diff --git a/its/plugin/fast-tests/src/test/java/com/sonar/javascript/it/plugin/ReferencedTSConfigTest.java b/its/plugin/fast-tests/src/test/java/com/sonar/javascript/it/plugin/ReferencedTSConfigTest.java index f59ac6d1da3..5183cbd95a0 100644 --- a/its/plugin/fast-tests/src/test/java/com/sonar/javascript/it/plugin/ReferencedTSConfigTest.java +++ b/its/plugin/fast-tests/src/test/java/com/sonar/javascript/it/plugin/ReferencedTSConfigTest.java @@ -58,7 +58,13 @@ void test() { result .logOutput() .stream() - .filter(l -> l.message().matches("TypeScript(\\(\\d\\.\\d\\.\\d\\))? configuration file.*")) + .filter(l -> + l + .message() + .matches( + "Creating TypeScript(\\(\\d\\.\\d\\.\\d\\))? program with configuration file.*" + ) + ) ).hasSize(2); } } diff --git a/its/plugin/fast-tests/src/test/java/com/sonar/javascript/it/plugin/TypeCheckerConfigTest.java b/its/plugin/fast-tests/src/test/java/com/sonar/javascript/it/plugin/TypeCheckerConfigTest.java index dd5f817cce7..6ff6364d2e9 100644 --- a/its/plugin/fast-tests/src/test/java/com/sonar/javascript/it/plugin/TypeCheckerConfigTest.java +++ b/its/plugin/fast-tests/src/test/java/com/sonar/javascript/it/plugin/TypeCheckerConfigTest.java @@ -93,14 +93,16 @@ void multiple_targets() { .extracting(Log::message) .filteredOn(m -> m.startsWith("Found 1 tsconfig.json file(s)")) .hasSize(1); - assertThat(result.logOutput()) - .extracting(Log::message) - .filteredOn(m -> - m.equals( - "Found 1 file(s) not part of any tsconfig.json: they will be analyzed without type information" + assertThat( + result + .logOutput() + .stream() + .filter(l -> + l + .message() + .matches("Creating TypeScript(\\(\\d\\.\\d\\.\\d\\))? program from entry point.*") ) - ) - .hasSize(1); + ).hasSize(1); var issues = result .scannerOutputReader() diff --git a/its/plugin/tests/src/test/java/com/sonar/javascript/it/plugin/TypeScriptAnalysisTest.java b/its/plugin/tests/src/test/java/com/sonar/javascript/it/plugin/TypeScriptAnalysisTest.java index 1b060ef3ac6..ce038cf6666 100644 --- a/its/plugin/tests/src/test/java/com/sonar/javascript/it/plugin/TypeScriptAnalysisTest.java +++ b/its/plugin/tests/src/test/java/com/sonar/javascript/it/plugin/TypeScriptAnalysisTest.java @@ -159,10 +159,10 @@ void should_use_multiple_custom_tsconfigs() throws Exception { result.getLogsLines(l -> l.contains( "Found 2 tsconfig.json file(s): " + - tsconfigs - .stream() - .map(tsconfig -> tsconfig.toString().replace("\\", "/")) - .toList() + tsconfigs + .stream() + .map(tsconfig -> tsconfig.toString().replace("\\", "/")) + .toList() ) ) ).hasSize(1); @@ -247,14 +247,7 @@ void should_exclude_from_extended_tsconfig() throws Exception { assertThat( result.getLogsLines(l -> - l.contains( - "INFO: Found 1 file(s) not part of any tsconfig.json: they will be analyzed without type information" - ) - ) - ).hasSize(1); - assertThat( - result.getLogsLines(l -> - l.contains("File not part of any tsconfig.json: dir/file.excluded.ts") + l.matches(".*Creating TypeScript(\\(\\d\\.\\d\\.\\d\\))? program from entry point.*") ) ).hasSize(1); } diff --git a/its/ruling/src/test/expected/jsts/TypeScript/javascript-S1874.json b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S1874.json new file mode 100644 index 00000000000..a31c31df4c5 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S1874.json @@ -0,0 +1,5 @@ +{ +"TypeScript:scripts/mocha-parallel.js": [ +359 +] +} diff --git a/its/ruling/src/test/expected/jsts/TypeScript/javascript-S2870.json b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S2870.json new file mode 100644 index 00000000000..90446265393 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S2870.json @@ -0,0 +1,7 @@ +{ +"TypeScript:lib/tsc.js": [ +47353, +48006, +48316 +] +} diff --git a/its/ruling/src/test/expected/jsts/TypeScript/javascript-S3402.json b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S3402.json new file mode 100644 index 00000000000..13cc8772d18 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S3402.json @@ -0,0 +1,5 @@ +{ +"TypeScript:Jakefile.js": [ +821 +] +} diff --git a/its/ruling/src/test/expected/jsts/TypeScript/javascript-S3403.json b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S3403.json new file mode 100644 index 00000000000..7e647c41ced --- /dev/null +++ b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S3403.json @@ -0,0 +1,16 @@ +{ +"TypeScript:lib/tsc.js": [ +935, +4077, +6973, +36581, +36592, +38926, +48587, +48593 +], +"TypeScript:lib/typingsInstaller.js": [ +945, +4087 +] +} diff --git a/its/ruling/src/test/expected/jsts/TypeScript/javascript-S3800.json b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S3800.json new file mode 100644 index 00000000000..48fd60958ff --- /dev/null +++ b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S3800.json @@ -0,0 +1,19 @@ +{ +"TypeScript:lib/tsc.js": [ +21324, +21647, +24458, +27089, +28494, +29121, +29465, +30166, +30329, +30454, +30469, +36112, +38034, +43431, +44314 +] +} diff --git a/its/ruling/src/test/expected/jsts/TypeScript/javascript-S4139.json b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S4139.json new file mode 100644 index 00000000000..702806babb3 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S4139.json @@ -0,0 +1,6 @@ +{ +"TypeScript:Jakefile.js": [ +381, +703 +] +} diff --git a/its/ruling/src/test/expected/jsts/TypeScript/javascript-S6582.json b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S6582.json new file mode 100644 index 00000000000..84415063036 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/TypeScript/javascript-S6582.json @@ -0,0 +1,261 @@ +{ +"TypeScript:Jakefile.js": [ +44 +], +"TypeScript:lib/tsc.js": [ +116, +120, +756, +762, +1090, +1399, +1473, +1475, +1575, +1676, +1779, +2414, +4953, +4990, +5183, +5192, +5320, +5552, +5565, +5568, +5666, +5670, +5680, +5684, +6061, +6145, +6231, +6239, +6240, +6284, +6309, +6310, +6318, +6370, +6373, +6990, +7014, +7203, +7263, +7507, +7538, +8554, +8579, +8583, +8595, +8599, +9623, +10679, +10680, +10713, +10723, +10733, +10734, +10746, +10756, +10770, +10784, +10825, +10830, +11629, +11630, +11679, +12451, +16399, +17497, +17499, +17540, +17545, +17575, +18214, +18674, +18985, +18988, +19003, +19014, +19036, +19068, +19134, +19134, +20086, +20114, +20191, +20230, +20231, +20400, +20592, +20640, +20654, +20660, +21331, +21400, +21419, +21483, +21528, +21730, +22009, +22054, +22069, +22252, +22558, +22559, +22717, +22749, +22857, +22926, +22934, +22939, +23401, +23428, +23444, +23634, +23725, +24100, +24130, +24408, +24734, +25444, +25497, +25614, +25641, +25832, +26041, +26044, +26523, +26586, +26597, +26805, +26907, +27085, +27145, +30033, +30419, +30446, +30461, +30470, +30476, +30619, +31095, +31835, +32026, +32055, +32160, +32240, +32691, +32857, +32931, +33009, +33134, +33302, +33317, +34009, +35193, +35352, +35598, +35725, +37131, +37484, +37491, +37494, +37661, +37690, +37953, +38260, +38292, +38298, +38656, +38667, +38759, +38789, +38959, +40910, +41064, +41152, +41686, +41698, +43633, +43934, +44204, +44570, +44761, +45278, +46088, +46102, +46262, +46337, +47543, +47604, +48421, +48424, +48530, +48552, +48912, +48913, +48938, +48939, +48940, +49058, +49059, +49105, +49116, +49558, +50184, +50201, +50344, +50787, +51494, +52617, +52665, +53018, +53584, +54009, +54088, +54254, +55192, +55384, +55501, +55657, +55838, +56213, +56269, +56269 +], +"TypeScript:lib/typingsInstaller.js": [ +126, +130, +766, +772, +1100, +1409, +1483, +1485, +1585, +1686, +1789, +2424, +5529, +5721, +5838, +5994, +6175, +6260, +6576, +6604, +6681, +6720, +6721, +6890, +7082, +7130, +7144, +7150, +7215, +7705, +7705 +] +} diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S1529.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S1529.json deleted file mode 100644 index 98df7c975db..00000000000 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S1529.json +++ /dev/null @@ -1,5 +0,0 @@ -{ -"TypeScript:scripts/buildProtocol.ts": [ -109 -] -} diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S1874.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S1874.json index 339c13411b9..a2896b41e30 100644 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S1874.json +++ b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S1874.json @@ -1,7 +1,33 @@ { +"TypeScript:Gulpfile.ts": [ +876 +], +"TypeScript:scripts/authors.ts": [ +90, +91 +], "TypeScript:scripts/importDefinitelyTypedTests/importDefinitelyTypedTests.ts": [ 41 ], +"TypeScript:scripts/ior.ts": [ +14, +54 +], +"TypeScript:scripts/processDiagnosticMessages.ts": [ +23, +155, +207 +], +"TypeScript:scripts/word2md.ts": [ +10, +246, +281, +289, +290, +301, +311, +352 +], "TypeScript:src/compiler/checker.ts": [ 2285 ], @@ -71,6 +97,10 @@ 447, 772 ], +"TypeScript:src/harness/instrumenter.ts": [ +41, +41 +], "TypeScript:src/harness/projectsRunner.ts": [ 104, 105, diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S2933.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S2933.json index d1c82b95b8f..04abe7784df 100644 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S2933.json +++ b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S2933.json @@ -1,4 +1,10 @@ { +"TypeScript:scripts/buildProtocol.ts": [ +11, +13, +15, +15 +], "TypeScript:src/compiler/core.ts": [ 71, 72, diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S3003.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S3003.json index 4fff421ba50..08b3c3c760b 100644 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S3003.json +++ b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S3003.json @@ -1,4 +1,7 @@ { +"TypeScript:scripts/authors.ts": [ +92 +], "TypeScript:src/compiler/core.ts": [ 1347 ], diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S3402.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S3402.json index f195153f700..1ffba835005 100644 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S3402.json +++ b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S3402.json @@ -1,4 +1,10 @@ { +"TypeScript:Gulpfile.ts": [ +616 +], +"TypeScript:scripts/processDiagnosticMessages.ts": [ +193 +], "TypeScript:src/compiler/checker.ts": [ 6514 ], diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S4139.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S4139.json index d8383d3a683..f11fab993c1 100644 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S4139.json +++ b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S4139.json @@ -1,4 +1,7 @@ { +"TypeScript:Gulpfile.ts": [ +176 +], "TypeScript:src/compiler/factory.ts": [ 2483 ], diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S4623.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S4623.json index 3d5a6e8d0f0..b74fcdc3e4e 100644 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S4623.json +++ b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S4623.json @@ -1,4 +1,7 @@ { +"TypeScript:scripts/processDiagnosticMessages.ts": [ +74 +], "TypeScript:src/compiler/checker.ts": [ 2695, 16872, diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6557.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6557.json index 29e13748936..c7e334936c6 100644 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6557.json +++ b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6557.json @@ -1,4 +1,14 @@ { +"TypeScript:Gulpfile.ts": [ +105 +], +"TypeScript:scripts/authors.ts": [ +90, +91 +], +"TypeScript:scripts/ior.ts": [ +57 +], "TypeScript:src/compiler/core.ts": [ 1691, 1700, diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6594.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6594.json index 27932ddfbab..92e2caaff90 100644 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6594.json +++ b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6594.json @@ -1,4 +1,10 @@ { +"TypeScript:scripts/configureNightly.ts": [ +40 +], +"TypeScript:scripts/word2md.ts": [ +288 +], "TypeScript:src/compiler/comments.ts": [ 422, 423 diff --git a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6606.json b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6606.json index 3dd9289abd0..710757fb60c 100644 --- a/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6606.json +++ b/its/ruling/src/test/expected/jsts/TypeScript/typescript-S6606.json @@ -1,4 +1,7 @@ { +"TypeScript:scripts/processDiagnosticMessages.ts": [ +157 +], "TypeScript:src/compiler/binder.ts": [ 185 ], diff --git a/its/ruling/src/test/expected/jsts/ant-design/javascript-S1874.json b/its/ruling/src/test/expected/jsts/ant-design/javascript-S1874.json new file mode 100644 index 00000000000..e02da18f9ab --- /dev/null +++ b/its/ruling/src/test/expected/jsts/ant-design/javascript-S1874.json @@ -0,0 +1,8 @@ +{ +"ant-design:components/form/__tests__/index.test.js": [ +362 +], +"ant-design:components/table/__tests__/Table.filter.test.js": [ +1703 +] +} diff --git a/its/ruling/src/test/expected/jsts/ant-design/javascript-S2871.json b/its/ruling/src/test/expected/jsts/ant-design/javascript-S2871.json new file mode 100644 index 00000000000..5f2738ed2cb --- /dev/null +++ b/its/ruling/src/test/expected/jsts/ant-design/javascript-S2871.json @@ -0,0 +1,15 @@ +{ +"ant-design:components/table/__tests__/Table.rowSelection.test.js": [ +1390, +1392, +1428, +1469 +], +"ant-design:components/tree/__tests__/util.test.js": [ +24, +24 +], +"ant-design:site/theme/template/Content/Demo/CodePreview.jsx": [ +12 +] +} diff --git a/its/ruling/src/test/expected/jsts/ant-design/javascript-S4043.json b/its/ruling/src/test/expected/jsts/ant-design/javascript-S4043.json new file mode 100644 index 00000000000..4814c96b41c --- /dev/null +++ b/its/ruling/src/test/expected/jsts/ant-design/javascript-S4043.json @@ -0,0 +1,12 @@ +{ +"ant-design:components/tree/__tests__/util.test.js": [ +24, +24 +], +"ant-design:site/theme/template/Content/ComponentDoc.jsx": [ +121 +], +"ant-design:site/theme/template/Content/ComponentOverview.jsx": [ +101 +] +} diff --git a/its/ruling/src/test/expected/jsts/ant-design/javascript-S6551.json b/its/ruling/src/test/expected/jsts/ant-design/javascript-S6551.json new file mode 100644 index 00000000000..f55403cfbb9 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/ant-design/javascript-S6551.json @@ -0,0 +1,8 @@ +{ +"ant-design:components/table/__tests__/Table.filter.test.js": [ +2247, +2251, +2277, +2281 +] +} diff --git a/its/ruling/src/test/expected/jsts/ant-design/javascript-S6557.json b/its/ruling/src/test/expected/jsts/ant-design/javascript-S6557.json new file mode 100644 index 00000000000..47509fc0be9 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/ant-design/javascript-S6557.json @@ -0,0 +1,20 @@ +{ +"ant-design:components/locale-provider/__tests__/index.test.js": [ +252 +], +"ant-design:scripts/check-version-md.js": [ +15 +], +"ant-design:site/theme/index.js": [ +12, +31 +], +"ant-design:site/theme/template/Content/MainContent.jsx": [ +254 +], +"ant-design:site/theme/template/Icon/utils.js": [ +19, +21, +23 +] +} diff --git a/its/ruling/src/test/expected/jsts/ant-design/javascript-S6582.json b/its/ruling/src/test/expected/jsts/ant-design/javascript-S6582.json new file mode 100644 index 00000000000..4feee82295f --- /dev/null +++ b/its/ruling/src/test/expected/jsts/ant-design/javascript-S6582.json @@ -0,0 +1,28 @@ +{ +"ant-design:components/typography/__tests__/index.test.js": [ +139 +], +"ant-design:index-style-only.js": [ +10, +14 +], +"ant-design:site/antd.js": [ +12, +16 +], +"ant-design:site/bisheng.config.js": [ +180 +], +"ant-design:site/theme/template/Content/ComponentDoc.jsx": [ +36 +], +"ant-design:site/theme/template/Content/Demo/index.jsx": [ +194 +], +"ant-design:site/theme/template/Content/MainContent.jsx": [ +57, +187, +307, +313 +] +} diff --git a/its/ruling/src/test/expected/jsts/ant-design/javascript-S6594.json b/its/ruling/src/test/expected/jsts/ant-design/javascript-S6594.json new file mode 100644 index 00000000000..0e8da8d231d --- /dev/null +++ b/its/ruling/src/test/expected/jsts/ant-design/javascript-S6594.json @@ -0,0 +1,6 @@ +{ +"ant-design:site/theme/template/Content/Demo/index.jsx": [ +193, +279 +] +} diff --git a/its/ruling/src/test/expected/jsts/console/javascript-S6582.json b/its/ruling/src/test/expected/jsts/console/javascript-S6582.json new file mode 100644 index 00000000000..f885fb5adea --- /dev/null +++ b/its/ruling/src/test/expected/jsts/console/javascript-S6582.json @@ -0,0 +1,12 @@ +{ +"console:src/views/FunctionsView/FunctionLogs/Codemirror.js": [ +90, +93 +], +"console:src/views/FunctionsView/FunctionLogs/ResultViewer.js": [ +124 +], +"console:src/views/SchemaView/Editor/QueryEditor.js": [ +191 +] +} diff --git a/its/ruling/src/test/expected/jsts/courselit/javascript-S1874.json b/its/ruling/src/test/expected/jsts/courselit/javascript-S1874.json new file mode 100644 index 00000000000..e16c8027601 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/courselit/javascript-S1874.json @@ -0,0 +1,6 @@ +{ +"courselit:packages/rich-text/src/index.js": [ +9, +11 +] +} diff --git a/its/ruling/src/test/expected/jsts/courselit/javascript-S6582.json b/its/ruling/src/test/expected/jsts/courselit/javascript-S6582.json new file mode 100644 index 00000000000..0ce6ff52558 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/courselit/javascript-S6582.json @@ -0,0 +1,5 @@ +{ +"courselit:packages/rich-text/src/index.js": [ +24 +] +} diff --git a/its/ruling/src/test/expected/jsts/eigen/javascript-S2871.json b/its/ruling/src/test/expected/jsts/eigen/javascript-S2871.json new file mode 100644 index 00000000000..93635901bc6 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/eigen/javascript-S2871.json @@ -0,0 +1,5 @@ +{ +"eigen:scripts/generate-manifest.js": [ +47 +] +} diff --git a/its/ruling/src/test/expected/jsts/eigen/javascript-S4123.json b/its/ruling/src/test/expected/jsts/eigen/javascript-S4123.json new file mode 100644 index 00000000000..09075d13fbb --- /dev/null +++ b/its/ruling/src/test/expected/jsts/eigen/javascript-S4123.json @@ -0,0 +1,8 @@ +{ +"eigen:scripts/detect-secrets.js": [ +33, +63, +71, +80 +] +} diff --git a/its/ruling/src/test/expected/jsts/eigen/javascript-S6582.json b/its/ruling/src/test/expected/jsts/eigen/javascript-S6582.json new file mode 100644 index 00000000000..b06c0cb1e1e --- /dev/null +++ b/its/ruling/src/test/expected/jsts/eigen/javascript-S6582.json @@ -0,0 +1,5 @@ +{ +"eigen:__mocks__/react-relay.js": [ +12 +] +} diff --git a/its/ruling/src/test/expected/jsts/eigen/javascript-S6594.json b/its/ruling/src/test/expected/jsts/eigen/javascript-S6594.json index c4edc92bfa5..599677b5673 100644 --- a/its/ruling/src/test/expected/jsts/eigen/javascript-S6594.json +++ b/its/ruling/src/test/expected/jsts/eigen/javascript-S6594.json @@ -2,5 +2,8 @@ "eigen:scripts/changelog/parsePRDescription.js": [ 36, 83 +], +"eigen:scripts/generate-manifest.js": [ +37 ] } diff --git a/its/ruling/src/test/expected/jsts/eigen/typescript-S1874.json b/its/ruling/src/test/expected/jsts/eigen/typescript-S1874.json index c21c9afe060..a5ea64cde65 100644 --- a/its/ruling/src/test/expected/jsts/eigen/typescript-S1874.json +++ b/its/ruling/src/test/expected/jsts/eigen/typescript-S1874.json @@ -1055,6 +1055,11 @@ 3, 13 ], +"eigen:src/app/Scenes/MyProfile/__mocks__/LoggedInUserInfo.tsx": [ +1, +5, +5 +], "eigen:src/app/Scenes/NewWorksForYou/NewWorksForYou.tests.tsx": [ 3, 36 diff --git a/its/ruling/src/test/expected/jsts/eigen/typescript-S2201.json b/its/ruling/src/test/expected/jsts/eigen/typescript-S2201.json index a2de19947ee..529bf17b25c 100644 --- a/its/ruling/src/test/expected/jsts/eigen/typescript-S2201.json +++ b/its/ruling/src/test/expected/jsts/eigen/typescript-S2201.json @@ -1,4 +1,7 @@ { +"eigen:metaphysics-queries-freshness-tests/test-freshness.ts": [ +153 +], "eigen:src/app/Components/ArtworkFilter/Filters/WaysToBuyOptions.tsx": [ 67 ], diff --git a/its/ruling/src/test/expected/jsts/eigen/typescript-S4328.json b/its/ruling/src/test/expected/jsts/eigen/typescript-S4328.json index 66c563add0c..2d238c12d46 100644 --- a/its/ruling/src/test/expected/jsts/eigen/typescript-S4328.json +++ b/its/ruling/src/test/expected/jsts/eigen/typescript-S4328.json @@ -1354,9 +1354,6 @@ 1, 2 ], -"eigen:src/app/Scenes/MyProfile/__mocks__/LoggedInUserInfo.tsx": [ -1 -], "eigen:src/app/Scenes/MyProfile/__tests__/MyProfileEditForm.tests.tsx": [ 2 ], diff --git a/its/ruling/src/test/expected/jsts/fireface/javascript-S6582.json b/its/ruling/src/test/expected/jsts/fireface/javascript-S6582.json new file mode 100644 index 00000000000..25762c64fdf --- /dev/null +++ b/its/ruling/src/test/expected/jsts/fireface/javascript-S6582.json @@ -0,0 +1,5 @@ +{ +"fireface:karma.conf.js": [ +33 +] +} diff --git a/its/ruling/src/test/expected/jsts/jira-clone/javascript-S1874.json b/its/ruling/src/test/expected/jsts/jira-clone/javascript-S1874.json new file mode 100644 index 00000000000..9f5d452bfa2 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/jira-clone/javascript-S1874.json @@ -0,0 +1,5 @@ +{ +"jira-clone:client/src/shared/utils/browser.js": [ +12 +] +} diff --git a/its/ruling/src/test/expected/jsts/jira-clone/javascript-S2234.json b/its/ruling/src/test/expected/jsts/jira-clone/javascript-S2234.json new file mode 100644 index 00000000000..9d1310425a9 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/jira-clone/javascript-S2234.json @@ -0,0 +1,5 @@ +{ +"jira-clone:client/src/Project/Board/Lists/index.jsx": [ +23 +] +} diff --git a/its/ruling/src/test/expected/jsts/jira-clone/javascript-S6582.json b/its/ruling/src/test/expected/jsts/jira-clone/javascript-S6582.json new file mode 100644 index 00000000000..17e8f9b82cc --- /dev/null +++ b/its/ruling/src/test/expected/jsts/jira-clone/javascript-S6582.json @@ -0,0 +1,11 @@ +{ +"jira-clone:client/src/Project/Board/IssueDetails/AssigneesReporter/index.jsx": [ +61 +], +"jira-clone:client/src/Project/IssueCreate/index.jsx": [ +162 +], +"jira-clone:client/src/shared/hooks/onOutsideClick.js": [ +30 +] +} diff --git a/its/ruling/src/test/expected/jsts/jira-clone/javascript-S6671.json b/its/ruling/src/test/expected/jsts/jira-clone/javascript-S6671.json new file mode 100644 index 00000000000..e5e130248b2 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/jira-clone/javascript-S6671.json @@ -0,0 +1,5 @@ +{ +"jira-clone:client/src/shared/utils/api.js": [ +44 +] +} diff --git a/its/ruling/src/test/expected/jsts/knockout/javascript-S1874.json b/its/ruling/src/test/expected/jsts/knockout/javascript-S1874.json new file mode 100644 index 00000000000..9501b66ff84 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/knockout/javascript-S1874.json @@ -0,0 +1,12 @@ +{ +"knockout:build/knockout-raw.js": [ +25 +], +"knockout:src/templating/jquery.tmpl/jqueryTmplTemplateEngine.js": [ +61 +], +"knockout:src/utils.js": [ +418, +419 +] +} diff --git a/its/ruling/src/test/expected/jsts/knockout/javascript-S3402.json b/its/ruling/src/test/expected/jsts/knockout/javascript-S3402.json new file mode 100644 index 00000000000..5dcc310b59b --- /dev/null +++ b/its/ruling/src/test/expected/jsts/knockout/javascript-S3402.json @@ -0,0 +1,5 @@ +{ +"knockout:src/utils.domData.js": [ +68 +] +} diff --git a/its/ruling/src/test/expected/jsts/knockout/javascript-S3579.json b/its/ruling/src/test/expected/jsts/knockout/javascript-S3579.json new file mode 100644 index 00000000000..e76e52bc372 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/knockout/javascript-S3579.json @@ -0,0 +1,5 @@ +{ +"knockout:src/binding/editDetection/arrayToDomNodeChildren.js": [ +155 +] +} diff --git a/its/ruling/src/test/expected/jsts/knockout/javascript-S6557.json b/its/ruling/src/test/expected/jsts/knockout/javascript-S6557.json new file mode 100644 index 00000000000..28fd14239d6 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/knockout/javascript-S6557.json @@ -0,0 +1,5 @@ +{ +"knockout:src/binding/defaultBindings/style.js": [ +14 +] +} diff --git a/its/ruling/src/test/expected/jsts/knockout/javascript-S6582.json b/its/ruling/src/test/expected/jsts/knockout/javascript-S6582.json new file mode 100644 index 00000000000..f4e75f1979a --- /dev/null +++ b/its/ruling/src/test/expected/jsts/knockout/javascript-S6582.json @@ -0,0 +1,87 @@ +{ +"knockout:src/binding/bindingAttributeSyntax.js": [ +81, +98, +100, +133, +166, +182, +188, +217, +233, +508, +542 +], +"knockout:src/binding/bindingProvider.js": [ +58 +], +"knockout:src/binding/defaultBindings/textInput.js": [ +14 +], +"knockout:src/binding/defaultBindings/value.js": [ +38 +], +"knockout:src/binding/editDetection/arrayToDomNodeChildren.js": [ +89 +], +"knockout:src/binding/expressionRewriting.js": [ +119, +184 +], +"knockout:src/binding/selectExtensions.js": [ +14 +], +"knockout:src/components/componentBinding.js": [ +10, +73 +], +"knockout:src/components/defaultLoader.js": [ +182, +190 +], +"knockout:src/components/loaderRegistry.js": [ +45 +], +"knockout:src/subscribables/dependentObservable.js": [ +171, +260, +518 +], +"knockout:src/subscribables/observableArray.changeTracking.js": [ +86 +], +"knockout:src/subscribables/subscribable.js": [ +161, +166, +178 +], +"knockout:src/templating/jquery.tmpl/jqueryTmplTemplateEngine.js": [ +8 +], +"knockout:src/templating/templateSources.js": [ +45 +], +"knockout:src/templating/templating.js": [ +83, +270 +], +"knockout:src/utils.domData.js": [ +54 +], +"knockout:src/utils.domManipulation.js": [ +83 +], +"knockout:src/utils.js": [ +222, +353, +361, +373, +404, +452, +539, +548 +], +"knockout:src/virtualElements.js": [ +13 +] +} diff --git a/its/ruling/src/test/expected/jsts/knockout/javascript-S6594.json b/its/ruling/src/test/expected/jsts/knockout/javascript-S6594.json new file mode 100644 index 00000000000..25b45e1047e --- /dev/null +++ b/its/ruling/src/test/expected/jsts/knockout/javascript-S6594.json @@ -0,0 +1,10 @@ +{ +"knockout:src/binding/defaultBindings/textInput.js": [ +15, +16, +17, +18, +19, +20 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S1154.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S1154.json new file mode 100644 index 00000000000..c4e149020b4 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S1154.json @@ -0,0 +1,5 @@ +{ +"paper.js:src/core/PaperScope.js": [ +89 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S1874.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S1874.json new file mode 100644 index 00000000000..9468892dd49 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S1874.json @@ -0,0 +1,9 @@ +{ +"paper.js:src/core/PaperScript.js": [ +375, +421 +], +"paper.js:src/load.js": [ +29 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S2871.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S2871.json new file mode 100644 index 00000000000..339d15a31ce --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S2871.json @@ -0,0 +1,6 @@ +{ +"paper.js:src/path/Curve.js": [ +667, +1727 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S3402.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S3402.json new file mode 100644 index 00000000000..bc0f7c51573 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S3402.json @@ -0,0 +1,5 @@ +{ +"paper.js:src/node/extend.js": [ +115 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S3403.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S3403.json new file mode 100644 index 00000000000..c15972faa44 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S3403.json @@ -0,0 +1,9 @@ +{ +"paper.js:src/basic/Rectangle.js": [ +843 +], +"paper.js:src/util/Numerical.js": [ +385, +390 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S4043.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S4043.json new file mode 100644 index 00000000000..24e83cecf48 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S4043.json @@ -0,0 +1,6 @@ +{ +"paper.js:src/path/Curve.js": [ +1808, +1808 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S4139.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S4139.json new file mode 100644 index 00000000000..6f22c4fea57 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S4139.json @@ -0,0 +1,5 @@ +{ +"paper.js:src/item/Item.js": [ +2175 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S6551.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S6551.json new file mode 100644 index 00000000000..e47f5904f50 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S6551.json @@ -0,0 +1,5 @@ +{ +"paper.js:src/canvas/CanvasProvider.js": [ +35 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S6557.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S6557.json new file mode 100644 index 00000000000..85ad3207cbe --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S6557.json @@ -0,0 +1,30 @@ +{ +"paper.js:gulp/typescript/typescript-definition-generator.js": [ +59 +], +"paper.js:src/core/Base.js": [ +32, +539 +], +"paper.js:src/core/PaperScope.js": [ +245 +], +"paper.js:src/core/PaperScript.js": [ +487 +], +"paper.js:src/event/Key.js": [ +78 +], +"paper.js:src/item/Raster.js": [ +555 +], +"paper.js:src/node/self.js": [ +22 +], +"paper.js:src/style/Color.js": [ +105 +], +"paper.js:src/style/Style.js": [ +147 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S6582.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S6582.json new file mode 100644 index 00000000000..466b2ebfcd7 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S6582.json @@ -0,0 +1,217 @@ +{ +"paper.js:gulp/typescript/typescript-definition-generator.js": [ +190 +], +"paper.js:src/anim/Tween.js": [ +233, +327, +332, +344 +], +"paper.js:src/basic/Rectangle.js": [ +123, +622 +], +"paper.js:src/canvas/CanvasProvider.js": [ +60, +61 +], +"paper.js:src/core/Base.js": [ +126, +128, +198, +201, +478, +523, +580, +652 +], +"paper.js:src/core/Emitter.js": [ +27, +34, +50, +51, +58, +80, +86, +96, +108, +124 +], +"paper.js:src/core/PaperScope.js": [ +159 +], +"paper.js:src/core/PaperScript.js": [ +90, +108, +238, +544, +627 +], +"paper.js:src/dom/DomElement.js": [ +41, +42 +], +"paper.js:src/event/Event.js": [ +25 +], +"paper.js:src/event/Key.js": [ +70, +71, +110, +111, +140, +145 +], +"paper.js:src/item/Item.js": [ +921, +946, +1000, +1001, +1003, +1082, +1196, +1351, +1377, +1529, +1540, +1552, +1563, +1678, +2107, +2279, +2280, +2307, +2309, +2479, +2517, +2567, +2692, +2792, +3589, +4297, +4486, +4823, +4824 +], +"paper.js:src/item/Project.js": [ +755 +], +"paper.js:src/item/Raster.js": [ +292, +325, +334, +427, +463, +554 +], +"paper.js:src/node/canvas.js": [ +44 +], +"paper.js:src/node/self.js": [ +20 +], +"paper.js:src/path/CompoundPath.js": [ +191, +203, +231, +243, +367, +376 +], +"paper.js:src/path/Curve.js": [ +298, +311 +], +"paper.js:src/path/CurveLocation.js": [ +132, +154, +166, +239, +297, +308, +524 +], +"paper.js:src/path/Path.Constructors.js": [ +25, +343 +], +"paper.js:src/path/Path.js": [ +176, +1046, +1047, +1183, +1186, +1191, +1194, +1228, +1302, +1833, +2299 +], +"paper.js:src/path/PathFitter.js": [ +31 +], +"paper.js:src/path/PathItem.Boolean.js": [ +88, +155, +200, +310, +418, +442, +919, +946, +959, +960, +1067, +1068, +1095, +1245, +1246, +1363 +], +"paper.js:src/path/PathItem.js": [ +134, +159, +165 +], +"paper.js:src/path/Segment.js": [ +387, +501 +], +"paper.js:src/style/Color.js": [ +675, +915 +], +"paper.js:src/style/Gradient.js": [ +101 +], +"paper.js:src/style/Style.js": [ +133, +165, +209, +232 +], +"paper.js:src/svg/SvgExport.js": [ +103, +385 +], +"paper.js:src/svg/SvgImport.js": [ +371, +506, +555, +556, +564, +611, +673 +], +"paper.js:src/view/CanvasView.js": [ +104 +], +"paper.js:src/view/View.js": [ +1055, +1325, +1345, +1472 +] +} diff --git a/its/ruling/src/test/expected/jsts/paper.js/javascript-S6594.json b/its/ruling/src/test/expected/jsts/paper.js/javascript-S6594.json new file mode 100644 index 00000000000..ef963c612e7 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/paper.js/javascript-S6594.json @@ -0,0 +1,8 @@ +{ +"paper.js:src/anim/Tween.js": [ +353 +], +"paper.js:src/view/View.js": [ +1083 +] +} diff --git a/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S3403.json b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S3403.json new file mode 100644 index 00000000000..925d9cd4afd --- /dev/null +++ b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S3403.json @@ -0,0 +1,5 @@ +{ +"react-cloud-music:src/api/utils.js": [ +59 +] +} diff --git a/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S3760.json b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S3760.json new file mode 100644 index 00000000000..2f71402ca89 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S3760.json @@ -0,0 +1,7 @@ +{ +"react-cloud-music:src/api/lyric-parser.js": [ +62, +65, +65 +] +} diff --git a/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S3800.json b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S3800.json new file mode 100644 index 00000000000..c52db8bb4bb --- /dev/null +++ b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S3800.json @@ -0,0 +1,8 @@ +{ +"react-cloud-music:src/api/utils.js": [ +49 +], +"react-cloud-music:ts-music/config/getHttpsConfig.js": [ +48 +] +} diff --git a/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S6582.json b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S6582.json index 8f13226a393..5d1de7128ac 100644 --- a/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S6582.json +++ b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S6582.json @@ -1,4 +1,34 @@ { +"react-cloud-music:scripts/build.js": [ +115 +], +"react-cloud-music:scripts/start.js": [ +141 +], +"react-cloud-music:src/application/Album/index.jsx": [ +44 +], +"react-cloud-music:src/application/Player/index.jsx": [ +95, +120 +], +"react-cloud-music:src/application/Rank/store/index.js": [ +17 +], +"react-cloud-music:src/application/Search/index.jsx": [ +91, +115 +], +"react-cloud-music:src/serviceWorker.js": [ +78, +88 +], +"react-cloud-music:ts-music/scripts/build.js": [ +125 +], +"react-cloud-music:ts-music/scripts/start.js": [ +162 +], "react-cloud-music:ts-music/src/serviceWorker.js": [ 78, 88 diff --git a/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S6594.json b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S6594.json index 821b1245cf4..adde4867457 100644 --- a/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S6594.json +++ b/its/ruling/src/test/expected/jsts/react-cloud-music/javascript-S6594.json @@ -1,4 +1,7 @@ { +"react-cloud-music:src/serviceWorker.js": [ +18 +], "react-cloud-music:ts-music/src/serviceWorker.js": [ 18 ] diff --git a/its/ruling/src/test/expected/jsts/rxjs/javascript-S3533.json b/its/ruling/src/test/expected/jsts/rxjs/javascript-S3533.json index 6ad40c647fd..1c79d7c15a5 100644 --- a/its/ruling/src/test/expected/jsts/rxjs/javascript-S3533.json +++ b/its/ruling/src/test/expected/jsts/rxjs/javascript-S3533.json @@ -43,6 +43,9 @@ "rxjs:perf/macro/mergeMap/mergemap.spec.js": [ 1 ], +"rxjs:perf/macro/perf-helpers.js": [ +1 +], "rxjs:perf/macro/specbuilder.js": [ 1 ], diff --git a/its/ruling/src/test/expected/jsts/rxjs/javascript-S6582.json b/its/ruling/src/test/expected/jsts/rxjs/javascript-S6582.json new file mode 100644 index 00000000000..4f6e586ee6a --- /dev/null +++ b/its/ruling/src/test/expected/jsts/rxjs/javascript-S6582.json @@ -0,0 +1,9 @@ +{ +"rxjs:doc/scripts/theme-toggler.js": [ +18, +25 +], +"rxjs:perf/micro/index.js": [ +157 +] +} diff --git a/its/ruling/src/test/expected/jsts/rxjs/javascript-S6594.json b/its/ruling/src/test/expected/jsts/rxjs/javascript-S6594.json new file mode 100644 index 00000000000..72a197c3a3d --- /dev/null +++ b/its/ruling/src/test/expected/jsts/rxjs/javascript-S6594.json @@ -0,0 +1,5 @@ +{ +"rxjs:doc/scripts/custom-manual-styles.js": [ +2 +] +} diff --git a/its/ruling/src/test/expected/jsts/searchkit/javascript-S6582.json b/its/ruling/src/test/expected/jsts/searchkit/javascript-S6582.json new file mode 100644 index 00000000000..9bd2764c038 --- /dev/null +++ b/its/ruling/src/test/expected/jsts/searchkit/javascript-S6582.json @@ -0,0 +1,19 @@ +{ +"searchkit:examples/next/components/geosearch-examples/Input.jsx": [ +50 +], +"searchkit:examples/next/components/geosearch-examples/maps.jsx": [ +67, +100, +147 +], +"searchkit:examples/next/pages/_app.jsx": [ +10 +], +"searchkit:examples/next/pages/graphql/index.jsx": [ +43 +], +"searchkit:examples/next/pages/index.jsx": [ +42 +] +} diff --git a/its/ruling/src/test/expected/jsts/searchkit/typescript-S2871.json b/its/ruling/src/test/expected/jsts/searchkit/typescript-S2871.json new file mode 100644 index 00000000000..afdd9253acd --- /dev/null +++ b/its/ruling/src/test/expected/jsts/searchkit/typescript-S2871.json @@ -0,0 +1,10 @@ +{ +"searchkit:packages/searchkit-sdk/tests/filters-facets/VisibleWhen.test.ts": [ +70, +70, +81, +82, +96, +96 +] +} diff --git a/its/ruling/src/test/expected/jsts/searchkit/typescript-S2933.json b/its/ruling/src/test/expected/jsts/searchkit/typescript-S2933.json index fc94b7668b0..24268e1143d 100644 --- a/its/ruling/src/test/expected/jsts/searchkit/typescript-S2933.json +++ b/its/ruling/src/test/expected/jsts/searchkit/typescript-S2933.json @@ -9,6 +9,11 @@ 24, 27 ], +"searchkit:packages/searchkit-schema/tests/support/server.ts": [ +54, +55, +56 +], "searchkit:packages/searchkit-sdk/src/facets/GeoDistanceOptionsFacet.ts": [ 21 ], diff --git a/its/ruling/src/test/expected/jsts/searchkit/typescript-S4325.json b/its/ruling/src/test/expected/jsts/searchkit/typescript-S4325.json index af432a37d3b..990286dda51 100644 --- a/its/ruling/src/test/expected/jsts/searchkit/typescript-S4325.json +++ b/its/ruling/src/test/expected/jsts/searchkit/typescript-S4325.json @@ -1,5 +1,9 @@ { "searchkit:packages/searchkit-sdk/src/core/RequestBodyBuilder.ts": [ 109 +], +"searchkit:packages/searchkit-sdk/tests/filters-facets/VisibleWhen.test.ts": [ +50, +67 ] } diff --git a/its/ruling/src/test/expected/jsts/vuetify/javascript-S2871.json b/its/ruling/src/test/expected/jsts/vuetify/javascript-S2871.json index 68239da7e97..b300ca1462f 100644 --- a/its/ruling/src/test/expected/jsts/vuetify/javascript-S2871.json +++ b/its/ruling/src/test/expected/jsts/vuetify/javascript-S2871.json @@ -1,5 +1,9 @@ { "vuetify:packages/docs/src/service-worker.js": [ 84 +], +"vuetify:packages/vuetify/build/rollup.config.js": [ +174, +292 ] } diff --git a/its/ruling/src/test/expected/jsts/vuetify/javascript-S6582.json b/its/ruling/src/test/expected/jsts/vuetify/javascript-S6582.json new file mode 100644 index 00000000000..94fd19dec2d --- /dev/null +++ b/its/ruling/src/test/expected/jsts/vuetify/javascript-S6582.json @@ -0,0 +1,8 @@ +{ +"vuetify:scripts/converter.js": [ +55 +], +"vuetify:scripts/rules/no-render-string-reference.js": [ +16 +] +} diff --git a/its/ruling/src/test/expected/jsts/vuetify/javascript-S6959.json b/its/ruling/src/test/expected/jsts/vuetify/javascript-S6959.json new file mode 100644 index 00000000000..53d8345d84d --- /dev/null +++ b/its/ruling/src/test/expected/jsts/vuetify/javascript-S6959.json @@ -0,0 +1,5 @@ +{ +"vuetify:ecosystem-win.config.js": [ +15 +] +} diff --git a/packages/jsts/src/analysis/analysis.ts b/packages/jsts/src/analysis/analysis.ts index f10618a2bfb..2d83e82aa6d 100644 --- a/packages/jsts/src/analysis/analysis.ts +++ b/packages/jsts/src/analysis/analysis.ts @@ -22,6 +22,7 @@ import { SymbolHighlight } from '../linter/visitors/symbol-highlighting.js'; import { Metrics } from '../linter/visitors/metrics/metrics.js'; import { CpdToken } from '../linter/visitors/cpd.js'; import { Issue } from '../linter/issues/issue.js'; +import type { Program } from 'typescript'; /** * @@ -49,7 +50,7 @@ export interface JsTsAnalysisInput extends AnalysisInput { ignoreHeaderComments?: boolean; allowTsParserJsFiles?: boolean; tsConfigs?: string[]; - programId?: string; + program?: Program; skipAst?: boolean; clearDependenciesCache?: boolean; } diff --git a/packages/jsts/src/analysis/projectAnalysis/analyzeProject.ts b/packages/jsts/src/analysis/projectAnalysis/analyzeProject.ts index e2a2d794964..eebc766ff06 100644 --- a/packages/jsts/src/analysis/projectAnalysis/analyzeProject.ts +++ b/packages/jsts/src/analysis/projectAnalysis/analyzeProject.ts @@ -58,6 +58,7 @@ export async function analyzeProject( const { rules, files, configuration = {}, bundles = [], rulesWorkdir } = input; const results: ProjectAnalysisOutput = { files: {}, + compilerOptions: [], meta: { warnings: [], }, diff --git a/packages/jsts/src/analysis/projectAnalysis/analyzeWithProgram.ts b/packages/jsts/src/analysis/projectAnalysis/analyzeWithProgram.ts index 341f6a8a503..dbe930e63c1 100644 --- a/packages/jsts/src/analysis/projectAnalysis/analyzeWithProgram.ts +++ b/packages/jsts/src/analysis/projectAnalysis/analyzeWithProgram.ts @@ -15,7 +15,7 @@ * along with this program; if not, see https://sonarsource.com/license/ssal/ */ import type { JsTsFiles, ProjectAnalysisOutput } from './projectAnalysis.js'; -import { createAndSaveProgram, deleteProgram } from '../../program/program.js'; +import { createProgram, createProgramFromSingleFile } from '../../program/program.js'; import { analyzeFile } from './analyzeFile.js'; import { error, info, warn } from '../../../../shared/src/helpers/logging.js'; import { fieldsForJsTsAnalysisInput } from '../../../../shared/src/helpers/configuration.js'; @@ -25,6 +25,8 @@ import { ProgressReport } from '../../../../shared/src/helpers/progress-report.j import { handleFileResult } from './handleFileResult.js'; import type { WsIncrementalResult } from '../../../../bridge/src/request.js'; import { isAnalysisCancelled } from './analyzeProject.js'; +import merge from 'lodash.merge'; +import { fillFileContent } from '../../../../shared/src/types/analysis.js'; /** * Analyzes JavaScript / TypeScript files using TypeScript programs. Files not @@ -49,7 +51,7 @@ export async function analyzeWithProgram( if (isAnalysisCancelled()) { return; } - await analyzeProgram( + await analyzeFilesFromTsConfig( files, tsConfig, results, @@ -62,9 +64,61 @@ export async function analyzeWithProgram( break; } } + + await analyzeFilesFromEntryPoint( + files, + results, + pendingFiles, + progressReport, + incrementalResultsChannel, + ); } -async function analyzeProgram( +async function analyzeFilesFromEntryPoint( + files: JsTsFiles, + results: ProjectAnalysisOutput, + pendingFiles: Set, + progressReport: ProgressReport, + incrementalResultsChannel?: (result: WsIncrementalResult) => void, +) { + const compilerOptions: ts.CompilerOptions = merge({}, ...results.compilerOptions); + + for (const pendingFile of pendingFiles) { + if (isAnalysisCancelled()) { + return; + } + if (!pendingFiles.has(pendingFile) || !files[pendingFile]) { + // pendingFiles is modified during the loop; when a file + // was already analyzed from another entry point, it gets removed + continue; + } + let program: ts.Program; + info(`Creating TypeScript(${ts.version}) program from entry point ${pendingFile}`); + try { + program = createProgramFromSingleFile( + pendingFile, + (await fillFileContent(files[pendingFile])).fileContent, + compilerOptions, + ); + } catch (e) { + error('Failed to create program: ' + e); + results.meta.warnings.push( + `Failed to create TypeScript program program from entry point ${pendingFile}.`, + ); + return; + } + await analyzeProgram( + program, + files, + results, + pendingFiles, + progressReport, + incrementalResultsChannel, + ); + } +} + +async function analyzeFilesFromTsConfig( files: JsTsFiles, tsConfig: string, results: ProjectAnalysisOutput, @@ -77,16 +131,10 @@ async function analyzeProgram( return; } processedTSConfigs.add(tsConfig); - info('Creating TypeScript program'); - info(`TypeScript(${ts.version}) configuration file ${tsConfig}`); - let filenames, programId, projectReferences, missingTsConfig; + info(`Creating TypeScript(${ts.version}) program with configuration file ${tsConfig}`); + let program, projectReferences, missingTsConfig; try { - ({ - files: filenames, - programId, - projectReferences, - missingTsConfig, - } = createAndSaveProgram(tsConfig)); + ({ program, projectReferences, missingTsConfig } = createProgram(tsConfig)); } catch (e) { error('Failed to create program: ' + e); results.meta.warnings.push( @@ -94,35 +142,28 @@ async function analyzeProgram( ); return; } + results.compilerOptions.push(program.getCompilerOptions()); if (missingTsConfig) { const msg = "At least one referenced/extended tsconfig.json was not found in the project. Please run 'npm install' for a more complete analysis. Check analysis logs for more details."; warn(msg); results.meta.warnings.push(msg); } - for (const filename of filenames) { - if (isAnalysisCancelled()) { - return; - } - // only analyze files which are requested - if (files[filename] && pendingFiles.has(filename)) { - progressReport.nextFile(filename); - const result = await analyzeFile({ - ...files[filename], - programId, - ...fieldsForJsTsAnalysisInput(), - }); - pendingFiles.delete(filename); - handleFileResult(result, filename, results, incrementalResultsChannel); - } - } - deleteProgram(programId); + + await analyzeProgram( + program, + files, + results, + pendingFiles, + progressReport, + incrementalResultsChannel, + ); for (const reference of projectReferences) { if (isAnalysisCancelled()) { return; } - await analyzeProgram( + await analyzeFilesFromTsConfig( files, reference, results, @@ -133,3 +174,30 @@ async function analyzeProgram( ); } } + +async function analyzeProgram( + program: ts.Program, + files: JsTsFiles, + results: ProjectAnalysisOutput, + pendingFiles: Set, + progressReport: ProgressReport, + incrementalResultsChannel?: (result: WsIncrementalResult) => void, +) { + for (const { fileName } of program.getSourceFiles()) { + if (isAnalysisCancelled()) { + return; + } + + // only analyze files which are requested + if (files[fileName] && pendingFiles.has(fileName)) { + progressReport.nextFile(fileName); + const result = await analyzeFile({ + ...files[fileName], + program, + ...fieldsForJsTsAnalysisInput(), + }); + pendingFiles.delete(fileName); + handleFileResult(result, fileName, results, incrementalResultsChannel); + } + } +} diff --git a/packages/jsts/src/analysis/projectAnalysis/projectAnalysis.ts b/packages/jsts/src/analysis/projectAnalysis/projectAnalysis.ts index f2a1569f8df..8d45332b2b7 100644 --- a/packages/jsts/src/analysis/projectAnalysis/projectAnalysis.ts +++ b/packages/jsts/src/analysis/projectAnalysis/projectAnalysis.ts @@ -14,11 +14,16 @@ * You should have received a copy of the Sonar Source-Available License * along with this program; if not, see https://sonarsource.com/license/ssal/ */ -import { JsTsAnalysisInput, JsTsAnalysisOutput, JsTsAnalysisOutputWithAst } from '../analysis.js'; -import { RuleConfig } from '../../linter/config/rule-config.js'; -import { EmbeddedAnalysisOutput } from '../../embedded/analysis/analysis.js'; -import { ErrorCode } from '../../../../shared/src/errors/error.js'; -import { Configuration } from '../../../../shared/src/helpers/configuration.js'; +import type { + JsTsAnalysisInput, + JsTsAnalysisOutput, + JsTsAnalysisOutputWithAst, +} from '../analysis.js'; +import type { RuleConfig } from '../../linter/config/rule-config.js'; +import type { EmbeddedAnalysisOutput } from '../../embedded/analysis/analysis.js'; +import type { ErrorCode } from '../../../../shared/src/errors/error.js'; +import type { Configuration } from '../../../../shared/src/helpers/configuration.js'; +import type { CompilerOptions } from 'typescript'; export type ProjectAnalysisMeta = { warnings: string[]; @@ -27,6 +32,7 @@ export type ProjectAnalysisMeta = { export type ProjectAnalysisOutput = { files: { [key: string]: FileResult }; meta: ProjectAnalysisMeta; + compilerOptions: CompilerOptions[]; }; export type FileResult = diff --git a/packages/jsts/src/builders/build.ts b/packages/jsts/src/builders/build.ts index b35ef3acca3..8a6cf72934f 100644 --- a/packages/jsts/src/builders/build.ts +++ b/packages/jsts/src/builders/build.ts @@ -19,7 +19,6 @@ import { CompleteJsTsAnalysisInput, JsTsAnalysisInput } from '../analysis/analys import { buildParserOptions } from '../parsers/options.js'; import { parse } from '../parsers/parse.js'; import { Parser, parsersMap } from '../parsers/eslint.js'; -import { getProgramById } from '../program/program.js'; import { Linter } from 'eslint'; /** @@ -43,7 +42,7 @@ export function build(input: CompleteJsTsAnalysisInput) { parser: vueFile ? parsersMap.typescript : undefined, }; if (!vueFile) { - options.programs = input.programId && [getProgramById(input.programId)]; + options.programs = input.program ? [input.program] : undefined; options.project = input.tsConfigs; } try { diff --git a/packages/jsts/src/program/program.ts b/packages/jsts/src/program/program.ts index 626887de793..3ac67bbb2bc 100644 --- a/packages/jsts/src/program/program.ts +++ b/packages/jsts/src/program/program.ts @@ -18,7 +18,7 @@ * This file provides an API to take control over TypeScript's Program instances * in the context of program-based analysis for JavaScript / TypeScript. * - * A TypeScript's Program instance is used by TypeScript ESLint parser in order + * A TypeScript's Program instance is used by TypeScript ESLint parser * to make available TypeScript's type checker for rules willing to use type * information for the sake of precision. It works similarly as using TSConfigs * except it gives the control over the lifecycle of this internal data structure @@ -27,7 +27,7 @@ import path from 'node:path'; import ts from 'typescript'; -import { debug, error, warn } from '../../../shared/src/helpers/logging.js'; +import { error, warn } from '../../../shared/src/helpers/logging.js'; import { readFileSync, toUnixPath, @@ -35,18 +35,29 @@ import { } from '../../../shared/src/helpers/files.js'; type ProgramResult = { - files: string[]; projectReferences: string[]; missingTsConfig: boolean; program: ts.Program; - programId?: string; +}; + +const defaultCompilerOptions: ts.CompilerOptions = { + target: ts.ScriptTarget.ESNext, + module: ts.ModuleKind.ESNext, + moduleResolution: ts.ModuleResolutionKind.NodeNext, + lib: ['esnext', 'DOM'], + strict: true, + esModuleInterop: true, + skipLibCheck: true, + allowSyntheticDefaultImports: true, + allowJs: true, + checkJs: true, }; /** * Gets the files resolved by a TSConfig * * The resolving of the files for a given TSConfig file is done - * by invoking TypeScript compiler. + * by invoking the TypeScript compiler. * * @param tsConfig TSConfig to parse * @param tsconfigContents TSConfig contents that we want to provide to TSConfig @@ -157,74 +168,41 @@ export function createProgram(tsConfig: string, tsconfigContents?: string): Prog warn(`Skipping missing referenced tsconfig.json: ${reference.path}`); } } - const files = program - .getSourceFiles() - .map(sourceFile => sourceFile.fileName) - .filter(exceptions); return { - files, projectReferences, missingTsConfig: programOptions.missingTsConfig, program, }; } -/** - * A cache of created TypeScript's Program instances - * - * It associates a program identifier to an instance of a TypeScript's Program. - */ -const programs = new Map(); - -/** - * A counter of created TypeScript's Program instances - */ -let programCount = 0; - -/** - * Computes the next identifier available for a TypeScript's Program. - * @returns - */ -function nextId() { - programCount++; - return programCount.toString(); -} - -/** - * Creates a TypeScript's Program instance and saves it in memory - * - * To be removed once Java part does not handle program creation - */ -export function createAndSaveProgram(tsConfig: string): ProgramResult & { programId: string } { - const program = createProgram(tsConfig); - - const programId = nextId(); - programs.set(programId, program.program); - debug(`program from ${tsConfig} with id ${programId} is created`); - return { ...program, programId }; -} - -/** - * Gets an existing TypeScript's Program by its identifier - * @param programId the identifier of the TypeScript's Program to retrieve - * @throws a runtime error if there is no such program - * @returns the retrieved TypeScript's Program - */ -export function getProgramById(programId: string): ts.Program { - const program = programs.get(programId); - if (!program) { - throw new Error(`Failed to find program ${programId}`); - } - return program; -} - -/** - * Deletes an existing TypeScript's Program by its identifier - * @param programId the identifier of the TypeScript's Program to delete - */ -export function deleteProgram(programId: string): void { - programs.delete(programId); +export function createProgramFromSingleFile( + fileName: string, + contents: string, + compilerOptions: ts.CompilerOptions = defaultCompilerOptions, +) { + const compilerHost = ts.createCompilerHost(compilerOptions); + const target = compilerOptions.target ?? ts.ScriptTarget.ESNext; + + // Create a virtual file system with our source code + const sourceFile = ts.createSourceFile(fileName, contents, target, true); + + // Create program + return ts.createProgram({ + rootNames: [fileName], + options: compilerOptions, + host: { + ...compilerHost, + getSourceFile: (name: string) => { + if (name === fileName) { + return sourceFile; + } + return compilerHost.getSourceFile(name, target); + }, + fileExists: (name: string) => name === fileName || ts.sys.fileExists(name), + readFile: (name: string) => (name === fileName ? contents : ts.sys.readFile(name)), + }, + }); } function diagnosticToString(diagnostic: ts.Diagnostic): string { @@ -274,15 +252,3 @@ export function isRootNodeModules(file: string) { const topNodeModules = toUnixPath(path.resolve(path.join(root, 'node_modules'))); return normalizedFile.startsWith(topNodeModules); } - -function exceptions(filename: string) { - const { dir, ext } = path.parse(filename); - - /* JSON files */ - if (ext === '.json') { - return false; - } - - /* Node modules */ - return !toUnixPath(dir).split('/').includes('node_modules'); -} diff --git a/packages/jsts/tests/analysis/analyzeProject.test.ts b/packages/jsts/tests/analysis/analyzeProject.test.ts index 3fe84f24bc6..960ae8f471f 100644 --- a/packages/jsts/tests/analysis/analyzeProject.test.ts +++ b/packages/jsts/tests/analysis/analyzeProject.test.ts @@ -60,7 +60,11 @@ describe('analyzeProject', () => { }); const consoleLogMock = (console.log as Mock).mock; const result = await analyzeProject(prepareInput(fixtures, files)); - assert(consoleLogMock.calls.some(call => call.arguments[0] === 'Creating TypeScript program')); + assert( + consoleLogMock.calls.some(call => + /Creating TypeScript\(\d\.\d\.\d\) program/.test(call.arguments[0]), + ), + ); expect(result).toBeDefined(); expect(result.files[toUnixPath(join(fixtures, 'parsing-error.js'))]).toMatchObject({ @@ -131,6 +135,7 @@ describe('analyzeProject', () => { const baseDir = join(fixtures, 'empty-folder'); const result = await analyzeProject(prepareInput(baseDir, {})); expect(result).toEqual({ + compilerOptions: [], files: {}, meta: { warnings: [], diff --git a/packages/jsts/tests/analysis/analyzer.test.ts b/packages/jsts/tests/analysis/analyzer.test.ts index 424d90bac40..c2850cddc48 100644 --- a/packages/jsts/tests/analysis/analyzer.test.ts +++ b/packages/jsts/tests/analysis/analyzer.test.ts @@ -23,7 +23,7 @@ import { analyzeJSTS } from '../../src/analysis/analyzer.js'; import { APIError } from '../../../shared/src/errors/error.js'; import type { RuleConfig } from '../../src/linter/config/rule-config.js'; import { Linter } from '../../src/linter/linter.js'; -import { createAndSaveProgram } from '../../src/program/program.js'; +import { createProgram } from '../../src/program/program.js'; import { deserializeProtobuf } from '../../src/parsers/ast.js'; import { jsTsInput } from '../tools/helpers/input.js'; import { parseJavaScriptSourceFile } from '../tools/helpers/parsing.js'; @@ -308,12 +308,12 @@ describe('await analyzeJSTS', () => { await Linter.initialize({ baseDir: path.dirname(filePath), rules }); const tsConfig = path.join(currentPath, 'fixtures', 'tsconfig.json'); - const { programId } = createAndSaveProgram(tsConfig); + const { program } = createProgram(tsConfig); const language = 'ts'; const { issues: [issue], - } = await analyzeJSTS(await jsTsInput({ filePath, programId, language })); + } = await analyzeJSTS(await jsTsInput({ filePath, program, language })); expect(issue).toEqual( expect.objectContaining({ ruleId: 'S2870', @@ -335,12 +335,12 @@ describe('await analyzeJSTS', () => { await Linter.initialize({ baseDir: path.dirname(filePath), rules }); const tsConfig = path.join(currentPath, 'fixtures', 'paths', 'tsconfig.json'); - const { programId } = createAndSaveProgram(tsConfig); + const { program } = createProgram(tsConfig); const language = 'ts'; const { issues: [issue], - } = await analyzeJSTS(await jsTsInput({ filePath, programId, language })); + } = await analyzeJSTS(await jsTsInput({ filePath, program, language })); expect(issue).toEqual( expect.objectContaining({ ruleId: 'S3003', @@ -362,10 +362,10 @@ describe('await analyzeJSTS', () => { await Linter.initialize({ baseDir: path.dirname(filePath), rules }); const tsConfig = path.join(currentPath, 'fixtures', 'paths', 'tsconfig_no_paths.json'); - const { programId } = createAndSaveProgram(tsConfig); + const { program } = createProgram(tsConfig); const language = 'ts'; - const { issues } = await analyzeJSTS(await jsTsInput({ filePath, programId, language })); + const { issues } = await analyzeJSTS(await jsTsInput({ filePath, program, language })); expect(issues).toHaveLength(0); }); @@ -403,15 +403,14 @@ describe('await analyzeJSTS', () => { const classicDependencyPath = path.join(currentPath, 'fixtures', 'module', 'string42.ts'); const nodeTsConfig = path.join(currentPath, 'fixtures', 'module', 'tsconfig_commonjs.json'); - const nodeProgram = createAndSaveProgram(nodeTsConfig); - expect(nodeProgram.files).not.toContain(toUnixPath(nodeDependencyPath)); - expect(nodeProgram.files).not.toContain(toUnixPath(nodenextDependencyPath)); - expect(nodeProgram.files).not.toContain(toUnixPath(classicDependencyPath)); + const nodeProgram = createProgram(nodeTsConfig); + const nodeFiles = nodeProgram.program.getSourceFiles().map(file => file.fileName); + expect(nodeFiles).toContain(toUnixPath(nodeDependencyPath)); + expect(nodeFiles).not.toContain(toUnixPath(nodenextDependencyPath)); + expect(nodeFiles).not.toContain(toUnixPath(classicDependencyPath)); const { issues: [nodeIssue], - } = await analyzeJSTS( - await jsTsInput({ filePath, programId: nodeProgram.programId, language }), - ); + } = await analyzeJSTS(await jsTsInput({ filePath, program: nodeProgram.program, language })); expect(nodeIssue).toEqual( expect.objectContaining({ ruleId: 'S3003', @@ -419,14 +418,15 @@ describe('await analyzeJSTS', () => { ); const nodenextTsConfig = path.join(currentPath, 'fixtures', 'module', 'tsconfig_nodenext.json'); - const nodenextProgram = createAndSaveProgram(nodenextTsConfig); - expect(nodenextProgram.files).not.toContain(toUnixPath(nodeDependencyPath)); - expect(nodenextProgram.files).not.toContain(toUnixPath(nodenextDependencyPath)); - expect(nodenextProgram.files).not.toContain(toUnixPath(classicDependencyPath)); + const nodenextProgram = createProgram(nodenextTsConfig); + const nodenextFiles = nodenextProgram.program.getSourceFiles().map(file => file.fileName); + expect(nodenextFiles).not.toContain(toUnixPath(nodeDependencyPath)); + expect(nodenextFiles).toContain(toUnixPath(nodenextDependencyPath)); + expect(nodenextFiles).not.toContain(toUnixPath(classicDependencyPath)); const { issues: [nodenextIssue], } = await analyzeJSTS( - await jsTsInput({ filePath, programId: nodenextProgram.programId, language }), + await jsTsInput({ filePath, program: nodenextProgram.program, language }), ); expect(nodenextIssue).toEqual( expect.objectContaining({ @@ -435,15 +435,14 @@ describe('await analyzeJSTS', () => { ); const classicTsConfig = path.join(currentPath, 'fixtures', 'module', 'tsconfig_esnext.json'); - const classicProgram = createAndSaveProgram(classicTsConfig); - expect(classicProgram.files).not.toContain(toUnixPath(nodeDependencyPath)); - expect(classicProgram.files).not.toContain(toUnixPath(nodenextDependencyPath)); - expect(classicProgram.files).toContain(toUnixPath(classicDependencyPath)); + const classicProgram = createProgram(classicTsConfig); + const classicFiles = classicProgram.program.getSourceFiles().map(file => file.fileName); + expect(classicFiles).not.toContain(toUnixPath(nodeDependencyPath)); + expect(classicFiles).not.toContain(toUnixPath(nodenextDependencyPath)); + expect(classicFiles).toContain(toUnixPath(classicDependencyPath)); const { issues: [classicIssue], - } = await analyzeJSTS( - await jsTsInput({ filePath, programId: classicProgram.programId, language }), - ); + } = await analyzeJSTS(await jsTsInput({ filePath, program: classicProgram.program, language })); expect(classicIssue).toEqual( expect.objectContaining({ ruleId: 'S3003', diff --git a/packages/jsts/tests/parsers/options.test.ts b/packages/jsts/tests/parsers/options.test.ts index a5d0ccf5478..9e7b5017a19 100644 --- a/packages/jsts/tests/parsers/options.test.ts +++ b/packages/jsts/tests/parsers/options.test.ts @@ -17,7 +17,7 @@ import path from 'node:path'; import { describe, it } from 'node:test'; import { expect } from 'expect'; -import { createAndSaveProgram, getProgramById } from '../../src/program/program.js'; +import { createProgram } from '../../src/program/program.js'; import { buildParserOptions } from '../../src/parsers/options.js'; describe('buildParserOptions', () => { @@ -75,8 +75,7 @@ describe('buildParserOptions', () => { it('should build parser options with TypeScript program', () => { const tsConfig = path.join(import.meta.dirname, 'fixtures', 'options', 'tsconfig.json'); - const { programId } = createAndSaveProgram(tsConfig); - const program = getProgramById(programId); + const program = createProgram(tsConfig); const filePath = '/tmp/dir'; expect(buildParserOptions({ filePath, programs: [program] })).toEqual( diff --git a/packages/jsts/tests/program/program.test.ts b/packages/jsts/tests/program/program.test.ts index 69c34fc8ed8..0d00b222723 100644 --- a/packages/jsts/tests/program/program.test.ts +++ b/packages/jsts/tests/program/program.test.ts @@ -20,11 +20,8 @@ import { isRoot, toUnixPath } from '../../src/rules/helpers/index.js'; import { describe, it, type Mock } from 'node:test'; import { expect } from 'expect'; import { - createAndSaveProgram, createProgram, createProgramOptions, - deleteProgram, - getProgramById, isRootNodeModules, } from '../../src/program/program.js'; @@ -34,9 +31,10 @@ describe('program', () => { const reference = path.join(fixtures, 'reference'); const tsConfig = path.join(fixtures, 'tsconfig.json'); - const { programId, files, projectReferences } = createAndSaveProgram(tsConfig); + const { program, projectReferences } = createProgram(tsConfig); + const files = program.getSourceFiles().map(f => f.fileName); - expect(programId).toBeDefined(); + expect(program).toBeDefined(); expect(files).toContain(toUnixPath(path.join(fixtures, 'file.ts'))); // behavior changed in TS 5.5, program will no longer include files from referenced projects expect(files).not.toContain(toUnixPath(path.join(reference, 'file.ts'))); @@ -48,10 +46,12 @@ describe('program', () => { const fixtures = path.join(import.meta.dirname, 'fixtures'); const tsConfig = path.join(fixtures, `tsconfig_missing_reference.json`); - const { programId, files, projectReferences, missingTsConfig } = createAndSaveProgram(tsConfig); + const { program, projectReferences, missingTsConfig } = createProgram(tsConfig); - expect(programId).toBeDefined(); - expect(files).toEqual(expect.arrayContaining([toUnixPath(path.join(fixtures, 'file.ts'))])); + expect(program).toBeDefined(); + expect(program.getSourceFiles().map(f => f.fileName)).toEqual( + expect.arrayContaining([toUnixPath(path.join(fixtures, 'file.ts'))]), + ); expect(projectReferences).toEqual([]); expect(missingTsConfig).toBe(false); }); @@ -70,10 +70,12 @@ describe('program', () => { const fixtures = path.join(import.meta.dirname, 'fixtures'); const tsConfig = path.join(fixtures, 'tsconfig_missing.json'); - const { programId, files, projectReferences, missingTsConfig } = createAndSaveProgram(tsConfig); + const { program, projectReferences, missingTsConfig } = createProgram(tsConfig); - expect(programId).toBeDefined(); - expect(files).toEqual(expect.arrayContaining([toUnixPath(path.join(fixtures, 'file.ts'))])); + expect(program).toBeDefined(); + expect(program.getSourceFiles().map(f => f.fileName)).toEqual( + expect.arrayContaining([toUnixPath(path.join(fixtures, 'file.ts'))]), + ); expect(projectReferences).toEqual([]); expect(missingTsConfig).toBe(true); }); @@ -164,36 +166,6 @@ describe('program', () => { } }); - it('should find an existing program', () => { - const fixtures = path.join(import.meta.dirname, 'fixtures'); - const tsConfig = path.join(fixtures, 'tsconfig.json'); - const { programId, files } = createAndSaveProgram(tsConfig); - - const program = getProgramById(programId); - - expect(program.getCompilerOptions().configFilePath).toEqual(toUnixPath(tsConfig)); - // behavior in TS 5.5 changed, program will no longer include files from referenced projects - expect(program.getSourceFiles().map(s => s.fileName)).toEqual( - expect.arrayContaining( - files.map(toUnixPath).filter(file => file.startsWith(toUnixPath(fixtures))), - ), - ); - }); - - it('should fail finding a non-existing program', () => { - const programId = '$#&/()=?!£@~+°'; - expect(() => getProgramById(programId)).toThrow(`Failed to find program ${programId}`); - }); - - it('should delete a program', () => { - const fixtures = path.join(import.meta.dirname, 'fixtures'); - const tsConfig = path.join(fixtures, 'tsconfig.json'); - const { programId } = createAndSaveProgram(tsConfig); - - deleteProgram(programId); - expect(() => getProgramById(programId)).toThrow(`Failed to find program ${programId}`); - }); - it('should return files', () => { const result = createProgramOptions('tsconfig.json', '{ "files": ["/foo/file.ts"] }'); expect(result).toMatchObject({ @@ -229,7 +201,9 @@ describe('program', () => { expect(files).toContain(mainFile); expect(files).not.toContain(dependencyPath); - files = createProgram(tsConfig).files; + files = createProgram(tsConfig) + .program.getSourceFiles() + .map(f => f.fileName); expect(files).toContain(mainFile); expect(files).toContain(dependencyPath); }); @@ -244,18 +218,4 @@ describe('program', () => { }), ); }); - - it('should filter out JSON files on program creation', () => { - const fixtures = toUnixPath(path.join(import.meta.dirname, 'fixtures', 'json')); - const tsConfig = toUnixPath(path.join(fixtures, 'tsconfig.json')); - const { files } = createProgram(tsConfig); - expect(files.some(file => file.endsWith('.json'))).toBe(false); - }); - - it('should filter out node modules on program creation', () => { - const fixtures = toUnixPath(path.join(import.meta.dirname, 'fixtures', 'node')); - const tsConfig = toUnixPath(path.join(fixtures, 'tsconfig.json')); - const { files } = createProgram(tsConfig); - expect(files).toEqual([toUnixPath(path.join(fixtures, 'file.ts'))]); - }); }); diff --git a/packages/jsts/tests/rules/helpers/type.test.ts b/packages/jsts/tests/rules/helpers/type.test.ts index 377d2783281..76c22462543 100644 --- a/packages/jsts/tests/rules/helpers/type.test.ts +++ b/packages/jsts/tests/rules/helpers/type.test.ts @@ -17,47 +17,18 @@ import { describe, it } from 'node:test'; import { expect } from 'expect'; -import * as ts from 'typescript'; import { parseForESLint } from '@typescript-eslint/parser'; import { RequiredParserServices, typeHasMethod } from '../../../src/rules/helpers/index.js'; +import { createProgramFromSingleFile } from '../../../src/program/program.js'; // Helper function to create a TypeScript program and services from source code function createProgramFromSource(sourceCode: string): { services: RequiredParserServices; - sourceFile: ts.SourceFile; ast: any; } { - const compilerOptions: ts.CompilerOptions = { - target: ts.ScriptTarget.ES2020, - module: ts.ModuleKind.ESNext, - moduleResolution: ts.ModuleResolutionKind.Node10, - lib: ['ES2020', 'DOM'], - strict: true, - esModuleInterop: true, - skipLibCheck: true, - allowSyntheticDefaultImports: true, - }; - - const compilerHost = ts.createCompilerHost(compilerOptions); - // Create a virtual file system with our source code const fileName = 'test.ts'; - const sourceFile = ts.createSourceFile(fileName, sourceCode, ts.ScriptTarget.ES2020, true); - - // Create program - const program = ts.createProgram({ - rootNames: [fileName], - options: compilerOptions, - host: { - ...compilerHost, - getSourceFile: (name: string) => { - if (name === fileName) return sourceFile; - return compilerHost.getSourceFile(name, ts.ScriptTarget.ES2020); - }, - fileExists: (name: string) => name === fileName || ts.sys.fileExists(name), - readFile: (name: string) => (name === fileName ? sourceCode : ts.sys.readFile(name)), - }, - }); + const program = createProgramFromSingleFile(fileName, sourceCode); // Parse with TypeScript ESLint parser const parseResult = parseForESLint(sourceCode, { @@ -77,7 +48,6 @@ function createProgramFromSource(sourceCode: string): { return { services: parseResult.services as RequiredParserServices, - sourceFile, ast: parseResult.ast, }; } diff --git a/packages/jsts/tests/tools/helpers/input.ts b/packages/jsts/tests/tools/helpers/input.ts index 963737a5656..aaac21723e2 100644 --- a/packages/jsts/tests/tools/helpers/input.ts +++ b/packages/jsts/tests/tools/helpers/input.ts @@ -25,7 +25,7 @@ export async function jsTsInput(input: allOptional): Promise