diff --git a/javascript/extractor/src/com/semmle/js/extractor/Main.java b/javascript/extractor/src/com/semmle/js/extractor/Main.java index b455a2c9e099..57198709460e 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/Main.java +++ b/javascript/extractor/src/com/semmle/js/extractor/Main.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -41,7 +42,7 @@ public class Main { * A version identifier that should be updated every time the extractor changes in such a way that * it may produce different tuples for the same file under the same {@link ExtractorConfig}. */ - public static final String EXTRACTOR_VERSION = "2025-01-09"; + public static final String EXTRACTOR_VERSION = "2025-01-21"; public static final Pattern NEWLINE = Pattern.compile("\n"); @@ -179,6 +180,12 @@ public void run(String[] args) { remainingTypescriptFiles.add(f); } } + for (Map.Entry entry : extractorState.getSnippets().entrySet()) { + if (!extractedFiles.contains(entry.getKey().toFile()) + && FileType.forFileExtension(entry.getKey().toFile()) == FileType.TYPESCRIPT) { + remainingTypescriptFiles.add(entry.getKey().toFile()); + } + } if (!remainingTypescriptFiles.isEmpty()) { tsParser.prepareFiles(remainingTypescriptFiles); for (File f : remainingTypescriptFiles) { diff --git a/javascript/ql/src/change-notes/2025-01-21-vue-ts-notsconfig.md b/javascript/ql/src/change-notes/2025-01-21-vue-ts-notsconfig.md new file mode 100644 index 000000000000..fb2dddb47a78 --- /dev/null +++ b/javascript/ql/src/change-notes/2025-01-21-vue-ts-notsconfig.md @@ -0,0 +1,6 @@ +--- +category: fix +--- +* Fixed a bug that would occur when TypeScript code was found in an HTML-like file, such as a `.vue` file, + but where it could not be associated with any `tsconfig.json` file. Previously the embedded code was not + extracted in this case, but should now be extracted properly. diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/embedded-typescript.vue b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/embedded-typescript.vue new file mode 100644 index 000000000000..6b6436aa2b47 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/embedded-typescript.vue @@ -0,0 +1,7 @@ + + + diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/test.expected b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/test.expected new file mode 100644 index 000000000000..d13f8c732645 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/test.expected @@ -0,0 +1,2 @@ +| embedded-typescript.vue:5:1:6:0 | | +| test.js:1:1:2:0 | | diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/test.js b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/test.js new file mode 100644 index 000000000000..702f4280cee7 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/test.js @@ -0,0 +1 @@ +console.log("hello"); diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/test.ql b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/test.ql new file mode 100644 index 000000000000..0b69fee6d49f --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmbeddedTypeScriptNoTSConfig/test.ql @@ -0,0 +1,3 @@ +import javascript + +query predicate toplevels(TopLevel top) { any() }