diff --git a/README.md b/README.md index 87d38e709..a1ccf587e 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ Subsequence Match Merging --neighbor-length= Minimal length of neighboring matches to be merged (between 1 and minTokenMatch, default: 2). -Subcommands (supported languages): +Languages: c cpp csharp diff --git a/cli/src/main/java/de/jplag/cli/JPlagRunner.java b/cli/src/main/java/de/jplag/cli/JPlagRunner.java index ee47fdba4..3346eec62 100644 --- a/cli/src/main/java/de/jplag/cli/JPlagRunner.java +++ b/cli/src/main/java/de/jplag/cli/JPlagRunner.java @@ -43,7 +43,11 @@ public static void runInternalServer(File zipFile, int port) throws IOException ReportViewer reportViewer = new ReportViewer(zipFile, port); int actualPort = reportViewer.start(); logger.info("ReportViewer started on port http://localhost:{}", actualPort); - Desktop.getDesktop().browse(URI.create("http://localhost:" + actualPort + "/")); + if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { + Desktop.getDesktop().browse(URI.create("http://localhost:" + actualPort + "/")); + } else { + logger.info("Could not open browser. You can open the Report Viewer here: http://localhost:{}/", actualPort); + } System.out.println("Press Enter key to exit..."); System.in.read(); diff --git a/cli/src/main/java/de/jplag/cli/picocli/CliInputHandler.java b/cli/src/main/java/de/jplag/cli/picocli/CliInputHandler.java index 77389f3f3..4bc388a35 100644 --- a/cli/src/main/java/de/jplag/cli/picocli/CliInputHandler.java +++ b/cli/src/main/java/de/jplag/cli/picocli/CliInputHandler.java @@ -1,5 +1,6 @@ package de.jplag.cli.picocli; +import static picocli.CommandLine.Model.UsageMessageSpec.SECTION_KEY_COMMAND_LIST_HEADING; import static picocli.CommandLine.Model.UsageMessageSpec.SECTION_KEY_DESCRIPTION_HEADING; import static picocli.CommandLine.Model.UsageMessageSpec.SECTION_KEY_OPTION_LIST; import static picocli.CommandLine.Model.UsageMessageSpec.SECTION_KEY_SYNOPSIS; @@ -70,6 +71,7 @@ private CommandLine buildCommandLine() { } return it; }).collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator()); + cli.getHelpSectionMap().put(SECTION_KEY_COMMAND_LIST_HEADING, help -> "Languages:" + System.lineSeparator()); buildSubcommands().forEach(cli::addSubcommand); diff --git a/cli/src/main/java/de/jplag/cli/server/ReportViewer.java b/cli/src/main/java/de/jplag/cli/server/ReportViewer.java index 09d88857f..32be96485 100644 --- a/cli/src/main/java/de/jplag/cli/server/ReportViewer.java +++ b/cli/src/main/java/de/jplag/cli/server/ReportViewer.java @@ -59,12 +59,14 @@ public int start() throws IOException { throw new IllegalStateException("Server already started"); } + System.setProperty("java.net.preferIPv4Stack", "true"); + int currentPort = this.port; int remainingLookups = MAX_PORT_LOOKUPS; BindException lastException = new BindException("Could not create server. Probably due to no free port found."); while (server == null && remainingLookups-- > 0) { try { - server = HttpServer.create(new InetSocketAddress(InetAddress.getLoopbackAddress(), currentPort), 0); + server = HttpServer.create(new InetSocketAddress(InetAddress.getByAddress(new byte[] {127, 0, 0, 1}), currentPort), 0); } catch (BindException e) { logger.info("Port {} is not available. Trying to find a different one.", currentPort); lastException = e; diff --git a/core/pom.xml b/core/pom.xml index 0d1f9480c..bcdbe8d7f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -37,6 +37,12 @@ ${revision} test + + io.soabase.record-builder + record-builder-processor + 42 + provided + @@ -46,5 +52,15 @@ src/main/resources + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.7.0 + + src/main/java;target/generated-sources/annotations + + + diff --git a/core/src/main/java/de/jplag/options/JPlagOptions.java b/core/src/main/java/de/jplag/options/JPlagOptions.java index 7dd35c066..aad3fa74e 100644 --- a/core/src/main/java/de/jplag/options/JPlagOptions.java +++ b/core/src/main/java/de/jplag/options/JPlagOptions.java @@ -3,8 +3,6 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -25,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.soabase.recordbuilder.core.RecordBuilder; /** * This record defines the options to configure {@link JPlag}. @@ -49,6 +48,7 @@ * @param clusteringOptions Clustering options * @param debugParser If true, submissions that cannot be parsed will be stored in a separate directory. */ +@RecordBuilder() public record JPlagOptions(@JsonSerialize(using = LanguageSerializer.class) Language language, @JsonProperty("min_token_match") Integer minimumTokenMatch, @JsonProperty("submission_directories") Set submissionDirectories, @JsonProperty("old_directories") Set oldSubmissionDirectories, @JsonProperty("base_directory") File baseCodeSubmissionDirectory, @@ -56,15 +56,24 @@ public record JPlagOptions(@JsonSerialize(using = LanguageSerializer.class) Lang @JsonProperty("exclusion_file_name") String exclusionFileName, @JsonProperty("similarity_metric") SimilarityMetric similarityMetric, @JsonProperty("similarity_threshold") double similarityThreshold, @JsonProperty("max_comparisons") int maximumNumberOfComparisons, @JsonProperty("cluster") ClusteringOptions clusteringOptions, boolean debugParser, @JsonProperty("merging") MergingOptions mergingOptions, - @JsonProperty("normalize") boolean normalize) { + @JsonProperty("normalize") boolean normalize) implements JPlagOptionsBuilder.With { public static final double DEFAULT_SIMILARITY_THRESHOLD = 0; public static final int DEFAULT_SHOWN_COMPARISONS = 500; public static final int SHOW_ALL_COMPARISONS = 0; public static final SimilarityMetric DEFAULT_SIMILARITY_METRIC = SimilarityMetric.AVG; - public static final Charset CHARSET = StandardCharsets.UTF_8; public static final String ERROR_FOLDER = "errors"; + /** + * @param lang The new language + * @return The modified options + * @deprecated Use withLanguage instead + */ + @Deprecated(forRemoval = true) + public JPlagOptions withLanguageOption(Language lang) { + return this.withLanguage(lang); + } + private static final Logger logger = LoggerFactory.getLogger(JPlagOptions.class); public JPlagOptions(Language language, Set submissionDirectories, Set oldSubmissionDirectories) { @@ -93,96 +102,6 @@ public JPlagOptions(Language language, Integer minimumTokenMatch, Set subm this.normalize = normalize; } - public JPlagOptions withLanguageOption(Language language) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withDebugParser(boolean debugParser) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withFileSuffixes(List fileSuffixes) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withSimilarityThreshold(double similarityThreshold) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withMaximumNumberOfComparisons(int maximumNumberOfComparisons) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withSimilarityMetric(SimilarityMetric similarityMetric) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withMinimumTokenMatch(Integer minimumTokenMatch) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withExclusionFileName(String exclusionFileName) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withSubmissionDirectories(Set submissionDirectories) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withOldSubmissionDirectories(Set oldSubmissionDirectories) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withBaseCodeSubmissionDirectory(File baseCodeSubmissionDirectory) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withSubdirectoryName(String subdirectoryName) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withClusteringOptions(ClusteringOptions clusteringOptions) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withMergingOptions(MergingOptions mergingOptions) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - - public JPlagOptions withNormalize(boolean normalize) { - return new JPlagOptions(language, minimumTokenMatch, submissionDirectories, oldSubmissionDirectories, baseCodeSubmissionDirectory, - subdirectoryName, fileSuffixes, exclusionFileName, similarityMetric, similarityThreshold, maximumNumberOfComparisons, - clusteringOptions, debugParser, mergingOptions, normalize); - } - public boolean hasBaseCode() { return baseCodeSubmissionDirectory != null; } diff --git a/core/src/test/java/de/jplag/options/JPlagOptionsTest.java b/core/src/test/java/de/jplag/options/JPlagOptionsTest.java new file mode 100644 index 000000000..90bb54c15 --- /dev/null +++ b/core/src/test/java/de/jplag/options/JPlagOptionsTest.java @@ -0,0 +1,20 @@ +package de.jplag.options; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Set; + +import org.junit.jupiter.api.Test; + +import de.jplag.java.JavaLanguage; + +class JPlagOptionsTest { + @Test + void testWithLanguageOption() { + JavaLanguage lang = new JavaLanguage(); + JPlagOptions options = new JPlagOptions(null, Set.of(), Set.of()); + options = options.withLanguageOption(lang); + + assertEquals(lang, options.language()); + } +} diff --git a/language-antlr-utils/src/main/java/de/jplag/antlr/AbstractAntlrParserAdapter.java b/language-antlr-utils/src/main/java/de/jplag/antlr/AbstractAntlrParserAdapter.java index 8ba51cea0..440d4a7aa 100644 --- a/language-antlr-utils/src/main/java/de/jplag/antlr/AbstractAntlrParserAdapter.java +++ b/language-antlr-utils/src/main/java/de/jplag/antlr/AbstractAntlrParserAdapter.java @@ -62,6 +62,8 @@ private void parseFile(File file, TokenCollector collector) throws ParsingExcept Lexer lexer = this.createLexer(CharStreams.fromReader(reader)); CommonTokenStream tokenStream = new CommonTokenStream(lexer); T parser = this.createParser(tokenStream); + parser.removeErrorListeners(); + parser.addErrorListener(new AntlrLoggerErrorListener()); ParserRuleContext entryContext = this.getEntryContext(parser); ParseTreeWalker treeWalker = new ParseTreeWalker(); InternalListener listener = new InternalListener(this.getListener(), collector); diff --git a/language-antlr-utils/src/main/java/de/jplag/antlr/AntlrLoggerErrorListener.java b/language-antlr-utils/src/main/java/de/jplag/antlr/AntlrLoggerErrorListener.java new file mode 100644 index 000000000..2fa820ca6 --- /dev/null +++ b/language-antlr-utils/src/main/java/de/jplag/antlr/AntlrLoggerErrorListener.java @@ -0,0 +1,21 @@ +package de.jplag.antlr; + +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Writes error messages from ANTLR to a logger + */ +public class AntlrLoggerErrorListener extends BaseErrorListener { + private static final Logger logger = LoggerFactory.getLogger(AntlrLoggerErrorListener.class); + private static final String ERROR_TEMPLATE = "ANTLR error - line {}:{} {}"; + + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, + RecognitionException e) { + logger.error(ERROR_TEMPLATE, line, charPositionInLine, msg); + } +} diff --git a/languages/java/src/main/java/de/jplag/java/TokenGeneratingTreeScanner.java b/languages/java/src/main/java/de/jplag/java/TokenGeneratingTreeScanner.java index 28bd5838a..9589da81b 100644 --- a/languages/java/src/main/java/de/jplag/java/TokenGeneratingTreeScanner.java +++ b/languages/java/src/main/java/de/jplag/java/TokenGeneratingTreeScanner.java @@ -380,10 +380,11 @@ public Void visitThrow(ThrowTree node, Void unused) { @Override public Void visitNewClass(NewClassTree node, Void unused) { long start = positions.getStartPosition(ast, node); + long end = positions.getEndPosition(ast, node.getIdentifier()); if (!node.getTypeArguments().isEmpty()) { addToken(JavaTokenType.J_GENERIC, start, 3 + node.getIdentifier().toString().length(), new CodeSemantics()); } - addToken(JavaTokenType.J_NEWCLASS, start, 3, new CodeSemantics()); + addToken(JavaTokenType.J_NEWCLASS, start, end, new CodeSemantics()); super.visitNewClass(node, null); return null; } @@ -399,8 +400,8 @@ public Void visitTypeParameter(TypeParameterTree node, Void unused) { @Override public Void visitNewArray(NewArrayTree node, Void unused) { long start = positions.getStartPosition(ast, node); - long end = positions.getEndPosition(ast, node) - 1; - addToken(JavaTokenType.J_NEWARRAY, start, 3, new CodeSemantics()); + long end = node.getType() == null ? start + 1 : positions.getEndPosition(ast, node.getType()); + addToken(JavaTokenType.J_NEWARRAY, start, end, new CodeSemantics()); scan(node.getType(), null); scan(node.getDimensions(), null); boolean hasInit = node.getInitializers() != null && !node.getInitializers().isEmpty(); @@ -411,6 +412,7 @@ public Void visitNewArray(NewArrayTree node, Void unused) { scan(node.getInitializers(), null); // super method has annotation processing but we have it disabled anyways if (hasInit) { + end = positions.getEndPosition(ast, node.getInitializers().getLast()) - 1; addToken(JavaTokenType.J_ARRAY_INIT_END, end, 1, new CodeSemantics()); } return null; @@ -419,7 +421,8 @@ public Void visitNewArray(NewArrayTree node, Void unused) { @Override public Void visitAssignment(AssignmentTree node, Void unused) { long start = positions.getStartPosition(ast, node); - addToken(JavaTokenType.J_ASSIGN, start, 1, new CodeSemantics()); + long end = positions.getStartPosition(ast, node.getExpression()) - 1; + addToken(JavaTokenType.J_ASSIGN, start, end, new CodeSemantics()); variableRegistry.setNextVariableAccessType(VariableAccessType.WRITE); return super.visitAssignment(node, null); } @@ -427,7 +430,8 @@ public Void visitAssignment(AssignmentTree node, Void unused) { @Override public Void visitCompoundAssignment(CompoundAssignmentTree node, Void unused) { long start = positions.getStartPosition(ast, node); - addToken(JavaTokenType.J_ASSIGN, start, 1, new CodeSemantics()); + long end = positions.getStartPosition(ast, node.getExpression()) - 1; + addToken(JavaTokenType.J_ASSIGN, start, end, new CodeSemantics()); variableRegistry.setNextVariableAccessType(VariableAccessType.READ_WRITE); return super.visitCompoundAssignment(node, null); } @@ -437,7 +441,7 @@ public Void visitUnary(UnaryTree node, Void unused) { if (Set.of(Tree.Kind.PREFIX_INCREMENT, Tree.Kind.POSTFIX_INCREMENT, Tree.Kind.PREFIX_DECREMENT, Tree.Kind.POSTFIX_DECREMENT) .contains(node.getKind())) { long start = positions.getStartPosition(ast, node); - addToken(JavaTokenType.J_ASSIGN, start, 1, new CodeSemantics()); + addToken(JavaTokenType.J_ASSIGN, start, node.toString().length(), new CodeSemantics()); variableRegistry.setNextVariableAccessType(VariableAccessType.READ_WRITE); } return super.visitUnary(node, null); @@ -454,6 +458,8 @@ public Void visitAssert(AssertTree node, Void unused) { public Void visitVariable(VariableTree node, Void unused) { if (!node.getName().contentEquals(ANONYMOUS_VARIABLE_NAME)) { long start = positions.getStartPosition(ast, node); + long end = positions.getEndPosition(ast, node) - 1; + end -= node.getInitializer() == null ? 0 : node.getInitializer().toString().length(); String name = node.getName().toString(); boolean inLocalScope = variableRegistry.inLocalScope(); // this presents a problem when classes are declared in local scopes, which can happen in ad-hoc implementations @@ -465,7 +471,7 @@ public Void visitVariable(VariableTree node, Void unused) { } else { semantics = CodeSemantics.createKeep(); } - addToken(JavaTokenType.J_VARDEF, start, node.toString().length(), semantics); + addToken(JavaTokenType.J_VARDEF, start, end, semantics); // manually add variable to semantics since identifier isn't visited variableRegistry.setNextVariableAccessType(VariableAccessType.WRITE); variableRegistry.registerVariableAccess(name, !inLocalScope); @@ -483,7 +489,7 @@ public Void visitConditionalExpression(ConditionalExpressionTree node, Void unus @Override public Void visitMethodInvocation(MethodInvocationTree node, Void unused) { long start = positions.getStartPosition(ast, node); - long end = positions.getEndPosition(ast, node.getMethodSelect()) - start; + long end = positions.getEndPosition(ast, node.getMethodSelect()); CodeSemantics codeSemantics = CRITICAL_METHODS.contains(node.getMethodSelect().toString()) ? CodeSemantics.createCritical() : CodeSemantics.createControl(); addToken(JavaTokenType.J_APPLY, start, end, codeSemantics); diff --git a/pom.xml b/pom.xml index aa9f84310..efc11ba0c 100644 --- a/pom.xml +++ b/pom.xml @@ -240,7 +240,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.3.0 + 3.3.1 org.jacoco diff --git a/report-viewer/package-lock.json b/report-viewer/package-lock.json index 5c9bd360c..a4a9ea496 100644 --- a/report-viewer/package-lock.json +++ b/report-viewer/package-lock.json @@ -8,14 +8,14 @@ "name": "report-viewer", "version": "0.0.0", "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.5.2", + "@fortawesome/fontawesome-svg-core": "^6.6.0", "@fortawesome/free-brands-svg-icons": "^6.5.2", - "@fortawesome/free-solid-svg-icons": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.6.0", "@fortawesome/vue-fontawesome": "^3.0.8", "chart.js": "^4.4.3", "chartjs-chart-graph": "^4.3.1", "chartjs-plugin-datalabels": "^2.2.0", - "highlight.js": "^11.9.0", + "highlight.js": "^11.10.0", "jszip": "^3.10.0", "pinia": "^2.1.7", "slash": "^5.1.0", @@ -45,11 +45,11 @@ "postcss": "^8.4.35", "prettier": "^3.3.2", "prettier-plugin-tailwindcss": "^0.6.5", - "tailwindcss": "^3.4.4", + "tailwindcss": "^3.4.6", "typescript": "^5.5.3", - "vite": "^5.3.1", + "vite": "^5.3.4", "vitest": "^2.0.1", - "vue-tsc": "^2.0.21" + "vue-tsc": "^2.0.26" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -543,23 +543,21 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", - "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.2" - }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", + "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", "engines": { "node": ">=6" } }, - "node_modules/@fortawesome/fontawesome-svg-core/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", - "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", - "hasInstallScript": true, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz", + "integrity": "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.6.0" + }, "engines": { "node": ">=6" } @@ -586,26 +584,16 @@ } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", - "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", - "hasInstallScript": true, + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.6.0.tgz", + "integrity": "sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA==", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.5.2" + "@fortawesome/fontawesome-common-types": "6.6.0" }, "engines": { "node": ">=6" } }, - "node_modules/@fortawesome/free-solid-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", - "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@fortawesome/vue-fontawesome": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.8.tgz", @@ -1395,30 +1383,27 @@ } }, "node_modules/@volar/language-core": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.0.tgz", - "integrity": "sha512-pvhL24WUh3VDnv7Yw5N1sjhPtdx7q9g+Wl3tggmnkMcyK8GcCNElF2zHiKznryn0DiUGk+eez/p2qQhz+puuHw==", + "version": "2.4.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.16.tgz", + "integrity": "sha512-oOTnIZlx0P/idFwVw+W0NbzKDtZAQMzXSdIFfTePCKcXlb4Ys12GaGkx8NF9dsvPYV3nbv3ZsSxnkZWBmNKd7A==", "dev": true, "dependencies": { - "@volar/source-map": "2.3.0" + "@volar/source-map": "2.4.0-alpha.16" } }, "node_modules/@volar/source-map": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.0.tgz", - "integrity": "sha512-G/228aZjAOGhDjhlyZ++nDbKrS9uk+5DMaEstjvzglaAw7nqtDyhnQAsYzUg6BMP9BtwZ59RIw5HGePrutn00Q==", - "dev": true, - "dependencies": { - "muggle-string": "^0.4.0" - } + "version": "2.4.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.16.tgz", + "integrity": "sha512-sL9vNG7iR2hiKZor7UkD5Sufu3QCia4cbp2gX/nGRNSdaPbhOpdAoavwlBm0PrVkpiA19NZuavZoobD8krviFg==", + "dev": true }, "node_modules/@volar/typescript": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.0.tgz", - "integrity": "sha512-PtUwMM87WsKVeLJN33GSTUjBexlKfKgouWlOUIv7pjrOnTwhXHZNSmpc312xgXdTjQPpToK6KXSIcKu9sBQ5LQ==", + "version": "2.4.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.16.tgz", + "integrity": "sha512-WCx7z5O81McCQp2cC0c8081y+MgTiAR2WAiJjVL4tr4Qh4GgqK0lgn3CqAjcKizaK1R5y3wfrUqgIYr+QeFYcw==", "dev": true, "dependencies": { - "@volar/language-core": "2.3.0", + "@volar/language-core": "2.4.0-alpha.16", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -1523,16 +1508,17 @@ } }, "node_modules/@vue/language-core": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.21.tgz", - "integrity": "sha512-vjs6KwnCK++kIXT+eI63BGpJHfHNVJcUCr3RnvJsccT3vbJnZV5IhHR2puEkoOkIbDdp0Gqi1wEnv3hEd3WsxQ==", + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.26.tgz", + "integrity": "sha512-/lt6SfQ3O1yDAhPsnLv9iSUgXd1dMHqUm/t3RctfqjuwQf1LnftZ414X3UBn6aXT4MiwXWtbNJ4Z0NZWwDWgJQ==", "dev": true, "dependencies": { - "@volar/language-core": "~2.3.0-alpha.15", + "@volar/language-core": "~2.4.0-alpha.15", "@vue/compiler-dom": "^3.4.0", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "vue-template-compiler": "^2.7.14" }, @@ -3453,9 +3439,9 @@ } }, "node_modules/highlight.js": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", - "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.10.0.tgz", + "integrity": "sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==", "engines": { "node": ">=12.0.0" } @@ -5270,9 +5256,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "funding": [ { "type": "opencollective", @@ -5289,7 +5275,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -6474,9 +6460,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", - "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.6.tgz", + "integrity": "sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -6830,13 +6816,13 @@ } }, "node_modules/vite": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", - "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", "dev": true, "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.38", + "postcss": "^8.4.39", "rollup": "^4.13.0" }, "bin": { @@ -7098,20 +7084,20 @@ } }, "node_modules/vue-tsc": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.21.tgz", - "integrity": "sha512-E6x1p1HaHES6Doy8pqtm7kQern79zRtIewkf9fiv7Y43Zo4AFDS5hKi+iHi2RwEhqRmuiwliB1LCEFEGwvxQnw==", + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.26.tgz", + "integrity": "sha512-tOhuwy2bIXbMhz82ef37qeiaQHMXKQkD6mOF6CCPl3/uYtST3l6fdNyfMxipudrQTxTfXVPlgJdMENBFfC1CfQ==", "dev": true, "dependencies": { - "@volar/typescript": "~2.3.0-alpha.15", - "@vue/language-core": "2.0.21", + "@volar/typescript": "~2.4.0-alpha.15", + "@vue/language-core": "2.0.26", "semver": "^7.5.4" }, "bin": { "vue-tsc": "bin/vue-tsc.js" }, "peerDependencies": { - "typescript": "*" + "typescript": ">=5.0.0" } }, "node_modules/vue-virtual-scroller": { diff --git a/report-viewer/package.json b/report-viewer/package.json index 2bfad84a5..9d47d5b85 100644 --- a/report-viewer/package.json +++ b/report-viewer/package.json @@ -19,14 +19,14 @@ "prepare": "cd .. && husky report-viewer/.husky" }, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.5.2", + "@fortawesome/fontawesome-svg-core": "^6.6.0", "@fortawesome/free-brands-svg-icons": "^6.5.2", - "@fortawesome/free-solid-svg-icons": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.6.0", "@fortawesome/vue-fontawesome": "^3.0.8", "chart.js": "^4.4.3", "chartjs-chart-graph": "^4.3.1", "chartjs-plugin-datalabels": "^2.2.0", - "highlight.js": "^11.9.0", + "highlight.js": "^11.10.0", "jszip": "^3.10.0", "pinia": "^2.1.7", "slash": "^5.1.0", @@ -56,10 +56,10 @@ "postcss": "^8.4.35", "prettier": "^3.3.2", "prettier-plugin-tailwindcss": "^0.6.5", - "tailwindcss": "^3.4.4", + "tailwindcss": "^3.4.6", "typescript": "^5.5.3", - "vite": "^5.3.1", + "vite": "^5.3.4", "vitest": "^2.0.1", - "vue-tsc": "^2.0.21" + "vue-tsc": "^2.0.26" } }