diff --git a/db-tests/build.gradle b/db-tests/build.gradle index 81bb95bbd9..dfcad31365 100644 --- a/db-tests/build.gradle +++ b/db-tests/build.gradle @@ -21,12 +21,8 @@ task e2eTest(type: Test) { } dependencies { - testImplementation 'org.assertj:assertj-core:3.24.2' - implementation 'org.postgresql:postgresql:42.6.0' testImplementation 'org.postgresql:postgresql:42.6.0' - testImplementation 'com.zaxxer:HikariCP:5.0.1' - testImplementation 'junit:junit:4.13.2' - testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.0' + testImplementation 'com.zaxxer:HikariCP:5.0.1' } diff --git a/e2e-tests/build.gradle b/e2e-tests/build.gradle index 6d128b00f0..fb334867a3 100644 --- a/e2e-tests/build.gradle +++ b/e2e-tests/build.gradle @@ -39,7 +39,6 @@ task e2eTest(type: Test) { dependencies { testImplementation 'com.microsoft.playwright:playwright:1.37.0' - testImplementation 'org.assertj:assertj-core:3.24.2' testImplementation 'org.glassfish:javax.json:1.1.4' testImplementation 'org.apache.commons:commons-lang3:3.13.0' diff --git a/load-tests/package-lock.json b/load-tests/package-lock.json index 884595e621..2c4e0ba90b 100644 --- a/load-tests/package-lock.json +++ b/load-tests/package-lock.json @@ -39,12 +39,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -91,12 +91,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -202,22 +202,22 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -379,9 +379,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -425,12 +425,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -439,9 +439,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.11.tgz", - "integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1730,33 +1730,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", - "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.11", - "@babel/types": "^7.22.11", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1765,13 +1765,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", - "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { diff --git a/merlin-server/build.gradle b/merlin-server/build.gradle index 29064dd49e..be7eb521c3 100644 --- a/merlin-server/build.gradle +++ b/merlin-server/build.gradle @@ -80,11 +80,9 @@ dependencies { implementation project(':constraints') implementation project(':permissions') - implementation 'org.apache.commons:commons-lang3:3.13.0' - implementation 'io.javalin:javalin:5.6.2' + implementation 'io.javalin:javalin:5.6.3' implementation 'org.slf4j:slf4j-simple:2.0.7' implementation 'org.glassfish:javax.json:1.1.4' - implementation 'org.apache.bcel:bcel:6.7.0' implementation 'org.postgresql:postgresql:42.6.0' implementation 'com.zaxxer:HikariCP:5.0.1' @@ -92,7 +90,5 @@ dependencies { testImplementation project(':examples:foo-missionmodel') testImplementation project(':merlin-framework') testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0' - testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'javax.json.bind:javax.json.bind-api:1.0' testImplementation 'net.jqwik:jqwik:1.6.5' } diff --git a/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/http/MerlinParsersTest.java b/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/http/MerlinParsersTest.java index 5326952494..aefa2be6ec 100644 --- a/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/http/MerlinParsersTest.java +++ b/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/http/MerlinParsersTest.java @@ -1,6 +1,5 @@ package gov.nasa.jpl.aerie.merlin.server.http; -import gov.nasa.jpl.aerie.json.JsonParseResult; import gov.nasa.jpl.aerie.json.JsonParser; import gov.nasa.jpl.aerie.merlin.protocol.types.SerializedValue; import gov.nasa.jpl.aerie.merlin.server.models.HasuraAction; @@ -18,32 +17,22 @@ import static gov.nasa.jpl.aerie.merlin.driver.json.SerializedValueJsonParser.serializedValueP; import static gov.nasa.jpl.aerie.merlin.server.http.HasuraParsers.*; import static gov.nasa.jpl.aerie.merlin.server.http.MerlinParsersTest.NestedLists.nestedList; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public final class MerlinParsersTest { - public static final class NestedLists { - public final List lists; - - public NestedLists(final List lists) { - this.lists = lists; - } + public record NestedLists(List lists) { @Override - public boolean equals(final Object obj) { - if (!(obj instanceof NestedLists)) return false; - final var other = (NestedLists) obj; - return Objects.equals(this.lists, other.lists); - } - - @Override - public int hashCode() { - return this.lists.hashCode(); - } + public boolean equals(final Object obj) { + if (!(obj instanceof final NestedLists other)) return false; + return Objects.equals(this.lists, other.lists); + } public static NestedLists nestedList(NestedLists... lists) { - return new NestedLists(List.of(lists)); + return new NestedLists(List.of(lists)); + } } - } @Test public void testRecursiveList() { @@ -64,13 +53,10 @@ public void testRecursiveList() { . build()) . build(); - assertThat( - listsP.parse(foo).getSuccessOrThrow() - ).isEqualTo( - nestedList( + final var expected = nestedList( nestedList(nestedList()), - nestedList(nestedList(), nestedList(), nestedList())) - ); + nestedList(nestedList(), nestedList(), nestedList())); + assertEquals(expected, listsP.parse(foo).getSuccessOrThrow()); } @Test @@ -78,12 +64,12 @@ public void testSerializedReal() { final var expected = SerializedValue.of(3.14); final var actual = serializedValueP.parse(Json.createValue(3.14)).getSuccessOrThrow(); - assertThat(expected).isEqualTo(actual); + assertEquals(expected, actual); } @Test public void testRealIsNotALong() { - assertThat(longP.parse(Json.createValue(3.14))).matches(JsonParseResult::isFailure); + assertTrue(longP.parse(Json.createValue(3.14)).isFailure()); } @Test @@ -111,7 +97,7 @@ public void testHasuraActionParsers() { new HasuraAction.MissionModelInput("1"), new HasuraAction.Session("aerie_admin", null)); - assertThat(hasuraMissionModelActionP.parse(json).getSuccessOrThrow()).isEqualTo(expected); + assertEquals(expected, hasuraMissionModelActionP.parse(json).getSuccessOrThrow()); } { @@ -138,7 +124,7 @@ public void testHasuraActionParsers() { new HasuraAction.MissionModelInput("1"), new HasuraAction.Session("aerie_admin", "userId")); - assertThat(hasuraMissionModelActionP.parse(json).getSuccessOrThrow()).isEqualTo(expected); + assertEquals(expected, hasuraMissionModelActionP.parse(json).getSuccessOrThrow()); } } @@ -163,6 +149,6 @@ public void testHasuraMissionModelEventParser() { final var expected = new HasuraMissionModelEvent("1"); - assertThat(hasuraMissionModelEventTriggerP.parse(json).getSuccessOrThrow()).isEqualTo(expected); + assertEquals(expected, hasuraMissionModelEventTriggerP.parse(json).getSuccessOrThrow()); } } diff --git a/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/models/MissionModelTest.java b/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/models/MissionModelTest.java index db6319ab65..d13b4532b3 100644 --- a/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/models/MissionModelTest.java +++ b/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/models/MissionModelTest.java @@ -17,8 +17,9 @@ import java.util.Map; import java.util.Optional; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.catchThrowable; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public final class MissionModelTest { @@ -59,7 +60,7 @@ public void shouldGetActivityTypeList() { specType.getOutputType().getSchema()))); // THEN - assertThat(activityTypes).containsAllEntriesOf(expectedTypes); + assertTrue(activityTypes.entrySet().containsAll(expectedTypes.entrySet())); } @Test @@ -89,7 +90,7 @@ public void shouldGetActivityType() throws MissionModelService.NoSuchActivityTyp specType.getOutputType().getSchema()); // THEN - assertThat(type).isEqualTo(expectedType); + assertEquals(expectedType, type); } @Test @@ -97,8 +98,9 @@ public void shouldNotGetActivityTypeForNonexistentActivityType() { // GIVEN final String activityId = "nonexistent activity type"; + // THEN + assertThrows(MissionModelService.NoSuchActivityTypeException.class, () -> { // WHEN - final var thrown = catchThrowable(() -> { final var specType = Optional .ofNullable(registry.directiveTypes().get(activityId)) .orElseThrow(() -> new MissionModelService.NoSuchActivityTypeException(activityId)); @@ -109,9 +111,6 @@ public void shouldNotGetActivityTypeForNonexistentActivityType() { specType.getInputType().getRequiredParameters(), specType.getOutputType().getSchema()); }); - - // THEN - assertThat(thrown).isInstanceOf(MissionModelService.NoSuchActivityTypeException.class); } @Test @@ -132,7 +131,7 @@ public void shouldInstantiateActivityInstance() final var failures = specType.getInputType().validateArguments(activity.getArguments()); // THEN - assertThat(failures).isEmpty(); + assertTrue(failures.isEmpty()); } @Test @@ -143,7 +142,7 @@ public void shouldNotInstantiateActivityInstanceWithIncorrectParameterType() { "y", SerializedValue.of(1.0))); // WHEN - final var thrown = catchThrowable(() -> { + final var thrown = assertThrows(InstantiationException.class, () -> { final var activity = new SerializedActivity(typeName, parameters); final var specType = Optional .ofNullable(registry.directiveTypes().get(activity.getTypeName())) @@ -152,13 +151,10 @@ public void shouldNotInstantiateActivityInstanceWithIncorrectParameterType() { }); // THEN - assertThat(thrown).isInstanceOf(InstantiationException.class); - if (thrown instanceof final InstantiationException e) { - assertThat(e.extraneousArguments).isEmpty(); - assertThat(e.missingArguments).map(args -> args.parameterName()).isEqualTo(List.of("z")); - assertThat(e.unconstructableArguments).map(args -> args.parameterName()).isEqualTo(List.of("y")); - assertThat(e.validArguments).map(args -> args.parameterName()).isEqualTo(List.of("x", "y", "vecs")); - } + assertTrue(thrown.extraneousArguments.isEmpty()); + assertEquals(List.of("z"), thrown.missingArguments.stream().map(a -> a.parameterName()).toList()); + assertEquals(List.of("y"), thrown.unconstructableArguments.stream().map(a -> a.parameterName()).toList()); + assertEquals(List.of("x", "y", "vecs"), thrown.validArguments.stream().map(a -> a.parameterName()).toList()); } @Test @@ -168,7 +164,7 @@ public void shouldNotInstantiateActivityInstanceWithExtraParameter() { final var parameters = new HashMap<>(Map.of("Nonexistent", SerializedValue.of(""))); // WHEN - final var thrown = catchThrowable(() -> { + final var thrown = assertThrows(InstantiationException.class, () -> { final var activity = new SerializedActivity(typeName, parameters); final var specType = Optional .ofNullable(registry.directiveTypes().get(activity.getTypeName())) @@ -177,12 +173,9 @@ public void shouldNotInstantiateActivityInstanceWithExtraParameter() { }); // THEN - assertThat(thrown).isInstanceOf(InstantiationException.class); - if (thrown instanceof final InstantiationException e) { - assertThat(e.extraneousArguments).map(args -> args.parameterName()).isEqualTo(List.of("Nonexistent")); - assertThat(e.missingArguments).map(args -> args.parameterName()).isEqualTo(List.of("z")); - assertThat(e.unconstructableArguments).isEmpty(); - assertThat(e.validArguments).map(args -> args.parameterName()).isEqualTo(List.of("x", "y", "vecs")); - } + assertEquals(List.of("Nonexistent"), thrown.extraneousArguments.stream().map(a -> a.parameterName()).toList()); + assertEquals(List.of("z"), thrown.missingArguments.stream().map(a -> a.parameterName()).toList()); + assertTrue(thrown.unconstructableArguments.isEmpty()); + assertEquals(List.of("x", "y", "vecs"), thrown.validArguments.stream().map(a -> a.parameterName()).toList()); } } diff --git a/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/remotes/PlanRepositoryContractTest.java b/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/remotes/PlanRepositoryContractTest.java index 0333a02203..9404358dd8 100644 --- a/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/remotes/PlanRepositoryContractTest.java +++ b/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/remotes/PlanRepositoryContractTest.java @@ -12,7 +12,9 @@ import java.util.Map; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; public abstract class PlanRepositoryContractTest { protected InMemoryPlanRepository planRepository = null; @@ -36,7 +38,7 @@ public void testCanStorePlan() throws NoSuchPlanException { // THEN final Plan fetchedPlan = this.planRepository.getPlanForValidation(ids.planId()); - assertThat(fetchedPlan.name).isEqualTo("new-plan"); + assertEquals("new-plan", fetchedPlan.name); } @Test @@ -55,8 +57,9 @@ public void testCreatePlanWithActivity() throws NoSuchPlanException { // THEN final Plan fetchedPlan = this.planRepository.getPlanForValidation(ids.planId()); - assertThat(fetchedPlan.name).isEqualTo("new-plan"); - assertThat(fetchedPlan.activityDirectives.values()).containsExactly(activity); + assertEquals("new-plan", fetchedPlan.name); + assertEquals(1, fetchedPlan.activityDirectives.size()); + assertTrue(fetchedPlan.activityDirectives.containsValue(activity)); } @Test @@ -69,7 +72,9 @@ public void testCreatePlanWithNullActivitiesList() final CreatedPlan ids = this.planRepository.storePlan(new Plan()); // THEN - assertThat(this.planRepository.getPlanForValidation(ids.planId()).activityDirectives).isNotNull().isEmpty(); + final var directives = this.planRepository.getPlanForValidation(ids.planId()).activityDirectives; + assertNotNull(directives); + assertTrue(directives.isEmpty()); } @Test @@ -78,12 +83,12 @@ public void testCanDeletePlan() throws NoSuchPlanException { this.planRepository.storePlan(new Plan()); final CreatedPlan ids = this.planRepository.storePlan(new Plan()); this.planRepository.storePlan(new Plan()); - assertThat(this.planRepository.getAllPlans()).size().isEqualTo(3); + assertEquals(3, this.planRepository.getAllPlans().size()); // WHEN this.planRepository.deletePlan(ids.planId()); // THEN - assertThat(this.planRepository.getAllPlans()).size().isEqualTo(2); + assertEquals(2, this.planRepository.getAllPlans().size()); } } diff --git a/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/remotes/postgres/PostgresParsersTest.java b/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/remotes/postgres/PostgresParsersTest.java index 8aa6b584bf..08cde20175 100644 --- a/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/remotes/postgres/PostgresParsersTest.java +++ b/merlin-server/src/test/java/gov/nasa/jpl/aerie/merlin/server/remotes/postgres/PostgresParsersTest.java @@ -2,7 +2,8 @@ import javax.json.Json; import static gov.nasa.jpl.aerie.merlin.server.remotes.postgres.PostgresParsers.pgTimestampP; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + import gov.nasa.jpl.aerie.merlin.server.models.Timestamp; import org.junit.jupiter.api.Test; @@ -14,6 +15,6 @@ public void testTimestampParser() { final var expected = Timestamp.fromString("2022-001T23:43:59.83237"); final var actual = pgTimestampP.parse(Json.createValue(timestamp)).getSuccessOrThrow(); - assertThat(expected).isEqualTo(actual); + assertEquals(expected, actual); } } diff --git a/merlin-worker/build.gradle b/merlin-worker/build.gradle index abea0c48d2..bf65678a2e 100644 --- a/merlin-worker/build.gradle +++ b/merlin-worker/build.gradle @@ -28,18 +28,8 @@ dependencies { implementation project(':parsing-utilities') implementation project(':constraints') - implementation 'org.apache.commons:commons-lang3:3.13.0' - implementation 'io.javalin:javalin:5.6.2' + implementation 'io.javalin:javalin:5.6.3' implementation 'org.slf4j:slf4j-simple:2.0.7' - implementation 'org.eclipse:yasson:3.0.3' - implementation 'org.apache.bcel:bcel:6.7.0' implementation 'org.postgresql:postgresql:42.6.0' implementation 'com.zaxxer:HikariCP:5.0.1' - - testImplementation project(':examples:foo-missionmodel') - testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0' - testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'junit:junit:4.13.2' - testImplementation 'javax.json.bind:javax.json.bind-api:1.0' - testImplementation 'org.glassfish:javax.json:1.1.4' } diff --git a/permissions/build.gradle b/permissions/build.gradle index 6627d47a16..019f5248bb 100644 --- a/permissions/build.gradle +++ b/permissions/build.gradle @@ -1,7 +1,5 @@ plugins { id 'java' - id 'java-test-fixtures' - id 'jacoco' } java { @@ -11,24 +9,5 @@ java { } dependencies { - implementation 'io.javalin:javalin:5.6.2' implementation 'org.glassfish:javax.json:1.1.4' - - testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0' - testImplementation 'org.assertj:assertj-core:3.24.2' -} - -test { - useJUnitPlatform() - testLogging { - events 'passed', 'skipped', 'failed' - exceptionFormat 'full' - } -} - -jacocoTestReport { - dependsOn test - reports { - xml.required = true - } } diff --git a/scheduler-driver/build.gradle b/scheduler-driver/build.gradle index 2ef972d6b5..c5d5ad7fd1 100644 --- a/scheduler-driver/build.gradle +++ b/scheduler-driver/build.gradle @@ -27,10 +27,7 @@ dependencies { compileOnly project(':constraints') implementation 'org.apache.commons:commons-lang3:3.13.0' - implementation 'org.apache.commons:commons-math3:3.6.1' implementation 'com.google.guava:guava:32.1.2-jre' - implementation 'org.jfree:jfreechart:1.5.4' - implementation 'com.google.code.gson:gson:2.10.1' implementation 'org.jgrapht:jgrapht-core:1.5.2' implementation 'org.slf4j:slf4j-simple:2.0.7' @@ -40,10 +37,6 @@ dependencies { testImplementation project(':examples:foo-missionmodel') testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' testImplementation 'com.google.guava:guava-testlib:32.1.2-jre' - testImplementation 'com.google.truth.extensions:truth-java8-extension:1.1.5' - //for when aerielander will be published - //testImplementation 'gov.nasa.jpl.aerie:aerielander:0.11.0-SNAPSHOT-+' - testImplementation files('src/test/resources/gov/nasa/jpl/aerie/scheduler/aerielander.jar') } publishing { diff --git a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/ActivityTypeTest.java b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/ActivityTypeTest.java index 52d3e9c942..e83766b716 100644 --- a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/ActivityTypeTest.java +++ b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/ActivityTypeTest.java @@ -3,7 +3,7 @@ import gov.nasa.jpl.aerie.scheduler.model.ActivityType; import org.junit.jupiter.api.Test; -import static com.google.common.truth.Truth.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; public class ActivityTypeTest { @@ -23,7 +23,7 @@ public void getName_ofCtorValue() { final var expected = "A"; final var obj = new ActivityType(expected); final var actual = obj.getName(); - assertThat(actual).isEqualTo(expected); + assertEquals(expected, actual); } } diff --git a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/AerieLanderTestUtility.java b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/AerieLanderTestUtility.java deleted file mode 100644 index 41650637fb..0000000000 --- a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/AerieLanderTestUtility.java +++ /dev/null @@ -1,37 +0,0 @@ -package gov.nasa.jpl.aerie.scheduler; - -import gov.nasa.jpl.aerie.merlin.driver.DirectiveTypeRegistry; -import gov.nasa.jpl.aerie.merlin.driver.MissionModel; -import gov.nasa.jpl.aerie.merlin.driver.MissionModelBuilder; -import gov.nasa.jpl.aerie.merlin.protocol.model.SchedulerModel; -import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirective; -import gov.nasa.jpl.aerie.scheduler.model.Plan; - -import java.time.Instant; -import java.util.List; - -/** - * Some utility functions used in tests - */ -public class AerieLanderTestUtility { - public static void printPlan(Plan plan) { - List acts = plan.getActivitiesByTime(); - SchedulingActivityDirective last = null; - for (var act : acts) { - System.out.println(act.toString()); - } - } - - public static MissionModel getMerlinSightMissionModel(){ - final var builder = new MissionModelBuilder(); - final var configuration = gov.nasa.jpl.aerielander.config.Configuration.defaultConfiguration(); - final var modelType = new gov.nasa.jpl.aerielander.generated.GeneratedModelType(); - final var registry = DirectiveTypeRegistry.extract(modelType); - final var model = modelType.instantiate(Instant.EPOCH, configuration, builder); - return builder.build(model, registry); - } - - static SchedulerModel getMerlinSightSchedulerModel() { - return new gov.nasa.jpl.aerielander.generated.GeneratedSchedulerModel(); - } -} diff --git a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/LongDurationPlanTest.java b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/LongDurationPlanTest.java index a28a538f4d..e27709886e 100644 --- a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/LongDurationPlanTest.java +++ b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/LongDurationPlanTest.java @@ -1,7 +1,5 @@ package gov.nasa.jpl.aerie.scheduler; -import com.google.common.truth.Correspondence; -import com.google.common.truth.Truth; import gov.nasa.jpl.aerie.constraints.time.Windows; import gov.nasa.jpl.aerie.constraints.tree.WindowsWrapperExpression; import gov.nasa.jpl.aerie.merlin.protocol.types.Duration; @@ -15,10 +13,10 @@ import org.junit.jupiter.api.Test; import java.util.List; -import java.util.Objects; -import static com.google.common.truth.Truth8.assertThat; +import static gov.nasa.jpl.aerie.scheduler.TestUtility.assertSetEquality; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class LongDurationPlanTest { @@ -52,20 +50,6 @@ private static PlanInMemory makePlanA012(Problem problem) { return plan; } - /** used to compare plan activities but ignore generated details like name **/ - private static boolean equalsExceptInName(SchedulingActivityDirective a, SchedulingActivityDirective b) { - //REVIEW: maybe unify within ActivityInstance closer to data - return Objects.equals(a.getType(), b.getType()) - && Objects.equals(a.startOffset(), b.startOffset()) - && Objects.equals(a.getEndTime(), b.getEndTime()) - && Objects.equals(a.duration(), b.duration()) - && Objects.equals(a.arguments(), b.arguments()); - } - - /** matches activities if they agree in everything except the (possibly auto-generated) names **/ - private static final Correspondence equalExceptInName = Correspondence.from( - LongDurationPlanTest::equalsExceptInName, "matches"); - @Test public void getNextSolution_initialPlanInOutput() { final var problem = makeTestMissionAB(); @@ -75,10 +59,8 @@ public void getNextSolution_initialPlanInOutput() { final var plan = solver.getNextSolution(); - assertThat(plan).isPresent(); - Truth.assertThat(plan.get().getActivitiesByTime()) - .comparingElementsUsing(equalExceptInName) - .containsExactlyElementsIn(expectedPlan.getActivitiesByTime()); + assertTrue(plan.isPresent()); + assertSetEquality(plan.get().getActivitiesByTime(), expectedPlan.getActivitiesByTime()); assertEquals(1, problem.getSimulationFacade().countSimulationRestarts()); } @@ -97,9 +79,7 @@ public void getNextSolution_proceduralGoalCreatesActivities() { final var plan = solver.getNextSolution().orElseThrow(); - Truth.assertThat(plan.getActivitiesByTime()) - .comparingElementsUsing(equalExceptInName) - .containsExactlyElementsIn(expectedPlan.getActivitiesByTime()); + assertSetEquality(plan.getActivitiesByTime(), expectedPlan.getActivitiesByTime()); assertEquals(2, problem.getSimulationFacade().countSimulationRestarts()); } } diff --git a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/PrioritySolverTest.java b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/PrioritySolverTest.java index b8909e3369..449d034252 100644 --- a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/PrioritySolverTest.java +++ b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/PrioritySolverTest.java @@ -1,7 +1,6 @@ package gov.nasa.jpl.aerie.scheduler; import com.google.common.testing.NullPointerTester; -import com.google.common.truth.Correspondence; import gov.nasa.jpl.aerie.constraints.time.Interval; import gov.nasa.jpl.aerie.constraints.time.Windows; import gov.nasa.jpl.aerie.constraints.tree.WindowsWrapperExpression; @@ -26,9 +25,8 @@ import java.util.List; import java.util.Optional; -import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth8.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static gov.nasa.jpl.aerie.scheduler.TestUtility.assertSetEquality; +import static org.junit.jupiter.api.Assertions.*; public class PrioritySolverTest { private static PrioritySolver makeEmptyProblemSolver() { @@ -60,9 +58,9 @@ public void getNextSolution_onEmptyProblemGivesEmptyPlanAndOneEmptyEvaluation() final var solver = makeEmptyProblemSolver(); final var plan = solver.getNextSolution(); - assertThat(plan).isPresent(); - assertThat(plan.get().getEvaluation()).isEqualTo(new Evaluation()); - assertThat(plan.get().getActivitiesByTime()).isEmpty(); + assertTrue(plan.isPresent()); + assertEquals(new Evaluation(), plan.get().getEvaluation()); + assertTrue(plan.get().getActivitiesByTime().isEmpty()); } @Test @@ -71,7 +69,7 @@ public void getNextSolution_givesNoSolutionOnSubsequentCall() { solver.getNextSolution(); final var plan1 = solver.getNextSolution(); - assertThat(plan1).isEmpty(); + assertTrue(plan1.isEmpty()); } //test mission with two primitive activity types @@ -118,10 +116,6 @@ private static PlanInMemory makePlanAB012(Problem problem) { return plan; } - /** matches activities if they agree in everything except the (possibly auto-generated) names **/ - private static final Correspondence equalExceptInName = Correspondence.from( - SchedulingActivityDirective::equalsInProperties, "matches"); - @Test public void getNextSolution_initialPlanInOutput() { final var problem = makeTestMissionAB(); @@ -131,10 +125,8 @@ public void getNextSolution_initialPlanInOutput() { final var plan = solver.getNextSolution(); - assertThat(plan).isPresent(); - assertThat(plan.get().getActivitiesByTime()) - .comparingElementsUsing(equalExceptInName) - .containsExactlyElementsIn(expectedPlan.getActivitiesByTime()); + assertTrue(plan.isPresent()); + assertSetEquality(plan.get().getActivitiesByTime(), expectedPlan.getActivitiesByTime()); assertEquals(1, problem.getSimulationFacade().countSimulationRestarts()); } @@ -153,9 +145,7 @@ public void getNextSolution_proceduralGoalCreatesActivities() { final var plan = solver.getNextSolution().orElseThrow(); - assertThat(plan.getActivitiesByTime()) - .comparingElementsUsing(equalExceptInName) - .containsExactlyElementsIn(expectedPlan.getActivitiesByTime()); + assertSetEquality(plan.getActivitiesByTime(), expectedPlan.getActivitiesByTime()); assertEquals(4, problem.getSimulationFacade().countSimulationRestarts()); } @@ -174,12 +164,10 @@ public void getNextSolution_proceduralGoalAttachesActivitiesToEvaluation() { final var plan = solver.getNextSolution().orElseThrow(); - assertThat(plan.getEvaluation()).isNotNull(); + assertNotNull(plan.getEvaluation()); final var eval = plan.getEvaluation().forGoal(goal); - assertThat(eval).isNotNull(); - assertThat(eval.getAssociatedActivities()) - .comparingElementsUsing(equalExceptInName) - .containsExactlyElementsIn(expectedPlan.getActivitiesByTime()); + assertNotNull(eval); + assertSetEquality(eval.getAssociatedActivities().stream().toList(), expectedPlan.getActivitiesByTime()); assertEquals(4, problem.getSimulationFacade().countSimulationRestarts()); } @@ -206,11 +194,8 @@ public void getNextSolution_recurrenceGoalWorks() { //TODO: evaluation should have association of instances to goal //TODO: should ensure no other spurious acts yet need to ignore special interval activities //TODO: may want looser expectation (eg allow flexibility as long as right repeat pattern met) - assertThat(plan.getActivitiesByTime().get(0).equalsInProperties(expectedPlan.getActivitiesByTime().get(0))) - .isTrue(); - assertThat(plan.getActivitiesByTime()) - .comparingElementsUsing(equalExceptInName) - .containsExactlyElementsIn(expectedPlan.getActivitiesByTime()).inOrder(); + assertTrue(plan.getActivitiesByTime().get(0).equalsInProperties(expectedPlan.getActivitiesByTime().get(0))); + assertSetEquality(plan.getActivitiesByTime(), expectedPlan.getActivitiesByTime()); assertEquals(4, problem.getSimulationFacade().countSimulationRestarts()); } @@ -242,9 +227,7 @@ public void getNextSolution_coexistenceGoalOnActivityWorks() { final var expectedPlan = makePlanAB012(problem); //TODO: evaluation should have association of instances to goal //TODO: should ensure no other spurious acts yet need to ignore special interval activities - assertThat(plan.getActivitiesByTime()) - .comparingElementsUsing(equalExceptInName) - .containsAtLeastElementsIn(expectedPlan.getActivitiesByTime()); + assertSetEquality(plan.getActivitiesByTime(), expectedPlan.getActivitiesByTime()); assertEquals(4, problem.getSimulationFacade().countSimulationRestarts()); } @@ -284,9 +267,7 @@ public void getNextSolution_coexistenceGoalOnActivityWorks_withInitialSimResults final var solver = makeProblemSolver(problem); final var plan = solver.getNextSolution().orElseThrow(); final var expectedPlan = makePlanAB012(problem); - assertThat(plan.getActivitiesByTime()) - .comparingElementsUsing(equalExceptInName) - .containsAtLeastElementsIn(expectedPlan.getActivitiesByTime()); + assertSetEquality(plan.getActivitiesByTime(), expectedPlan.getActivitiesByTime()); assertEquals(3, problem.getSimulationFacade().countSimulationRestarts()); } @@ -327,7 +308,7 @@ public void testCardGoalWithApplyWhen(){ var plan = solver.getNextSolution().orElseThrow(); //will insert an activity at the beginning of the plan in addition of the two already-present activities - assertThat(plan.getActivities().size()).isEqualTo(3); + assertEquals(3, plan.getActivities().size()); assertEquals(2, problem.getSimulationFacade().countSimulationRestarts()); } diff --git a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/SimulationFacadeTest.java b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/SimulationFacadeTest.java index 500334fa79..b18fff4b76 100644 --- a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/SimulationFacadeTest.java +++ b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/SimulationFacadeTest.java @@ -1,22 +1,8 @@ package gov.nasa.jpl.aerie.scheduler; -import gov.nasa.jpl.aerie.constraints.time.Interval; import gov.nasa.jpl.aerie.constraints.time.Segment; import gov.nasa.jpl.aerie.constraints.time.Windows; -import gov.nasa.jpl.aerie.constraints.tree.And; -import gov.nasa.jpl.aerie.constraints.tree.AssignGaps; -import gov.nasa.jpl.aerie.constraints.tree.DiscreteResource; -import gov.nasa.jpl.aerie.constraints.tree.Equal; -import gov.nasa.jpl.aerie.constraints.tree.GreaterThan; -import gov.nasa.jpl.aerie.constraints.tree.GreaterThanOrEqual; -import gov.nasa.jpl.aerie.constraints.tree.LessThan; -import gov.nasa.jpl.aerie.constraints.tree.LessThanOrEqual; -import gov.nasa.jpl.aerie.constraints.tree.NotEqual; -import gov.nasa.jpl.aerie.constraints.tree.RealResource; -import gov.nasa.jpl.aerie.constraints.tree.RealValue; -import gov.nasa.jpl.aerie.constraints.tree.SpansFromWindows; -import gov.nasa.jpl.aerie.constraints.tree.WindowsValue; -import gov.nasa.jpl.aerie.constraints.tree.WindowsWrapperExpression; +import gov.nasa.jpl.aerie.constraints.tree.*; import gov.nasa.jpl.aerie.merlin.driver.MissionModel; import gov.nasa.jpl.aerie.merlin.protocol.types.Duration; import gov.nasa.jpl.aerie.merlin.protocol.types.SerializedValue; @@ -44,7 +30,6 @@ import java.util.Map; import java.util.function.Function; -import static com.google.common.truth.Truth.assertThat; import static gov.nasa.jpl.aerie.constraints.time.Interval.Inclusivity.Exclusive; import static gov.nasa.jpl.aerie.constraints.time.Interval.Inclusivity.Inclusive; import static gov.nasa.jpl.aerie.constraints.time.Interval.interval; @@ -66,7 +51,6 @@ public class SimulationFacadeTest { //hard-coded range of scheduling/simulation operations private static final PlanningHorizon horizon = new PlanningHorizon(t0h, tEndh); - private static final Interval entireHorizon = horizon.getHor(); //concrete named time points used to setup tests and validate expectations private static final Duration t0 = horizon.toDur(t0h); @@ -165,16 +149,19 @@ public void associationToExistingSatisfyingActivity(){ problem.setInitialPlan(plan); final var solver = new PrioritySolver(problem); final var plan1 = solver.getNextSolution(); - assertThat(plan1.isPresent()).isTrue(); + assertTrue(plan1.isPresent()); + final var actAssociatedInFirstRun = plan1.get().getEvaluation().forGoal(goal).getAssociatedActivities(); - assertThat(actAssociatedInFirstRun.size()).isEqualTo(1); + assertEquals(1, actAssociatedInFirstRun.size()); + problem.setInitialPlan(plan1.get()); final var solver2 = new PrioritySolver(problem); final var plan2 = solver2.getNextSolution(); - assertThat(plan2.isPresent()).isTrue(); + assertTrue(plan2.isPresent()); + final var actAssociatedInSecondRun = plan2.get().getEvaluation().forGoal(goal).getAssociatedActivities(); - assertThat(actAssociatedInSecondRun.size()).isEqualTo(1); - assertThat(actAssociatedInFirstRun.iterator().next().equalsInProperties(actAssociatedInSecondRun.iterator().next())).isTrue(); + assertEquals(1, actAssociatedInSecondRun.size()); + assertTrue(actAssociatedInFirstRun.iterator().next().equalsInProperties(actAssociatedInSecondRun.iterator().next())); assertEquals(2, problem.getSimulationFacade().countSimulationRestarts()); } @@ -184,7 +171,7 @@ public void getValueAtTimeDoubleOnSimplePlanMidpoint() throws SimulationFacade.S facade.computeSimulationResultsUntil(tEnd); final var stateQuery = new StateQueryParam(getFruitRes().name, new TimeExpressionConstant(t1_5)); final var actual = stateQuery.getValue(facade.getLatestConstraintSimulationResults().get(), null, horizon.getHor()); - assertThat(actual).isEqualTo(SerializedValue.of(3.0)); + assertEquals(SerializedValue.of(3.0), actual); } @Test @@ -193,7 +180,7 @@ public void getValueAtTimeDoubleOnSimplePlan() throws SimulationFacade.Simulatio facade.computeSimulationResultsUntil(tEnd); final var stateQuery = new StateQueryParam(getFruitRes().name, new TimeExpressionConstant(t2)); final var actual = stateQuery.getValue(facade.getLatestConstraintSimulationResults().get(), null, horizon.getHor()); - assertThat(actual).isEqualTo(SerializedValue.of(2.9)); + assertEquals(SerializedValue.of(2.9), actual); assertEquals(1, problem.getSimulationFacade().countSimulationRestarts()); } @@ -206,7 +193,7 @@ public void whenValueAboveDoubleOnSimplePlan() throws SimulationFacade.Simulatio Segment.of(interval(0, Inclusive, 2, Exclusive, SECONDS), true), Segment.of(interval(2, Inclusive,5, Exclusive, SECONDS), false) ); - assertThat(actual).isEqualTo(expected); + assertEquals(expected, actual); } @Test @@ -218,7 +205,7 @@ public void whenValueBelowDoubleOnSimplePlan() throws SimulationFacade.Simulatio Segment.of(interval(0, Inclusive, 2, Exclusive, SECONDS), false), Segment.of(interval(2, Inclusive, 5, Exclusive, SECONDS), true) ); - assertThat(actual).isEqualTo(expected); + assertEquals(expected, actual); } @Test @@ -231,7 +218,7 @@ public void whenValueBetweenDoubleOnSimplePlan() throws SimulationFacade.Simulat Segment.of(interval(1, Inclusive, 2, Exclusive, SECONDS), true), Segment.of(interval(2, Inclusive, 5, Exclusive, SECONDS), false) ); - assertThat(actual).isEqualTo(expected); + assertEquals(expected, actual); } @Test @@ -244,7 +231,7 @@ public void whenValueEqualDoubleOnSimplePlan() throws SimulationFacade.Simulatio Segment.of(interval(1, Inclusive, 2, Exclusive, SECONDS), true), Segment.of(interval(2, Inclusive, 5, Exclusive, SECONDS), false) ); - assertThat(actual).isEqualTo(expected); + assertEquals(expected, actual); } @Test @@ -257,7 +244,7 @@ public void whenValueNotEqualDoubleOnSimplePlan() throws SimulationFacade.Simula Segment.of(interval(1, Inclusive, 2, Exclusive, SECONDS), false), Segment.of(interval(2, Inclusive, 5, Exclusive, SECONDS), true) ); - assertThat(actual).isEqualTo(expected); + assertEquals(expected, actual); } @Test diff --git a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/TestUnsatisfiableCompositeGoals.java b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/TestUnsatisfiableCompositeGoals.java index 9340efa3e3..11f8d86bcf 100644 --- a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/TestUnsatisfiableCompositeGoals.java +++ b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/TestUnsatisfiableCompositeGoals.java @@ -24,7 +24,6 @@ import java.util.List; -import static com.google.common.truth.Truth.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; public class TestUnsatisfiableCompositeGoals { @@ -253,7 +252,7 @@ public void testCardinalityBacktrack() { final var solver = new PrioritySolver(problem); var plan = solver.getNextSolution().orElseThrow(); - assertThat(plan.getActivities().size()).isEqualTo(0); + assertEquals(0, plan.getActivities().size()); assertEquals(2, problem.getSimulationFacade().countSimulationRestarts()); } } diff --git a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/TestUtility.java b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/TestUtility.java index 101c3f230f..537416e344 100644 --- a/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/TestUtility.java +++ b/scheduler-driver/src/test/java/gov/nasa/jpl/aerie/scheduler/TestUtility.java @@ -15,8 +15,13 @@ import gov.nasa.jpl.aerie.scheduler.model.SchedulingCondition; import java.time.Instant; +import java.util.ArrayList; import java.util.List; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + public class TestUtility { public static boolean emptyPlan(Plan plan) { @@ -146,4 +151,23 @@ public static Instant timeFromEpochDays(int days) { return timeFromEpochHours(days * 24); } + /** matches activities if they agree in everything except the (possibly auto-generated) names **/ + public static void assertSetEquality(List expected, List actual) { + assertEquals(expected.size(), actual.size()); + final var backupExpected = new ArrayList<>(expected); + for (SchedulingActivityDirective directive : actual) { + final int matchIndex = getIndexSADList(backupExpected, directive); + assertNotEquals(-1, matchIndex); + backupExpected.remove(matchIndex); // Remove to avoid similar elements matching twice + } + } + + private static int getIndexSADList(List list, SchedulingActivityDirective directive) { + for (int i = 0; i < list.size(); ++i) { + if (list.get(i).equalsInProperties(directive)) { + return i; + } + } + return -1; + } } diff --git a/scheduler-server/build.gradle b/scheduler-server/build.gradle index f60a755a08..8c2381b95f 100644 --- a/scheduler-server/build.gradle +++ b/scheduler-server/build.gradle @@ -25,22 +25,16 @@ dependencies { implementation project(':constraints') implementation project(':scheduler-driver') - implementation 'org.apache.commons:commons-lang3:3.13.0' - implementation 'io.javalin:javalin:5.6.2' + implementation 'io.javalin:javalin:5.6.3' implementation 'org.eclipse:yasson:3.0.3' - implementation 'org.apache.bcel:bcel:6.7.0' implementation 'org.postgresql:postgresql:42.6.0' implementation 'com.zaxxer:HikariCP:5.0.1' testImplementation project(':examples:foo-missionmodel') testImplementation project(':merlin-framework') - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.0' + testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.0' - testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'javax.json.bind:javax.json.bind-api:1.0' - testImplementation 'org.glassfish:javax.json:1.1.4' testFixturesImplementation project(':merlin-driver') } diff --git a/scheduler-server/src/test/java/gov/nasa/jpl/aerie/scheduler/server/services/GenerateSchedulingLibActionTest.java b/scheduler-server/src/test/java/gov/nasa/jpl/aerie/scheduler/server/services/GenerateSchedulingLibActionTest.java index 010b900346..21aad6c5a8 100644 --- a/scheduler-server/src/test/java/gov/nasa/jpl/aerie/scheduler/server/services/GenerateSchedulingLibActionTest.java +++ b/scheduler-server/src/test/java/gov/nasa/jpl/aerie/scheduler/server/services/GenerateSchedulingLibActionTest.java @@ -1,7 +1,8 @@ package gov.nasa.jpl.aerie.scheduler.server.services; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; public final class GenerateSchedulingLibActionTest { @@ -16,7 +17,7 @@ void testTypescriptResourcesLoaded() { private static void assertTypescriptResourceLoaded(final String basename) { final var res = GenerateSchedulingLibAction.getTypescriptResource(basename); - assertThat(res.basename()).isEqualTo(basename); - assertThat(res.source()).isNotEmpty(); + assertEquals(basename, res.basename()); + assertFalse(res.source().isEmpty()); } } diff --git a/scheduler-worker/build.gradle b/scheduler-worker/build.gradle index e8c0b63552..882a6ec2f7 100644 --- a/scheduler-worker/build.gradle +++ b/scheduler-worker/build.gradle @@ -113,11 +113,9 @@ dependencies { implementation project(':parsing-utilities') implementation project(':constraints') - implementation 'org.apache.commons:commons-lang3:3.13.0' - implementation 'io.javalin:javalin:5.6.2' + implementation 'io.javalin:javalin:5.6.3' implementation 'org.slf4j:slf4j-simple:2.0.7' implementation 'org.eclipse:yasson:3.0.3' - implementation 'org.apache.bcel:bcel:6.7.0' implementation 'org.postgresql:postgresql:42.6.0' implementation 'com.zaxxer:HikariCP:5.0.1' @@ -125,9 +123,6 @@ dependencies { testImplementation testFixtures(project(':scheduler-server')) testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.0' - testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'javax.json.bind:javax.json.bind-api:1.0' - testImplementation 'org.glassfish:javax.json:1.1.4' } publishing { diff --git a/sequencing-server/package-lock.json b/sequencing-server/package-lock.json index 24ddd5546d..965ebb73f1 100644 --- a/sequencing-server/package-lock.json +++ b/sequencing-server/package-lock.json @@ -70,17 +70,89 @@ "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", @@ -144,13 +216,14 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", - "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.19.4", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -190,34 +263,34 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -276,30 +349,30 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -329,13 +402,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -414,9 +487,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -603,33 +676,33 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", - "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.6", - "@babel/types": "^7.19.4", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -661,13 +734,13 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2754,9 +2827,9 @@ "dev": true }, "node_modules/graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" @@ -3644,9 +3717,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4787,9 +4860,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5279,9 +5352,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5719,12 +5792,71 @@ "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/compat-data": { @@ -5774,13 +5906,14 @@ } }, "@babel/generator": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", - "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.19.4", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -5810,28 +5943,28 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { @@ -5875,24 +6008,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -5913,13 +6046,13 @@ } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -5982,9 +6115,9 @@ } }, "@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -6114,30 +6247,30 @@ } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", - "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.6", - "@babel/types": "^7.19.4", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -6160,13 +6293,13 @@ } }, "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -7825,9 +7958,9 @@ "dev": true }, "graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", "peer": true }, "graphql-request": { @@ -8493,9 +8626,9 @@ }, "dependencies": { "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9326,9 +9459,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "send": { @@ -9693,9 +9826,9 @@ }, "dependencies": { "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0"