@jpoly1219/context-extractor 0.1.2 → 0.2.1
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 +24 -15
- package/dist/app.d.ts +27 -0
- package/dist/app.js +284 -0
- package/dist/codeql.d.ts +17 -0
- package/dist/codeql.js +1341 -0
- package/dist/constants.d.ts +11 -0
- package/dist/constants.js +62 -0
- package/dist/core.d.ts +20 -0
- package/dist/core.js +576 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +7 -0
- package/dist/main.d.ts +13 -0
- package/dist/main.js +254 -0
- package/dist/ocaml-driver.d.ts +30 -0
- package/dist/ocaml-driver.js +394 -0
- package/dist/ocaml-type-checker.d.ts +52 -0
- package/dist/ocaml-type-checker.js +286 -0
- package/dist/runner.d.ts +1 -0
- package/dist/runner.js +52 -0
- package/dist/types.d.ts +135 -0
- package/dist/types.js +14 -0
- package/dist/typescript-driver.d.ts +27 -0
- package/dist/typescript-driver.js +542 -0
- package/dist/typescript-type-checker.d.ts +64 -0
- package/dist/typescript-type-checker.js +512 -0
- package/dist/utils.d.ts +40 -0
- package/dist/utils.js +350 -0
- package/package.json +1 -1
package/dist/utils.js
ADDED
@@ -0,0 +1,350 @@
|
|
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 (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
+
exports.getAllOCamlFiles = exports.getAllTSFiles = exports.supportsHole = exports.isQLIdentifier = exports.isQLLabel = exports.isQLKeyword = exports.isQLLiteral = exports.isQLPredefined = exports.isQLLocalTypeAccess = exports.isQLInterface = exports.isQLArray = exports.isQLUnion = exports.isQLTuple = exports.isQLFunction = exports.parseCodeQLTypesAndLocations = exports.parseCodeQLLocationsAndTypes = exports.parseCodeQLTypes = exports.parseCodeQLVars = exports.parseCodeQLRelevantTypes = exports.removeLines = exports.parseTypeArrayString = exports.escapeQuotes = exports.isTypeAlias = exports.isPrimitive = exports.isFunction = exports.isObject = exports.isArray = exports.isUnion = exports.isTuple = exports.extractSnippet = exports.formatTypeSpan = exports.indexOfRegexGroup = void 0;
|
27
|
+
const fs = __importStar(require("fs"));
|
28
|
+
const path = __importStar(require("path"));
|
29
|
+
const types_1 = require("./types");
|
30
|
+
const indexOfRegexGroup = (match, n) => {
|
31
|
+
return match.reduce((acc, curr, i) => {
|
32
|
+
if (i < 1 || i >= n)
|
33
|
+
return acc;
|
34
|
+
return acc + curr.length;
|
35
|
+
}, match.index);
|
36
|
+
};
|
37
|
+
exports.indexOfRegexGroup = indexOfRegexGroup;
|
38
|
+
const formatTypeSpan = (typeSpan) => {
|
39
|
+
const formatted = typeSpan.split("").reduce((acc, curr) => {
|
40
|
+
// if (curr === "\n" || (curr === " " && acc.slice(-1) === " ")) return acc;
|
41
|
+
if (curr === "\n")
|
42
|
+
return acc;
|
43
|
+
if (curr === " " && acc.slice(-1) === " ")
|
44
|
+
return acc;
|
45
|
+
// if (curr === "{") return acc + "{ ";
|
46
|
+
// if (curr === "}") return acc + " }";
|
47
|
+
return acc + curr;
|
48
|
+
}, "");
|
49
|
+
return formatted;
|
50
|
+
};
|
51
|
+
exports.formatTypeSpan = formatTypeSpan;
|
52
|
+
const extractSnippet = (documentContent, start, end) => {
|
53
|
+
const lines = documentContent.split('\n');
|
54
|
+
const snippet = [];
|
55
|
+
for (let lineNumber = start.line; lineNumber <= end.line; lineNumber++) {
|
56
|
+
const line = lines[lineNumber];
|
57
|
+
// console.log(line, lineNumber)
|
58
|
+
if (line == undefined)
|
59
|
+
continue;
|
60
|
+
if (lineNumber === start.line && lineNumber === end.line) {
|
61
|
+
// Single-line range
|
62
|
+
snippet.push(line.substring(start.character, end.character));
|
63
|
+
}
|
64
|
+
else if (lineNumber === start.line) {
|
65
|
+
// Starting line of the range
|
66
|
+
snippet.push(line.substring(start.character));
|
67
|
+
}
|
68
|
+
else if (lineNumber === end.line) {
|
69
|
+
// Ending line of the range
|
70
|
+
snippet.push(line.substring(0, end.character));
|
71
|
+
}
|
72
|
+
else {
|
73
|
+
// Entire line within the range
|
74
|
+
snippet.push(line);
|
75
|
+
}
|
76
|
+
}
|
77
|
+
return snippet.join('\n');
|
78
|
+
};
|
79
|
+
exports.extractSnippet = extractSnippet;
|
80
|
+
const isTuple = (typeSpan) => {
|
81
|
+
return typeSpan[0] === "[" && typeSpan[typeSpan.length - 1] === "]";
|
82
|
+
};
|
83
|
+
exports.isTuple = isTuple;
|
84
|
+
const isUnion = (typeSpan) => {
|
85
|
+
return typeSpan.includes(" | ");
|
86
|
+
};
|
87
|
+
exports.isUnion = isUnion;
|
88
|
+
const isArray = (typeSpan) => {
|
89
|
+
return typeSpan.slice(-2) === "[]";
|
90
|
+
};
|
91
|
+
exports.isArray = isArray;
|
92
|
+
const isObject = (typeSpan) => {
|
93
|
+
return typeSpan[0] === "{" && typeSpan[typeSpan.length - 1] === "}";
|
94
|
+
};
|
95
|
+
exports.isObject = isObject;
|
96
|
+
// this is a very rudimentary check, so it should be expanded upon
|
97
|
+
const isFunction = (typeSpan) => {
|
98
|
+
return typeSpan.includes("=>");
|
99
|
+
};
|
100
|
+
exports.isFunction = isFunction;
|
101
|
+
const isPrimitive = (typeSpan) => {
|
102
|
+
const primitives = ["string", "number", "boolean"];
|
103
|
+
return primitives.includes(typeSpan);
|
104
|
+
};
|
105
|
+
exports.isPrimitive = isPrimitive;
|
106
|
+
const isTypeAlias = (typeSpan) => {
|
107
|
+
const caps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
108
|
+
return caps.includes(typeSpan[0]);
|
109
|
+
};
|
110
|
+
exports.isTypeAlias = isTypeAlias;
|
111
|
+
const escapeQuotes = (typeSpan) => {
|
112
|
+
return typeSpan.replace(/"/g, `\\"`);
|
113
|
+
};
|
114
|
+
exports.escapeQuotes = escapeQuotes;
|
115
|
+
const parseTypeArrayString = (typeStr) => {
|
116
|
+
// Remove all spaces
|
117
|
+
const cleaned = typeStr.replace(/\s/g, '');
|
118
|
+
// Remove the outermost square brackets
|
119
|
+
const inner = cleaned.slice(1, -1);
|
120
|
+
// const inner = cleaned.slice(-1) === ";" ? cleaned.slice(1, -2) : cleaned.slice(1, -1);
|
121
|
+
// Split the string, respecting nested structures
|
122
|
+
const result = [];
|
123
|
+
let currentItem = '';
|
124
|
+
let nestLevel = 0;
|
125
|
+
for (const char of inner) {
|
126
|
+
if (char === '[')
|
127
|
+
nestLevel++;
|
128
|
+
if (char === ']')
|
129
|
+
nestLevel--;
|
130
|
+
if (char === ',' && nestLevel === 0) {
|
131
|
+
// check if currentItem is a name: type pair or just type
|
132
|
+
if (currentItem.includes(":")) {
|
133
|
+
result.push(currentItem.split(":")[1]);
|
134
|
+
}
|
135
|
+
else {
|
136
|
+
result.push(currentItem);
|
137
|
+
}
|
138
|
+
currentItem = '';
|
139
|
+
}
|
140
|
+
else {
|
141
|
+
currentItem += char;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
if (currentItem.includes(":")) {
|
145
|
+
result.push(currentItem.split(":")[1]);
|
146
|
+
}
|
147
|
+
else {
|
148
|
+
result.push(currentItem);
|
149
|
+
}
|
150
|
+
return result;
|
151
|
+
};
|
152
|
+
exports.parseTypeArrayString = parseTypeArrayString;
|
153
|
+
const removeLines = (fileContent) => {
|
154
|
+
const lines = fileContent.split("\n");
|
155
|
+
const filtered = [];
|
156
|
+
for (let i = 0; i < lines.length; i++) {
|
157
|
+
const line = lines[i];
|
158
|
+
if (!(line.split(" ").includes("import") || line.split(" ").includes("from") || line.split(" ").includes("export"))) {
|
159
|
+
filtered.push(line);
|
160
|
+
}
|
161
|
+
}
|
162
|
+
return filtered;
|
163
|
+
};
|
164
|
+
exports.removeLines = removeLines;
|
165
|
+
const parseCodeQLRelevantTypes = (table) => {
|
166
|
+
const m = new Map();
|
167
|
+
const rows = table["#select"]["tuples"];
|
168
|
+
rows.forEach(row => {
|
169
|
+
const typeDeclaration = row[0]["label"];
|
170
|
+
const typeName = row[1];
|
171
|
+
const typeDefinition = row[2]["label"];
|
172
|
+
const typeQLClass = row[3];
|
173
|
+
const componentName = row[4]["label"];
|
174
|
+
const componentQLClass = row[5];
|
175
|
+
if (!m.has(typeName)) {
|
176
|
+
m.set(typeName, {
|
177
|
+
typeAliasDeclaration: typeDeclaration,
|
178
|
+
typeName: typeName,
|
179
|
+
typeDefinition: typeDefinition,
|
180
|
+
typeQLClass: typeQLClass,
|
181
|
+
components: [{ typeName: componentName, typeQLClass: componentQLClass }]
|
182
|
+
});
|
183
|
+
}
|
184
|
+
else {
|
185
|
+
const value = m.get(typeName);
|
186
|
+
value.components.push({ typeName: componentName, typeQLClass: componentQLClass });
|
187
|
+
m.set(typeName, value);
|
188
|
+
}
|
189
|
+
});
|
190
|
+
return m;
|
191
|
+
};
|
192
|
+
exports.parseCodeQLRelevantTypes = parseCodeQLRelevantTypes;
|
193
|
+
const parseCodeQLVars = (table) => {
|
194
|
+
const m = new Map();
|
195
|
+
const rows = table["#select"]["tuples"];
|
196
|
+
rows.forEach(row => {
|
197
|
+
const declaration = row[0]["label"];
|
198
|
+
const bindingPattern = row[1]["label"];
|
199
|
+
const typeAnnotation = row[2]["label"];
|
200
|
+
;
|
201
|
+
const init = row[3]["label"];
|
202
|
+
const qlClass = row[4];
|
203
|
+
const functionReturnType = row[5];
|
204
|
+
const functionReturnTypeQLClass = row[6];
|
205
|
+
const componentName = row[7]["label"];
|
206
|
+
const componentQLClass = row[8];
|
207
|
+
if (!m.has(bindingPattern)) {
|
208
|
+
m.set(bindingPattern, {
|
209
|
+
constDeclaration: declaration,
|
210
|
+
bindingPattern: bindingPattern,
|
211
|
+
typeAnnotation: typeAnnotation,
|
212
|
+
init: init,
|
213
|
+
typeQLClass: qlClass,
|
214
|
+
functionReturnType: functionReturnType,
|
215
|
+
functionReturnTypeQLClass: functionReturnTypeQLClass,
|
216
|
+
components: [{ typeName: componentName, typeQLClass: componentQLClass }]
|
217
|
+
});
|
218
|
+
}
|
219
|
+
else {
|
220
|
+
const value = m.get(bindingPattern);
|
221
|
+
value.components.push({ typeName: componentName, typeQLClass: componentQLClass });
|
222
|
+
m.set(bindingPattern, value);
|
223
|
+
}
|
224
|
+
});
|
225
|
+
return m;
|
226
|
+
};
|
227
|
+
exports.parseCodeQLVars = parseCodeQLVars;
|
228
|
+
const parseCodeQLTypes = (table) => {
|
229
|
+
const arr = [];
|
230
|
+
const rows = table["#select"]["tuples"];
|
231
|
+
rows.forEach(row => {
|
232
|
+
const typeName = row[0];
|
233
|
+
const typeQLClass = row[1];
|
234
|
+
arr.push({ typeName: typeName, typeQLClass: typeQLClass });
|
235
|
+
});
|
236
|
+
return arr;
|
237
|
+
};
|
238
|
+
exports.parseCodeQLTypes = parseCodeQLTypes;
|
239
|
+
const parseCodeQLLocationsAndTypes = (table) => {
|
240
|
+
const locationToTypes = new Map();
|
241
|
+
const rows = table["#select"]["tuples"];
|
242
|
+
rows.forEach(row => {
|
243
|
+
const typeName = row[0];
|
244
|
+
const locatedFile = row[1];
|
245
|
+
if (!locationToTypes.has(locatedFile)) {
|
246
|
+
locationToTypes.set(locatedFile, [typeName]);
|
247
|
+
}
|
248
|
+
else {
|
249
|
+
const pair = locationToTypes.get(locatedFile);
|
250
|
+
pair.push(typeName);
|
251
|
+
locationToTypes.set(locatedFile, pair);
|
252
|
+
}
|
253
|
+
});
|
254
|
+
return locationToTypes;
|
255
|
+
};
|
256
|
+
exports.parseCodeQLLocationsAndTypes = parseCodeQLLocationsAndTypes;
|
257
|
+
const parseCodeQLTypesAndLocations = (table) => {
|
258
|
+
const typeToLocation = new Map();
|
259
|
+
const rows = table["#select"]["tuples"];
|
260
|
+
rows.forEach(row => {
|
261
|
+
const typeName = row[0];
|
262
|
+
const locatedFile = row[1];
|
263
|
+
if (!typeToLocation.has(typeName)) {
|
264
|
+
typeToLocation.set(typeName, locatedFile);
|
265
|
+
}
|
266
|
+
else {
|
267
|
+
// NOTE: this should technically be a name collision
|
268
|
+
typeToLocation.set(typeName, locatedFile);
|
269
|
+
}
|
270
|
+
});
|
271
|
+
return typeToLocation;
|
272
|
+
};
|
273
|
+
exports.parseCodeQLTypesAndLocations = parseCodeQLTypesAndLocations;
|
274
|
+
const isQLFunction = (typeQLClass) => {
|
275
|
+
return typeQLClass === "FunctionTypeExpr";
|
276
|
+
};
|
277
|
+
exports.isQLFunction = isQLFunction;
|
278
|
+
const isQLTuple = (typeQLClass) => {
|
279
|
+
return typeQLClass === "TupleTypeExpr";
|
280
|
+
};
|
281
|
+
exports.isQLTuple = isQLTuple;
|
282
|
+
const isQLUnion = (typeQLClass) => {
|
283
|
+
return typeQLClass === "UnionTypeExpr";
|
284
|
+
};
|
285
|
+
exports.isQLUnion = isQLUnion;
|
286
|
+
const isQLArray = (typeQLClass) => {
|
287
|
+
return typeQLClass === "ArrayTypeExpr";
|
288
|
+
};
|
289
|
+
exports.isQLArray = isQLArray;
|
290
|
+
const isQLInterface = (typeQLClass) => {
|
291
|
+
return typeQLClass === "InterfaceTypeExpr";
|
292
|
+
};
|
293
|
+
exports.isQLInterface = isQLInterface;
|
294
|
+
const isQLLocalTypeAccess = (typeQLClass) => {
|
295
|
+
return typeQLClass === "LocalTypeAccess";
|
296
|
+
};
|
297
|
+
exports.isQLLocalTypeAccess = isQLLocalTypeAccess;
|
298
|
+
const isQLPredefined = (typeQLClass) => {
|
299
|
+
return typeQLClass === "PredefinedTypeExpr";
|
300
|
+
};
|
301
|
+
exports.isQLPredefined = isQLPredefined;
|
302
|
+
const isQLLiteral = (typeQLClass) => {
|
303
|
+
return typeQLClass === "LiteralTypeExpr";
|
304
|
+
};
|
305
|
+
exports.isQLLiteral = isQLLiteral;
|
306
|
+
const isQLKeyword = (typeQLClass) => {
|
307
|
+
return typeQLClass === "KeywordTypeExpr";
|
308
|
+
};
|
309
|
+
exports.isQLKeyword = isQLKeyword;
|
310
|
+
const isQLLabel = (typeQLClass) => {
|
311
|
+
return typeQLClass === "Label";
|
312
|
+
};
|
313
|
+
exports.isQLLabel = isQLLabel;
|
314
|
+
const isQLIdentifier = (typeQLClass) => {
|
315
|
+
return typeQLClass === "Identifier";
|
316
|
+
};
|
317
|
+
exports.isQLIdentifier = isQLIdentifier;
|
318
|
+
const supportsHole = (lang) => {
|
319
|
+
const supportedLangs = [types_1.Language.OCaml];
|
320
|
+
return supportedLangs.includes(lang);
|
321
|
+
};
|
322
|
+
exports.supportsHole = supportsHole;
|
323
|
+
const getAllTSFiles = (dirPath, arrayOfFiles = []) => {
|
324
|
+
const files = fs.readdirSync(dirPath);
|
325
|
+
files.forEach((file) => {
|
326
|
+
const filePath = path.join(dirPath, file);
|
327
|
+
if (fs.statSync(filePath).isDirectory()) {
|
328
|
+
getAllTSFiles(filePath, arrayOfFiles);
|
329
|
+
}
|
330
|
+
else if (filePath.endsWith(".ts")) {
|
331
|
+
arrayOfFiles.push(filePath);
|
332
|
+
}
|
333
|
+
});
|
334
|
+
return arrayOfFiles;
|
335
|
+
};
|
336
|
+
exports.getAllTSFiles = getAllTSFiles;
|
337
|
+
const getAllOCamlFiles = (dirPath, arrayOfFiles = []) => {
|
338
|
+
const files = fs.readdirSync(dirPath);
|
339
|
+
files.forEach((file) => {
|
340
|
+
const filePath = path.join(dirPath, file);
|
341
|
+
if (fs.statSync(filePath).isDirectory()) {
|
342
|
+
getAllTSFiles(filePath, arrayOfFiles);
|
343
|
+
}
|
344
|
+
else if (filePath.endsWith(".ml")) {
|
345
|
+
arrayOfFiles.push(filePath);
|
346
|
+
}
|
347
|
+
});
|
348
|
+
return arrayOfFiles;
|
349
|
+
};
|
350
|
+
exports.getAllOCamlFiles = getAllOCamlFiles;
|