contributorGroups = Arrays.asList("contributor", "author");
+
+ public static final int MAXIMUM_NUMBER_OF_GUESTS = MAXIMUM_NUMBER_OF_USERS * 10;
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/CompileTimeVariables.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/CompileTimeVariables.java
new file mode 100644
index 0000000000..c783a1368b
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/CompileTimeVariables.java
@@ -0,0 +1,21 @@
+package com.baeldung.compiletimeconstants;
+
+import java.io.PrintWriter;
+
+public class CompileTimeVariables {
+
+ public final String errorMessage = ClassConstants.DEFAULT_USERNAME + " not allowed here.";
+ public final int maximumLoginAttempts = 5;
+
+ public static void main(String[] args) {
+ PrintWriter printWriter = System.console().writer();
+ printWriter.println(ClassConstants.DEFAULT_USERNAME);
+
+ CompileTimeVariables instance = new CompileTimeVariables();
+ printWriter.println(instance.maximumLoginAttempts);
+
+ final String username = "baeldung" + "-" + "user";
+ printWriter.println(username);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/RuntimeVariables.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/RuntimeVariables.java
new file mode 100644
index 0000000000..53e567fe54
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/RuntimeVariables.java
@@ -0,0 +1,16 @@
+package com.baeldung.compiletimeconstants;
+
+import java.io.Console;
+public class RuntimeVariables {
+
+ public static void main(String[] args) {
+ Console console = System.console();
+
+ final String input = console.readLine();
+ console.writer().println(input);
+
+ final double random = Math.random();
+ console.writer().println("Number: " + random);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/SwitchStatement.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/SwitchStatement.java
new file mode 100644
index 0000000000..4242dc8d36
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/compiletimeconstants/SwitchStatement.java
@@ -0,0 +1,17 @@
+package com.baeldung.compiletimeconstants;
+
+public class SwitchStatement {
+
+ private static final String VALUE_ONE = "value-one";
+
+ public static void main(String[] args) {
+ final String valueTwo = "value" + "-" + "two";
+ switch (args[0]) {
+ case VALUE_ONE:
+ break;
+ case valueTwo:
+ break;
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/BenchmarkRunner.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/BenchmarkRunner.java
new file mode 100644
index 0000000000..ee34114195
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/BenchmarkRunner.java
@@ -0,0 +1,34 @@
+package com.baeldung.finalkeyword;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.concurrent.TimeUnit;
+
+public class BenchmarkRunner {
+
+ public static void main(String[] args) throws Exception {
+ org.openjdk.jmh.Main.main(args);
+ }
+
+ @Benchmark
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ @BenchmarkMode(Mode.AverageTime)
+ public static String concatNonFinalStrings() {
+ String x = "x";
+ String y = "y";
+ return x + y;
+ }
+
+ @Benchmark
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ @BenchmarkMode(Mode.AverageTime)
+ public static String concatFinalStrings() {
+ final String x = "x";
+ final String y = "y";
+ return x + y;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/ClassVariableFinal.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/ClassVariableFinal.java
new file mode 100644
index 0000000000..1aeef76e58
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/ClassVariableFinal.java
@@ -0,0 +1,19 @@
+package com.baeldung.finalkeyword;
+
+import java.io.Console;
+
+public class ClassVariableFinal {
+
+ static final boolean doX = false;
+ static final boolean doY = true;
+
+ public static void main(String[] args) {
+ Console console = System.console();
+ if (doX) {
+ console.writer().println("x");
+ } else if (doY) {
+ console.writer().println("y");
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/ClassVariableNonFinal.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/ClassVariableNonFinal.java
new file mode 100644
index 0000000000..a6d83a66cb
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/ClassVariableNonFinal.java
@@ -0,0 +1,19 @@
+package com.baeldung.finalkeyword;
+
+import java.io.Console;
+
+public class ClassVariableNonFinal {
+
+ static boolean doX = false;
+ static boolean doY = true;
+
+ public static void main(String[] args) {
+ Console console = System.console();
+ if (doX) {
+ console.writer().println("x");
+ } else if (doY) {
+ console.writer().println("y");
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/package-info.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/package-info.java
new file mode 100644
index 0000000000..fd1e3cf8d8
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/finalkeyword/package-info.java
@@ -0,0 +1,13 @@
+/**
+* This module is about impact of the final keyword on performance
+ *
+ * This module explores if there are any performance benefits from
+ * using the final keyword in our code. This module examines the performance
+ * implications of using final on a variable, method, and class level.
+ *
+*
+* @since 1.0
+* @author baeldung
+* @version 1.1
+*/
+package com.baeldung.finalkeyword;
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/hash/Player.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/hash/Player.java
new file mode 100644
index 0000000000..79d2396816
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/hash/Player.java
@@ -0,0 +1,91 @@
+package com.baeldung.hash;
+
+import java.util.Objects;
+
+public class Player {
+ private String firstName;
+ private String lastName;
+ private String position;
+
+ public Player() {
+
+ }
+
+ public Player(String firstName, String lastName, String position) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.position = position;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getPosition() {
+ return position;
+ }
+
+ public void setPosition(String position) {
+ this.position = position;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(firstName, lastName, position);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (obj == null) {
+ return false;
+ }
+
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+
+ Player other = (Player) obj;
+
+ if (firstName == null) {
+ if (other.firstName != null) {
+ return false;
+ }
+ } else if (!firstName.equals(other.firstName)) {
+ return false;
+ }
+
+ if (lastName == null) {
+ if (other.lastName != null) {
+ return false;
+ }
+ } else if (!lastName.equals(other.lastName)) {
+ return false;
+ }
+
+ if (position == null) {
+ if (other.position != null) {
+ return false;
+ }
+ } else if (!position.equals(other.position)) {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/HashCodeUnitTest.java b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/HashCodeUnitTest.java
new file mode 100644
index 0000000000..d1a9e06611
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/HashCodeUnitTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.hash;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.util.Objects;
+
+import org.junit.Test;
+
+public class HashCodeUnitTest {
+
+ @Test
+ public void whenCallingObjectsHashCodeOnIndenticalObjects_thenSameHashCodeReturned() {
+ String stringOne = "test";
+ String stringTwo = "test";
+ int hashCode1 = Objects.hashCode(stringOne);
+ int hashCode2 = Objects.hashCode(stringTwo);
+
+ assertEquals(hashCode1, hashCode2);
+ }
+
+ @Test
+ public void whenCallingObjectsHashCodeOnNullObject_thenZeroReturned() {
+ String nullString = null;
+ int hashCode = Objects.hashCode(nullString);
+ assertEquals(0, hashCode);
+ }
+
+ @Test
+ public void whenCallingObjectHashCodeOnIndenticalObjects_thenSameHashCodeReturned() {
+ Double valueOne = Double.valueOf(1.0012);
+ Double valueTwo = Double.valueOf(1.0012);
+
+ int hashCode1 = valueOne.hashCode();
+ int hashCode2 = valueTwo.hashCode();
+
+ assertEquals(hashCode1, hashCode2);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void whenCallingObjectHashCodeOnNullObject_theNullPointerExceptionThrown() {
+ Double value = null;
+ value.hashCode();
+ }
+
+ @Test
+ public void whenCallingObjectsHashOnStrings_thenSameHashCodeReturned() {
+ String strOne = "one";
+ String strTwo = "two";
+ String strOne2 = "one";
+ String strTwo2 = "two";
+
+ int hashCode1 = Objects.hash(strOne, strTwo);
+ int hashCode2 = Objects.hash(strOne2, strTwo2);
+
+ assertEquals(hashCode1, hashCode2);
+ }
+
+ @Test
+ public void whenCallingObjectsHashOnSingleString_thenDifferentHashcodeFromObjectsHashCodeCallReturned() {
+ String testString = "test string";
+ int hashCode1 = Objects.hash(testString);
+ int hashCode2 = Objects.hashCode(testString);
+
+ assertNotEquals(hashCode1, hashCode2);
+ }
+}
diff --git a/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/PlayerUnitTest.java b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/PlayerUnitTest.java
new file mode 100644
index 0000000000..fe0ef8a727
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/hash/PlayerUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.hash;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+
+public class PlayerUnitTest {
+
+ @Test
+ public void whenCallingHashCodeOnIdenticalValue_thenSameHashCodeReturned() {
+ Player player = new Player("Eduardo", "Rodriguez", "Pitcher");
+ Player indenticalPlayer = new Player("Eduardo", "Rodriguez", "Pitcher");
+
+ int hashCode1 = player.hashCode();
+ int hashCode2 = player.hashCode();
+ int hashCode3 = indenticalPlayer.hashCode();
+
+ assertEquals(hashCode1, hashCode2);
+ assertEquals(hashCode1, hashCode3);
+ }
+
+ @Test
+ public void whenCallingHashCodeAndArraysHashCode_thenSameHashCodeReturned() {
+ Player player = new Player("Bobby", "Dalbec", "First Base");
+ int hashcode1 = player.hashCode();
+ String[] playerInfo = { "Bobby", "Dalbec", "First Base" };
+ int hashcode2 = Arrays.hashCode(playerInfo);
+
+ assertEquals(hashcode1, hashcode2);
+ }
+}
diff --git a/core-java-modules/core-java-lang-math-2/pom.xml b/core-java-modules/core-java-lang-math-2/pom.xml
index e2cced4fbf..098d77b59a 100644
--- a/core-java-modules/core-java-lang-math-2/pom.xml
+++ b/core-java-modules/core-java-lang-math-2/pom.xml
@@ -1,10 +1,12 @@
-
+
4.0.0
core-java-lang-math-2
0.0.1-SNAPSHOT
core-java-lang-math-2
+
com.baeldung.core-java-modules
core-java-modules
@@ -58,22 +60,10 @@
org.openjdk.jmh
jmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- ${exec-maven-plugin.version}
-
-
-
-
-
3.6.1
3.9.0
@@ -83,7 +73,6 @@
1.0.0-beta4
1.2.0
0.6.0
- 1.19
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-math-3/pom.xml b/core-java-modules/core-java-lang-math-3/pom.xml
index 27c2372ab6..6779d0ecc6 100644
--- a/core-java-modules/core-java-lang-math-3/pom.xml
+++ b/core-java-modules/core-java-lang-math-3/pom.xml
@@ -6,6 +6,7 @@
core-java-lang-math-3
0.0.1-SNAPSHOT
core-java-lang-math-3
+
com.baeldung.core-java-modules
core-java-modules
@@ -19,7 +20,6 @@
exp4j
0.4.8
-
com.fathzer
javaluator
@@ -27,9 +27,4 @@
-
-
-
-
-
diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml
index 81ff0d43ea..0facdf2d8b 100644
--- a/core-java-modules/core-java-lang-math/pom.xml
+++ b/core-java-modules/core-java-lang-math/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-lang-math
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -40,4 +40,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-constructors/pom.xml b/core-java-modules/core-java-lang-oop-constructors/pom.xml
index e54286a822..5635059fa9 100644
--- a/core-java-modules/core-java-lang-oop-constructors/pom.xml
+++ b/core-java-modules/core-java-lang-oop-constructors/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-constructors
+ core-java-lang-oop-constructors
+ jar
+
core-java-modules
com.baeldung.core-java-modules
0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-constructors
- core-java-lang-oop-constructors
- jar
@@ -25,4 +25,5 @@
3.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-generics/README.md b/core-java-modules/core-java-lang-oop-generics/README.md
index 9c9080ece3..720ba9dcfd 100644
--- a/core-java-modules/core-java-lang-oop-generics/README.md
+++ b/core-java-modules/core-java-lang-oop-generics/README.md
@@ -8,3 +8,4 @@ This module contains articles about generics in Java
- [Raw Types in Java](https://www.baeldung.com/raw-types-java)
- [Super Type Tokens in Java Generics](https://www.baeldung.com/java-super-type-tokens)
- [Java Warning “unchecked conversion”](https://www.baeldung.com/java-unchecked-conversion)
+- [Java Warning “Unchecked Cast”](https://www.baeldung.com/java-warning-unchecked-cast)
diff --git a/core-java-modules/core-java-lang-oop-generics/pom.xml b/core-java-modules/core-java-lang-oop-generics/pom.xml
index 1a538edac9..b13683d1cd 100644
--- a/core-java-modules/core-java-lang-oop-generics/pom.xml
+++ b/core-java-modules/core-java-lang-oop-generics/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-generics
+ core-java-lang-oop-generics
+ jar
+
core-java-modules
com.baeldung.core-java-modules
0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-generics
- core-java-lang-oop-generics
- jar
@@ -20,7 +20,6 @@
true
-
org.apache.maven.plugins
@@ -30,12 +29,13 @@
${maven.compiler.source}
${maven.compiler.target}
-
+
+
1.8
1.8
diff --git a/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/uncheckedcast/UncheckedCast.java b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/uncheckedcast/UncheckedCast.java
new file mode 100644
index 0000000000..fe79488d11
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-generics/src/main/java/com/baeldung/uncheckedcast/UncheckedCast.java
@@ -0,0 +1,26 @@
+package com.baeldung.uncheckedcast;
+
+import java.time.LocalDate;
+import java.time.Month;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class UncheckedCast {
+ public static Map getRawMap() {
+ Map rawMap = new HashMap();
+ rawMap.put("date 1", LocalDate.of(2021, Month.FEBRUARY, 10));
+ rawMap.put("date 2", LocalDate.of(1992, Month.AUGUST, 8));
+ rawMap.put("date 3", LocalDate.of(1976, Month.NOVEMBER, 18));
+ return rawMap;
+ }
+
+ public static Map getRawMapWithMixedTypes() {
+ Map rawMap = new HashMap();
+ rawMap.put("date 1", LocalDate.of(2021, Month.FEBRUARY, 10));
+ rawMap.put("date 2", LocalDate.of(1992, Month.AUGUST, 8));
+ rawMap.put("date 3", LocalDate.of(1976, Month.NOVEMBER, 18));
+ rawMap.put("date 4", new Date());
+ return rawMap;
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/uncheckedcast/UncheckedCastUnitTest.java b/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/uncheckedcast/UncheckedCastUnitTest.java
new file mode 100644
index 0000000000..b1bd46555e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-generics/src/test/java/com/baeldung/uncheckedcast/UncheckedCastUnitTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.uncheckedcast;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.time.LocalDate;
+import java.time.Month;
+import java.util.Map;
+
+public class UncheckedCastUnitTest {
+
+ @Test
+ public void givenRawMap_whenCastToTypedMap_shouldHaveCompilerWarning() {
+ Map castFromRawMap = (Map) UncheckedCast.getRawMap();
+ Assert.assertEquals(3, castFromRawMap.size());
+ Assert.assertEquals(castFromRawMap.get("date 2"), LocalDate.of(1992, Month.AUGUST, 8));
+ }
+
+ @Test(expected = ClassCastException.class)
+ public void givenMixTypedRawMap_whenCastToTypedMap_shouldThrowClassCastException() {
+ Map castFromRawMap = (Map) UncheckedCast.getRawMapWithMixedTypes();
+ Assert.assertEquals(4, castFromRawMap.size());
+ Assert.assertTrue(castFromRawMap.get("date 4").isAfter(castFromRawMap.get("date 3")));
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-inheritance/pom.xml b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
index ca828279db..e0272fb94e 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/pom.xml
+++ b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-inheritance
+ core-java-lang-oop-inheritance
+ jar
+
core-java-modules
com.baeldung.core-java-modules
0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-inheritance
- core-java-lang-oop-inheritance
- jar
@@ -25,4 +25,5 @@
3.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-methods/pom.xml b/core-java-modules/core-java-lang-oop-methods/pom.xml
index bcf561a6c2..e493f716ec 100644
--- a/core-java-modules/core-java-lang-oop-methods/pom.xml
+++ b/core-java-modules/core-java-lang-oop-methods/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-methods
+ core-java-lang-oop-methods
+ jar
+
core-java-modules
com.baeldung.core-java-modules
0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-methods
- core-java-lang-oop-methods
- jar
@@ -24,7 +24,6 @@
commons-lang
${commons-lang.version}
-
org.assertj
assertj-core
@@ -42,8 +41,8 @@
1.18.12
2.6
-
3.10.0
3.0.3
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-modifiers/pom.xml b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
index 5f0be4545f..70c70608eb 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-modifiers
+ core-java-lang-oop-modifiers
+ jar
+
core-java-modules
com.baeldung.core-java-modules
0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-modifiers
- core-java-lang-oop-modifiers
- jar
@@ -31,4 +31,5 @@
3.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-others/pom.xml b/core-java-modules/core-java-lang-oop-others/pom.xml
index ad5699d592..d9d147f34a 100644
--- a/core-java-modules/core-java-lang-oop-others/pom.xml
+++ b/core-java-modules/core-java-lang-oop-others/pom.xml
@@ -1,16 +1,16 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-others
+ core-java-lang-oop-others
+ jar
+
core-java-modules
com.baeldung.core-java-modules
0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-others
- core-java-lang-oop-others
- jar
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-patterns/pom.xml b/core-java-modules/core-java-lang-oop-patterns/pom.xml
index 0829295250..8b8b4a7b46 100644
--- a/core-java-modules/core-java-lang-oop-patterns/pom.xml
+++ b/core-java-modules/core-java-lang-oop-patterns/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-patterns
+ core-java-lang-oop-patterns
+ jar
+
core-java-modules
com.baeldung.core-java-modules
0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-patterns
- core-java-lang-oop-patterns
- jar
@@ -29,7 +29,6 @@
gson
${gson.version}
-
org.assertj
assertj-core
@@ -42,4 +41,5 @@
2.8.2
3.10.0
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Car.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Car.java
new file mode 100644
index 0000000000..6f17ecc536
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Car.java
@@ -0,0 +1,42 @@
+package com.baeldung.interfacevsabstractclass;
+
+public class Car extends Vehicle {
+
+ public Car(String vechicleName) {
+ super(vechicleName);
+ }
+
+ public Car(String vechicleName, String vehicleModel) {
+ super(vechicleName, vehicleModel);
+ }
+
+ public Car(String vechicleName, String vehicleModel, Long makeYear) {
+ super(vechicleName, vehicleModel, makeYear);
+ }
+
+ @Override
+ protected void start() {
+ // code implementation details on starting a car.
+ }
+
+ @Override
+ protected void stop() {
+ // code implementation details on stopping a car.
+ }
+
+ @Override
+ protected void drive() {
+ // code implementation details on start driving a car.
+ }
+
+ @Override
+ protected void changeGear() {
+ // code implementation details on changing the car gear.
+ }
+
+ @Override
+ protected void reverse() {
+ // code implementation details on reverse driving a car.
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/ImageSender.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/ImageSender.java
new file mode 100644
index 0000000000..1948cc6583
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/ImageSender.java
@@ -0,0 +1,12 @@
+package com.baeldung.interfacevsabstractclass;
+
+import java.io.File;
+
+public class ImageSender implements Sender {
+
+ @Override
+ public void send(File fileToBeSent) {
+ // image sending implementation code.
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Sender.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Sender.java
new file mode 100644
index 0000000000..fde6527ef6
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Sender.java
@@ -0,0 +1,8 @@
+package com.baeldung.interfacevsabstractclass;
+
+import java.io.File;
+
+public interface Sender {
+
+ void send(File fileToBeSent);
+}
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Vehicle.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Vehicle.java
new file mode 100644
index 0000000000..d98b8ca93b
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/Vehicle.java
@@ -0,0 +1,57 @@
+package com.baeldung.interfacevsabstractclass;
+
+public abstract class Vehicle {
+
+ private String vehicleName;
+ private String vehicleModel;
+ private Long makeYear;
+
+ public Vehicle(String vehicleName) {
+ this.vehicleName = vehicleName;
+ }
+
+ public Vehicle(String vehicleName, String vehicleModel) {
+ this(vehicleName);
+ this.vehicleModel = vehicleModel;
+ }
+
+ public Vehicle(String vechicleName, String vehicleModel, Long makeYear) {
+ this(vechicleName, vehicleModel);
+ this.makeYear = makeYear;
+ }
+
+ public String getVehicleName() {
+ return vehicleName;
+ }
+
+ public void setVehicleName(String vehicleName) {
+ this.vehicleName = vehicleName;
+ }
+
+ public String getVehicleModel() {
+ return vehicleModel;
+ }
+
+ public void setVehicleModel(String vehicleModel) {
+ this.vehicleModel = vehicleModel;
+ }
+
+ public Long getMakeYear() {
+ return makeYear;
+ }
+
+ public void setMakeYear(Long makeYear) {
+ this.makeYear = makeYear;
+ }
+
+ protected abstract void start();
+
+ protected abstract void stop();
+
+ protected abstract void drive();
+
+ protected abstract void changeGear();
+
+ protected abstract void reverse();
+
+}
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/VideoSender.java b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/VideoSender.java
new file mode 100644
index 0000000000..71f8050590
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/main/java/com/baeldung/interfacevsabstractclass/VideoSender.java
@@ -0,0 +1,12 @@
+package com.baeldung.interfacevsabstractclass;
+
+import java.io.File;
+
+public class VideoSender implements Sender {
+
+ @Override
+ public void send(File fileToBeSent) {
+ // video sending implementation code
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/SenderUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/SenderUnitTest.java
new file mode 100644
index 0000000000..6419721b3a
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/SenderUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.interfacevsabstractclass;
+
+import static org.junit.jupiter.api.Assertions.*;
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.interfacevsabstractclass.ImageSender;
+import com.baeldung.interfacevsabstractclass.Sender;
+
+import java.io.File;
+
+class SenderUnitTest {
+
+ public final static String IMAGE_FILE_PATH = "/sample_image_file_path/photo.jpg";
+
+ @Test
+ void givenImageUploaded_whenButtonClicked_thenSendImage() {
+ File imageFile = new File(IMAGE_FILE_PATH);
+
+ Sender sender = new ImageSender();
+ sender.send(imageFile);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/VehicleUnitTest.java b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/VehicleUnitTest.java
new file mode 100644
index 0000000000..1650ab9257
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-patterns/src/test/java/com/baeldung/interfacevsabstractclass/VehicleUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.interfacevsabstractclass;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.interfacevsabstractclass.Car;
+import com.baeldung.interfacevsabstractclass.Vehicle;
+
+class VehicleUnitTest {
+
+ @Test
+ void givenVehicle_whenNeedToDrive_thenStart() {
+ Vehicle car = new Car("BMW");
+
+ car.start();
+ car.drive();
+ car.changeGear();
+ car.stop();
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-types-2/README.md b/core-java-modules/core-java-lang-oop-types-2/README.md
new file mode 100644
index 0000000000..a4e7b101c3
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/README.md
@@ -0,0 +1,7 @@
+## Core Java Lang OOP - Types
+
+This module contains articles about types in Java
+
+### Relevant Articles:
+
+- [Convert an Array of Primitives to an Array of Objects](https://www.baeldung.com/java-primitive-array-to-object-array)
diff --git a/core-java-modules/core-java-lang-oop-types-2/pom.xml b/core-java-modules/core-java-lang-oop-types-2/pom.xml
new file mode 100644
index 0000000000..d95123b39e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+ core-java-lang-oop-types-2
+ jar
+
+
+ core-java-modules
+ com.baeldung.core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/conversions/PrimitiveToObjectArrayUnitTest.java b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/conversions/PrimitiveToObjectArrayUnitTest.java
new file mode 100644
index 0000000000..e0f292f26e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/conversions/PrimitiveToObjectArrayUnitTest.java
@@ -0,0 +1,81 @@
+package com.baeldung.conversions;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class PrimitiveToObjectArrayUnitTest {
+
+ @Test
+ void givenUsingIteration_whenConvertingToObjects_thenSuccess() {
+ int[] input = new int[] { 0, 1, 2, 3, 4 };
+ Integer[] expected = new Integer[] { 0, 1, 2, 3, 4 };
+
+ Integer[] output = new Integer[input.length];
+ for (int i = 0; i < input.length; i++) {
+ output[i] = input[i];
+ }
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingIteration_whenConvertingToPrimitives_thenSuccess() {
+ Integer[] input = new Integer[] { 0, 1, 2, 3, 4 };
+ int[] expected = new int[] { 0, 1, 2, 3, 4 };
+
+ int[] output = new int[input.length];
+ for (int i = 0; i < input.length; i++) {
+ output[i] = input[i];
+ }
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingStreams_whenConvertingToObjects_thenSuccess() {
+ int[] input = new int[] { 0, 1, 2, 3, 4 };
+ Integer[] expected = new Integer[] { 0, 1, 2, 3, 4 };
+
+ Integer[] output = Arrays.stream(input)
+ .boxed()
+ .toArray(Integer[]::new);
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingStreams_whenConvertingToPrimitives_thenSuccess() {
+ Integer[] input = new Integer[] { 0, 1, 2, 3, 4 };
+ int[] expected = new int[] { 0, 1, 2, 3, 4 };
+
+ int[] output = Arrays.stream(input)
+ .mapToInt(Integer::intValue)
+ .toArray();
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingApacheCommons_whenConvertingToObjects_thenSuccess() {
+ int[] input = new int[] { 0, 1, 2, 3, 4 };
+ Integer[] expected = new Integer[] { 0, 1, 2, 3, 4 };
+
+ Integer[] output = ArrayUtils.toObject(input);
+
+ assertArrayEquals(expected, output);
+ }
+
+ @Test
+ void givenUsingApacheCommons_whenConvertingToPrimitives_thenSuccess() {
+ Integer[] input = new Integer[] { 0, 1, 2, 3, 4 };
+ int[] expected = new int[] { 0, 1, 2, 3, 4 };
+
+ int[] output = ArrayUtils.toPrimitive(input);
+
+ assertArrayEquals(expected, output);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-types/README.md b/core-java-modules/core-java-lang-oop-types/README.md
index 6c649877b3..1ac5a5c804 100644
--- a/core-java-modules/core-java-lang-oop-types/README.md
+++ b/core-java-modules/core-java-lang-oop-types/README.md
@@ -13,3 +13,4 @@ This module contains articles about types in Java
- [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums)
- [Determine if an Object is of Primitive Type](https://www.baeldung.com/java-object-primitive-type)
- [Extending Enums in Java](https://www.baeldung.com/java-extending-enums)
+- [Java Class File Naming Conventions](https://www.baeldung.com/java-class-file-naming)
diff --git a/core-java-modules/core-java-lang-oop-types/pom.xml b/core-java-modules/core-java-lang-oop-types/pom.xml
index c4efd9b8d2..b770caf970 100644
--- a/core-java-modules/core-java-lang-oop-types/pom.xml
+++ b/core-java-modules/core-java-lang-oop-types/pom.xml
@@ -1,17 +1,17 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ core-java-lang-oop-types
+ core-java-lang-oop-types
+ jar
+
core-java-modules
com.baeldung.core-java-modules
0.0.1-SNAPSHOT
- 4.0.0
-
- core-java-lang-oop-types
- core-java-lang-oop-types
- jar
@@ -28,4 +28,5 @@
1.15
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/classfile/Outer.java b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/classfile/Outer.java
new file mode 100644
index 0000000000..489b85d12d
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types/src/main/java/com/baeldung/classfile/Outer.java
@@ -0,0 +1,135 @@
+package com.baeldung.classfile;
+
+import org.apache.commons.lang3.StringUtils;
+import com.baeldung.classfile.HelloWorld.HelloSomeone;
+
+public class Outer {
+
+ // Static Nested class
+ static class StaticNested {
+ public String message() {
+ return "This is a static Nested Class";
+ }
+ }
+
+ // Non-static Nested class
+ class Nested {
+ public String message() {
+ return "This is a non-static Nested Class";
+ }
+ }
+
+ // Local class
+ public String message() {
+ class Local {
+ private String message() {
+ return "This is a Local Class within a method";
+ }
+ }
+ Local local = new Local();
+ return local.message();
+ }
+
+ // Local class within if clause
+ public String message(String name) {
+ if (StringUtils.isEmpty(name)) {
+ class Local {
+ private String message() {
+ return "This is a Local Class within if clause";
+ }
+ }
+ Local local = new Local();
+ return local.message();
+ } else
+ return "Welcome to " + name;
+ }
+
+ // Anonymous Inner class extending a class
+ public String greet() {
+ Outer anonymous = new Outer() {
+ @Override
+ public String greet() {
+ return "Running Anonymous Class...";
+ }
+ };
+ return anonymous.greet();
+ }
+
+ // Anonymous inner class implementing an interface
+ public String greet(String name) {
+
+ HelloWorld helloWorld = new HelloWorld() {
+ @Override
+ public String greet(String name) {
+ return "Welcome to " + name;
+ }
+
+ };
+ return helloWorld.greet(name);
+ }
+
+ // Anonymous inner class implementing nested interface
+ public String greetSomeone(String name) {
+
+ HelloSomeone helloSomeOne = new HelloSomeone() {
+ @Override
+ public String greet(String name) {
+ return "Hello " + name;
+ }
+
+ };
+ return helloSomeOne.greet(name);
+ }
+
+ // Nested interface within a class
+ interface HelloOuter {
+ public String hello(String name);
+ }
+
+ // Enum within a class
+ enum Color {
+ RED, GREEN, BLUE;
+ }
+}
+
+interface HelloWorld {
+
+ public String greet(String name);
+
+ // Nested class within an interface
+ class InnerClass implements HelloWorld {
+ @Override
+ public String greet(String name) {
+ return "Inner class within an interface";
+ }
+ }
+
+ // Nested interface within an interfaces
+ interface HelloSomeone {
+ public String greet(String name);
+ }
+
+ // Enum within an interface
+ enum Directon {
+ NORTH, SOUTH, EAST, WEST;
+ }
+}
+
+enum Level {
+ LOW, MEDIUM, HIGH;
+
+}
+
+enum Foods {
+
+ DRINKS, EATS;
+
+ // Enum within Enum
+ enum DRINKS {
+ APPLE_JUICE, COLA;
+ }
+
+ enum EATS {
+ POTATO, RICE;
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/classfile/OuterUnitTest.java b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/classfile/OuterUnitTest.java
new file mode 100644
index 0000000000..3ffe7d561a
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types/src/test/java/com/baeldung/classfile/OuterUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.classfile;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
+import com.baeldung.classfile.Outer.Nested;
+
+public class OuterUnitTest {
+
+ @Test
+ public void when_static_nestedClass_then_verifyOutput() {
+ Outer.StaticNested nestedClass = new Outer.StaticNested();
+ assertEquals("This is a static Nested Class", nestedClass.message());
+ }
+
+ @Test
+ public void when_nestedClass_then_verifyOutput() {
+ Outer outer = new Outer();
+ Nested nestedClass = outer.new Nested();
+ assertEquals("This is a non-static Nested Class", nestedClass.message());
+ }
+
+ @Test
+ public void when_localClass_then_verifyOutput() {
+ Outer outer = new Outer();
+ assertEquals("This is a Local Class within a method", outer.message());
+ }
+
+ @Test
+ public void when_localClassInIfClause_then_verifyOutput() {
+ Outer outer = new Outer();
+ assertEquals("Welcome to Baeldung", outer.message("Baeldung"));
+ assertEquals("This is a Local Class within if clause", outer.message(""));
+ }
+
+ @Test
+ public void when_anonymousClass_then_verifyOutput() {
+ Outer outer = new Outer();
+ assertEquals("Running Anonymous Class...", outer.greet());
+ }
+
+ @Test
+ public void when_anonymousClassHelloWorld_then_verifyOutput() {
+ Outer outer = new Outer();
+ assertEquals("Welcome to Baeldung", outer.greet("Baeldung"));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-operators/pom.xml b/core-java-modules/core-java-lang-operators/pom.xml
index 5b4c2fecaa..2d669bfa55 100644
--- a/core-java-modules/core-java-lang-operators/pom.xml
+++ b/core-java-modules/core-java-lang-operators/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-lang-operators
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -46,4 +46,4 @@
3.10.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-syntax-2/pom.xml b/core-java-modules/core-java-lang-syntax-2/pom.xml
index b88c86b047..b725089351 100644
--- a/core-java-modules/core-java-lang-syntax-2/pom.xml
+++ b/core-java-modules/core-java-lang-syntax-2/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-lang-syntax-2
jar
+
com.baeldung.core-java-modules
core-java-modules
diff --git a/core-java-modules/core-java-lang-syntax/pom.xml b/core-java-modules/core-java-lang-syntax/pom.xml
index c8f6524e0b..70b0600580 100644
--- a/core-java-modules/core-java-lang-syntax/pom.xml
+++ b/core-java-modules/core-java-lang-syntax/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-lang-syntax
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -51,4 +51,4 @@
3.10.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang/pom.xml b/core-java-modules/core-java-lang/pom.xml
index 807d5f34d4..2a1a7a05b8 100644
--- a/core-java-modules/core-java-lang/pom.xml
+++ b/core-java-modules/core-java-lang/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-lang
jar
+
com.baeldung.core-java-modules
core-java-modules
diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md
index 9def4c8eb6..fa49c35bf8 100644
--- a/core-java-modules/core-java-networking-2/README.md
+++ b/core-java-modules/core-java-networking-2/README.md
@@ -14,5 +14,4 @@ This module contains articles about networking in Java
- [Handling java.net.ConnectException](https://www.baeldung.com/java-net-connectexception)
- [Getting MAC addresses in Java](https://www.baeldung.com/java-mac-address)
- [Sending Emails with Attachments in Java](https://www.baeldung.com/java-send-emails-attachments)
-- [Finding a Free Port in Java](https://www.baeldung.com/java-free-port)
- [[<-- Prev]](/core-java-modules/core-java-networking)
diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml
index 89a98bbf8b..893db2d85c 100644
--- a/core-java-modules/core-java-networking-2/pom.xml
+++ b/core-java-modules/core-java-networking-2/pom.xml
@@ -1,12 +1,12 @@
-
4.0.0
core-java-networking-2
core-java-networking-2
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -53,4 +53,4 @@
2.4.5
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java
index 16017ee482..987a69582f 100644
--- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/download/FileDownloadIntegrationTest.java
@@ -17,9 +17,9 @@ import static org.junit.Assert.assertTrue;
public class FileDownloadIntegrationTest {
- static String FILE_URL = "http://ovh.net/files/1Mio.dat";
+ static String FILE_URL = "https://s3.amazonaws.com/baeldung.com/Do+JSON+with+Jackson+by+Baeldung.pdf";
static String FILE_NAME = "file.dat";
- static String FILE_MD5_HASH = "6cb91af4ed4c60c11613b75cd1fc6116";
+ static String FILE_MD5_HASH = "c959feb066b37f5c4f0e0f45bbbb4f86";
@Test
public void givenJavaIO_whenDownloadingFile_thenDownloadShouldBeCorrect() throws NoSuchAlgorithmException, IOException {
diff --git a/core-java-modules/core-java-networking-3/README.md b/core-java-modules/core-java-networking-3/README.md
index a81e85751d..09470fe88c 100644
--- a/core-java-modules/core-java-networking-3/README.md
+++ b/core-java-modules/core-java-networking-3/README.md
@@ -4,5 +4,5 @@ This module contains articles about networking in Java
### Relevant Articles
-- TODO: add link once live
+- [Finding a Free Port in Java](https://www.baeldung.com/java-free-port)
- [[<-- Prev]](/core-java-modules/core-java-networking-2)
diff --git a/core-java-modules/core-java-networking-3/pom.xml b/core-java-modules/core-java-networking-3/pom.xml
index d72981f862..35e88b3b92 100644
--- a/core-java-modules/core-java-networking-3/pom.xml
+++ b/core-java-modules/core-java-networking-3/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -56,4 +55,4 @@
3.11.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking/pom.xml b/core-java-modules/core-java-networking/pom.xml
index b81be2751a..3e69e03dcb 100644
--- a/core-java-modules/core-java-networking/pom.xml
+++ b/core-java-modules/core-java-networking/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-networking
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -31,4 +31,4 @@
4.3.4.RELEASE
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-nio-2/README.md b/core-java-modules/core-java-nio-2/README.md
index ef73159f66..ab54899501 100644
--- a/core-java-modules/core-java-nio-2/README.md
+++ b/core-java-modules/core-java-nio-2/README.md
@@ -9,4 +9,5 @@ This module contains articles about core Java non-blocking input and output (IO)
- [Introduction to the Java NIO Selector](https://www.baeldung.com/java-nio-selector)
- [Using Java MappedByteBuffer](https://www.baeldung.com/java-mapped-byte-buffer)
- [How to Lock a File in Java](https://www.baeldung.com/java-lock-files)
+- [Java NIO DatagramChannel](https://www.baeldung.com/java-nio-datagramchannel)
- [[<-- Prev]](/core-java-modules/core-java-nio)
diff --git a/core-java-modules/core-java-nio-2/pom.xml b/core-java-modules/core-java-nio-2/pom.xml
index 0c7c079406..0f4107d536 100644
--- a/core-java-modules/core-java-nio-2/pom.xml
+++ b/core-java-modules/core-java-nio-2/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-nio-2
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -15,4 +15,13 @@
../
+
+
+ org.assertj
+ assertj-core
+ 3.6.1
+ test
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java
new file mode 100644
index 0000000000..43e0747622
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java
@@ -0,0 +1,18 @@
+package com.baeldung.datagramchannel;
+
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.nio.channels.DatagramChannel;
+
+public class DatagramChannelBuilder {
+
+ public static DatagramChannel openChannel() throws IOException {
+ DatagramChannel datagramChannel = DatagramChannel.open();
+ return datagramChannel;
+ }
+
+ public static DatagramChannel bindChannel(SocketAddress local) throws IOException {
+ return openChannel().bind(local);
+ }
+
+}
diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java
new file mode 100644
index 0000000000..e377cc431c
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java
@@ -0,0 +1,31 @@
+package com.baeldung.datagramchannel;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+
+public class DatagramClient {
+
+ public static DatagramChannel startClient() throws IOException {
+ DatagramChannel client = DatagramChannelBuilder.bindChannel(null);
+ client.configureBlocking(false);
+ return client;
+ }
+
+ public static void sendMessage(DatagramChannel client, String msg, SocketAddress serverAddress) throws IOException {
+ ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());
+ client.send(buffer, serverAddress);
+ }
+
+ public static void main(String[] args) throws IOException {
+ DatagramChannel client = startClient();
+ String msg = "Hello, this is a Baeldung's DatagramChannel based UDP client!";
+ InetSocketAddress serverAddress = new InetSocketAddress("localhost", 7001);
+
+ sendMessage(client, msg, serverAddress);
+
+ }
+
+}
diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java
new file mode 100644
index 0000000000..ed3345a26d
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java
@@ -0,0 +1,46 @@
+package com.baeldung.datagramchannel;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+
+public class DatagramServer {
+
+ public static DatagramChannel startServer() throws IOException {
+ InetSocketAddress address = new InetSocketAddress("localhost", 7001);
+ DatagramChannel server = DatagramChannelBuilder.bindChannel(address);
+
+ System.out.println("Server started at #" + address);
+
+ return server;
+ }
+
+ public static String receiveMessage(DatagramChannel server) throws IOException {
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ SocketAddress remoteAdd = server.receive(buffer);
+ String message = extractMessage(buffer);
+
+ System.out.println("Client at #" + remoteAdd + " sent: " + message);
+
+ return message;
+ }
+
+ private static String extractMessage(ByteBuffer buffer) {
+ buffer.flip();
+
+ byte[] bytes = new byte[buffer.remaining()];
+ buffer.get(bytes);
+
+ String msg = new String(bytes);
+
+ return msg;
+ }
+
+ public static void main(String[] args) throws IOException {
+ DatagramChannel server = startServer();
+ receiveMessage(server);
+ }
+
+}
diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java
new file mode 100644
index 0000000000..f816072ee7
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.datagramchannel;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.channels.DatagramChannel;
+import org.junit.jupiter.api.Test;
+
+public class DatagramChannelUnitTest {
+
+ @Test
+ public void whenClientSendsAndServerReceivesUDPPacket_thenCorrect() throws IOException {
+ DatagramChannel server = DatagramServer.startServer();
+ DatagramChannel client = DatagramClient.startClient();
+
+ String msg1 = "Hello, this is a Baeldung's DatagramChannel based UDP client!";
+ String msg2 = "Hi again!, Are you there!";
+
+ InetSocketAddress serverAddress = new InetSocketAddress("localhost", 7001);
+
+ DatagramClient.sendMessage(client, msg1, serverAddress);
+ DatagramClient.sendMessage(client, msg2, serverAddress);
+
+ assertEquals("Hello, this is a Baeldung's DatagramChannel based UDP client!", DatagramServer.receiveMessage(server));
+ assertEquals("Hi again!, Are you there!", DatagramServer.receiveMessage(server));
+ }
+
+}
diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java
new file mode 100644
index 0000000000..7a6c9e6eab
--- /dev/null
+++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/selector/SelectorManualTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.selector;
+
+import org.junit.Test;
+import java.io.IOException;
+import java.nio.channels.Pipe;
+import java.nio.channels.SelectableChannel;
+import java.nio.channels.Selector;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import static java.nio.channels.SelectionKey.OP_READ;
+
+public class SelectorManualTest {
+
+ @Test
+ public void whenWakeUpCalledOnSelector_thenBlockedThreadReturns() throws IOException, InterruptedException {
+ Pipe pipe = Pipe.open();
+
+ Selector selector = Selector.open();
+ SelectableChannel channel = pipe.source();
+ channel.configureBlocking(false);
+ channel.register(selector, OP_READ);
+
+ List invocationStepsTracker = Collections.synchronizedList(new ArrayList<>());
+
+ CountDownLatch latch = new CountDownLatch(1);
+
+ Thread thread = new Thread(() -> {
+ invocationStepsTracker.add(">> Count down");
+ latch.countDown();
+ try {
+ invocationStepsTracker.add(">> Start select");
+ selector.select();
+ invocationStepsTracker.add(">> End select");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ });
+
+ invocationStepsTracker.add(">> Start await");
+ thread.start();
+ latch.await();
+ invocationStepsTracker.add(">> End await");
+
+ invocationStepsTracker.add(">> Wakeup thread");
+
+ selector.wakeup();
+ channel.close();
+
+ assertThat(invocationStepsTracker)
+ .containsExactly(
+ ">> Start await",
+ ">> Count down",
+ ">> Start select",
+ ">> End await",
+ ">> Wakeup thread",
+ ">> End select"
+ );
+ }
+}
diff --git a/core-java-modules/core-java-nio/pom.xml b/core-java-modules/core-java-nio/pom.xml
index 5b8baf6a70..1d267245a9 100644
--- a/core-java-modules/core-java-nio/pom.xml
+++ b/core-java-modules/core-java-nio/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-nio
jar
+
com.baeldung.core-java-modules
core-java-modules
diff --git a/core-java-modules/core-java-optional/pom.xml b/core-java-modules/core-java-optional/pom.xml
index 575ccb0759..dd5217df74 100644
--- a/core-java-modules/core-java-optional/pom.xml
+++ b/core-java-modules/core-java-optional/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -67,8 +66,6 @@
5.4.0.Final
- 1.19
- 1.19
27.1-jre
3.10.0
3.1.1
diff --git a/core-java-modules/core-java-os/pom.xml b/core-java-modules/core-java-os/pom.xml
index e17ddf9b37..5f00b709e3 100644
--- a/core-java-modules/core-java-os/pom.xml
+++ b/core-java-modules/core-java-os/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-os
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -63,7 +63,6 @@
true
-
org.apache.maven.plugins
@@ -81,7 +80,6 @@
4.1
4.01
-
3.6.1
1.8.9
@@ -92,4 +90,4 @@
1.8.7
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsUnitTest.java
index a7a23fb6fc..c81f060150 100644
--- a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsUnitTest.java
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessAPIEnhancementsUnitTest.java
@@ -20,7 +20,8 @@ public class ProcessAPIEnhancementsUnitTest {
Logger log = LoggerFactory.getLogger(ProcessAPIEnhancementsUnitTest.class);
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenCurrentProcess_whenInvokeGetInfo_thenSuccess() throws IOException {
ProcessHandle processHandle = ProcessHandle.current();
ProcessHandle.Info processInfo = processHandle.info();
@@ -41,7 +42,8 @@ public class ProcessAPIEnhancementsUnitTest {
.isPresent());
}
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenSpawnProcess_whenInvokeGetInfo_thenSuccess() throws IOException {
String javaCmd = ProcessUtils.getJavaCmd()
@@ -67,7 +69,8 @@ public class ProcessAPIEnhancementsUnitTest {
.isPresent());
}
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenLiveProcesses_whenInvokeGetInfo_thenSuccess() {
Stream liveProcesses = ProcessHandle.allProcesses();
liveProcesses.filter(ProcessHandle::isAlive)
@@ -82,7 +85,8 @@ public class ProcessAPIEnhancementsUnitTest {
});
}
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenProcess_whenGetChildProcess_thenSuccess() throws IOException {
int childProcessCount = 5;
for (int i = 0; i < childProcessCount; i++) {
@@ -105,7 +109,8 @@ public class ProcessAPIEnhancementsUnitTest {
.command()));
}
- @Test
+ // @Test
+ // OS / Java version dependent
public void givenProcess_whenAddExitCallback_thenSuccess() throws Exception {
String javaCmd = ProcessUtils.getJavaCmd()
.getAbsolutePath();
diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessUnderstandingUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessUnderstandingUnitTest.java
index 69b65852cc..b3b9ca8bc6 100644
--- a/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessUnderstandingUnitTest.java
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/java9/process/ProcessUnderstandingUnitTest.java
@@ -90,18 +90,22 @@ class ProcessUnderstandingUnitTest {
}
@Test
- public void givenSourceProgram_whenReadingInputStream_thenFirstLineEquals3() throws IOException {
+ public void givenSourceProgram_whenReadingInputStream_thenFirstLineEquals3() throws IOException, InterruptedException {
Runtime.getRuntime()
.exec("javac -cp src src/main/java/com/baeldung/java9/process/OutputStreamExample.java"
- .replace("/", File.separator));
+ .replace("/", File.separator))
+ .waitFor(5, TimeUnit.SECONDS);
Process process = Runtime.getRuntime()
.exec("java -cp src/main/java com.baeldung.java9.process.OutputStreamExample"
.replace("/", File.separator));
+ process.waitFor(5, TimeUnit.SECONDS);
+
BufferedReader output = new BufferedReader(new InputStreamReader(process.getInputStream()));
- int value = Integer.parseInt(output.readLine());
+ String line = output.readLine();
+ int value = Integer.parseInt(line);
assertEquals(3, value);
}
diff --git a/core-java-modules/core-java-perf/pom.xml b/core-java-modules/core-java-perf/pom.xml
index 3956c7e9fb..bc82e92e34 100644
--- a/core-java-modules/core-java-perf/pom.xml
+++ b/core-java-modules/core-java-perf/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-perf
jar
+
com.baeldung.core-java-modules
core-java-modules
diff --git a/core-java-modules/core-java-reflection-2/README.md b/core-java-modules/core-java-reflection-2/README.md
index 9ed14f08dc..3195cddc42 100644
--- a/core-java-modules/core-java-reflection-2/README.md
+++ b/core-java-modules/core-java-reflection-2/README.md
@@ -4,3 +4,4 @@
- [Set Field Value With Reflection](https://www.baeldung.com/java-set-private-field-value)
- [Checking If a Method is Static Using Reflection in Java](https://www.baeldung.com/java-check-method-is-static)
- [Checking if a Java Class is ‘abstract’ Using Reflection](https://www.baeldung.com/java-reflection-is-class-abstract)
+- [Invoking a Private Method in Java](https://www.baeldung.com/java-call-private-method)
diff --git a/core-java-modules/core-java-reflection-2/pom.xml b/core-java-modules/core-java-reflection-2/pom.xml
index ea76ee8c98..74a7328c16 100644
--- a/core-java-modules/core-java-reflection-2/pom.xml
+++ b/core-java-modules/core-java-reflection-2/pom.xml
@@ -7,13 +7,23 @@
0.1.0-SNAPSHOT
core-java-reflection-2
jar
+
com.baeldung.core-java-modules
core-java-modules
0.0.1-SNAPSHOT
../
-
+
+
+
+ org.springframework
+ spring-test
+ ${spring.version}
+ test
+
+
+
core-java-reflection-2
@@ -40,5 +50,6 @@
3.8.0
1.8
1.8
+ 5.3.4
\ No newline at end of file
diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/privatemethods/LongArrayUtil.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/privatemethods/LongArrayUtil.java
new file mode 100644
index 0000000000..03d8daabbf
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/privatemethods/LongArrayUtil.java
@@ -0,0 +1,18 @@
+package com.baeldung.reflection.access.privatemethods;
+
+public class LongArrayUtil {
+
+ public static int indexOf(long[] array, long target) {
+ return indexOf(array, target, 0, array.length);
+ }
+
+ private static int indexOf(long[] array, long target, int start, int end) {
+ for (int i = start; i < end; i++) {
+ if (array[i] == target) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+}
diff --git a/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/privatemethods/InvokePrivateMethodsUnitTest.java b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/privatemethods/InvokePrivateMethodsUnitTest.java
new file mode 100644
index 0000000000..e98eb9ec7f
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/access/privatemethods/InvokePrivateMethodsUnitTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.reflection.access.privatemethods;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import java.lang.reflect.Method;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class InvokePrivateMethodsUnitTest {
+
+ private final long[] someLongArray = new long[] { 1L, 2L, 1L, 4L, 2L };
+
+ @Test
+ void whenSearchingForLongValueInSubsequenceUsingReflection_thenTheCorrectIndexOfTheValueIsReturned() throws Exception {
+ Method indexOfMethod = LongArrayUtil.class.getDeclaredMethod("indexOf", long[].class, long.class, int.class, int.class);
+ indexOfMethod.setAccessible(true);
+
+ assertEquals(2, indexOfMethod.invoke(LongArrayUtil.class, someLongArray, 1L, 1, someLongArray.length), "The index should be 2.");
+ }
+
+ @Test
+ void whenSearchingForLongValueInSubsequenceUsingSpring_thenTheCorrectIndexOfTheValueIsReturned() throws Exception {
+ int indexOfSearchTarget = ReflectionTestUtils.invokeMethod(LongArrayUtil.class, "indexOf", someLongArray, 1L, 1, someLongArray.length);
+ assertEquals(2, indexOfSearchTarget, "The index should be 2.");
+ }
+
+}
diff --git a/core-java-modules/core-java-reflection/pom.xml b/core-java-modules/core-java-reflection/pom.xml
index 4ae7b26745..67922eec5b 100644
--- a/core-java-modules/core-java-reflection/pom.xml
+++ b/core-java-modules/core-java-reflection/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-reflection
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -51,4 +51,5 @@
1.8
1.8
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-regex/pom.xml b/core-java-modules/core-java-regex/pom.xml
index f26218877c..fc8c1a8385 100644
--- a/core-java-modules/core-java-regex/pom.xml
+++ b/core-java-modules/core-java-regex/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-regex
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -48,4 +48,4 @@
3.15.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-security-2/README.md b/core-java-modules/core-java-security-2/README.md
index 9b99d624c9..684f2504cc 100644
--- a/core-java-modules/core-java-security-2/README.md
+++ b/core-java-modules/core-java-security-2/README.md
@@ -15,4 +15,6 @@ This module contains articles about core Java Security
- [Security Context Basics: User, Subject and Principal](https://www.baeldung.com/security-context-basics)
- [Java AES Encryption and Decryption](https://www.baeldung.com/java-aes-encryption-decryption)
- [InvalidAlgorithmParameterException: Wrong IV Length](https://www.baeldung.com/java-invalidalgorithmparameter-exception)
+- [The java.security.egd JVM Option](https://www.baeldung.com/java-security-egd)
+- [RSA in Java](https://www.baeldung.com/java-rsa)
- More articles: [[<-- prev]](/core-java-modules/core-java-security)
diff --git a/core-java-modules/core-java-security-2/pom.xml b/core-java-modules/core-java-security-2/pom.xml
index 895509410d..2520cee7f8 100644
--- a/core-java-modules/core-java-security-2/pom.xml
+++ b/core-java-modules/core-java-security-2/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-security-2
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -16,45 +16,38 @@
-
commons-codec
commons-codec
${commons-codec.version}
-
org.bouncycastle
bcprov-jdk15on
${bouncycastle.version}
-
-
+
org.assertj
assertj-core
${assertj-core.version}
test
-
javax.xml.bind
jaxb-api
${jaxb-api.version}
-
-
-
+
1.60
1.11
-
3.18.0
2.3.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/rsa/RsaUnitTest.java b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/rsa/RsaUnitTest.java
new file mode 100644
index 0000000000..ac93f71125
--- /dev/null
+++ b/core-java-modules/core-java-security-2/src/test/java/com/baeldung/rsa/RsaUnitTest.java
@@ -0,0 +1,92 @@
+package com.baeldung.cipher;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import javax.crypto.Cipher;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+public class RsaUnitTest {
+
+ @Test
+ public void givenRsaKeyPair_whenEncryptAndDecryptString_thenCompareResults() throws Exception {
+ KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
+ generator.initialize(2048);
+ KeyPair pair = generator.generateKeyPair();
+ PrivateKey privateKey = pair.getPrivate();
+ PublicKey publicKey = pair.getPublic();
+
+ String secretMessage = "Baeldung secret message";
+ Cipher encryptCipher = Cipher.getInstance("RSA");
+ encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
+ byte[] secretMessageBytes = secretMessage.getBytes(StandardCharsets.UTF_8);
+ byte[] encryptedMessageBytes = encryptCipher.doFinal(secretMessageBytes);
+
+ Cipher decryptCipher = Cipher.getInstance("RSA");
+ decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
+ byte[] decryptedMessageBytes = decryptCipher.doFinal(encryptedMessageBytes);
+ String decryptedMessage = new String(decryptedMessageBytes, StandardCharsets.UTF_8);
+
+ Assertions.assertEquals(secretMessage, decryptedMessage);
+ }
+
+ @Test
+ public void givenRsaKeyPair_whenEncryptAndDecryptFile_thenCompareResults() throws Exception {
+ KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
+ generator.initialize(2048);
+ KeyPair pair = generator.generateKeyPair();
+ PrivateKey privateKey = pair.getPrivate();
+ PublicKey publicKey = pair.getPublic();
+
+ String originalContent = "some secret message";
+ Path tempFile = Files.createTempFile("temp", "txt");
+ writeString(tempFile, originalContent);
+
+ byte[] fileBytes = Files.readAllBytes(tempFile);
+ Cipher encryptCipher = Cipher.getInstance("RSA");
+ encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
+ byte[] encryptedFileBytes = encryptCipher.doFinal(fileBytes);
+ try (FileOutputStream stream = new FileOutputStream(tempFile.toFile())) {
+ stream.write(encryptedFileBytes);
+ }
+
+ encryptedFileBytes = Files.readAllBytes(tempFile);
+ Cipher decryptCipher = Cipher.getInstance("RSA");
+ decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
+ byte[] decryptedFileBytes = decryptCipher.doFinal(encryptedFileBytes);
+ try (FileOutputStream stream = new FileOutputStream(tempFile.toFile())) {
+ stream.write(decryptedFileBytes);
+ }
+
+ String fileContent = readString(tempFile);
+
+ Assertions.assertEquals(originalContent, fileContent);
+ }
+
+ private void writeString(Path path, String content) throws Exception {
+ try (BufferedWriter writer = Files.newBufferedWriter(path)) {
+ writer.write(content);
+ }
+ }
+
+ private String readString(Path path) throws Exception {
+ StringBuilder resultStringBuilder = new StringBuilder();
+ try (BufferedReader br = new BufferedReader(new FileReader(path.toFile()))) {
+ String line;
+ while ((line = br.readLine()) != null) {
+ resultStringBuilder.append(line);
+ }
+ }
+ return resultStringBuilder.toString();
+ }
+}
diff --git a/core-java-modules/core-java-security/pom.xml b/core-java-modules/core-java-security/pom.xml
index 8ad120c8fc..7b49d08a37 100644
--- a/core-java-modules/core-java-security/pom.xml
+++ b/core-java-modules/core-java-security/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-security
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -30,4 +30,4 @@
3.10.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-2/pom.xml b/core-java-modules/core-java-streams-2/pom.xml
index 2a0a4348b0..f875e910db 100644
--- a/core-java-modules/core-java-streams-2/pom.xml
+++ b/core-java-modules/core-java-streams-2/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
1.0
core-java-streams-2
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -47,7 +47,6 @@
- UTF-8
1.9
1.9
3.11.1
diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md
index 9adde005e6..26b4dfe975 100644
--- a/core-java-modules/core-java-streams-3/README.md
+++ b/core-java-modules/core-java-streams-3/README.md
@@ -10,4 +10,6 @@ This module contains articles about the Stream API in Java.
- [Debugging Java 8 Streams with IntelliJ](https://www.baeldung.com/intellij-debugging-java-streams)
- [Add BigDecimals using the Stream API](https://www.baeldung.com/java-stream-add-bigdecimals)
- [Should We Close a Java Stream?](https://www.baeldung.com/java-stream-close)
+- [Returning Stream vs. Collection](https://www.baeldung.com/java-return-stream-collection)
+- [Convert a Java Enumeration Into a Stream](https://www.baeldung.com/java-enumeration-to-stream)
- More articles: [[<-- prev>]](/../core-java-streams-2)
diff --git a/core-java-modules/core-java-streams-3/pom.xml b/core-java-modules/core-java-streams-3/pom.xml
index cbb7366a7d..659f1937f2 100644
--- a/core-java-modules/core-java-streams-3/pom.xml
+++ b/core-java-modules/core-java-streams-3/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-streams-3
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -49,8 +49,6 @@
3.6.1
-
- 2.22.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationSpliterator.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationSpliterator.java
new file mode 100644
index 0000000000..5227fcb6c4
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationSpliterator.java
@@ -0,0 +1,30 @@
+package com.baeldung.streams.conversion;
+
+import java.util.Enumeration;
+import java.util.Spliterators.AbstractSpliterator;
+import java.util.function.Consumer;
+
+public class EnumerationSpliterator extends AbstractSpliterator {
+
+ private final Enumeration enumeration;
+
+ public EnumerationSpliterator(long est, int additionalCharacteristics, Enumeration enumeration) {
+ super(est, additionalCharacteristics);
+ this.enumeration = enumeration;
+ }
+
+ @Override
+ public boolean tryAdvance(Consumer super T> action) {
+ if (enumeration.hasMoreElements()) {
+ action.accept(enumeration.nextElement());
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void forEachRemaining(Consumer super T> action) {
+ while (enumeration.hasMoreElements())
+ action.accept(enumeration.nextElement());
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationStreamConversion.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationStreamConversion.java
new file mode 100644
index 0000000000..cf041b9426
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationStreamConversion.java
@@ -0,0 +1,16 @@
+package com.baeldung.streams.conversion;
+
+import java.util.Enumeration;
+import java.util.Spliterator;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+public class EnumerationStreamConversion {
+
+ public static Stream convert(Enumeration enumeration) {
+ EnumerationSpliterator spliterator = new EnumerationSpliterator(Long.MAX_VALUE, Spliterator.ORDERED, enumeration);
+ Stream stream = StreamSupport.stream(spliterator, false);
+
+ return stream;
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/streamvscollection/StreamVsCollectionExample.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/streamvscollection/StreamVsCollectionExample.java
new file mode 100644
index 0000000000..379d231bed
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/streamvscollection/StreamVsCollectionExample.java
@@ -0,0 +1,95 @@
+package com.baeldung.streams.streamvscollection;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class StreamVsCollectionExample {
+
+ static ArrayList userNameSource = new ArrayList<>();
+
+ static {
+ userNameSource.add("john");
+ userNameSource.add("smith");
+ userNameSource.add("tom");
+ userNameSource.add("rob");
+ userNameSource.add("charlie");
+ userNameSource.add("alfred");
+ }
+
+ public static Stream userNames() {
+ return userNameSource.stream();
+ }
+
+ public static List userNameList() {
+ return userNames().collect(Collectors.toList());
+ }
+
+ public static Set userNameSet() {
+ return userNames().collect(Collectors.toSet());
+ }
+
+ public static Map userNameMap() {
+ return userNames().collect(Collectors.toMap(u1 -> u1.toString(), u1 -> u1.toString()));
+ }
+
+ public static Stream filterUserNames() {
+ return userNames().filter(i -> i.length() >= 4);
+ }
+
+ public static Stream sortUserNames() {
+ return userNames().sorted();
+ }
+
+ public static Stream limitUserNames() {
+ return userNames().limit(3);
+ }
+
+ public static Stream sortFilterLimitUserNames() {
+ return filterUserNames().sorted().limit(3);
+ }
+
+ public static void printStream(Stream stream) {
+ stream.forEach(System.out::println);
+ }
+
+ public static void modifyList() {
+ userNameSource.remove(2);
+ }
+
+ public static Map modifyMap() {
+ Map userNameMap = userNameMap();
+ userNameMap.put("bob", "bob");
+ userNameMap.remove("alfred");
+
+ return userNameMap;
+ }
+
+ public static void tryStreamTraversal() {
+ Stream userNameStream = userNames();
+ userNameStream.forEach(System.out::println);
+
+ try {
+ userNameStream.forEach(System.out::println);
+ } catch(IllegalStateException e) {
+ System.out.println("stream has already been operated upon or closed");
+ }
+ }
+
+ public static void main(String[] args) {
+ System.out.println(userNameMap());
+ System.out.println(modifyMap());
+ tryStreamTraversal();
+
+ Set set = userNames().collect(Collectors.toCollection(TreeSet::new));
+ set.forEach(val -> System.out.println(val));
+
+ }
+
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conversion/EnumerationStreamConversionUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conversion/EnumerationStreamConversionUnitTest.java
new file mode 100644
index 0000000000..a075312fb5
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conversion/EnumerationStreamConversionUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.streams.conversion;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Vector;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+public class EnumerationStreamConversionUnitTest {
+
+ @Test
+ public void givenEnumeration_whenConvertedToStream_thenNotNull() {
+ Vector input = new Vector<>(Arrays.asList(1, 2, 3, 4, 5));
+
+ Stream resultingStream = EnumerationStreamConversion.convert(input.elements());
+
+ Assert.assertNotNull(resultingStream);
+ }
+
+ @Test
+ public void whenConvertedToList_thenCorrect() {
+ Vector input = new Vector<>(Arrays.asList(1, 2, 3, 4, 5));
+
+ Stream stream = EnumerationStreamConversion.convert(input.elements());
+ List list = stream.filter(e -> e >= 3)
+ .collect(Collectors.toList());
+ assertThat(list, contains(3, 4, 5));
+ }
+}
diff --git a/core-java-modules/core-java-streams/pom.xml b/core-java-modules/core-java-streams/pom.xml
index f713fe7499..f02ba1c69a 100644
--- a/core-java-modules/core-java-streams/pom.xml
+++ b/core-java-modules/core-java-streams/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-streams
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -121,4 +121,4 @@
1.8
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-algorithms-2/pom.xml b/core-java-modules/core-java-string-algorithms-2/pom.xml
index 2a84cebb4c..e263c1c79c 100644
--- a/core-java-modules/core-java-string-algorithms-2/pom.xml
+++ b/core-java-modules/core-java-string-algorithms-2/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-string-algorithms-2
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -34,7 +34,7 @@
org.openjdk.jmh
jmh-generator-annprocess
- ${jmh-core.version}
+ ${jmh-generator.version}
org.assertj
@@ -65,4 +65,4 @@
1.2
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-algorithms-3/pom.xml b/core-java-modules/core-java-string-algorithms-3/pom.xml
index 610956588e..1048b796bc 100644
--- a/core-java-modules/core-java-string-algorithms-3/pom.xml
+++ b/core-java-modules/core-java-string-algorithms-3/pom.xml
@@ -1,5 +1,4 @@
-
4.0.0
@@ -7,6 +6,7 @@
0.1.0-SNAPSHOT
jar
core-java-string-algorithms-3
+
com.baeldung.core-java-modules
core-java-modules
@@ -43,7 +43,6 @@
true
-
org.apache.maven.plugins
@@ -63,4 +62,4 @@
28.1-jre
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-algorithms/pom.xml b/core-java-modules/core-java-string-algorithms/pom.xml
index 6ba9ae7bb3..0ad9ec4c66 100644
--- a/core-java-modules/core-java-string-algorithms/pom.xml
+++ b/core-java-modules/core-java-string-algorithms/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-string-algorithms
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -39,7 +39,7 @@
org.openjdk.jmh
jmh-generator-annprocess
- ${jmh-core.version}
+ ${jmh-generator.version}
com.vdurmont
@@ -71,4 +71,4 @@
4.0.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-apis/pom.xml b/core-java-modules/core-java-string-apis/pom.xml
index 449092bacb..b09d59fc10 100644
--- a/core-java-modules/core-java-string-apis/pom.xml
+++ b/core-java-modules/core-java-string-apis/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-string-apis
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -54,4 +54,4 @@
1.4
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-conversions-2/pom.xml b/core-java-modules/core-java-string-conversions-2/pom.xml
index cd7381d822..8a222a6b5d 100644
--- a/core-java-modules/core-java-string-conversions-2/pom.xml
+++ b/core-java-modules/core-java-string-conversions-2/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-string-conversions-2
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -45,4 +45,4 @@
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-conversions/pom.xml b/core-java-modules/core-java-string-conversions/pom.xml
index 7d8977d2a5..ccbeb69768 100644
--- a/core-java-modules/core-java-string-conversions/pom.xml
+++ b/core-java-modules/core-java-string-conversions/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-string-conversions
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -66,4 +66,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml
index 5865d9a776..b7187d2fdf 100644
--- a/core-java-modules/core-java-string-operations-2/pom.xml
+++ b/core-java-modules/core-java-string-operations-2/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-string-operations-2
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -57,7 +57,6 @@
jmh-core
${jmh-core.version}
-
org.openjdk.jmh
jmh-generator-annprocess
@@ -68,7 +67,6 @@
commons-codec
${commons-codec.version}
-
org.assertj
assertj-core
@@ -92,7 +90,8 @@
-
+
org.openjdk.jmh.Main
@@ -119,4 +118,4 @@
1.14
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-3/README.md b/core-java-modules/core-java-string-operations-3/README.md
index 7f391ee056..bc4af852ed 100644
--- a/core-java-modules/core-java-string-operations-3/README.md
+++ b/core-java-modules/core-java-string-operations-3/README.md
@@ -2,3 +2,4 @@
- [Version Comparison in Java](https://www.baeldung.com/java-comparing-versions)
- [Java (String) or .toString()?](https://www.baeldung.com/java-string-casting-vs-tostring)
+- [Split Java String by Newline](https://www.baeldung.com/java-string-split-by-newline)
diff --git a/core-java-modules/core-java-string-operations-3/pom.xml b/core-java-modules/core-java-string-operations-3/pom.xml
index 5edff0e090..aa9fe38cca 100644
--- a/core-java-modules/core-java-string-operations-3/pom.xml
+++ b/core-java-modules/core-java-string-operations-3/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-string-operations-3
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -52,10 +52,10 @@
3.1.0
-
-
- gradle-repo
- https://repo.gradle.org/gradle/libs-releases-local/
-
-
-
+
+
+ gradle-repo
+ https://repo.gradle.org/gradle/libs-releases-local/
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitstringbynewline/SplitStringByNewLineUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitstringbynewline/SplitStringByNewLineUnitTest.java
new file mode 100644
index 0000000000..9afba62947
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitstringbynewline/SplitStringByNewLineUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.splitstringbynewline;
+
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class SplitStringByNewLineUnitTest {
+ @Test
+ public void givenString_whenSplitByNewLineUsingSystemLineSeparator_thenReturnsArray() {
+ assertThat("Line1\nLine2\nLine3".split(System.lineSeparator())).containsExactly("Line1", "Line2", "Line3");
+ }
+
+ @Test
+ public void givenString_whenSplitByNewLineUsingRegularExpressionPattern_thenReturnsArray() {
+ assertThat("Line1\nLine2\nLine3".split("\\r?\\n|\\r")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat("Line1\rLine2\rLine3".split("\\r?\\n|\\r")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat("Line1\r\nLine2\r\nLine3".split("\\r?\\n|\\r")).containsExactly("Line1", "Line2", "Line3");
+ }
+
+ @Test
+ public void givenString_whenSplitByNewLineUsingJava8Pattern_thenReturnsArray() {
+ assertThat("Line1\nLine2\nLine3".split("\\R")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat("Line1\rLine2\rLine3".split("\\R")).containsExactly("Line1", "Line2", "Line3");
+
+ assertThat("Line1\r\nLine2\r\nLine3".split("\\R")).containsExactly("Line1", "Line2", "Line3");
+ }
+}
diff --git a/core-java-modules/core-java-string-operations/pom.xml b/core-java-modules/core-java-string-operations/pom.xml
index 9632988392..a7f75f37e2 100644
--- a/core-java-modules/core-java-string-operations/pom.xml
+++ b/core-java-modules/core-java-string-operations/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-string-operations
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -64,4 +64,4 @@
1.10
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-strings/pom.xml b/core-java-modules/core-java-strings/pom.xml
index b09dc3f8a4..137499de6b 100644
--- a/core-java-modules/core-java-strings/pom.xml
+++ b/core-java-modules/core-java-strings/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-strings
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -59,4 +59,4 @@
61.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-sun/pom.xml b/core-java-modules/core-java-sun/pom.xml
index 0f53407ec1..347020a736 100644
--- a/core-java-modules/core-java-sun/pom.xml
+++ b/core-java-modules/core-java-sun/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java-sun
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -44,7 +44,6 @@
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
java
com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
@@ -68,7 +67,6 @@
org.codehaus.mojo
exec-maven-plugin
-
run-benchmarks
@@ -99,7 +97,6 @@
3.6.1
1.7.0
-
1.8.0
diff --git a/core-java-modules/core-java-time-measurements/pom.xml b/core-java-modules/core-java-time-measurements/pom.xml
index 3197b1ae6a..663cf6708b 100644
--- a/core-java-modules/core-java-time-measurements/pom.xml
+++ b/core-java-modules/core-java-time-measurements/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -9,6 +8,7 @@
0.0.1-SNAPSHOT
core-java-time-measurements
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -73,7 +73,6 @@
true
-
maven-surefire-plugin
@@ -102,4 +101,4 @@
2.22.1
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml
index b8d75058eb..504ec321f2 100644
--- a/core-java-modules/core-java/pom.xml
+++ b/core-java-modules/core-java/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -8,6 +7,7 @@
0.1.0-SNAPSHOT
core-java
jar
+
com.baeldung.core-java-modules
core-java-modules
@@ -90,11 +90,9 @@
-
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
java
com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
@@ -107,7 +105,6 @@
-
org.apache.maven.plugins
maven-javadoc-plugin
@@ -154,7 +151,6 @@
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
run-benchmarks
@@ -185,17 +181,13 @@
0.4
1.8.7
-
3.10.0
-
1.1
-
3.0.0-M1
- 1.6.0
1.8
1.8
-
+
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/daomodule/pom.xml b/core-java-modules/multimodulemavenproject/daomodule/pom.xml
index 56c2d70d24..626a6f707a 100644
--- a/core-java-modules/multimodulemavenproject/daomodule/pom.xml
+++ b/core-java-modules/multimodulemavenproject/daomodule/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
diff --git a/core-java-modules/multimodulemavenproject/entitymodule/pom.xml b/core-java-modules/multimodulemavenproject/entitymodule/pom.xml
index 00ad56b3ab..e2a453b9c2 100644
--- a/core-java-modules/multimodulemavenproject/entitymodule/pom.xml
+++ b/core-java-modules/multimodulemavenproject/entitymodule/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
diff --git a/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml b/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml
index a9fe04b108..c376a2b04e 100644
--- a/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml
+++ b/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
diff --git a/core-java-modules/multimodulemavenproject/pom.xml b/core-java-modules/multimodulemavenproject/pom.xml
index dcf9f7311e..f45774ae00 100644
--- a/core-java-modules/multimodulemavenproject/pom.xml
+++ b/core-java-modules/multimodulemavenproject/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.multimodulemavenproject
multimodulemavenproject
@@ -59,8 +60,7 @@
3.8.0
1.9
1.9
- UTF-8
3.12.2
-
+
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml b/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml
index 150c10b68f..4df29457c5 100644
--- a/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml
+++ b/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 2d342c4216..b4aae7949f 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -20,16 +19,13 @@
core-java
core-java-8
core-java-8-2
-
core-java-annotations
-
core-java-arrays-sorting
core-java-arrays-guides
core-java-arrays-multidimensional
core-java-arrays-convert
core-java-arrays-operations-basic
core-java-arrays-operations-advanced
-
core-java-char
core-java-collections
core-java-collections-2
@@ -42,7 +38,6 @@
core-java-collections-maps
core-java-collections-maps-2
core-java-collections-maps-3
-
core-java-concurrency-2
core-java-concurrency-advanced
core-java-concurrency-advanced-2
@@ -53,35 +48,31 @@
core-java-concurrency-collections
core-java-concurrency-collections-2
core-java-console
-
-
+
core-java-8-datetime-2
core-java-date-operations-2
core-java-8-datetime
-
core-java-exceptions
core-java-exceptions-2
core-java-exceptions-3
core-java-function
- core-java-functional
-
+ core-java-functional
core-java-io
core-java-io-2
core-java-io-3
- core-java-io-4
+ core-java-io-4
core-java-io-apis
core-java-io-conversions
core-java-io-conversions-2
-
core-java-jar
core-java-jndi
core-java-jvm
core-java-jvm-2
-
core-java-lambdas
core-java-lang
core-java-lang-2
core-java-lang-3
+ core-java-lang-4
core-java-lang-math
core-java-lang-math-2
core-java-lang-math-3
@@ -90,25 +81,22 @@
core-java-lang-oop-generics
core-java-lang-oop-modifiers
core-java-lang-oop-types
+ core-java-lang-oop-types-2
core-java-lang-oop-inheritance
core-java-lang-oop-methods
core-java-lang-oop-others
core-java-lang-operators
core-java-lang-syntax
core-java-lang-syntax-2
-
core-java-networking
core-java-networking-2
+ core-java-networking-3
core-java-nio
core-java-nio-2
-
core-java-optional
-
core-java-perf
-
core-java-reflection
core-java-reflection-2
-
core-java-security
core-java-security-2
core-java-streams
@@ -125,7 +113,6 @@
core-java-string-operations-3
core-java-strings
core-java-sun
-
core-java-regex
pre-jpms
@@ -147,20 +134,8 @@
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
-
-
-
2.22.2
5.6.2
-
+
\ No newline at end of file
diff --git a/core-java-modules/pre-jpms/pom.xml b/core-java-modules/pre-jpms/pom.xml
index 9032c9475b..60e425b936 100644
--- a/core-java-modules/pre-jpms/pom.xml
+++ b/core-java-modules/pre-jpms/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -78,4 +77,4 @@
1.8
-
+
\ No newline at end of file
diff --git a/couchbase/pom.xml b/couchbase/pom.xml
index 34e2832e55..e87975a53c 100644
--- a/couchbase/pom.xml
+++ b/couchbase/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -72,4 +71,4 @@
4.3.5.RELEASE
-
+
\ No newline at end of file
diff --git a/custom-pmd/pom.xml b/custom-pmd/pom.xml
index e0f38199ec..550f96de33 100644
--- a/custom-pmd/pom.xml
+++ b/custom-pmd/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -45,11 +44,10 @@
- UTF-8
3.7.0
6.0.1
1.8
1.8
-
+
\ No newline at end of file
diff --git a/dagger/pom.xml b/dagger/pom.xml
index e9410ceb63..304b0e428e 100644
--- a/dagger/pom.xml
+++ b/dagger/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -46,4 +45,4 @@
2.16
-
+
\ No newline at end of file
diff --git a/data-structures/pom.xml b/data-structures/pom.xml
index e2d2e23090..cba602878f 100644
--- a/data-structures/pom.xml
+++ b/data-structures/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -35,7 +34,6 @@
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
@@ -45,4 +43,4 @@
0.7.0
-
+
\ No newline at end of file
diff --git a/data-structures/src/main/java/com/baeldung/circularbuffer/CircularBuffer.java b/data-structures/src/main/java/com/baeldung/circularbuffer/CircularBuffer.java
index 6b315265b4..cde07728ba 100644
--- a/data-structures/src/main/java/com/baeldung/circularbuffer/CircularBuffer.java
+++ b/data-structures/src/main/java/com/baeldung/circularbuffer/CircularBuffer.java
@@ -10,10 +10,8 @@ public class CircularBuffer {
@SuppressWarnings("unchecked")
public CircularBuffer(int capacity) {
-
this.capacity = (capacity < 1) ? DEFAULT_CAPACITY : capacity;
- this.data = (E[]) new Object[capacity];
-
+ this.data = (E[]) new Object[this.capacity];
this.readSequence = 0;
this.writeSequence = -1;
}
diff --git a/data-structures/src/main/java/com/baeldung/circularlinkedlist/CircularLinkedList.java b/data-structures/src/main/java/com/baeldung/circularlinkedlist/CircularLinkedList.java
index 47368d7f15..cf18f0783e 100644
--- a/data-structures/src/main/java/com/baeldung/circularlinkedlist/CircularLinkedList.java
+++ b/data-structures/src/main/java/com/baeldung/circularlinkedlist/CircularLinkedList.java
@@ -5,7 +5,7 @@ import org.slf4j.LoggerFactory;
public class CircularLinkedList {
- final Logger LOGGER = LoggerFactory.getLogger(CircularLinkedList.class);
+ final Logger logger = LoggerFactory.getLogger(CircularLinkedList.class);
private Node head = null;
private Node tail = null;
@@ -42,24 +42,29 @@ public class CircularLinkedList {
}
public void deleteNode(int valueToDelete) {
-
Node currentNode = head;
-
- if (head != null) {
- if (currentNode.value == valueToDelete) {
- head = head.nextNode;
- tail.nextNode = head;
- } else {
- do {
- Node nextNode = currentNode.nextNode;
- if (nextNode.value == valueToDelete) {
- currentNode.nextNode = nextNode.nextNode;
- break;
- }
- currentNode = currentNode.nextNode;
- } while (currentNode != head);
- }
+ if (head == null) {
+ return;
}
+ do {
+ Node nextNode = currentNode.nextNode;
+ if (nextNode.value == valueToDelete) {
+ if (tail == head) {
+ head = null;
+ tail = null;
+ } else {
+ currentNode.nextNode = nextNode.nextNode;
+ if (head == nextNode) {
+ head = head.nextNode;
+ }
+ if (tail == nextNode) {
+ tail = currentNode;
+ }
+ }
+ break;
+ }
+ currentNode = nextNode;
+ } while (currentNode != head);
}
public void traverseList() {
@@ -68,7 +73,7 @@ public class CircularLinkedList {
if (head != null) {
do {
- LOGGER.info(currentNode.value + " ");
+ logger.info(currentNode.value + " ");
currentNode = currentNode.nextNode;
} while (currentNode != head);
}
diff --git a/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java b/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java
index 7469e8ba64..42cacbd3ea 100644
--- a/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java
+++ b/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java
@@ -148,48 +148,46 @@ public class BinaryTree {
}
}
-
public void traverseInOrderWithoutRecursion() {
- Stack stack = new Stack();
+ Stack stack = new Stack<>();
+ Node current = root;
+
+ while (current != null || !stack.isEmpty()) {
+ while (current != null) {
+ stack.push(current);
+ current = current.left;
+ }
+
+ Node top = stack.pop();
+ visit(top.value);
+ current = top.right;
+ }
+ }
+
+ public void traversePreOrderWithoutRecursion() {
+ Stack stack = new Stack<>();
Node current = root;
stack.push(root);
- while(! stack.isEmpty()) {
- while(current.left != null) {
- current = current.left;
- stack.push(current);
- }
+
+ while (current != null && !stack.isEmpty()) {
current = stack.pop();
visit(current.value);
- if(current.right != null) {
- current = current.right;
- stack.push(current);
- }
+
+ if (current.right != null)
+ stack.push(current.right);
+
+ if (current.left != null)
+ stack.push(current.left);
}
}
- public void traversePreOrderWithoutRecursion() {
- Stack stack = new Stack();
- Node current = root;
- stack.push(root);
- while(! stack.isEmpty()) {
- current = stack.pop();
- visit(current.value);
-
- if(current.right != null)
- stack.push(current.right);
-
- if(current.left != null)
- stack.push(current.left);
- }
- }
-
public void traversePostOrderWithoutRecursion() {
- Stack stack = new Stack();
+ Stack stack = new Stack<>();
Node prev = root;
Node current = root;
stack.push(root);
- while (!stack.isEmpty()) {
+ while (current != null && !stack.isEmpty()) {
current = stack.peek();
boolean hasChild = (current.left != null || current.right != null);
boolean isPrevLastChild = (prev == current.right || (prev == current.left && current.right == null));
diff --git a/data-structures/src/test/java/com/baeldung/circularlinkedlist/CircularLinkedListUnitTest.java b/data-structures/src/test/java/com/baeldung/circularlinkedlist/CircularLinkedListUnitTest.java
index 5b0573a1ce..23829df7e9 100644
--- a/data-structures/src/test/java/com/baeldung/circularlinkedlist/CircularLinkedListUnitTest.java
+++ b/data-structures/src/test/java/com/baeldung/circularlinkedlist/CircularLinkedListUnitTest.java
@@ -1,10 +1,10 @@
package com.baeldung.circularlinkedlist;
+import org.junit.Test;
+
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import org.junit.Test;
-
public class CircularLinkedListUnitTest {
@Test
@@ -23,7 +23,7 @@ public class CircularLinkedListUnitTest {
}
@Test
- public void givenACircularLinkedList_WhenDeletingElements_ThenListDoesNotContainThoseElements() {
+ public void givenACircularLinkedList_WhenDeletingInOrderHeadMiddleTail_ThenListDoesNotContainThoseElements() {
CircularLinkedList cll = createCircularLinkedList();
assertTrue(cll.containsNode(13));
@@ -39,6 +39,32 @@ public class CircularLinkedListUnitTest {
assertFalse(cll.containsNode(46));
}
+ @Test
+ public void givenACircularLinkedList_WhenDeletingInOrderTailMiddleHead_ThenListDoesNotContainThoseElements() {
+ CircularLinkedList cll = createCircularLinkedList();
+
+ assertTrue(cll.containsNode(46));
+ cll.deleteNode(46);
+ assertFalse(cll.containsNode(46));
+
+ assertTrue(cll.containsNode(1));
+ cll.deleteNode(1);
+ assertFalse(cll.containsNode(1));
+
+ assertTrue(cll.containsNode(13));
+ cll.deleteNode(13);
+ assertFalse(cll.containsNode(13));
+ }
+
+ @Test
+ public void givenACircularLinkedListWithOneNode_WhenDeletingElement_ThenListDoesNotContainTheElement() {
+ CircularLinkedList cll = new CircularLinkedList();
+ cll.addNode(1);
+ cll.deleteNode(1);
+ assertFalse(cll.containsNode(1));
+ }
+
+
private CircularLinkedList createCircularLinkedList() {
CircularLinkedList cll = new CircularLinkedList();
diff --git a/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java b/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java
index f99cb52ed7..e89557f21b 100644
--- a/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java
+++ b/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java
@@ -13,7 +13,7 @@ public class BinaryTreeUnitTest {
BinaryTree bt = createBinaryTree();
- assertTrue(!bt.isEmpty());
+ assertFalse(bt.isEmpty());
}
@Test
@@ -72,6 +72,7 @@ public class BinaryTreeUnitTest {
@Test
public void it_deletes_the_root() {
+
int value = 12;
BinaryTree bt = new BinaryTree();
bt.add(value);
@@ -91,6 +92,14 @@ public class BinaryTreeUnitTest {
bt.traverseInOrderWithoutRecursion();
}
+ @Test
+ public void givenAnEmptyBinaryTree_WhenTraversingInOrderWithoutRecursion_ThenNoException() {
+
+ BinaryTree empty = new BinaryTree();
+
+ empty.traverseInOrderWithoutRecursion();
+ }
+
@Test
public void givenABinaryTree_WhenTraversingPreOrder_ThenPrintValues() {
@@ -101,6 +110,14 @@ public class BinaryTreeUnitTest {
bt.traversePreOrderWithoutRecursion();
}
+ @Test
+ public void givenAnEmptyBinaryTree_WhenTraversingPreOrderWithoutRecursion_ThenNoException() {
+
+ BinaryTree empty = new BinaryTree();
+
+ empty.traversePreOrderWithoutRecursion();
+ }
+
@Test
public void givenABinaryTree_WhenTraversingPostOrder_ThenPrintValues() {
@@ -111,6 +128,14 @@ public class BinaryTreeUnitTest {
bt.traversePostOrderWithoutRecursion();
}
+ @Test
+ public void givenAnEmptyBinaryTree_WhenTraversingPostOrderWithoutRecursion_ThenNoException() {
+
+ BinaryTree empty = new BinaryTree();
+
+ empty.traversePostOrderWithoutRecursion();
+ }
+
@Test
public void givenABinaryTree_WhenTraversingLevelOrder_ThenPrintValues() {
diff --git a/ddd-modules/mainapp/pom.xml b/ddd-modules/mainapp/pom.xml
index 59d2ad7d3a..6b913df979 100644
--- a/ddd-modules/mainapp/pom.xml
+++ b/ddd-modules/mainapp/pom.xml
@@ -29,7 +29,6 @@
org.apache.maven.plugins
maven-surefire-plugin
- 2.16
true
diff --git a/ddd-modules/pom.xml b/ddd-modules/pom.xml
index 6ab1829198..376dad89e5 100644
--- a/ddd-modules/pom.xml
+++ b/ddd-modules/pom.xml
@@ -66,7 +66,6 @@
org.apache.maven.plugins
maven-surefire-plugin
- ${maven-surefire-plugin.version}
0
@@ -75,13 +74,10 @@
- UTF-8
-
9
9
3.8.1
- 2.22.2
1.0
diff --git a/ddd/pom.xml b/ddd/pom.xml
index 7d03208802..77cf1f5341 100644
--- a/ddd/pom.xml
+++ b/ddd/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -99,17 +98,7 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
-
-
1.0.1
-
-
+
\ No newline at end of file
diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml
index af65aa7e03..f1f9b9fa7b 100644
--- a/deeplearning4j/pom.xml
+++ b/deeplearning4j/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -66,4 +65,4 @@
1.7.5
-
+
\ No newline at end of file
diff --git a/discord4j/pom.xml b/discord4j/pom.xml
index 664692f60a..1e73e5109b 100644
--- a/discord4j/pom.xml
+++ b/discord4j/pom.xml
@@ -1,71 +1,71 @@
-
- 4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.3.5.RELEASE
-
-
- com.baeldung
- discord4j-bot
- 0.0.1-SNAPSHOT
- discord4j-bot
- Demo Discord bot using Discord4J + Spring Boot
+
+ 4.0.0
+ com.baeldung
+ discord4j
+ 0.0.1-SNAPSHOT
+ discord4j
+ Demo Discord bot using Discord4J + Spring Boot
-
- 1.8
-
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
-
-
- org.springframework.boot
- spring-boot-starter
-
-
- org.springframework.boot
- spring-boot-starter-webflux
-
-
- org.springframework.boot
- spring-boot-starter-actuator
-
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+ com.discord4j
+ discord4j-core
+ 3.1.1
+
+
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.junit.vintage
- junit-vintage-engine
-
-
-
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
-
- com.discord4j
- discord4j-core
- 3.1.1
-
-
+
+ 1.8
+
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- 1.8
- 1.8
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/disruptor/pom.xml b/disruptor/pom.xml
index 31fc28986b..c2f9cf34b0 100644
--- a/disruptor/pom.xml
+++ b/disruptor/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -87,7 +86,8 @@
true
-
+
org.baeldung.executable.ExecutableMavenJar
diff --git a/docker/README.md b/docker/README.md
index ce7fe261c2..f1b4181e64 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -3,3 +3,4 @@
- [Introduction to Docker Compose](https://www.baeldung.com/docker-compose)
- [Reusing Docker Layers with Spring Boot](https://www.baeldung.com/docker-layers-spring-boot)
- [Running Spring Boot with PostgreSQL in Docker Compose](https://www.baeldung.com/spring-boot-postgresql-docker)
+- [How To Configure Java Heap Size Inside a Docker Container](https://www.baeldung.com/ops/docker-jvm-heap-size)
diff --git a/docker/docker-spring-boot-postgres/pom.xml b/docker/docker-spring-boot-postgres/pom.xml
index 0b359138f6..d08ae130db 100644
--- a/docker/docker-spring-boot-postgres/pom.xml
+++ b/docker/docker-spring-boot-postgres/pom.xml
@@ -2,21 +2,18 @@
4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.4.0
-
-
com.baeldung.docker
docker-spring-boot-postgres
0.0.1-SNAPSHOT
docker-spring-boot-postgres
Demo project showing Spring Boot, PostgreSQL, and Docker
-
-
- 11
-
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
@@ -44,5 +41,9 @@
+
+
+ 11
+
\ No newline at end of file
diff --git a/docker/heap-sizing/Dockerfile b/docker/heap-sizing/Dockerfile
new file mode 100644
index 0000000000..c455e45c70
--- /dev/null
+++ b/docker/heap-sizing/Dockerfile
@@ -0,0 +1,4 @@
+FROM openjdk:8u92-jdk-alpine
+COPY /src /src/
+RUN mkdir /app && ls /src && javac /src/main/java/com/baeldung/docker/heapsizing/PrintXmxXms.java -d /app
+CMD java -version && java $JAVA_OPTS -cp /app com.baeldung.docker.heapsizing.PrintXmxXms
\ No newline at end of file
diff --git a/docker/heap-sizing/pom.xml b/docker/heap-sizing/pom.xml
new file mode 100644
index 0000000000..a86a67fdcd
--- /dev/null
+++ b/docker/heap-sizing/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.2
+
+
+ com.baeldung.docker
+ heap-sizing
+ 0.0.1-SNAPSHOT
+ heap-sizing
+ Demo project for Spring Boot
+
+ 11
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ io.projectreactor
+ reactor-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ heapsizing-demo
+
+
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+ 2.7.1
+
+
+
+ heapsizing-demo-jib
+
+
+
+
+
+
+
diff --git a/docker/heap-sizing/src/main/java/com/baeldung/docker/heapsizing/HeapSizingApplication.java b/docker/heap-sizing/src/main/java/com/baeldung/docker/heapsizing/HeapSizingApplication.java
new file mode 100644
index 0000000000..00bee376c5
--- /dev/null
+++ b/docker/heap-sizing/src/main/java/com/baeldung/docker/heapsizing/HeapSizingApplication.java
@@ -0,0 +1,19 @@
+package com.baeldung.docker.heapsizing;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import java.util.logging.Logger;
+
+import static com.baeldung.docker.heapsizing.PrintXmxXms.logMemory;
+
+@SpringBootApplication
+public class HeapSizingApplication {
+ private static final Logger logger = Logger.getLogger(HeapSizingApplication.class.getName());
+
+ public static void main(String[] args) {
+ SpringApplication.run(HeapSizingApplication.class, args);
+ logMemory(logger);
+ }
+
+}
diff --git a/docker/heap-sizing/src/main/java/com/baeldung/docker/heapsizing/PrintXmxXms.java b/docker/heap-sizing/src/main/java/com/baeldung/docker/heapsizing/PrintXmxXms.java
new file mode 100644
index 0000000000..98f2f6455f
--- /dev/null
+++ b/docker/heap-sizing/src/main/java/com/baeldung/docker/heapsizing/PrintXmxXms.java
@@ -0,0 +1,36 @@
+package com.baeldung.docker.heapsizing;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.MemoryPoolMXBean;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class PrintXmxXms {
+
+ private static final Logger logger = Logger.getLogger(PrintXmxXms.class.getName());
+
+ public static void main(String[] args) {
+ logMemory(logger);
+ }
+
+ /**
+ * We're reusing this method in HeapSizingApplication, therefore this method was extracted
+ * to avoid repetition.
+ */
+ static void logMemory(Logger logger) {
+ float mb = 1024f * 1024f;
+ MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
+
+ // xmx controls the maximum size of the memory allocation pool,
+ // which includes the heap, the garbage collector's survivor space, and other pools.
+ float xmx = memoryBean.getHeapMemoryUsage().getMax() / mb;
+ float xms = memoryBean.getHeapMemoryUsage().getInit() / mb;
+ logger.log(Level.INFO, "Initial Memory (xms) : {0}mb", xms);
+ logger.log(Level.INFO, "Max Memory (xmx) : {0}mb", xmx);
+
+ for (MemoryPoolMXBean mp : ManagementFactory.getMemoryPoolMXBeans()) {
+ logger.log(Level.INFO, "Pool: {0} (type {1}) = {2}", new Object[]{ mp.getName(), mp.getType(), mp.getUsage().getMax() / mb });
+ }
+ }
+}
diff --git a/docker/pom.xml b/docker/pom.xml
index f05c303938..3fcc9ca94f 100644
--- a/docker/pom.xml
+++ b/docker/pom.xml
@@ -4,19 +4,19 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.3.1.RELEASE
-
-
-
com.baeldung.docker
docker
0.0.1
docker
Demo project showing Spring Boot and Docker
pom
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
11
diff --git a/dozer/pom.xml b/dozer/pom.xml
index 0fdf7f6fba..840763445c 100644
--- a/dozer/pom.xml
+++ b/dozer/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -31,4 +30,4 @@
5.5.1
-
+
\ No newline at end of file
diff --git a/drools/pom.xml b/drools/pom.xml
index e0a7b52938..cc96d9d032 100644
--- a/drools/pom.xml
+++ b/drools/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -65,4 +64,4 @@
7.10.0.Final
-
+
\ No newline at end of file
diff --git a/dropwizard/pom.xml b/dropwizard/pom.xml
index c3e1a4e841..36f2ec43f0 100644
--- a/dropwizard/pom.xml
+++ b/dropwizard/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -49,8 +48,10 @@
-
-
+
+
com.baeldung.dropwizard.introduction.IntroductionApplication
diff --git a/dubbo/pom.xml b/dubbo/pom.xml
index cca1b3a3d1..76e09c4375 100644
--- a/dubbo/pom.xml
+++ b/dubbo/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -37,4 +36,4 @@
0.10
-
+
\ No newline at end of file
diff --git a/ethereum/pom.xml b/ethereum/pom.xml
index 5953195123..4283714b98 100644
--- a/ethereum/pom.xml
+++ b/ethereum/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -16,14 +15,12 @@
-
org.springframework.boot
spring-boot-starter
${spring.boot.version}
-
org.springframework.boot
spring-boot-starter-web
@@ -34,7 +31,6 @@
spring-boot-starter-tomcat
${spring.boot.version}
-
org.springframework
@@ -51,7 +47,6 @@
spring-webmvc
${spring.version}
-
org.ethereum
@@ -63,7 +58,6 @@
core
${web3j.core.version}
-
com.fasterxml.jackson.core
@@ -80,7 +74,6 @@
jackson-annotations
${jackson.version}
-
javax.servlet
@@ -102,7 +95,6 @@
javax.servlet.jsp-api
${javax.servlet.jsp-api.version}
-
org.slf4j
@@ -114,7 +106,6 @@
logback-classic
${logback.version}
-
org.springframework.boot
@@ -133,7 +124,6 @@
${spring.version}
test
-
org.mockito
@@ -219,4 +209,4 @@
2.0.4.RELEASE
3.1
-
+
\ No newline at end of file
diff --git a/feign/pom.xml b/feign/pom.xml
index da3cbcb0fd..56059d2a77 100644
--- a/feign/pom.xml
+++ b/feign/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -43,4 +42,4 @@
10.11
-
+
\ No newline at end of file
diff --git a/flyway-cdi-extension/pom.xml b/flyway-cdi-extension/pom.xml
index 566eed95d8..757d1e0a7f 100644
--- a/flyway-cdi-extension/pom.xml
+++ b/flyway-cdi-extension/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -57,4 +56,4 @@
8.5.33
1.3.2
-
+
\ No newline at end of file
diff --git a/google-cloud/pom.xml b/google-cloud/pom.xml
index 1e474b5dd0..72b9647bc8 100644
--- a/google-cloud/pom.xml
+++ b/google-cloud/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -35,4 +34,4 @@
1.16.0
-
+
\ No newline at end of file
diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml
index 6fdcae4f75..6b93ccbc71 100644
--- a/google-web-toolkit/pom.xml
+++ b/google-web-toolkit/pom.xml
@@ -1,6 +1,5 @@
-
@@ -54,11 +53,10 @@
-
+
${project.build.directory}/${project.build.finalName}/WEB-INF/classes
-
-
net.ltgt.gwt.maven
@@ -76,7 +74,8 @@
com.baeldung.Google_web_toolkit
Google_web_toolkit
true
-
+
${maven.compiler.source}
@@ -93,32 +92,23 @@
-
maven-surefire-plugin
- ${surefire.plugin.version}
true
-
-
-
+
1.8
1.8
-
-
- UTF-8
- UTF-8
2.8.2
1.0-rc-8
- 2.17
-
+
\ No newline at end of file
diff --git a/graphql/graphql-java/pom.xml b/graphql/graphql-java/pom.xml
index 30bfbf555a..eae30aa8fa 100644
--- a/graphql/graphql-java/pom.xml
+++ b/graphql/graphql-java/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
diff --git a/grpc/pom.xml b/grpc/pom.xml
index 5e1c0bb28b..c3e4996c29 100644
--- a/grpc/pom.xml
+++ b/grpc/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -78,4 +77,4 @@
1.6.1
0.6.1
-
+
\ No newline at end of file
diff --git a/gson/pom.xml b/gson/pom.xml
index 0de9a6a533..a928d87b61 100644
--- a/gson/pom.xml
+++ b/gson/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
diff --git a/guava-modules/guava-18/pom.xml b/guava-modules/guava-18/pom.xml
index d65fab1e57..ed295db2f4 100644
--- a/guava-modules/guava-18/pom.xml
+++ b/guava-modules/guava-18/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
guava-18
0.1.0-SNAPSHOT
diff --git a/guava-modules/guava-19/pom.xml b/guava-modules/guava-19/pom.xml
index 20a405cff4..3c29a2a59c 100644
--- a/guava-modules/guava-19/pom.xml
+++ b/guava-modules/guava-19/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
guava-19
0.1.0-SNAPSHOT
diff --git a/guava-modules/guava-21/pom.xml b/guava-modules/guava-21/pom.xml
index b793f11a7f..8b7c3cdcfd 100644
--- a/guava-modules/guava-21/pom.xml
+++ b/guava-modules/guava-21/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
guava-21
1.0-SNAPSHOT
diff --git a/guava-modules/guava-collections-list/pom.xml b/guava-modules/guava-collections-list/pom.xml
index cc52a5d48b..d281be2235 100644
--- a/guava-modules/guava-collections-list/pom.xml
+++ b/guava-modules/guava-collections-list/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -27,7 +26,6 @@
commons-lang3
${commons-lang3.version}
-
org.junit.jupiter
@@ -47,7 +45,6 @@
${assertj.version}
test
-
org.hamcrest
@@ -58,28 +55,18 @@
- guava-collections
-
+ guava-collections-list
src/main/resources
true
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
4.1
-
3.6.1
2.0.0.0
diff --git a/guava-modules/guava-collections-map/pom.xml b/guava-modules/guava-collections-map/pom.xml
index 82d634265b..a03a779b3e 100644
--- a/guava-modules/guava-collections-map/pom.xml
+++ b/guava-modules/guava-collections-map/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.guava
guava-collections-map
@@ -31,21 +32,12 @@
guava-collections-map
-
src/main/resources
true
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
diff --git a/guava-modules/guava-collections-set/pom.xml b/guava-modules/guava-collections-set/pom.xml
index 8f58148e41..b989966a54 100644
--- a/guava-modules/guava-collections-set/pom.xml
+++ b/guava-modules/guava-collections-set/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
guava-collections-set
0.1.0-SNAPSHOT
@@ -37,14 +38,6 @@
guava-collections-set
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
@@ -53,4 +46,4 @@
5.6.2
-
+
\ No newline at end of file
diff --git a/guava-modules/guava-collections/pom.xml b/guava-modules/guava-collections/pom.xml
index 53c55dc655..021c4c6037 100644
--- a/guava-modules/guava-collections/pom.xml
+++ b/guava-modules/guava-collections/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -32,7 +31,6 @@
jool
${jool.version}
-
org.junit.jupiter
@@ -52,7 +50,6 @@
${assertj.version}
test
-
org.hamcrest
@@ -64,28 +61,18 @@
guava-collections
-
src/main/resources
true
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
4.1
0.9.12
-
3.6.1
2.0.0.0
diff --git a/guava-modules/guava-core/pom.xml b/guava-modules/guava-core/pom.xml
index 5224148cb8..a15dfb5178 100644
--- a/guava-modules/guava-core/pom.xml
+++ b/guava-modules/guava-core/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -31,7 +30,7 @@
- guava
+ guava-core
src/main/resources
@@ -45,4 +44,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/guava-modules/guava-io/pom.xml b/guava-modules/guava-io/pom.xml
index 6b3280755c..f6ebac8ba4 100644
--- a/guava-modules/guava-io/pom.xml
+++ b/guava-modules/guava-io/pom.xml
@@ -1,12 +1,10 @@
-
+
4.0.0
guava-io
0.1.0-SNAPSHOT
-
- 5.6.2
-
guava-io
@@ -33,21 +31,16 @@
guava-io
-
src/main/resources
true
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
+
+ 5.6.2
+
+
\ No newline at end of file
diff --git a/guava-modules/guava-utilities/pom.xml b/guava-modules/guava-utilities/pom.xml
index 0496f5b2e8..a9aca0ee08 100644
--- a/guava-modules/guava-utilities/pom.xml
+++ b/guava-modules/guava-utilities/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -21,7 +20,6 @@
commons-lang3
${commons-lang3.version}
-
org.junit.jupiter
@@ -44,22 +42,13 @@
- guava
-
+ guava-utilities
src/main/resources
true
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
diff --git a/guava-modules/pom.xml b/guava-modules/pom.xml
index b625f9fd0f..957b8ad166 100644
--- a/guava-modules/pom.xml
+++ b/guava-modules/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
guava-modules
guava-modules
@@ -46,19 +47,10 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
-
-
+ 2.22.2
5.6.2
29.0-jre
-
+
\ No newline at end of file
diff --git a/guice/pom.xml b/guice/pom.xml
index 6bbad6dddc..2d968cdfc7 100644
--- a/guice/pom.xml
+++ b/guice/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
diff --git a/hazelcast/pom.xml b/hazelcast/pom.xml
index 69444308a3..694563790f 100644
--- a/hazelcast/pom.xml
+++ b/hazelcast/pom.xml
@@ -1,8 +1,7 @@
-
+
4.0.0
hazelcast
0.0.1-SNAPSHOT
diff --git a/helidon/helidon-mp/pom.xml b/helidon/helidon-mp/pom.xml
index 38187a5cb8..3e61d05f61 100644
--- a/helidon/helidon-mp/pom.xml
+++ b/helidon/helidon-mp/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
helidon-mp
helidon-mp
@@ -29,4 +30,4 @@
2.26
-
+
\ No newline at end of file
diff --git a/helidon/helidon-se/pom.xml b/helidon/helidon-se/pom.xml
index d5592dfb7b..e26390a99d 100644
--- a/helidon/helidon-se/pom.xml
+++ b/helidon/helidon-se/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
helidon-se
helidon-se
@@ -13,14 +13,13 @@
-
+
io.helidon.config
helidon-config-yaml
${helidon.version}
-
-
+
io.helidon.webserver
helidon-webserver
@@ -37,8 +36,7 @@
helidon-webserver-json
${helidon.version}
-
-
+
io.helidon.security
helidon-security
diff --git a/helidon/pom.xml b/helidon/pom.xml
index 85bab4db42..36466203a8 100644
--- a/helidon/pom.xml
+++ b/helidon/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.helidon
helidon
@@ -18,4 +19,4 @@
helidon-mp
-
+
\ No newline at end of file
diff --git a/httpclient-2/pom.xml b/httpclient-2/pom.xml
index 7638c692dc..881b0407c3 100644
--- a/httpclient-2/pom.xml
+++ b/httpclient-2/pom.xml
@@ -26,7 +26,6 @@
-
org.springframework.boot
diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml
index 019f1af856..84b41cdd6c 100644
--- a/httpclient-simple/pom.xml
+++ b/httpclient-simple/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
httpclient-simple
0.1-SNAPSHOT
@@ -15,9 +16,7 @@
-
-
org.springframework.security
spring-security-web
@@ -28,9 +27,7 @@
spring-security-config
${spring-security.version}
-
-
org.springframework
spring-core
@@ -72,7 +69,6 @@
spring-expression
${spring.version}
-
org.springframework
spring-web
@@ -83,21 +79,17 @@
spring-webmvc
${spring.version}
-
org.springframework
spring-oxm
${spring.version}
-
-
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
-
org.apache.httpcomponents
httpcore
@@ -109,7 +101,6 @@
-
org.apache.commons
@@ -166,33 +157,26 @@
${wiremock.version}
test
-
-
javax.servlet
javax.servlet-api
${javax.servlet-api.version}
provided
-
javax.servlet
jstl
${jstl.version}
runtime
-
-
com.google.guava
guava
${guava.version}
-
-
org.springframework
spring-test
@@ -209,7 +193,6 @@
true
-
org.apache.maven.plugins
@@ -264,7 +247,6 @@
-
org.apache.maven.plugins
maven-surefire-plugin
@@ -288,7 +270,6 @@
-
@@ -302,7 +283,7 @@
2.5.1
4.4.11
- 4.5.8
+ 4.5.8
1.6.1
diff --git a/httpclient/pom.xml b/httpclient/pom.xml
index 606e9ed793..a1627cb6fa 100644
--- a/httpclient/pom.xml
+++ b/httpclient/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
httpclient
0.1-SNAPSHOT
diff --git a/hystrix/pom.xml b/hystrix/pom.xml
index 1cf8713b91..639d4eba02 100644
--- a/hystrix/pom.xml
+++ b/hystrix/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
hystrix
1.0
@@ -57,4 +58,4 @@
1.5.8
-
+
\ No newline at end of file
diff --git a/image-processing/pom.xml b/image-processing/pom.xml
index f2551598d5..ea218356ce 100644
--- a/image-processing/pom.xml
+++ b/image-processing/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
image-processing
1.0-SNAPSHOT
@@ -75,14 +76,14 @@
marvin
${marvin-version}
pom
-
+
com.github.downgoon
MarvinPlugins
${marvin-version}
-
+
1.3.5
1.51h
diff --git a/immutables/pom.xml b/immutables/pom.xml
index af4a62ea6b..648166fd74 100644
--- a/immutables/pom.xml
+++ b/immutables/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
immutables
immutables
diff --git a/jackson-modules/jackson-annotations/pom.xml b/jackson-modules/jackson-annotations/pom.xml
index e4a41a5825..bdc131c867 100644
--- a/jackson-modules/jackson-annotations/pom.xml
+++ b/jackson-modules/jackson-annotations/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jackson-annotations
0.0.1-SNAPSHOT
@@ -47,4 +48,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/bidirection/ItemWithRef.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/bidirection/ItemWithRef.java
index 0ca8d721e8..1bd2451c6c 100644
--- a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/bidirection/ItemWithRef.java
+++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/bidirection/ItemWithRef.java
@@ -1,12 +1,12 @@
package com.baeldung.jackson.bidirection;
-import com.fasterxml.jackson.annotation.JsonManagedReference;
+import com.fasterxml.jackson.annotation.JsonBackReference;
public class ItemWithRef {
public int id;
public String itemName;
- @JsonManagedReference
+ @JsonBackReference
public UserWithRef owner;
public ItemWithRef() {
diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/bidirection/UserWithRef.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/bidirection/UserWithRef.java
index 3de03fc651..cc7b2b52ca 100644
--- a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/bidirection/UserWithRef.java
+++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/bidirection/UserWithRef.java
@@ -3,13 +3,13 @@ package com.baeldung.jackson.bidirection;
import java.util.ArrayList;
import java.util.List;
-import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
public class UserWithRef {
public int id;
public String name;
- @JsonBackReference
+ @JsonManagedReference
public List userItems;
public UserWithRef() {
@@ -19,7 +19,7 @@ public class UserWithRef {
public UserWithRef(final int id, final String name) {
this.id = id;
this.name = name;
- userItems = new ArrayList();
+ userItems = new ArrayList<>();
}
public void addItem(final ItemWithRef item) {
diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/bidirection/JacksonBidirectionRelationUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/bidirection/JacksonBidirectionRelationUnitTest.java
index d0c5209891..b3ce27ad94 100644
--- a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/bidirection/JacksonBidirectionRelationUnitTest.java
+++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/bidirection/JacksonBidirectionRelationUnitTest.java
@@ -1,7 +1,9 @@
package com.baeldung.jackson.bidirection;
import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
@@ -16,7 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonBidirectionRelationUnitTest {
- @Test(expected = JsonMappingException.class)
+ @Test (expected = JsonMappingException.class)
public void givenBidirectionRelation_whenSerializing_thenException() throws JsonProcessingException {
final User user = new User(1, "John");
final Item item = new Item(2, "book", user);
@@ -26,16 +28,39 @@ public class JacksonBidirectionRelationUnitTest {
}
@Test
- public void givenBidirectionRelation_whenUsingJacksonReferenceAnnotation_thenCorrect() throws JsonProcessingException {
+ public void givenBidirectionRelation_whenUsingJacksonReferenceAnnotationWithSerialization_thenCorrect() throws JsonProcessingException {
final UserWithRef user = new UserWithRef(1, "John");
final ItemWithRef item = new ItemWithRef(2, "book", user);
user.addItem(item);
- final String result = new ObjectMapper().writeValueAsString(item);
+ final String itemJson = new ObjectMapper().writeValueAsString(item);
+ final String userJson = new ObjectMapper().writeValueAsString(user);
- assertThat(result, containsString("book"));
- assertThat(result, containsString("John"));
- assertThat(result, not(containsString("userItems")));
+ assertThat(itemJson, containsString("book"));
+ assertThat(itemJson, not(containsString("John")));
+
+ assertThat(userJson, containsString("John"));
+ assertThat(userJson, containsString("userItems"));
+ assertThat(userJson, containsString("book"));
+ }
+
+ @Test
+ public void givenBidirectionRelation_whenUsingJacksonReferenceAnnotationWithDeserialization_thenCorrect() throws JsonProcessingException {
+ final UserWithRef user = new UserWithRef(1, "John");
+ final ItemWithRef item = new ItemWithRef(2, "book", user);
+ user.addItem(item);
+
+ final String itemJson = new ObjectMapper().writeValueAsString(item);
+ final String userJson = new ObjectMapper().writeValueAsString(user);
+
+ final ItemWithRef itemRead = new ObjectMapper().readValue(itemJson, ItemWithRef.class);
+ final UserWithRef userRead = new ObjectMapper().readValue(userJson, UserWithRef.class);
+
+ assertThat(itemRead.itemName, is("book"));
+ assertThat(itemRead.owner, nullValue());
+
+ assertThat(userRead.name, is("John"));
+ assertThat(userRead.userItems.get(0).itemName, is("book"));
}
@Test
diff --git a/jackson-modules/jackson-conversions-2/pom.xml b/jackson-modules/jackson-conversions-2/pom.xml
index 992cff30b2..799fcb106a 100644
--- a/jackson-modules/jackson-conversions-2/pom.xml
+++ b/jackson-modules/jackson-conversions-2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jackson-conversions-2
0.0.1-SNAPSHOT
@@ -54,4 +55,4 @@
2.9.8
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson-conversions/pom.xml b/jackson-modules/jackson-conversions/pom.xml
index fafb731cc9..9218f209ac 100644
--- a/jackson-modules/jackson-conversions/pom.xml
+++ b/jackson-modules/jackson-conversions/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jackson-conversions
0.0.1-SNAPSHOT
@@ -35,4 +36,4 @@
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson-custom-conversions/pom.xml b/jackson-modules/jackson-custom-conversions/pom.xml
index f58b25781c..79af962eec 100644
--- a/jackson-modules/jackson-custom-conversions/pom.xml
+++ b/jackson-modules/jackson-custom-conversions/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jackson-custom-conversions
0.0.1-SNAPSHOT
@@ -28,8 +29,6 @@
jackson-core
${jackson.version}
-
-
@@ -42,4 +41,4 @@
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson-exceptions/pom.xml b/jackson-modules/jackson-exceptions/pom.xml
index 1a52892523..a24a0ab4b7 100644
--- a/jackson-modules/jackson-exceptions/pom.xml
+++ b/jackson-modules/jackson-exceptions/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jackson-exceptions
0.0.1-SNAPSHOT
@@ -22,4 +23,4 @@
-
+
\ No newline at end of file
diff --git a/jackson-modules/jackson/pom.xml b/jackson-modules/jackson/pom.xml
index 615076fc93..a4aecfa3de 100644
--- a/jackson-modules/jackson/pom.xml
+++ b/jackson-modules/jackson/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jackson
0.0.1-SNAPSHOT
@@ -19,41 +20,34 @@
jackson-datatype-jsr310
${jackson.version}
-
com.fasterxml.jackson.datatype
jackson-datatype-joda
${jackson.version}
-
com.fasterxml.jackson.module
jackson-module-jsonSchema
${jackson.version}
-
com.fasterxml.jackson.datatype
jackson-datatype-jdk8
${jackson.version}
-
-
io.rest-assured
json-schema-validator
${rest-assured.version}
test
-
io.rest-assured
json-path
${rest-assured.version}
test
-
org.assertj
assertj-core
@@ -78,4 +72,4 @@
3.11.0
-
+
\ No newline at end of file
diff --git a/jackson-modules/pom.xml b/jackson-modules/pom.xml
index 70b10e9554..3d9d83553e 100644
--- a/jackson-modules/pom.xml
+++ b/jackson-modules/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
jackson-modules
jackson-modules
@@ -35,7 +35,6 @@
jackson-dataformat-xml
${jackson.version}
-
org.junit.jupiter
junit-jupiter
@@ -50,17 +49,8 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
-
-
5.6.2
+
\ No newline at end of file
diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml
index 761dca6afa..204954ce60 100644
--- a/jackson-simple/pom.xml
+++ b/jackson-simple/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jackson-simple
0.0.1-SNAPSHOT
@@ -20,7 +21,6 @@
jackson-dataformat-xml
${jackson.version}
-
org.junit.jupiter
@@ -44,21 +44,12 @@
jackson-simple
-
src/main/resources
true
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
@@ -67,4 +58,4 @@
3.11.0
-
+
\ No newline at end of file
diff --git a/java-blockchain/pom.xml b/java-blockchain/pom.xml
index 3100fed7b9..6d3910df80 100644
--- a/java-blockchain/pom.xml
+++ b/java-blockchain/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.blockchain
java-blockchain
diff --git a/java-collections-conversions-2/pom.xml b/java-collections-conversions-2/pom.xml
index 23f20276a3..7845e0d934 100644
--- a/java-collections-conversions-2/pom.xml
+++ b/java-collections-conversions-2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
java-collections-conversions-2
0.1.0-SNAPSHOT
@@ -55,4 +56,4 @@
-
+
\ No newline at end of file
diff --git a/java-collections-conversions/pom.xml b/java-collections-conversions/pom.xml
index 2073640372..92fc66b480 100644
--- a/java-collections-conversions/pom.xml
+++ b/java-collections-conversions/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
java-collections-conversions
0.1.0-SNAPSHOT
@@ -40,4 +41,5 @@
4.1
-
+
+
\ No newline at end of file
diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md
index bd1029c9cf..9b1d8510c2 100644
--- a/java-collections-maps-3/README.md
+++ b/java-collections-maps-3/README.md
@@ -3,3 +3,4 @@
- [Java Map With Case-Insensitive Keys](https://www.baeldung.com/java-map-with-case-insensitive-keys)
- [Using a Byte Array as Map Key in Java](https://www.baeldung.com/java-map-key-byte-array)
- [Using the Map.Entry Java Class](https://www.baeldung.com/java-map-entry)
+- [Optimizing HashMap’s Performance](https://www.baeldung.com/java-hashmap-optimize-performance)
diff --git a/java-collections-maps-3/pom.xml b/java-collections-maps-3/pom.xml
index 3888623a7f..37a0f617d0 100644
--- a/java-collections-maps-3/pom.xml
+++ b/java-collections-maps-3/pom.xml
@@ -1,7 +1,13 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ java-collections-maps-3
+ 0.1.0-SNAPSHOT
+ java-collections-maps-3
+ jar
+
com.baeldung
parent-java
@@ -9,12 +15,6 @@
../parent-java
- 4.0.0
- java-collections-maps-3
- 0.1.0-SNAPSHOT
- java-collections-maps-3
- jar
-
org.springframework
@@ -28,11 +28,11 @@
${assertj.version}
test
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
@@ -40,4 +40,4 @@
3.6.1
5.2.5.RELEASE
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/app-auth-basic-store-db/pom.xml b/java-ee-8-security-api/app-auth-basic-store-db/pom.xml
index 02e3b04a40..7307f144a7 100644
--- a/java-ee-8-security-api/app-auth-basic-store-db/pom.xml
+++ b/java-ee-8-security-api/app-auth-basic-store-db/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
app-auth-basic-store-db
app-auth-basic-store-db
@@ -65,4 +66,4 @@
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml b/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml
index 9354782999..729b426049 100644
--- a/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml
+++ b/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
app-auth-custom-form-store-custom
app-auth-custom-form-store-custom
@@ -39,4 +40,4 @@
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/app-auth-custom-no-store/pom.xml b/java-ee-8-security-api/app-auth-custom-no-store/pom.xml
index fee665e22d..da6ed0a1a5 100644
--- a/java-ee-8-security-api/app-auth-custom-no-store/pom.xml
+++ b/java-ee-8-security-api/app-auth-custom-no-store/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
app-auth-custom-no-store
app-auth-custom-no-store
@@ -65,4 +66,4 @@
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml b/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml
index f8d19b5750..1dea82992c 100644
--- a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml
+++ b/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -53,4 +52,4 @@
4.0.4
-
+
\ No newline at end of file
diff --git a/java-ee-8-security-api/pom.xml b/java-ee-8-security-api/pom.xml
index 5eeebcb6f0..c01bedbeee 100644
--- a/java-ee-8-security-api/pom.xml
+++ b/java-ee-8-security-api/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
java-ee-8-security-api
1.0-SNAPSHOT
@@ -71,4 +71,4 @@
18.0.0.1
-
+
\ No newline at end of file
diff --git a/java-native/pom.xml b/java-native/pom.xml
index 29fc13b8d8..95cb24bd98 100644
--- a/java-native/pom.xml
+++ b/java-native/pom.xml
@@ -12,10 +12,6 @@
1.0.0-SNAPSHOT
-
- 5.6.0
-
-
net.java.dev.jna
@@ -23,7 +19,7 @@
${jna.version}
-
+
@@ -36,4 +32,9 @@
+
+
+ 5.6.0
+
+
\ No newline at end of file
diff --git a/java-numbers-2/pom.xml b/java-numbers-2/pom.xml
index 5c81b00756..466d040b13 100644
--- a/java-numbers-2/pom.xml
+++ b/java-numbers-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
java-numbers-2
0.1.0-SNAPSHOT
@@ -42,4 +42,4 @@
2.6.0
-
+
\ No newline at end of file
diff --git a/java-numbers-3/pom.xml b/java-numbers-3/pom.xml
index 62225a898f..e8e080c4c0 100644
--- a/java-numbers-3/pom.xml
+++ b/java-numbers-3/pom.xml
@@ -54,4 +54,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/java-numbers-4/pom.xml b/java-numbers-4/pom.xml
index f4b0e23bd7..dbd6ac456a 100644
--- a/java-numbers-4/pom.xml
+++ b/java-numbers-4/pom.xml
@@ -48,4 +48,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/java-numbers/pom.xml b/java-numbers/pom.xml
index fc904c5747..8bab655f73 100644
--- a/java-numbers/pom.xml
+++ b/java-numbers/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
java-numbers
0.1.0-SNAPSHOT
@@ -54,4 +54,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/java-rmi/pom.xml b/java-rmi/pom.xml
index 5fa3ac8845..fee5107423 100644
--- a/java-rmi/pom.xml
+++ b/java-rmi/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.rmi
java-rmi
@@ -14,4 +15,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java b/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java
index 66bfbe49eb..604899de03 100644
--- a/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java
+++ b/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java
@@ -1,44 +1,42 @@
package com.baeldung.rmi;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
+import org.junit.Before;
+import org.junit.Test;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
public class JavaRMIIntegrationTest {
-
- @BeforeClass
- public static void whenRunServer_thenServerStarts() {
-
- try {
- MessengerServiceImpl server = new MessengerServiceImpl();
- server.createStubAndBind();
- } catch (RemoteException e) {
- fail("Exception Occurred");
- }
- }
-
- @Test
- public void whenClientSendsMessageToServer_thenServerSendsResponseMessage() {
-
- try {
- Registry registry = LocateRegistry.getRegistry();
- MessengerService server = (MessengerService) registry.lookup("MessengerService");
- String responseMessage = server.sendMessage("Client Message");
-
- String expectedMessage = "Server Message";
- assertEquals(responseMessage, expectedMessage);
- } catch (RemoteException e) {
- fail("Exception Occurred");
- } catch (NotBoundException nb) {
- fail("Exception Occurred");
- }
- }
-
+
+ private MessengerServiceImpl messengerService;
+
+ @Before
+ public void init() {
+ try {
+ messengerService = new MessengerServiceImpl();
+ messengerService.createStubAndBind();
+ } catch (RemoteException e) {
+ fail("Exception Occurred: " + e);
+ }
+ }
+
+ @Test
+ public void whenClientSendsMessageToServer_thenServerSendsResponseMessage() {
+ try {
+ Registry registry = LocateRegistry.getRegistry();
+ MessengerService server = (MessengerService) registry.lookup("MessengerService");
+ String responseMessage = server.sendMessage("Client Message");
+
+ String expectedMessage = "Server Message";
+ assertEquals(responseMessage, expectedMessage);
+ } catch (RemoteException | NotBoundException e) {
+ fail("Exception Occurred: " + e);
+ }
+ }
+
}
\ No newline at end of file
diff --git a/java-spi/exchange-rate-api/pom.xml b/java-spi/exchange-rate-api/pom.xml
index 1630dbf699..8067175cac 100644
--- a/java-spi/exchange-rate-api/pom.xml
+++ b/java-spi/exchange-rate-api/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
exchange-rate-api
exchange-rate-api
@@ -12,4 +13,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/java-spi/exchange-rate-app/pom.xml b/java-spi/exchange-rate-app/pom.xml
index fea9ebe8d9..fbf87eb026 100644
--- a/java-spi/exchange-rate-app/pom.xml
+++ b/java-spi/exchange-rate-app/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
exchange-rate-app
exchange-rate-app
@@ -24,4 +25,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/java-spi/exchange-rate-impl/pom.xml b/java-spi/exchange-rate-impl/pom.xml
index 553a9e3377..254a8bb809 100644
--- a/java-spi/exchange-rate-impl/pom.xml
+++ b/java-spi/exchange-rate-impl/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
exchange-rate-impl
exchange-rate-impl
@@ -71,4 +72,4 @@
3.1.0
-
+
\ No newline at end of file
diff --git a/java-spi/pom.xml b/java-spi/pom.xml
index 6d4874083d..fac6409b9f 100644
--- a/java-spi/pom.xml
+++ b/java-spi/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
java-spi
java-spi
@@ -18,4 +19,4 @@
exchange-rate-app
-
+
\ No newline at end of file
diff --git a/java-vavr-stream/pom.xml b/java-vavr-stream/pom.xml
index 94520f299d..8358c29003 100644
--- a/java-vavr-stream/pom.xml
+++ b/java-vavr-stream/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.samples
java-vavr-stream
diff --git a/java-websocket/pom.xml b/java-websocket/pom.xml
index ddf10c4457..ffc2b0631e 100644
--- a/java-websocket/pom.xml
+++ b/java-websocket/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
java-websocket
0.0.1-SNAPSHOT
@@ -32,4 +33,4 @@
2.8.0
-
+
\ No newline at end of file
diff --git a/javafx/pom.xml b/javafx/pom.xml
index 50b9e7135c..9b0b6002a8 100644
--- a/javafx/pom.xml
+++ b/javafx/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
javafx
javafx
diff --git a/javax-servlets/pom.xml b/javax-servlets/pom.xml
index 700b823a6e..f1677050cf 100644
--- a/javax-servlets/pom.xml
+++ b/javax-servlets/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.javax-servlets
javax-servlets
@@ -21,21 +22,18 @@
${assertj.version}
test
-
commons-fileupload
commons-fileupload
${commons-fileupload.version}
-
javax.servlet
javax.servlet-api
${javax.servlet-api.version}
-
org.apache.httpcomponents
httpclient
@@ -62,4 +60,4 @@
4.0.1
-
+
\ No newline at end of file
diff --git a/javaxval/pom.xml b/javaxval/pom.xml
index 2655d1fe3e..d684e9dfe2 100644
--- a/javaxval/pom.xml
+++ b/javaxval/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
javaxval
0.1-SNAPSHOT
@@ -47,4 +48,4 @@
5.0.2.RELEASE
3.11.1
-
+
\ No newline at end of file
diff --git a/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
index 2df0cf81af..801d7966a5 100644
--- a/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
+++ b/javaxval/src/test/java/com/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
@@ -1,18 +1,17 @@
package com.baeldung.javaxval.bigdecimal;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.math.BigDecimal;
-import java.util.Set;
-
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.Validator;
-
import com.baeldung.javaxval.LocaleAwareUnitTest;
import org.junit.BeforeClass;
import org.junit.Test;
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import java.math.BigDecimal;
+import java.util.Set;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
public class InvoiceUnitTest extends LocaleAwareUnitTest {
private static Validator validator;
@@ -24,41 +23,67 @@ public class InvoiceUnitTest extends LocaleAwareUnitTest {
}
@Test
- public void whenPriceIntegerDigitLessThanThreeWithDecimalValue_thenShouldGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(10.21), "Book purchased");
+ public void whenLessThanThreeIntegerDigits_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("10.21"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
+ assertThat(violations).isEmpty();
}
@Test
- public void whenPriceIntegerDigitLessThanThreeWithIntegerValue_thenShouldNotGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(10), "Book purchased");
+ public void whenThreeIntegerDigits_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("102.21"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(0);
+ assertThat(violations).isEmpty();
}
@Test
- public void whenPriceIntegerDigitGreaterThanThree_thenShouldGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(1021.21), "Book purchased");
+ public void whenMoreThanThreeIntegerDigits_thenShouldGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("1021.21"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
+ assertThat(violations).hasSize(1);
+ assertThat(violations)
+ .extracting("message")
+ .containsOnly("numeric value out of bounds (<3 digits>.<2 digits> expected)");
+ }
+
+ @Test
+ public void whenLessThanTwoFractionDigits_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("99.9"), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations).isEmpty();
+ }
+
+ @Test
+ public void whenTwoFractionDigits_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("99.99"), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations).isEmpty();
+ }
+
+ @Test
+ public void whenMoreThanTwoFractionDigits_thenShouldGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal("99.999"), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations).hasSize(1);
+ assertThat(violations)
+ .extracting("message")
+ .containsOnly("numeric value out of bounds (<3 digits>.<2 digits> expected)");
}
@Test
public void whenPriceIsZero_thenShouldGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(000.00), "Book purchased");
+ Invoice invoice = new Invoice(new BigDecimal("0.00"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(1);
- violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("must be greater than 0.0"));
+ assertThat(violations).hasSize(1);
+ assertThat(violations)
+ .extracting("message")
+ .containsOnly("must be greater than 0.0");
}
@Test
public void whenPriceIsGreaterThanZero_thenShouldNotGiveConstraintViolations() {
- Invoice invoice = new Invoice(new BigDecimal(100.50), "Book purchased");
+ Invoice invoice = new Invoice(new BigDecimal("100.50"), "Book purchased");
Set> violations = validator.validate(invoice);
- assertThat(violations.size()).isEqualTo(0);
+ assertThat(violations).isEmpty();
}
-
}
diff --git a/jaxb/pom.xml b/jaxb/pom.xml
index dc13cf75bc..183f7f13cb 100644
--- a/jaxb/pom.xml
+++ b/jaxb/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jaxb
0.0.1-SNAPSHOT
@@ -34,7 +35,6 @@
true
-
@@ -55,7 +55,7 @@
-
+
@@ -64,9 +64,7 @@
-
-
org.codehaus.mojo
diff --git a/jee-7-security/pom.xml b/jee-7-security/pom.xml
index e47df7aae9..a8ceee8704 100644
--- a/jee-7-security/pom.xml
+++ b/jee-7-security/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jee-7-security
1.0-SNAPSHOT
@@ -58,4 +59,4 @@
1.0-pr
-
+
\ No newline at end of file
diff --git a/jee-7/pom.xml b/jee-7/pom.xml
index b0e10c1580..b68c8b9801 100644
--- a/jee-7/pom.xml
+++ b/jee-7/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
jee-7
1.0-SNAPSHOT
@@ -41,7 +41,6 @@
${javaee_api.version}
provided
-
org.jboss.arquillian.junit
arquillian-junit-container
@@ -60,14 +59,12 @@
${awaitility.version}
test
-
org.jboss.shrinkwrap.resolver
shrinkwrap-resolver-impl-maven
test
jar
-
org.jboss.shrinkwrap.resolver
shrinkwrap-resolver-impl-maven-archive
@@ -114,7 +111,6 @@
standard
${taglibs.standard.version}
-
javax.mvc
javax.mvc-api
@@ -125,13 +121,11 @@
ozark
${ozark.version}
-
org.springframework.security
spring-security-web
${org.springframework.security.version}
-
org.springframework.security
spring-security-config
@@ -143,7 +137,6 @@
${org.springframework.security.version}
-
org.jboss.spec.javax.batch
jboss-batch-api_1.0_spec
@@ -210,8 +203,8 @@
-
+
org.eclipse.m2e
lifecycle-mapping
@@ -242,7 +235,7 @@
-
+
org.codehaus.mojo
jaxws-maven-plugin
@@ -523,7 +516,6 @@
2.25
1.0.0.Final
4.2.3.RELEASE
- 2.21.0
1.1.2
2.2.14
4.5
@@ -540,4 +532,4 @@
2.22.1
-
+
\ No newline at end of file
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointIntegrationTest.java
similarity index 96%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointIntegrationTest.java
index c607efeb24..8190ae5afb 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointIntegrationTest.java
@@ -12,7 +12,7 @@ import javax.batch.runtime.StepExecution;
import org.junit.jupiter.api.Test;
-class CustomCheckPointUnitTest {
+class CustomCheckPointIntegrationTest {
@Test
public void givenChunk_whenCustomCheckPoint_thenCommitCountIsThree() throws Exception {
JobOperator jobOperator = BatchRuntime.getJobOperator();
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceIntegrationTest.java
similarity index 99%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceIntegrationTest.java
index 4b27e5f5ec..7dda13a752 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceIntegrationTest.java
@@ -16,7 +16,7 @@ import javax.batch.runtime.StepExecution;
import org.junit.jupiter.api.Test;
-class JobSequenceUnitTest {
+class JobSequenceIntegrationTest {
@Test
public void givenTwoSteps_thenBatch_CompleteWithSuccess() throws Exception {
JobOperator jobOperator = BatchRuntime.getJobOperator();
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetIntegrationTest.java
similarity index 98%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetIntegrationTest.java
index 788b75eb3e..dc91f747d3 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetIntegrationTest.java
@@ -11,7 +11,7 @@ import javax.batch.runtime.JobExecution;
import org.junit.jupiter.api.Test;
-class SimpleBatchLetUnitTest {
+class SimpleBatchLetIntegrationTest {
@Test
public void givenBatchLet_thenBatch_CompleteWithSuccess() throws Exception {
JobOperator jobOperator = BatchRuntime.getJobOperator();
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkIntegrationTest.java
similarity index 99%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkIntegrationTest.java
index 9010c365a2..a7884dbb32 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkIntegrationTest.java
@@ -16,7 +16,7 @@ import javax.batch.runtime.StepExecution;
import org.junit.jupiter.api.Test;
-class SimpleChunkUnitTest {
+class SimpleChunkIntegrationTest {
@Test
public void givenChunk_thenBatch_CompletesWithSucess() throws Exception {
JobOperator jobOperator = BatchRuntime.getJobOperator();
diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkIntegrationTest.java
similarity index 97%
rename from jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java
rename to jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkIntegrationTest.java
index bc410aec8d..8c3beeb2f3 100644
--- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java
+++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkIntegrationTest.java
@@ -13,7 +13,7 @@ import javax.batch.runtime.StepExecution;
import org.junit.jupiter.api.Test;
-class SimpleErrorChunkUnitTest {
+class SimpleErrorChunkIntegrationTest {
@Test
public void givenChunkError_thenBatch_CompletesWithFailed() throws Exception {
diff --git a/jersey/pom.xml b/jersey/pom.xml
index 065e2230a2..9f57179065 100644
--- a/jersey/pom.xml
+++ b/jersey/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jersey
0.0.1-SNAPSHOT
@@ -97,4 +98,4 @@
2.26
-
+
\ No newline at end of file
diff --git a/jgit/pom.xml b/jgit/pom.xml
index d960843868..ca58709583 100644
--- a/jgit/pom.xml
+++ b/jgit/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jgit
1.0-SNAPSHOT
diff --git a/jgroups/pom.xml b/jgroups/pom.xml
index 494de2fb4f..370d8a349a 100644
--- a/jgroups/pom.xml
+++ b/jgroups/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jgroups
0.1-SNAPSHOT
@@ -31,4 +32,4 @@
4.0.10.Final
-
+
\ No newline at end of file
diff --git a/jhipster-5/bookstore-monolith/pom.xml b/jhipster-5/bookstore-monolith/pom.xml
index dbc46bbb97..8403c2d1d4 100644
--- a/jhipster-5/bookstore-monolith/pom.xml
+++ b/jhipster-5/bookstore-monolith/pom.xml
@@ -6,7 +6,7 @@
bookstore-monolith
0.0.1-SNAPSHOT
war
- Bookstore
+ bookstore-monolith
jhipster-5
@@ -1099,8 +1099,6 @@
2.12.6
v10.15.0
6.4.1
- UTF-8
- UTF-8
${project.build.directory}/test-results
yyyyMMddHHmmss
${java.version}
diff --git a/jhipster/jhipster-uaa/gateway/pom.xml b/jhipster/jhipster-uaa/gateway/pom.xml
index b417bd7b57..53422bfa44 100644
--- a/jhipster/jhipster-uaa/gateway/pom.xml
+++ b/jhipster/jhipster-uaa/gateway/pom.xml
@@ -4,7 +4,7 @@
com.baeldung.jhipster.gateway
gateway
0.0.1-SNAPSHOT
- Gateway
+ gateway
war
@@ -1020,8 +1020,6 @@
2.12.6
v8.12.0
6.4.1
- UTF-8
- UTF-8
${project.build.directory}/test-results
yyyyMMddHHmmss
${java.version}
diff --git a/jhipster/jhipster-uaa/quotes/pom.xml b/jhipster/jhipster-uaa/quotes/pom.xml
index f088ad2fd1..2d61a2a820 100644
--- a/jhipster/jhipster-uaa/quotes/pom.xml
+++ b/jhipster/jhipster-uaa/quotes/pom.xml
@@ -4,7 +4,7 @@
com.baeldung.jhipster.quotes
quotes
0.0.1-SNAPSHOT
- Quotes
+ quotes
war
@@ -840,8 +840,6 @@
2.12.6
v8.12.0
6.4.1
- UTF-8
- UTF-8
${project.build.directory}/test-results
yyyyMMddHHmmss
${java.version}
diff --git a/jhipster/jhipster-uaa/uaa/pom.xml b/jhipster/jhipster-uaa/uaa/pom.xml
index f9c1f226bb..cabbf1de33 100644
--- a/jhipster/jhipster-uaa/uaa/pom.xml
+++ b/jhipster/jhipster-uaa/uaa/pom.xml
@@ -4,7 +4,7 @@
com.baeldung.jhipster.uaa
uaa
0.0.1-SNAPSHOT
- Uaa
+ uaa
war
@@ -842,8 +842,6 @@
2.12.6
v8.12.0
6.4.1
- UTF-8
- UTF-8
${project.build.directory}/test-results
yyyyMMddHHmmss
${java.version}
diff --git a/jib/pom.xml b/jib/pom.xml
index 15e7e44e7c..8208eebdf7 100644
--- a/jib/pom.xml
+++ b/jib/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jib
0.1-SNAPSHOT
@@ -42,4 +43,4 @@
2.5.0
-
+
\ No newline at end of file
diff --git a/jjwt/README.md b/jjwt/README.md
index 25f5a8f6f0..ff4b7f547c 100644
--- a/jjwt/README.md
+++ b/jjwt/README.md
@@ -8,8 +8,7 @@ This tutorial walks you through the various features supported by the [JJWT](htt
It's super easy to build and exercise this tutorial.
```
-mvn clean install
-java -jar target/*.jar
+mvn clean spring-boot:run
```
That's it!
@@ -47,3 +46,4 @@ Available commands (assumes httpie - https://github.com/jkbrzt/httpie):
## Relevant articles:
- [Supercharge Java Authentication with JSON Web Tokens (JWTs)](https://www.baeldung.com/java-json-web-tokens-jjwt)
+- [Decode a JWT Token in Java](https://www.baeldung.com/java-jwt-token-decode)
diff --git a/jjwt/pom.xml b/jjwt/pom.xml
index aa238fafb5..4c194f9285 100644
--- a/jjwt/pom.xml
+++ b/jjwt/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
io.jsonwebtoken
jjwt
@@ -20,31 +21,32 @@
org.springframework.boot
spring-boot-devtools
-
org.springframework.boot
spring-boot-starter-thymeleaf
-
org.springframework.boot
spring-boot-starter-security
-
org.springframework.boot
spring-boot-starter-web
-
io.jsonwebtoken
jjwt
${jjwt.version}
+
+ org.assertj
+ assertj-core
+ test
+
0.7.0
-
+
\ No newline at end of file
diff --git a/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java b/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java
new file mode 100644
index 0000000000..922d5c0ce5
--- /dev/null
+++ b/jjwt/src/main/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtil.java
@@ -0,0 +1,46 @@
+package io.jsonwebtoken.jjwtfun.util;
+
+import io.jsonwebtoken.SignatureAlgorithm;
+import io.jsonwebtoken.impl.crypto.DefaultJwtSignatureValidator;
+
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Base64;
+
+import static io.jsonwebtoken.SignatureAlgorithm.HS256;
+
+public class JWTDecoderUtil {
+
+ public static String decodeJWTToken(String token) {
+ Base64.Decoder decoder = Base64.getDecoder();
+
+ String[] chunks = token.split("\\.");
+
+ String header = new String(decoder.decode(chunks[0]));
+ String payload = new String(decoder.decode(chunks[1]));
+
+ return header + " " + payload;
+ }
+
+ public static String decodeJWTToken(String token, String secretKey) throws Exception {
+ Base64.Decoder decoder = Base64.getDecoder();
+
+ String[] chunks = token.split("\\.");
+
+ String header = new String(decoder.decode(chunks[0]));
+ String payload = new String(decoder.decode(chunks[1]));
+
+ String tokenWithoutSignature = chunks[0] + "." + chunks[1];
+ String signature = chunks[2];
+
+ SignatureAlgorithm sa = HS256;
+ SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), sa.getJcaName());
+
+ DefaultJwtSignatureValidator validator = new DefaultJwtSignatureValidator(sa, secretKeySpec);
+
+ if (!validator.isValid(tokenWithoutSignature, signature)) {
+ throw new Exception("Could not verify JWT token integrity!");
+ }
+
+ return header + " " + payload;
+ }
+}
diff --git a/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java b/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java
new file mode 100644
index 0000000000..3103a6c8a3
--- /dev/null
+++ b/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/util/JWTDecoderUtilUnitTest.java
@@ -0,0 +1,32 @@
+package io.jsonwebtoken.jjwtfun.util;
+
+import io.jsonwebtoken.SignatureAlgorithm;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+class JWTDecoderUtilUnitTest {
+
+ private final static String SIMPLE_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9";
+ private final static String SIGNED_TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJhZWxkdW5nIFVzZXIiLCJpYXQiOjE1MTYyMzkwMjJ9.qH7Zj_m3kY69kxhaQXTa-ivIpytKXXjZc1ZSmapZnGE";
+
+ @Test
+ void givenSimpleToken_whenDecoding_thenStringOfHeaderPayloadAreReturned() {
+ assertThat(JWTDecoderUtil.decodeJWTToken(SIMPLE_TOKEN))
+ .contains(SignatureAlgorithm.HS256.getValue());
+ }
+
+ @Test
+ void givenSignedToken_whenDecodingWithInvalidSecret_thenIntegrityIsNotValidated() {
+ assertThatThrownBy(() -> JWTDecoderUtil.decodeJWTToken(SIGNED_TOKEN, "BAD_SECRET"))
+ .hasMessage("Could not verify JWT token integrity!");
+ }
+
+ @Test
+ void givenSignedToken_whenDecodingWithValidSecret_thenIntegrityIsValidated() throws Exception {
+ assertThat(JWTDecoderUtil.decodeJWTToken(SIGNED_TOKEN, "MySecretKey"))
+ .contains("Baeldung User");
+ }
+}
diff --git a/jmeter/README.md b/jmeter/README.md
index 81300afe7c..53aca8d34b 100644
--- a/jmeter/README.md
+++ b/jmeter/README.md
@@ -7,7 +7,7 @@ It contains the code of a simple API for some CRUD operations built using Spring
- Maven
- JDK 8
-- MongoDB
+- MongoDB (Note: for the Write Extracted Data to a File Using JMeter example MongoDB is not required)
### Running
@@ -36,6 +36,14 @@ Or create a new one via a POST:
$ curl -X POST -H "Content-Type:application/json" -d '{ "firstName" : "Dassi", "lastName" : "Orleando", "phoneNumber": "+237 545454545", "email": "mymail@yahoo.fr" }' localhost:8080/students
```
+### Available UUID API
+
+You can view the test response using curl:
+
+```bash
+$ curl localhost:8080/api/uuid
+```
+
Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080)
Enjoy it :)
@@ -44,3 +52,4 @@ Enjoy it :)
- [Intro to Performance Testing using JMeter](https://www.baeldung.com/jmeter)
- [Configure Jenkins to Run and Show JMeter Tests](https://www.baeldung.com/jenkins-and-jmeter)
+- [Write Extracted Data to a File Using JMeter](https://www.baeldung.com/jmeter-write-to-file)
diff --git a/jmeter/pom.xml b/jmeter/pom.xml
index e2830baef5..199d95e0d6 100644
--- a/jmeter/pom.xml
+++ b/jmeter/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jmeter
jmeter
@@ -40,7 +41,6 @@
org.springframework.boot
spring-boot-maven-plugin
-
com.lazerycode.jmeter
jmeter-maven-plugin
@@ -65,4 +65,4 @@
2.6.0
-
+
\ No newline at end of file
diff --git a/jmeter/src/main/java/com/baeldung/controller/RetrieveUuidController.java b/jmeter/src/main/java/com/baeldung/controller/RetrieveUuidController.java
new file mode 100644
index 0000000000..32265c0170
--- /dev/null
+++ b/jmeter/src/main/java/com/baeldung/controller/RetrieveUuidController.java
@@ -0,0 +1,18 @@
+package com.baeldung.controller;
+
+import com.baeldung.model.Response;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.UUID;
+
+import static java.lang.String.format;
+
+@RestController
+public class RetrieveUuidController {
+
+ @GetMapping("/api/uuid")
+ public Response uuid() {
+ return new Response(format("Test message... %s.", UUID.randomUUID()));
+ }
+}
diff --git a/jmeter/src/main/java/com/baeldung/model/Response.java b/jmeter/src/main/java/com/baeldung/model/Response.java
new file mode 100644
index 0000000000..547e5b536e
--- /dev/null
+++ b/jmeter/src/main/java/com/baeldung/model/Response.java
@@ -0,0 +1,40 @@
+package com.baeldung.model;
+
+import java.time.Instant;
+import java.util.UUID;
+
+public class Response {
+ private Instant timestamp;
+ private UUID uuid;
+ private String message;
+
+ public Response(String message) {
+ this.timestamp = Instant.now();
+ this.uuid = UUID.randomUUID();
+ this.message = message;
+ }
+
+ public Instant getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Instant timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public UUID getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/jmeter/src/main/resources/FileExtractionExample.jmx b/jmeter/src/main/resources/FileExtractionExample.jmx
new file mode 100644
index 0000000000..961b6f143f
--- /dev/null
+++ b/jmeter/src/main/resources/FileExtractionExample.jmx
@@ -0,0 +1,124 @@
+
+
+
+
+ To run this test plan you must also be running the Spring application "JmeterApplication" That can be found in this directory
+ false
+ true
+ false
+
+
+
+
+
+
+
+ continue
+
+ false
+ 1
+
+ 1
+ 1
+ false
+
+
+ true
+
+
+
+
+
+
+ localhost
+ 8080
+ http
+
+ /api/test
+ GET
+ true
+ false
+ true
+ false
+
+
+
+
+
+
+ message
+ $.message
+ 1
+ true
+ NOT_FOUND
+
+
+
+
+
+ false
+ FileWriter fWriter = new FileWriter("/result.txt", true);
+BufferedWriter buff = new BufferedWriter(fWriter);
+
+buff.write("Response Code : " + ctx.getPreviousResult().getResponseCode());
+buff.write(System.getProperty("line.separator"));
+buff.write("Response Headers : " + ctx.getPreviousResult().getResponseHeaders());
+buff.write(System.getProperty("line.separator"));
+buff.write("Response Body : " + new String(ctx.getPreviousResult().getResponseData()));
+
+buff.write("More complex extraction : " + vars.get("message"));
+
+buff.close();
+fWriter.close();
+
+
+
+ response
+ false
+ false
+ false
+ false
+
+
+
+
+ false
+
+ saveConfig
+
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ true
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
diff --git a/jmeter/src/test/java/com/baeldung/JmeterIntegrationTest.java b/jmeter/src/test/java/com/baeldung/JmeterIntegrationTest.java
new file mode 100644
index 0000000000..a1494416ef
--- /dev/null
+++ b/jmeter/src/test/java/com/baeldung/JmeterIntegrationTest.java
@@ -0,0 +1,35 @@
+package com.baeldung;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@SpringBootTest
+class JmeterIntegrationTest {
+
+ MockMvc mvc;
+
+ public JmeterIntegrationTest(WebApplicationContext wac) {
+ this.mvc = MockMvcBuilders.webAppContextSetup(wac).build();
+ }
+
+ @Test
+ void whenCallingUUIDController_thenWeShouldRecieveRandomizedResponse() throws Exception {
+ MockHttpServletResponse response = mvc.perform(get("/api/uuid"))
+ .andDo(print())
+ .andExpect(status().isOk())
+ .andReturn()
+ .getResponse();
+
+ assertThat(response.getContentAsString())
+ .contains("Test message...");
+ }
+}
diff --git a/jmh/pom.xml b/jmh/pom.xml
index 16a5bc54a4..61f62efd5a 100644
--- a/jmh/pom.xml
+++ b/jmh/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jmh
1.0-SNAPSHOT
@@ -19,12 +20,12 @@
org.openjdk.jmh
jmh-core
- ${openjdk.jmh.version}
+ ${jmh-core.version}
org.openjdk.jmh
jmh-generator-annprocess
- ${openjdk.jmh.version}
+ ${jmh-generator.version}
org.openjdk.jol
@@ -47,7 +48,6 @@
-
org.apache.maven.plugins
maven-assembly-plugin
@@ -76,7 +76,6 @@
- 1.19
3.0.2
0.10
3.2.0
diff --git a/jooby/pom.xml b/jooby/pom.xml
index fe26f9a4c6..f972a22e9c 100644
--- a/jooby/pom.xml
+++ b/jooby/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.jooby
jooby
@@ -60,4 +61,4 @@
2.4.3
-
+
\ No newline at end of file
diff --git a/jsf/pom.xml b/jsf/pom.xml
index dc110b9fd5..88099ef9c4 100644
--- a/jsf/pom.xml
+++ b/jsf/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jsf
0.1-SNAPSHOT
@@ -66,7 +67,6 @@
4.3.4.RELEASE
-
2.2.14
3.0.0
diff --git a/json-2/pom.xml b/json-2/pom.xml
index e27d1c83f6..fbae40b6a3 100644
--- a/json-2/pom.xml
+++ b/json-2/pom.xml
@@ -1,7 +1,8 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
com.baeldung
json-2
0.0.1-SNAPSHOT
@@ -11,7 +12,6 @@
com.baeldung
1.0.0-SNAPSHOT
- 4.0.0
@@ -19,21 +19,18 @@
jsoniter
${jsoniter.version}
-
junit
junit
${junit.version}
test
-
org.assertj
assertj-core
${assertj-core.version}
test
-
com.squareup.moshi
moshi
@@ -110,46 +107,50 @@
+
+
+
+
+
+
+ org.eclipse.m2e
+ lifecycle-mapping
+ 1.0.0
+
+
+
+
+
+
+ org.apache.maven.plugins
+
+
+ maven-pmd-plugin
+
+
+ [3.13.0,)
+
+
+ check
+
+
+
+
+
+
+
+
+
+
+
+
+
+
0.9.23
3.11.1
1.9.2
-
-
-
-
-
- org.eclipse.m2e
- lifecycle-mapping
- 1.0.0
-
-
-
-
-
-
- org.apache.maven.plugins
-
-
- maven-pmd-plugin
-
-
- [3.13.0,)
-
-
- check
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
\ No newline at end of file
diff --git a/json-path/pom.xml b/json-path/pom.xml
index 8756ffee7b..b4577ec15f 100644
--- a/json-path/pom.xml
+++ b/json-path/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
json-path
0.0.1-SNAPSHOT
@@ -25,4 +26,5 @@
2.4.0
+
\ No newline at end of file
diff --git a/json/pom.xml b/json/pom.xml
index bd901b526e..260b2d1ad9 100644
--- a/json/pom.xml
+++ b/json/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
org.baeldung
json
@@ -87,4 +88,4 @@
3.11.1
-
+
\ No newline at end of file
diff --git a/jsoup/pom.xml b/jsoup/pom.xml
index d2b59476f3..44f8f996f5 100644
--- a/jsoup/pom.xml
+++ b/jsoup/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jsoup
jsoup
@@ -24,4 +25,4 @@
1.10.2
-
+
\ No newline at end of file
diff --git a/jta/pom.xml b/jta/pom.xml
index 8f90f74d43..b8b5570226 100644
--- a/jta/pom.xml
+++ b/jta/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
jta
1.0-SNAPSHOT
@@ -35,4 +36,4 @@
-
+
\ No newline at end of file
diff --git a/kubernetes/k8s-intro/README.md b/kubernetes/k8s-intro/README.md
new file mode 100644
index 0000000000..6ac593452c
--- /dev/null
+++ b/kubernetes/k8s-intro/README.md
@@ -0,0 +1,19 @@
+# Kubernetes Java API Sample Code
+
+This module contains sample code used to show how to use the Kubernetes client Java API.
+
+Before running those samples, make sure that your environment is correctly configured to access
+a working Kubernetes cluster.
+
+An easy way to check that everything is working as expected is issuing any *kubectl get* command:
+
+```shell
+$ kubectl get nodes
+```
+If you get a valid response, then you're good to go.
+
+### Relevant Articles:
+
+- [Paging and Async Calls with the Kubernetes API](https://www.baeldung.com/java-kubernetes-paging-async)
+- [Using Watch with the Kubernetes API](https://www.baeldung.com/java-kubernetes-watch)
+- [Using Namespaces and Selectors With the Kubernetes Java API](https://www.baeldung.com/java-kubernetes-namespaces-selectors)
diff --git a/kubernetes/k8s-intro/pom.xml b/kubernetes/k8s-intro/pom.xml
new file mode 100644
index 0000000000..61722cb2c8
--- /dev/null
+++ b/kubernetes/k8s-intro/pom.xml
@@ -0,0 +1,42 @@
+
+ 4.0.0
+ k8s-intro
+ 0.0.1-SNAPSHOT
+
+
+ com.baeldung
+ kubernetes
+ 1.0.0-SNAPSHOT
+
+
+
+
+ io.kubernetes
+ client-java
+ 11.0.0
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+ 1.8
+ 1.8
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kubernetes/k8s-intro/src/k8s/create-http-server.yml b/kubernetes/k8s-intro/src/k8s/create-http-server.yml
new file mode 100644
index 0000000000..59ef344de3
--- /dev/null
+++ b/kubernetes/k8s-intro/src/k8s/create-http-server.yml
@@ -0,0 +1,58 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: ns1
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: ns2
+---
+ apiVersion: apps/v1
+ kind: Deployment
+ metadata:
+ name: httpd
+ namespace: ns1
+ labels:
+ app: httpd
+ version: "1"
+ spec:
+ replicas: 3
+ selector:
+ matchLabels:
+ app: httpd
+ template:
+ metadata:
+ labels:
+ app: httpd
+ spec:
+ containers:
+ - name: main
+ image: httpd:alpine
+ ports:
+ - containerPort: 80
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: httpd
+ namespace: ns2
+ labels:
+ app: httpd
+ version: "2"
+ foo: bar
+spec:
+ replicas: 3
+ selector:
+ matchLabels:
+ app: httpd
+ template:
+ metadata:
+ labels:
+ app: httpd
+ spec:
+ containers:
+ - name: main
+ image: httpd:alpine
+ ports:
+ - containerPort: 80
\ No newline at end of file
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ApiInvoker.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ApiInvoker.java
new file mode 100644
index 0000000000..fbc2662170
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ApiInvoker.java
@@ -0,0 +1,11 @@
+package com.baeldung.kubernetes.intro;
+
+import io.kubernetes.client.openapi.ApiCallback;
+import io.kubernetes.client.openapi.ApiException;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import okhttp3.Call;
+
+@FunctionalInterface
+public interface ApiInvoker {
+ Call apply(CoreV1Api api, ApiCallback callback) throws ApiException;
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/AsyncHelper.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/AsyncHelper.java
new file mode 100644
index 0000000000..d9c29dcb64
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/AsyncHelper.java
@@ -0,0 +1,74 @@
+package com.baeldung.kubernetes.intro;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Future;
+import java.util.function.BiFunction;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.openapi.ApiCallback;
+import io.kubernetes.client.openapi.ApiException;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import okhttp3.Call;
+
+public class AsyncHelper implements ApiCallback {
+
+ private static final Logger log = LoggerFactory.getLogger(AsyncHelper.class);
+
+ private CoreV1Api api;
+ private CompletableFuture callResult;
+
+ private AsyncHelper(CoreV1Api api) {
+ this.api = api;
+ }
+
+ public static CompletableFuture doAsync(CoreV1Api api, ApiInvoker invoker) {
+
+ AsyncHelper p = new AsyncHelper<>(api);
+ return p.execute(invoker);
+ }
+
+ private CompletableFuture execute( ApiInvoker invoker) {
+
+ try {
+ callResult = new CompletableFuture<>();
+ log.info("[I38] Calling API...");
+ final Call call = invoker.apply(api,this);
+ log.info("[I41] API Succesfully invoked: method={}, url={}",
+ call.request().method(),
+ call.request().url());
+ return callResult;
+ }
+ catch(ApiException aex) {
+ callResult.completeExceptionally(aex);
+ return callResult;
+ }
+ }
+
+ @Override
+ public void onFailure(ApiException e, int statusCode, Map> responseHeaders) {
+ log.error("[E53] onFailure",e);
+ callResult.completeExceptionally(e);
+ }
+
+ @Override
+ public void onSuccess(R result, int statusCode, Map> responseHeaders) {
+ log.error("[E61] onSuccess: statusCode={}",statusCode);
+ callResult.complete(result);
+ }
+
+ @Override
+ public void onUploadProgress(long bytesWritten, long contentLength, boolean done) {
+ log.info("[E61] onUploadProgress: bytesWritten={}, contentLength={}, done={}",bytesWritten,contentLength,done);
+ }
+
+ @Override
+ public void onDownloadProgress(long bytesRead, long contentLength, boolean done) {
+ log.info("[E75] onDownloadProgress: bytesRead={}, contentLength={}, done={}",bytesRead,contentLength,done);
+ }
+}
+
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListNodes.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListNodes.java
new file mode 100644
index 0000000000..b0e540eb3a
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListNodes.java
@@ -0,0 +1,31 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1NodeList;
+import io.kubernetes.client.util.Config;
+
+/**
+ * @author Philippe
+ *
+ */
+public class ListNodes {
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+ CoreV1Api api = new CoreV1Api(client);
+ V1NodeList nodeList = api.listNode(null, null, null, null, null, null, null, null, 10, false);
+ nodeList.getItems()
+ .stream()
+ .forEach((node) -> System.out.println(node.getMetadata()));
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListNodesAsync.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListNodesAsync.java
new file mode 100644
index 0000000000..acd4512196
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListNodesAsync.java
@@ -0,0 +1,50 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1NodeList;
+import io.kubernetes.client.util.Config;
+
+/**
+ * @author Philippe
+ *
+ */
+public class ListNodesAsync {
+
+ private static Logger log = LoggerFactory.getLogger(ListNodesAsync.class);
+ /**
+ * @param args
+ */
+ public static void main(String[] args) throws Exception {
+
+ // Initial setup
+ ApiClient client = Config.defaultClient();
+ CoreV1Api api = new CoreV1Api(client);
+
+ // Start async call
+ CompletableFuture p = AsyncHelper.doAsync(api,(capi,cb) ->
+ capi.listNodeAsync(null, null, null, null, null, null, null, null, 10, false, cb)
+ );
+
+ p.thenAcceptAsync((nodeList) -> {
+ log.info("[I40] Processing results...");
+ nodeList.getItems()
+ .stream()
+ .forEach((node) -> System.out.println(node.getMetadata()));
+ });
+
+ log.info("[I46] Waiting results...");
+ p.get(10, TimeUnit.SECONDS);
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsPaged.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsPaged.java
new file mode 100644
index 0000000000..1c160ae607
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsPaged.java
@@ -0,0 +1,46 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1NodeList;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+
+/**
+ * @author Philippe
+ *
+ */
+public class ListPodsPaged {
+
+ private static final Logger log = LoggerFactory.getLogger(ListPodsPaged.class);
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+ CoreV1Api api = new CoreV1Api(client);
+ String continuationToken = null;
+ int limit = 2; // Just for illustration purposes. Real world values would range from ~100 to ~1000/page
+ Long remaining = null;
+ do {
+ log.info("==========================================================================");
+ log.info("Retrieving data: continuationToken={}, remaining={}", continuationToken,remaining);
+ V1PodList items = api.listPodForAllNamespaces(null, continuationToken, null, null, limit, null, null, null, 10, false);
+ continuationToken = items.getMetadata().getContinue();
+ remaining = items.getMetadata().getRemainingItemCount();
+ items.getItems()
+ .stream()
+ .forEach((node) -> System.out.println(node.getMetadata()));
+ } while( continuationToken != null );
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectors.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectors.java
new file mode 100644
index 0000000000..459f61099c
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectors.java
@@ -0,0 +1,68 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1NodeList;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+/**
+ * @author Philippe
+ *
+ */
+public class ListPodsWithFieldSelectors {
+
+ private static final Logger log = LoggerFactory.getLogger(ListPodsWithFieldSelectors.class);
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ String fs = createSelector(args);
+ V1PodList items = api.listPodForAllNamespaces(null, null, fs, null, null, null, null, null, 10, false);
+ items.getItems()
+ .stream()
+ .map((pod) -> pod.getMetadata().getName() )
+ .forEach((name) -> System.out.println("name=" + name));
+
+ }
+
+ private static String createSelector(String[] args) {
+
+ StringBuilder b = new StringBuilder();
+ for( int i = 0 ; i < args.length; i++ ) {
+ if( b.length() > 0 ) {
+ b.append(',');
+ }
+
+ b.append(args[i]);
+ }
+
+ return b.toString();
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectors.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectors.java
new file mode 100644
index 0000000000..2e7c8b6a1f
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectors.java
@@ -0,0 +1,68 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1NodeList;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+/**
+ * @author Philippe
+ *
+ */
+public class ListPodsWithLabelSelectors {
+
+ private static final Logger log = LoggerFactory.getLogger(ListPodsWithLabelSelectors.class);
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ String selector = createSelector(args);
+ V1PodList items = api.listPodForAllNamespaces(null, null, null, selector, null, null, null, null, 10, false);
+ items.getItems()
+ .stream()
+ .map((pod) -> pod.getMetadata().getName() )
+ .forEach((name) -> System.out.println("name=" + name));
+
+ }
+
+ private static String createSelector(String[] args) {
+
+ StringBuilder b = new StringBuilder();
+ for( int i = 0 ; i < args.length; i++ ) {
+ if( b.length() > 0 ) {
+ b.append(',');
+ }
+
+ b.append(args[i]);
+ }
+
+ return b.toString();
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithNamespaces.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithNamespaces.java
new file mode 100644
index 0000000000..68a951f394
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/ListPodsWithNamespaces.java
@@ -0,0 +1,52 @@
+/**
+ *
+ */
+package com.baeldung.kubernetes.intro;
+
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1NodeList;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+/**
+ * @author Philippe
+ *
+ */
+public class ListPodsWithNamespaces {
+
+ private static final Logger log = LoggerFactory.getLogger(ListPodsWithNamespaces.class);
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+ String namespace = "ns1";
+ V1PodList items = api.listNamespacedPod(namespace,null, null, null, null, null, null, null, null, 10, false);
+ items.getItems()
+ .stream()
+ .map((pod) -> pod.getMetadata().getName() )
+ .forEach((name) -> System.out.println("name=" + name));
+
+ }
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPods.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPods.java
new file mode 100644
index 0000000000..7df972b738
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPods.java
@@ -0,0 +1,72 @@
+package com.baeldung.kubernetes.intro;
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.reflect.TypeToken;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.ApiException;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1ObjectMeta;
+import io.kubernetes.client.openapi.models.V1Pod;
+import io.kubernetes.client.util.Config;
+import io.kubernetes.client.util.Watch;
+import io.kubernetes.client.util.Watch.Response;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+public class WatchPods {
+
+ private static Logger log = LoggerFactory.getLogger(WatchPods.class);
+
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+
+ // Optional, put helpful during tests: disable client timeout and enable
+ // HTTP wire-level logs
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ // Create the watch object that monitors pod creation/deletion/update events
+ while (true) {
+ log.info("[I46] Creating watch...");
+ try (Watch watch = Watch.createWatch(
+ client,
+ api.listPodForAllNamespacesCall(false, null, null, null, null, "false", null, null, 10, true, null),
+ new TypeToken>(){}.getType())) {
+
+ log.info("[I52] Receiving events:");
+ for (Response event : watch) {
+ V1Pod pod = event.object;
+ V1ObjectMeta meta = pod.getMetadata();
+ switch (event.type) {
+ case "ADDED":
+ case "MODIFIED":
+ case "DELETED":
+ log.info("event.type: {}, namespace={}, name={}",
+ event.type,
+ meta.getNamespace(),
+ meta.getName());
+ break;
+ default:
+ log.warn("[W66] Unknown event type: {}", event.type);
+ }
+ }
+ } catch (ApiException ex) {
+ log.error("[E70] ApiError", ex);
+ }
+ }
+ }
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarks.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarks.java
new file mode 100644
index 0000000000..9dfccfec08
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarks.java
@@ -0,0 +1,87 @@
+package com.baeldung.kubernetes.intro;
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.reflect.TypeToken;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.ApiException;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1ObjectMeta;
+import io.kubernetes.client.openapi.models.V1Pod;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import io.kubernetes.client.util.Watch;
+import io.kubernetes.client.util.Watch.Response;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+public class WatchPodsUsingBookmarks {
+
+ private static Logger log = LoggerFactory.getLogger(WatchPodsUsingBookmarks.class);
+
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+
+ // Optional, put helpful during tests: disable client timeout and enable
+ // HTTP wire-level logs
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ String resourceVersion = null;
+ while (true) {
+ // Get a fresh list only we need to resync
+ if ( resourceVersion == null ) {
+ log.info("[I48] Creating initial POD list...");
+ V1PodList podList = api.listPodForAllNamespaces(true, null, null, null, null, "false", resourceVersion, null, null, null);
+ resourceVersion = podList.getMetadata().getResourceVersion();
+ }
+
+ while (true) {
+ log.info("[I54] Creating watch: resourceVersion={}", resourceVersion);
+ try (Watch watch = Watch.createWatch(
+ client,
+ api.listPodForAllNamespacesCall(true, null, null, null, null, "false", resourceVersion, null, 10, true, null),
+ new TypeToken>(){}.getType())) {
+
+ log.info("[I60] Receiving events:");
+ for (Response event : watch) {
+ V1Pod pod = event.object;
+ V1ObjectMeta meta = pod.getMetadata();
+ switch (event.type) {
+ case "BOOKMARK":
+ resourceVersion = meta.getResourceVersion();
+ log.info("[I67] event.type: {}, resourceVersion={}", event.type,resourceVersion);
+ break;
+ case "ADDED":
+ case "MODIFIED":
+ case "DELETED":
+ log.info("event.type: {}, namespace={}, name={}",
+ event.type,
+ meta.getNamespace(),
+ meta.getName());
+ break;
+ default:
+ log.warn("[W76] Unknown event type: {}", event.type);
+ }
+ }
+ } catch (ApiException ex) {
+ log.error("[E80] ApiError", ex);
+ resourceVersion = null;
+ }
+ }
+ }
+ }
+}
diff --git a/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersions.java b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersions.java
new file mode 100644
index 0000000000..2165d7fc0b
--- /dev/null
+++ b/kubernetes/k8s-intro/src/main/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersions.java
@@ -0,0 +1,111 @@
+package com.baeldung.kubernetes.intro;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+import io.kubernetes.client.openapi.ApiClient;
+import io.kubernetes.client.openapi.ApiException;
+import io.kubernetes.client.openapi.apis.CoreV1Api;
+import io.kubernetes.client.openapi.models.V1ObjectMeta;
+import io.kubernetes.client.openapi.models.V1Pod;
+import io.kubernetes.client.openapi.models.V1PodList;
+import io.kubernetes.client.util.Config;
+import io.kubernetes.client.util.Watch;
+import io.kubernetes.client.util.Watch.Response;
+import okhttp3.OkHttpClient;
+import okhttp3.logging.HttpLoggingInterceptor;
+
+public class WatchPodsUsingResourceVersions {
+
+ private static Logger log = LoggerFactory.getLogger(WatchPodsUsingResourceVersions.class);
+
+ public static void main(String[] args) throws Exception {
+
+ ApiClient client = Config.defaultClient();
+
+ // Optional, put helpful during tests: disable client timeout and enable
+ // HTTP wire-level logs
+ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> log.info(message));
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ OkHttpClient newClient = client.getHttpClient()
+ .newBuilder()
+ .addInterceptor(interceptor)
+ .readTimeout(0, TimeUnit.SECONDS)
+ .build();
+
+ client.setHttpClient(newClient);
+ CoreV1Api api = new CoreV1Api(client);
+
+ String resourceVersion = null;
+ while (true) {
+ try {
+ if ( resourceVersion == null ) {
+ V1PodList podList = api.listPodForAllNamespaces(null, null, null, null, null, null, resourceVersion, null, null, null);
+ resourceVersion = podList.getMetadata().getResourceVersion();
+ }
+
+ log.info("[I59] Creating watch: resourceVersion={}", resourceVersion);
+ try (Watch watch = Watch.createWatch(
+ client,
+ api.listPodForAllNamespacesCall(null, null, null, null, null, null, resourceVersion, null, 60, true, null),
+ new TypeToken>(){}.getType())) {
+
+ log.info("[I65] Receiving events:");
+ for (Response event : watch) {
+ V1Pod pod = event.object;
+ V1ObjectMeta meta = pod.getMetadata();
+ switch (event.type) {
+ case "ADDED":
+ case "MODIFIED":
+ case "DELETED":
+ log.info("event: type={}, namespace={}, name={}",
+ event.type,
+ meta.getNamespace(),
+ meta.getName());
+ break;
+ default:
+ log.warn("[W76] Unknown event type: {}", event.type);
+ }
+ }
+ }
+ }
+ catch (ApiException ex) {
+ if ( ex.getCode() == 504 || ex.getCode() == 410 ) {
+ resourceVersion = extractResourceVersionFromException(ex);
+ }
+ else {
+ // Reset resource version
+ resourceVersion = null;
+ }
+ }
+ }
+ }
+
+ private static String extractResourceVersionFromException(ApiException ex) {
+
+ String body = ex.getResponseBody();
+ if (body == null) {
+ return null;
+ }
+
+ Gson gson = new Gson();
+ Map,?> st = gson.fromJson(body, Map.class);
+ Pattern p = Pattern.compile("Timeout: Too large resource version: (\\d+), current: (\\d+)");
+ String msg = (String)st.get("message");
+ Matcher m = p.matcher(msg);
+ if (!m.matches()) {
+ return null;
+ }
+
+ return m.group(2);
+ }
+
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListNodesAsyncLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListNodesAsyncLiveTest.java
new file mode 100644
index 0000000000..af32df8224
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListNodesAsyncLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class ListNodesAsyncLiveTest {
+ @Test
+ void whenListNodes_thenSuccess() throws Exception {
+ ListNodesAsync.main(new String[] {});
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListNodesLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListNodesLiveTest.java
new file mode 100644
index 0000000000..84a3efb903
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListNodesLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class ListNodesLiveTest {
+ @Test
+ void whenListNodes_thenSuccess() throws Exception {
+ ListNodes.main(new String[] {});
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsPagedLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsPagedLiveTest.java
new file mode 100644
index 0000000000..6fb3c5b32d
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsPagedLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class ListPodsPagedLiveTest {
+ @Test
+ void whenListPodsPage_thenSuccess() throws Exception {
+ ListPodsPaged.main(new String[] {});
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectorsLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectorsLiveTest.java
new file mode 100644
index 0000000000..9413fe1460
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithFieldSelectorsLiveTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class ListPodsWithFieldSelectorsLiveTest {
+ @Test
+ void givenEqualitySelector_whenListPodsWithFieldSelectors_thenSuccess() throws Exception {
+ ListPodsWithFieldSelectors.main(new String[] {
+ "metadata.namespace=ns1"
+ });
+ }
+
+ @Test
+ void givenInequalitySelector_whenListPodsWithFieldSelectors_thenSuccess() throws Exception {
+ ListPodsWithFieldSelectors.main(new String[] {
+ "metadata.namespace!=ns1"
+ });
+ }
+
+ @Test
+ void givenChainedSelector_whenListPodsWithFieldSelectors_thenSuccess() throws Exception {
+ ListPodsWithFieldSelectors.main(new String[] {
+ "metadata.namespace=ns1",
+ "status.phase=Running"
+ });
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectorsLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectorsLiveTest.java
new file mode 100644
index 0000000000..eb64853225
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/ListPodsWithLabelSelectorsLiveTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class ListPodsWithLabelSelectorsLiveTest {
+ @Test
+ void givenEqualitySelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app=httpd"
+ });
+ }
+
+ @Test
+ void givenInqualitySelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app!=httpd"
+ });
+ }
+
+ @Test
+ void givenInSetSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app in (httpd,test)"
+ });
+ }
+
+ @Test
+ void givenNotInSetSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app notin (httpd)"
+ });
+ }
+
+ @Test
+ void givenLabelPresentSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app"
+ });
+ }
+
+ @Test
+ void givenLabelNotPresentSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "!app"
+ });
+ }
+
+ @Test
+ void givenChainedSelector_whenListPodsWithLabelSelectors_thenSuccess() throws Exception {
+ ListPodsWithLabelSelectors.main(new String[] {
+ "app=httpd",
+ "!foo"
+ });
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsLiveTest.java
new file mode 100644
index 0000000000..37828d7a2d
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class WatchPodsLiveTest {
+ @Test
+ void whenWatchPods_thenSuccess() throws Exception {
+ WatchPods.main(new String[] {});
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarksLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarksLiveTest.java
new file mode 100644
index 0000000000..ea111f22a2
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingBookmarksLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class WatchPodsUsingBookmarksLiveTest {
+ @Test
+ void whenWatchPods_thenSuccess() throws Exception {
+ WatchPodsUsingBookmarks.main(new String[] {});
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersionsLiveTest.java b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersionsLiveTest.java
new file mode 100644
index 0000000000..79c3a13eb2
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/java/com/baeldung/kubernetes/intro/WatchPodsUsingResourceVersionsLiveTest.java
@@ -0,0 +1,10 @@
+package com.baeldung.kubernetes.intro;
+
+import org.junit.jupiter.api.Test;
+
+class WatchPodsUsingResourceVersionsLiveTest {
+ @Test
+ void whenWatchPods_thenSuccess() throws Exception {
+ WatchPodsUsingResourceVersions.main(new String[] {});
+ }
+}
diff --git a/kubernetes/k8s-intro/src/test/resources/logback.xml b/kubernetes/k8s-intro/src/test/resources/logback.xml
new file mode 100644
index 0000000000..479545e643
--- /dev/null
+++ b/kubernetes/k8s-intro/src/test/resources/logback.xml
@@ -0,0 +1,11 @@
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/kubernetes/pom.xml b/kubernetes/pom.xml
new file mode 100644
index 0000000000..72cb1577a4
--- /dev/null
+++ b/kubernetes/pom.xml
@@ -0,0 +1,17 @@
+
+ 4.0.0
+ kubernetes
+ pom
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ k8s-intro
+
+
\ No newline at end of file
diff --git a/language-interop/pom.xml b/language-interop/pom.xml
index bdf872a076..f2b0a08969 100644
--- a/language-interop/pom.xml
+++ b/language-interop/pom.xml
@@ -52,4 +52,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml
index 3aa36c3f90..28a7fb62fd 100644
--- a/libraries-2/pom.xml
+++ b/libraries-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
libraries-2
libraries-2
@@ -75,7 +75,6 @@
-
edu.uci.ics
crawler4j
@@ -136,4 +135,4 @@
2.5.0
-
+
\ No newline at end of file
diff --git a/libraries-3/pom.xml b/libraries-3/pom.xml
index 2f6e9fa747..079628ffaa 100644
--- a/libraries-3/pom.xml
+++ b/libraries-3/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
libraries-3
libraries-3
@@ -70,7 +70,7 @@
velocity-engine-core
${velocity-engine-core.version}
-
+
com.uber.nullaway
nullaway
${nullaway.version}
@@ -80,8 +80,7 @@
plexus-compiler-javac-errorprone
${plexus-compiler.version}
-
+
com.google.errorprone
error_prone_core
@@ -123,7 +122,7 @@
-
+
org.apache.maven.plugins
maven-compiler-plugin
3.5
@@ -141,7 +140,8 @@
-
+
-XepExcludedPaths:(.*)/test/.*|(.*)/jcabi/.*
-XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway
@@ -153,8 +153,8 @@
plexus-compiler-javac-errorprone
2.8
-
+
com.google.errorprone
error_prone_core
@@ -170,7 +170,7 @@
-
+
reload
@@ -189,7 +189,6 @@
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
start-server
@@ -211,11 +210,10 @@
-
+
1.78
1.18.6
-
0.43
2.7.2
1.2.3.Final
@@ -224,14 +222,12 @@
0.14.1
1.9.2
1.9.2
-
1.19
4.4.13
4.5.12
2.2
- 1.6.0
0.3.0
2.8
2.1.3
-
+
\ No newline at end of file
diff --git a/libraries-4/pom.xml b/libraries-4/pom.xml
index d7f6a44985..decd467de9 100644
--- a/libraries-4/pom.xml
+++ b/libraries-4/pom.xml
@@ -1,15 +1,15 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ libraries-4
+
parent-modules
com.baeldung
1.0.0-SNAPSHOT
- 4.0.0
-
- libraries-4
diff --git a/libraries-5/pom.xml b/libraries-5/pom.xml
index 63347dd60d..ff6c208f5f 100644
--- a/libraries-5/pom.xml
+++ b/libraries-5/pom.xml
@@ -1,16 +1,16 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ libraries-5
+
parent-modules
com.baeldung
1.0.0-SNAPSHOT
- libraries-5
- 4.0.0
-
org.springframework
@@ -33,7 +33,6 @@
${pact.version}
test
-
com.typesafe.akka
@@ -45,7 +44,6 @@
akka-testkit_${scala.version}
${typesafe-akka.version}
test
-
one.util
@@ -55,14 +53,13 @@
net.bytebuddy
byte-buddy
- ${bytebuddy.version}
+ ${byte-buddy.version}
net.bytebuddy
byte-buddy-agent
- ${bytebuddy.version}
+ ${byte-buddy.version}
-
com.github.docker-java
@@ -84,7 +81,6 @@
-
com.github.ben-manes.caffeine
caffeine
@@ -115,7 +111,7 @@
org.openjdk.jmh
jmh-core
- ${jmh.version}
+ ${jmh-core.version}
@@ -127,14 +123,12 @@
2.11
2.5.11
0.6.5
- 1.7.1
3.0.14
2.5.5
3.0.2
4.5.1
1.0
2.1.2
- 1.19
\ No newline at end of file
diff --git a/libraries-6/pom.xml b/libraries-6/pom.xml
index caaebbb922..6db3b1b77b 100644
--- a/libraries-6/pom.xml
+++ b/libraries-6/pom.xml
@@ -1,15 +1,15 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ libraries-6
+
parent-modules
com.baeldung
1.0.0-SNAPSHOT
- 4.0.0
-
- libraries-6
@@ -164,5 +164,4 @@
8.12.9
-
\ No newline at end of file
diff --git a/libraries-apache-commons-collections/pom.xml b/libraries-apache-commons-collections/pom.xml
index 2209874c66..e2805552e3 100644
--- a/libraries-apache-commons-collections/pom.xml
+++ b/libraries-apache-commons-collections/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
libraries-apache-commons-collections
libraries-apache-commons-collections
@@ -37,4 +38,4 @@
2.0.0.0
-
+
\ No newline at end of file
diff --git a/libraries-apache-commons-io/pom.xml b/libraries-apache-commons-io/pom.xml
index 21f3f16cd3..5d0ed20abf 100644
--- a/libraries-apache-commons-io/pom.xml
+++ b/libraries-apache-commons-io/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
libraries-apache-commons-io
libraries-apache-commons-io
@@ -28,4 +29,4 @@
1.4
-
+
\ No newline at end of file
diff --git a/libraries-apache-commons/pom.xml b/libraries-apache-commons/pom.xml
index 08dddac880..8fa55c1b0e 100644
--- a/libraries-apache-commons/pom.xml
+++ b/libraries-apache-commons/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
libraries-apache-commons
libraries-apache-commons
@@ -75,4 +76,4 @@
2.5
-
+
\ No newline at end of file
diff --git a/libraries-concurrency/pom.xml b/libraries-concurrency/pom.xml
index b7dc5187b1..d8f48a1959 100644
--- a/libraries-concurrency/pom.xml
+++ b/libraries-concurrency/pom.xml
@@ -47,7 +47,6 @@
org.codehaus.mojo
exec-maven-plugin
- 1.6.0
com.baeldung.quasar.App
target/classes
@@ -55,14 +54,11 @@
-Dco.paralleluniverse.fibers.verifyInstrumentation=true
-
-javaagent:${co.paralleluniverse:quasar-core:jar}
-
-classpath
-
com.baeldung.quasar.App
@@ -82,4 +78,5 @@
0.8.0
+
\ No newline at end of file
diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml
index 0154823cca..1feb3142ee 100644
--- a/libraries-data-2/pom.xml
+++ b/libraries-data-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
libraries-data-2
libraries-data-2
@@ -142,7 +142,7 @@
net.bytebuddy
byte-buddy
${byte-buddy.version}
- test
+ test
org.apache.kafka
@@ -168,7 +168,7 @@
0.1.0
1.0.3
9.1.5.Final
-
+
4.3.8.RELEASE
4.0.0
1.1.0
diff --git a/libraries-data-db/README.md b/libraries-data-db/README.md
index 790a3eb318..98a83d5669 100644
--- a/libraries-data-db/README.md
+++ b/libraries-data-db/README.md
@@ -3,9 +3,11 @@
This module contains articles about database-related data processing libraries.
### Relevant articles
+
- [Introduction to Reladomo](https://www.baeldung.com/reladomo)
- [Introduction to ORMLite](https://www.baeldung.com/ormlite)
- [Guide to Java Data Objects](https://www.baeldung.com/jdo)
- [Intro to JDO Queries 2/2](https://www.baeldung.com/jdo-queries)
- [Introduction to HikariCP](https://www.baeldung.com/hikaricp)
- [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm)
+- [Introduction to Debezium](https://www.baeldung.com/debezium-intro)
diff --git a/libraries-data-db/pom.xml b/libraries-data-db/pom.xml
index d51580ccbc..20119da8a2 100644
--- a/libraries-data-db/pom.xml
+++ b/libraries-data-db/pom.xml
@@ -1,15 +1,16 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
libraries-data-db
libraries-data-db
com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
@@ -76,6 +77,64 @@
io.ebean
ebean
${ebean.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+
+
+
+
+
+ io.debezium
+ debezium-api
+ ${debezium.version}
+
+
+ io.debezium
+ debezium-embedded
+ ${debezium.version}
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+
+
+ io.debezium
+ debezium-connector-mysql
+ ${debezium.version}
+
+
+ org.testcontainers
+ testcontainers
+ ${testcontainers-version}
+
+
+ org.testcontainers
+ mysql
+ ${testcontainers-version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ org.projectlombok
+ lombok
@@ -95,16 +154,25 @@
-
-
-
+
+
+
-
-
+
+
-
+
@@ -115,7 +183,6 @@
reladomogen
${reladomo.version}
-
com.goldmansachs.reladomo
reladomo-gen-util
@@ -157,7 +224,6 @@
-
org.datanucleus
@@ -213,6 +279,8 @@
3.2.0-m7
3.4.5
11.22.4
+ 1.4.2.Final
+ 1.15.3
\ No newline at end of file
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/DebeziumCDCApplication.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/DebeziumCDCApplication.java
new file mode 100644
index 0000000000..e690d096b1
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/DebeziumCDCApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.libraries.debezium;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DebeziumCDCApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DebeziumCDCApplication.class, args);
+ }
+
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/config/DebeziumConnectorConfig.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/config/DebeziumConnectorConfig.java
new file mode 100644
index 0000000000..64e3bda4d6
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/config/DebeziumConnectorConfig.java
@@ -0,0 +1,58 @@
+package com.baeldung.libraries.debezium.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.File;
+import java.io.IOException;
+
+@Configuration
+public class DebeziumConnectorConfig {
+
+ /**
+ * Database details.
+ */
+ @Value("${customer.datasource.host}")
+ private String customerDbHost;
+
+ @Value("${customer.datasource.database}")
+ private String customerDbName;
+
+ @Value("${customer.datasource.port}")
+ private String customerDbPort;
+
+ @Value("${customer.datasource.username}")
+ private String customerDbUsername;
+
+ @Value("${customer.datasource.password}")
+ private String customerDbPassword;
+
+ /**
+ * Customer Database Connector Configuration
+ */
+ @Bean
+ public io.debezium.config.Configuration customerConnector() throws IOException {
+ File offsetStorageTempFile = File.createTempFile("offsets_", ".dat");
+ File dbHistoryTempFile = File.createTempFile("dbhistory_", ".dat");
+ return io.debezium.config.Configuration.create()
+ .with("name", "customer-mysql-connector")
+ .with("connector.class", "io.debezium.connector.mysql.MySqlConnector")
+ .with("offset.storage", "org.apache.kafka.connect.storage.FileOffsetBackingStore")
+ .with("offset.storage.file.filename", offsetStorageTempFile.getAbsolutePath())
+ .with("offset.flush.interval.ms", "60000")
+ .with("database.hostname", customerDbHost)
+ .with("database.port", customerDbPort)
+ .with("database.user", customerDbUsername)
+ .with("database.password", customerDbPassword)
+ .with("database.dbname", customerDbName)
+ .with("database.include.list", customerDbName)
+ .with("include.schema.changes", "false")
+ .with("database.allowPublicKeyRetrieval", "true")
+ .with("database.server.id", "10181")
+ .with("database.server.name", "customer-mysql-db-server")
+ .with("database.history", "io.debezium.relational.history.FileDatabaseHistory")
+ .with("database.history.file.filename", dbHistoryTempFile.getAbsolutePath())
+ .build();
+ }
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/entity/Customer.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/entity/Customer.java
new file mode 100644
index 0000000000..2100b135af
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/entity/Customer.java
@@ -0,0 +1,18 @@
+package com.baeldung.libraries.debezium.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+@Getter
+@Setter
+public class Customer {
+ @Id
+ private Long id;
+
+ private String fullname;
+ private String email;
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/listener/DebeziumListener.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/listener/DebeziumListener.java
new file mode 100644
index 0000000000..6826fe6d6d
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/listener/DebeziumListener.java
@@ -0,0 +1,83 @@
+package com.baeldung.libraries.debezium.listener;
+
+import com.baeldung.libraries.debezium.service.CustomerService;
+import io.debezium.config.Configuration;
+import io.debezium.embedded.Connect;
+import io.debezium.engine.DebeziumEngine;
+import io.debezium.engine.RecordChangeEvent;
+import io.debezium.engine.format.ChangeEventFormat;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.kafka.connect.data.Field;
+import org.apache.kafka.connect.data.Struct;
+import org.apache.kafka.connect.source.SourceRecord;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import static io.debezium.data.Envelope.FieldName.*;
+import static io.debezium.data.Envelope.Operation;
+import static java.util.stream.Collectors.toMap;
+
+@Slf4j
+@Component
+public class DebeziumListener {
+
+ private final Executor executor = Executors.newSingleThreadExecutor();
+ private final CustomerService customerService;
+ private final DebeziumEngine> debeziumEngine;
+
+ public DebeziumListener(Configuration customerConnectorConfiguration, CustomerService customerService) {
+
+ this.debeziumEngine = DebeziumEngine.create(ChangeEventFormat.of(Connect.class))
+ .using(customerConnectorConfiguration.asProperties())
+ .notifying(this::handleChangeEvent)
+ .build();
+
+ this.customerService = customerService;
+ }
+
+ private void handleChangeEvent(RecordChangeEvent sourceRecordRecordChangeEvent) {
+ SourceRecord sourceRecord = sourceRecordRecordChangeEvent.record();
+
+ log.info("Key = '" + sourceRecord.key() + "' value = '" + sourceRecord.value() + "'");
+
+ Struct sourceRecordChangeValue= (Struct) sourceRecord.value();
+
+ if (sourceRecordChangeValue != null) {
+ Operation operation = Operation.forCode((String) sourceRecordChangeValue.get(OPERATION));
+
+ if(operation != Operation.READ) {
+ String record = operation == Operation.DELETE ? BEFORE : AFTER; // Handling Update & Insert operations.
+
+ Struct struct = (Struct) sourceRecordChangeValue.get(record);
+ Map payload = struct.schema().fields().stream()
+ .map(Field::name)
+ .filter(fieldName -> struct.get(fieldName) != null)
+ .map(fieldName -> Pair.of(fieldName, struct.get(fieldName)))
+ .collect(toMap(Pair::getKey, Pair::getValue));
+
+ this.customerService.replicateData(payload, operation);
+ log.info("Updated Data: {} with Operation: {}", payload, operation.name());
+ }
+ }
+ }
+
+ @PostConstruct
+ private void start() {
+ this.executor.execute(debeziumEngine);
+ }
+
+ @PreDestroy
+ private void stop() throws IOException {
+ if (this.debeziumEngine != null) {
+ this.debeziumEngine.close();
+ }
+ }
+
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/repository/CustomerRepository.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/repository/CustomerRepository.java
new file mode 100644
index 0000000000..fc199cb85c
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/repository/CustomerRepository.java
@@ -0,0 +1,9 @@
+package com.baeldung.libraries.debezium.repository;
+
+import com.baeldung.libraries.debezium.entity.Customer;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CustomerRepository extends JpaRepository {
+}
diff --git a/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/service/CustomerService.java b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/service/CustomerService.java
new file mode 100644
index 0000000000..4b35a94eb5
--- /dev/null
+++ b/libraries-data-db/src/main/java/com/baeldung/libraries/debezium/service/CustomerService.java
@@ -0,0 +1,30 @@
+package com.baeldung.libraries.debezium.service;
+
+import com.baeldung.libraries.debezium.entity.Customer;
+import com.baeldung.libraries.debezium.repository.CustomerRepository;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.debezium.data.Envelope.Operation;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Service
+public class CustomerService {
+
+ private final CustomerRepository customerRepository;
+
+ public CustomerService(CustomerRepository customerRepository) {
+ this.customerRepository = customerRepository;
+ }
+
+ public void replicateData(Map customerData, Operation operation) {
+ final ObjectMapper mapper = new ObjectMapper();
+ final Customer customer = mapper.convertValue(customerData, Customer.class);
+
+ if (Operation.DELETE.name().equals(operation.name())) {
+ customerRepository.deleteById(customer.getId());
+ } else {
+ customerRepository.save(customer);
+ }
+ }
+}
diff --git a/libraries-data-db/src/main/resources/application.yml b/libraries-data-db/src/main/resources/application.yml
new file mode 100644
index 0000000000..3fcf4a12a9
--- /dev/null
+++ b/libraries-data-db/src/main/resources/application.yml
@@ -0,0 +1,34 @@
+## Server properties
+server:
+ port: 8080
+
+## Primary/Target Database Properties
+spring:
+ datasource:
+ url: jdbc:mysql://localhost:3306/customerdb
+ username: root
+ password: root
+ jpa.hibernate.ddl-auto: create-drop
+ jpa.show-sql: true
+
+## Source Database Properties
+customer:
+ datasource:
+ host: localhost
+ port: 3305
+ database: customerdb
+ username: root
+ password: root
+
+ ## Logging properties
+logging:
+ level:
+ root: INFO
+ io:
+ debezium:
+ mysql:
+ BinlogReader: INFO
+ com:
+ baeldung:
+ libraries:
+ debezium: DEBUG
diff --git a/libraries-data-db/src/main/resources/customer.sql b/libraries-data-db/src/main/resources/customer.sql
new file mode 100644
index 0000000000..25e3bcf569
--- /dev/null
+++ b/libraries-data-db/src/main/resources/customer.sql
@@ -0,0 +1,9 @@
+drop table if exists customer;
+
+CREATE TABLE customer
+(
+ id integer NOT NULL,
+ fullname character varying(255),
+ email character varying(255),
+ CONSTRAINT customer_pkey PRIMARY KEY (id)
+);
diff --git a/libraries-data-db/src/main/resources/docker-compose.yml b/libraries-data-db/src/main/resources/docker-compose.yml
new file mode 100644
index 0000000000..ddf865cc78
--- /dev/null
+++ b/libraries-data-db/src/main/resources/docker-compose.yml
@@ -0,0 +1,25 @@
+version: "3.9"
+services:
+ # Install Source MySQL DB and setup the Customer database
+ mysql-1:
+ container_name: source-database
+ image: mysql
+ command: --default-authentication-plugin=mysql_native_password
+ restart: always
+ ports:
+ - 3305:3306
+ environment:
+ MYSQL_ROOT_PASSWORD: root
+ MYSQL_DATABASE: customerdb
+
+ # Install Target MySQL DB and setup the Customer database
+ mysql-2:
+ container_name: target-database
+ image: mysql
+ command: --default-authentication-plugin=mysql_native_password
+ restart: always
+ ports:
+ - 3306:3306
+ environment:
+ MYSQL_ROOT_PASSWORD: root
+ MYSQL_DATABASE: customerdb
diff --git a/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/DebeziumCDCLiveTest.java b/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/DebeziumCDCLiveTest.java
new file mode 100644
index 0000000000..916ea4a120
--- /dev/null
+++ b/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/DebeziumCDCLiveTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.libraries.debezium;
+
+import com.baeldung.libraries.debezium.repository.CustomerRepository;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = DebeziumCDCApplication.class)
+@ActiveProfiles("test")
+public class DebeziumCDCLiveTest {
+
+ @Autowired
+ private CustomerRepository customerRepository;
+
+ @Autowired
+ @Qualifier("sourceJdbcTemplate")
+ private NamedParameterJdbcTemplate jdbcTemplate;
+
+ @Before
+ public void clearData() {
+ jdbcTemplate.update("delete from customer where id = :id", Collections.singletonMap("id", 1));
+ }
+
+ @DynamicPropertySource
+ static void registerProperties(DynamicPropertyRegistry registry) {
+ registry.add("customer.datasource.port", MySQLTestContainerConfiguration::getPort);
+ }
+
+ @Test
+ public void whenInsertDataToSourceDatabase_thenCdcOk() throws InterruptedException {
+ assertThat(customerRepository.findAll().size()).isZero();
+
+ // insert data to source DB
+ Map map = new HashMap<>();
+ map.put("id", 1);
+ map.put("fullname", "John Doe");
+ map.put("email", "test@test.com");
+
+ jdbcTemplate.update("INSERT INTO customer(id, fullname, email) VALUES (:id, :fullname, :email)", map);
+
+ // verify target DB
+ Thread.sleep(10000);
+ assertThat(customerRepository.findAll().size()).isNotZero();
+ }
+
+}
diff --git a/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/MySQLTestContainerConfiguration.java b/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/MySQLTestContainerConfiguration.java
new file mode 100644
index 0000000000..e7394e190b
--- /dev/null
+++ b/libraries-data-db/src/test/java/com/baeldung/libraries/debezium/MySQLTestContainerConfiguration.java
@@ -0,0 +1,61 @@
+package com.baeldung.libraries.debezium;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+import org.testcontainers.containers.MySQLContainer;
+import org.testcontainers.utility.DockerImageName;
+
+import javax.sql.DataSource;
+
+@Configuration
+public class MySQLTestContainerConfiguration {
+
+ public static final DockerImageName MYSQL_IMAGE = DockerImageName.parse("mysql:8.0");
+
+ private static final MySQLContainer> mysqlContainer = new MySQLContainer<>(MYSQL_IMAGE)
+ .withCommand("--default-authentication-plugin=mysql_native_password")
+ .withInitScript("debezium/customer.sql")
+ .withDatabaseName("SOURCE_DB")
+ .withUsername("user")
+ .withPassword("user")
+ .withEnv("MYSQL_ROOT_PASSWORD", "user");
+
+ MySQLTestContainerConfiguration() {
+ mysqlContainer.start();
+ }
+
+ public static int getPort() {
+ return mysqlContainer.getFirstMappedPort();
+ }
+
+ @Bean
+ @Primary
+ public EmbeddedDatabase targetDatasource() {
+ return new EmbeddedDatabaseBuilder()
+ .setType(EmbeddedDatabaseType.H2)
+ .setName("TAGRET_DB")
+ .build();
+ }
+
+ @Bean(name = "SOURCE_DS")
+ public DataSource sourceDataSource() {
+ DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
+ dataSource.setUrl(mysqlContainer.getJdbcUrl());
+ dataSource.setUsername(mysqlContainer.getUsername());
+ dataSource.setPassword(mysqlContainer.getPassword());
+ return dataSource;
+ }
+
+ @Bean(name = "sourceJdbcTemplate")
+ public NamedParameterJdbcTemplate getJdbcTemplate(@Qualifier("SOURCE_DS") DataSource sourceDataSource) {
+ return new NamedParameterJdbcTemplate(sourceDataSource);
+ }
+}
diff --git a/libraries-data-db/src/test/resources/application-test.yml b/libraries-data-db/src/test/resources/application-test.yml
new file mode 100644
index 0000000000..96aaa2b727
--- /dev/null
+++ b/libraries-data-db/src/test/resources/application-test.yml
@@ -0,0 +1,7 @@
+## Source Database Properties
+customer:
+ datasource:
+ host: localhost
+ database: SOURCE_DB
+ username: root
+ password: user
diff --git a/libraries-data-db/src/test/resources/debezium/customer.sql b/libraries-data-db/src/test/resources/debezium/customer.sql
new file mode 100644
index 0000000000..25e3bcf569
--- /dev/null
+++ b/libraries-data-db/src/test/resources/debezium/customer.sql
@@ -0,0 +1,9 @@
+drop table if exists customer;
+
+CREATE TABLE customer
+(
+ id integer NOT NULL,
+ fullname character varying(255),
+ email character varying(255),
+ CONSTRAINT customer_pkey PRIMARY KEY (id)
+);
diff --git a/libraries-data-io/pom.xml b/libraries-data-io/pom.xml
index e15e188d10..58bfde9aa0 100644
--- a/libraries-data-io/pom.xml
+++ b/libraries-data-io/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
libraries-data-io
libraries-data-io
diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml
index 5adb490e96..3c6bedba90 100644
--- a/libraries-data/pom.xml
+++ b/libraries-data/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
libraries-data
libraries-data
@@ -57,8 +58,7 @@
hazelcast
${hazelcast.version}
-
-
+
org.apache.crunch
crunch-core
@@ -70,7 +70,6 @@
${org.apache.hadoop.hadoop-client}
provided
-
commons-cli
commons-cli
@@ -179,4 +178,4 @@
1.6.0.1
-
+
\ No newline at end of file
diff --git a/libraries-http-2/README.md b/libraries-http-2/README.md
index c0d6e76f1b..4085d98ea5 100644
--- a/libraries-http-2/README.md
+++ b/libraries-http-2/README.md
@@ -7,5 +7,7 @@ This module contains articles about HTTP libraries.
- [Jetty ReactiveStreams HTTP Client](https://www.baeldung.com/jetty-reactivestreams-http-client)
- [Decode an OkHttp JSON Response](https://www.baeldung.com/okhttp-json-response)
- [Retrofit 2 – Dynamic URL](https://www.baeldung.com/retrofit-dynamic-url)
+- [Adding Interceptors in OkHTTP](https://www.baeldung.com/java-okhttp-interceptors)
+- [A Guide to Events in OkHTTP](https://www.baeldung.com/java-okhttp-events)
- More articles [[<-- prev]](/libraries-http)
diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml
index d0bdb26bd4..d8479def3c 100644
--- a/libraries-http-2/pom.xml
+++ b/libraries-http-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
libraries-http-2
libraries-http-2
@@ -13,12 +13,17 @@
-
+
com.squareup.okhttp3
okhttp
${okhttp.version}
+
+ com.squareup.okhttp3
+ logging-interceptor
+ ${okhttp.version}
+
com.fasterxml.jackson.core
jackson-databind
@@ -66,7 +71,6 @@
reactive-streams
${reactive.stream.version}
-
com.squareup.retrofit2
@@ -81,9 +85,9 @@
- 3.14.2
+ 4.9.1
2.8.5
- 3.14.2
+ 4.9.1
1.0.3
9.4.19.v20190610
2.2.11
@@ -93,4 +97,4 @@
3.2.12.RELEASE
-
+
\ No newline at end of file
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/events/EventTimer.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/events/EventTimer.java
new file mode 100644
index 0000000000..356dea9fc6
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/events/EventTimer.java
@@ -0,0 +1,156 @@
+package com.baeldung.okhttp.events;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.util.List;
+
+import okhttp3.Call;
+import okhttp3.Connection;
+import okhttp3.EventListener;
+import okhttp3.Handshake;
+import okhttp3.HttpUrl;
+import okhttp3.Protocol;
+import okhttp3.Request;
+import okhttp3.Response;
+
+public class EventTimer extends EventListener {
+
+ private long start;
+
+ private void logTimedEvent(String name) {
+ long now = System.nanoTime();
+ if (name.equals("callStart")) {
+ start = now;
+ }
+ long elapsedNanos = now - start;
+ System.out.printf("%.3f %s%n", elapsedNanos / 1000000000d, name);
+ }
+
+ @Override
+ public void callStart(Call call) {
+ logTimedEvent("callStart");
+ }
+
+ @Override
+ public void proxySelectStart(Call call, HttpUrl url) {
+ logTimedEvent("proxySelectStart");
+ }
+
+ @Override
+ public void proxySelectEnd(Call call, HttpUrl url, List proxies) {
+ logTimedEvent("proxySelectEnd");
+ }
+
+ @Override
+ public void dnsStart(Call call, String domainName) {
+ logTimedEvent("dnsStart");
+ }
+
+ @Override
+ public void dnsEnd(Call call, String domainName, List inetAddressList) {
+ logTimedEvent("dnsEnd");
+ }
+
+ @Override
+ public void connectStart(Call call, InetSocketAddress inetSocketAddress, Proxy proxy) {
+ logTimedEvent("connectStart");
+ }
+
+ @Override
+ public void secureConnectStart(Call call) {
+ logTimedEvent("secureConnectStart");
+ }
+
+ @Override
+ public void secureConnectEnd(Call call, Handshake handshake) {
+ logTimedEvent("secureConnectEnd");
+ }
+
+ @Override
+ public void connectEnd(Call call, InetSocketAddress inetSocketAddress, Proxy proxy, Protocol protocol) {
+ logTimedEvent("connectEnd");
+ }
+
+ @Override
+ public void connectFailed(Call call, InetSocketAddress inetSocketAddress, Proxy proxy, Protocol protocol, IOException ioe) {
+ logTimedEvent("connectFailed");
+ }
+
+ @Override
+ public void connectionAcquired(Call call, Connection connection) {
+ logTimedEvent("connectionAcquired");
+ }
+
+ @Override
+ public void connectionReleased(Call call, Connection connection) {
+ logTimedEvent("connectionReleased");
+ }
+
+ @Override
+ public void requestHeadersStart(Call call) {
+ logTimedEvent("requestHeadersStart");
+ }
+
+ @Override
+ public void requestHeadersEnd(Call call, Request request) {
+ logTimedEvent("requestHeadersEnd");
+ }
+
+ @Override
+ public void requestBodyStart(Call call) {
+ logTimedEvent("requestBodyStart");
+ }
+
+ @Override
+ public void requestBodyEnd(Call call, long byteCount) {
+ logTimedEvent("requestBodyEnd");
+ }
+
+ @Override
+ public void requestFailed(Call call, IOException ioe) {
+ logTimedEvent("requestFailed");
+ }
+
+ @Override
+ public void responseHeadersStart(Call call) {
+ logTimedEvent("responseHeadersStart");
+ }
+
+ @Override
+ public void responseHeadersEnd(Call call, Response response) {
+ logTimedEvent("responseHeadersEnd");
+ }
+
+ @Override
+ public void responseBodyStart(Call call) {
+ logTimedEvent("responseBodyStart");
+ }
+
+ @Override
+ public void responseBodyEnd(Call call, long byteCount) {
+ logTimedEvent("responseBodyEnd");
+ }
+
+ @Override
+ public void responseFailed(Call call, IOException ioe) {
+ logTimedEvent("responseFailed");
+ }
+
+ @Override
+ public void callEnd(Call call) {
+ logTimedEvent("callEnd");
+ }
+
+ @Override
+ public void callFailed(Call call, IOException ioe) {
+ logTimedEvent("callFailed");
+ }
+
+ @Override
+ public void canceled(Call call) {
+ logTimedEvent("canceled");
+ }
+
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/events/SimpleLogEventsListener.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/events/SimpleLogEventsListener.java
new file mode 100644
index 0000000000..93e3eb6308
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/events/SimpleLogEventsListener.java
@@ -0,0 +1,37 @@
+package com.baeldung.okhttp.events;
+
+import java.time.LocalDateTime;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import okhttp3.Call;
+import okhttp3.EventListener;
+import okhttp3.Request;
+import okhttp3.Response;
+
+public class SimpleLogEventsListener extends EventListener {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SimpleLogEventsListener.class);
+
+ @Override
+ public void callStart(Call call) {
+ LOGGER.info("callStart at {}", LocalDateTime.now());
+ }
+
+ @Override
+ public void requestHeadersEnd(Call call, Request request) {
+ LOGGER.info("requestHeadersEnd at {} with headers {}", LocalDateTime.now(), request.headers());
+ }
+
+ @Override
+ public void responseHeadersEnd(Call call, Response response) {
+ LOGGER.info("responseHeadersEnd at {} with headers {}", LocalDateTime.now(), response.headers());
+ }
+
+ @Override
+ public void callEnd(Call call) {
+ LOGGER.info("callEnd at {}", LocalDateTime.now());
+ }
+
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/CacheControlResponeInterceptor.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/CacheControlResponeInterceptor.java
new file mode 100644
index 0000000000..e9f8db19be
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/CacheControlResponeInterceptor.java
@@ -0,0 +1,18 @@
+package com.baeldung.okhttp.interceptors;
+
+import java.io.IOException;
+
+import okhttp3.Interceptor;
+import okhttp3.Response;
+
+public class CacheControlResponeInterceptor implements Interceptor {
+
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ Response response = chain.proceed(chain.request());
+ return response.newBuilder()
+ .header("Cache-Control", "no-store")
+ .build();
+ }
+
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorMessage.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorMessage.java
new file mode 100644
index 0000000000..73411d947f
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorMessage.java
@@ -0,0 +1,21 @@
+package com.baeldung.okhttp.interceptors;
+
+public class ErrorMessage {
+
+ private final int status;
+ private final String detail;
+
+ public ErrorMessage(int status, String detail) {
+ this.status = status;
+ this.detail = detail;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public String getDetail() {
+ return detail;
+ }
+
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java
new file mode 100644
index 0000000000..f6c6673705
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/ErrorResponseInterceptor.java
@@ -0,0 +1,32 @@
+package com.baeldung.okhttp.interceptors;
+
+import java.io.IOException;
+
+import com.google.gson.Gson;
+
+import okhttp3.Interceptor;
+import okhttp3.MediaType;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+
+public class ErrorResponseInterceptor implements Interceptor {
+
+ public static final MediaType APPLICATION_JSON = MediaType.get("application/json; charset=utf-8");
+
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ Response response = chain.proceed(chain.request());
+
+ if(!response.isSuccessful()) {
+ Gson gson = new Gson();
+ String body = gson.toJson(new ErrorMessage(response.code(), "The response from the server was not OK"));
+ ResponseBody responseBody = ResponseBody.create(body, APPLICATION_JSON);
+
+ return response.newBuilder()
+ .body(responseBody)
+ .build();
+ }
+ return response;
+ }
+
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/SimpleLoggingInterceptor.java b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/SimpleLoggingInterceptor.java
new file mode 100644
index 0000000000..6d08546eea
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/okhttp/interceptors/SimpleLoggingInterceptor.java
@@ -0,0 +1,25 @@
+package com.baeldung.okhttp.interceptors;
+
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import okhttp3.Interceptor;
+import okhttp3.Request;
+import okhttp3.Response;
+
+public class SimpleLoggingInterceptor implements Interceptor {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SimpleLoggingInterceptor.class);
+
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ Request request = chain.request();
+
+ LOGGER.info("Intercepted headers: {} from URL: {}", request.headers(), request.url());
+
+ return chain.proceed(request);
+ }
+
+}
diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/events/EventTimerLiveTest.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/events/EventTimerLiveTest.java
new file mode 100644
index 0000000000..ebf4cd1404
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/events/EventTimerLiveTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.okhttp.events;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+
+public class EventTimerLiveTest {
+
+ @Test
+ public void givenSimpleEventTimer_whenRequestSent_thenCallsLogged() throws IOException {
+
+ OkHttpClient client = new OkHttpClient.Builder()
+ .eventListener(new EventTimer())
+ .build();
+
+ Request request = new Request.Builder()
+ .url("https://www.baeldung.com/")
+ .build();
+
+ try (Response response = client.newCall(request).execute()) {
+ assertEquals("Response code should be: ", 200, response.code());
+ }
+ }
+
+}
diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/events/LogEventsListenerIntegrationTest.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/events/LogEventsListenerIntegrationTest.java
new file mode 100644
index 0000000000..c5884e8a12
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/events/LogEventsListenerIntegrationTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.okhttp.events;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+
+public class LogEventsListenerIntegrationTest {
+
+ @Rule
+ public MockWebServer server = new MockWebServer();
+
+ @Test
+ public void givenSimpleEventLogger_whenRequestSent_thenCallsLogged() throws IOException {
+ server.enqueue(new MockResponse().setBody("Hello Baeldung Readers!"));
+
+ OkHttpClient client = new OkHttpClient.Builder()
+ .eventListener(new SimpleLogEventsListener())
+ .build();
+
+ Request request = new Request.Builder()
+ .url(server.url("/"))
+ .build();
+
+ try (Response response = client.newCall(request).execute()) {
+ assertEquals("Response code should be: ", 200, response.code());
+ assertEquals("Body should be: ", "Hello Baeldung Readers!", response.body().string());
+ }
+ }
+
+ @Test (expected = SocketTimeoutException.class)
+ public void givenConnectionError_whenRequestSent_thenFailedCallsLogged() throws IOException {
+ OkHttpClient client = new OkHttpClient.Builder()
+ .eventListener(new EventTimer())
+ .build();
+
+ Request request = new Request.Builder()
+ .url(server.url("/"))
+ .build();
+
+ client.newCall(request).execute();
+ }
+
+}
diff --git a/libraries-http-2/src/test/java/com/baeldung/okhttp/interceptors/InterceptorIntegrationTest.java b/libraries-http-2/src/test/java/com/baeldung/okhttp/interceptors/InterceptorIntegrationTest.java
new file mode 100644
index 0000000000..d15b67ad3b
--- /dev/null
+++ b/libraries-http-2/src/test/java/com/baeldung/okhttp/interceptors/InterceptorIntegrationTest.java
@@ -0,0 +1,90 @@
+package com.baeldung.okhttp.interceptors;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.logging.HttpLoggingInterceptor;
+import okhttp3.logging.HttpLoggingInterceptor.Level;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+
+public class InterceptorIntegrationTest {
+
+ @Rule
+ public MockWebServer server = new MockWebServer();
+
+ @Test
+ public void givenSimpleLogginInterceptor_whenRequestSent_thenHeadersLogged() throws IOException {
+ server.enqueue(new MockResponse().setBody("Hello Baeldung Readers!"));
+
+ OkHttpClient client = new OkHttpClient.Builder()
+ .addNetworkInterceptor(new SimpleLoggingInterceptor())
+ .build();
+
+ Request request = new Request.Builder()
+ .url(server.url("/greeting"))
+ .header("User-Agent", "A Baeldung Reader")
+ .build();
+
+ try (Response response = client.newCall(request).execute()) {
+ assertEquals("Response code should be: ", 200, response.code());
+ assertEquals("Body should be: ", "Hello Baeldung Readers!", response.body().string());
+ }
+ }
+
+ @Test
+ public void givenResponseInterceptor_whenRequestSent_thenCacheControlSetToNoStore() throws IOException {
+ server.enqueue(new MockResponse().setBody("Hello Baeldung Readers!"));
+
+ OkHttpClient client = new OkHttpClient.Builder()
+ .addInterceptor(getHttpLogger())
+ .addInterceptor(new CacheControlResponeInterceptor())
+ .build();
+
+ Request request = new Request.Builder()
+ .url(server.url("/greeting"))
+ .header("User-Agent", "A Baeldung Reader")
+ .build();
+
+ try (Response response = client.newCall(request).execute()) {
+ assertEquals("Response code should be: ", 200, response.code());
+ assertEquals("Body should be: ", "Hello Baeldung Readers!", response.body().string());
+ assertEquals("Response cache-control should be", "no-store", response.header("Cache-Control"));
+ }
+ }
+
+ @Test
+ public void givenErrorResponseInterceptor_whenResponseIs500_thenBodyIsJsonWithStatus() throws IOException {
+ server.enqueue(new MockResponse().setResponseCode(500).setBody("Hello Baeldung Readers!"));
+
+ OkHttpClient client = new OkHttpClient.Builder()
+ .addInterceptor(getHttpLogger())
+ .addInterceptor(new ErrorResponseInterceptor())
+ .build();
+
+ Request request = new Request.Builder()
+ .url(server.url("/greeting"))
+ .header("User-Agent", "A Baeldung Reader")
+ .build();
+
+ try (Response response = client.newCall(request).execute()) {
+ assertEquals("Response code should be: ", 500, response.code());
+ assertEquals("Body should be: ", "{\"status\":500,\"detail\":\"The response from the server was not OK\"}",
+ response.body().string());
+ }
+ }
+
+ private HttpLoggingInterceptor getHttpLogger() {
+ HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
+ logger.setLevel(Level.HEADERS);
+ return logger;
+ }
+
+}
diff --git a/libraries-http/pom.xml b/libraries-http/pom.xml
index 257cb988d6..8eb6142c38 100644
--- a/libraries-http/pom.xml
+++ b/libraries-http/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
libraries-http
libraries-http
@@ -18,14 +18,12 @@
assertj-core
${assertj.version}
-
com.squareup.okhttp3
okhttp
${com.squareup.okhttp3.version}
-
com.google.http-client
@@ -37,7 +35,6 @@
google-http-client-jackson2
${googleclient.version}
-
com.squareup.retrofit2
@@ -54,33 +51,28 @@
adapter-rxjava
${retrofit.version}
-
org.asynchttpclient
async-http-client
${async.http.client.version}
-
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
-
com.google.code.gson
gson
${gson.version}
-
com.squareup.okhttp3
mockwebserver
${com.squareup.okhttp3.version}
test
-
com.mashape.unirest
unirest-java
@@ -118,7 +110,7 @@
2.8.5
4.5.3
-
+
3.6.2
4.9.1
1.23.0
@@ -129,4 +121,4 @@
3.9.0
-
+
\ No newline at end of file
diff --git a/libraries-io/pom.xml b/libraries-io/pom.xml
index 8c2e841630..2f65fd989b 100644
--- a/libraries-io/pom.xml
+++ b/libraries-io/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
libraries-io
libraries-io
@@ -38,4 +38,4 @@
2.4
-
+
\ No newline at end of file
diff --git a/libraries-primitive/pom.xml b/libraries-primitive/pom.xml
index 1370468e76..06c42bd6c9 100644
--- a/libraries-primitive/pom.xml
+++ b/libraries-primitive/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
libraries-primitive
@@ -26,13 +26,13 @@
org.openjdk.jmh
jmh-core
- ${jmh.version}
+ ${jmh-core.version}
test
org.openjdk.jmh
jmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
test
@@ -46,10 +46,11 @@
8.2.2
4.12
- 1.19
10.0.0
1.8
1.8
+ 1.28
+ 1.28
\ No newline at end of file
diff --git a/libraries-rpc/pom.xml b/libraries-rpc/pom.xml
index 8741a41062..ab6b74ae84 100644
--- a/libraries-rpc/pom.xml
+++ b/libraries-rpc/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
libraries-rpc
libraries-rpc
@@ -13,17 +14,16 @@
-
- com.twitter
- finagle-core_2.13
- ${finagle.core.version}
-
-
- com.twitter
- finagle-http_2.13
- ${finagle.http.version}
-
-
+
+ com.twitter
+ finagle-core_2.13
+ ${finagle.core.version}
+
+
+ com.twitter
+ finagle-http_2.13
+ ${finagle.http.version}
+
@@ -31,5 +31,4 @@
20.4.0
-
-
+
\ No newline at end of file
diff --git a/libraries-security/pom.xml b/libraries-security/pom.xml
index 3b812f0d2c..6ee6b7c358 100644
--- a/libraries-security/pom.xml
+++ b/libraries-security/pom.xml
@@ -91,4 +91,4 @@
2.4.0.RELEASE
-
+
\ No newline at end of file
diff --git a/libraries-server-2/pom.xml b/libraries-server-2/pom.xml
index 5f500a7ced..7377fa3fa9 100644
--- a/libraries-server-2/pom.xml
+++ b/libraries-server-2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
libraries-server-2
0.0.1-SNAPSHOT
@@ -30,7 +31,7 @@
${jetty.version}
-
+
diff --git a/libraries-server/pom.xml b/libraries-server/pom.xml
index d9546f1678..e36ed88f8f 100644
--- a/libraries-server/pom.xml
+++ b/libraries-server/pom.xml
@@ -66,32 +66,27 @@
${junit.version}
test
-
org.apache.tomcat
tomcat-catalina
${tomcat.version}
-
org.igniterealtime.smack
smack-tcp
${smack.version}
-
org.igniterealtime.smack
smack-extensions
${smack.version}
-
org.igniterealtime.smack
smack-java7
${smack.version}
-
org.nanohttpd
@@ -103,7 +98,6 @@
nanohttpd-nanolets
${nanohttpd.version}
-
diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml
index 8052680ea5..6d7e0c01e1 100644
--- a/libraries-testing/pom.xml
+++ b/libraries-testing/pom.xml
@@ -129,47 +129,40 @@
asciidoctor-maven-plugin
${asciidoctor.version}
-
org.dbunit
dbunit
${dbunit.version}
test
-
com.h2database
h2
${h2.version}
test
-
org.assertj
assertj-core
${assertj-core.version}
test
-
net.bytebuddy
byte-buddy
${byte-buddy.version}
test
-
com.tngtech.archunit
archunit-junit5
${archunit.version}
test
-
-
net.serenity-bdd.maven.plugins
serenity-maven-plugin
@@ -184,7 +177,6 @@
-
org.apache.maven.plugins
maven-compiler-plugin
@@ -194,7 +186,6 @@
${maven-compiler-plugin.target}
-
@@ -220,4 +211,4 @@
0.14.1
-
+
\ No newline at end of file
diff --git a/libraries/pom.xml b/libraries/pom.xml
index fee66f928d..13f91fddd0 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -34,7 +34,6 @@
commons-net
${commons-net.version}
-
org.javatuples
javatuples
@@ -87,7 +86,6 @@
${serenity.jira.version}
test
-
org.datanucleus
@@ -164,14 +162,12 @@
${serenity.version}
test
-
org.lucee
jets3t
${jets3t-version}
-
io.rest-assured
spring-mock-mvc
@@ -202,7 +198,7 @@
org.openjdk.jmh
jmh-core
- ${jmh.version}
+ ${jmh-core.version}
junit
@@ -226,13 +222,11 @@
${org.hamcrest.java-hamcrest.version}
test
-
com.codepoetics
protonpack
${protonpack.version}
-
com.google.oauth-client
@@ -327,7 +321,6 @@
-
org.apache.maven.plugins
@@ -361,7 +354,6 @@
-
@@ -395,10 +387,9 @@
3.0.3
2.3.0
0.9.12
- 1.19
3.0.2
3.6
2.6
-
+
\ No newline at end of file
diff --git a/linkrest/pom.xml b/linkrest/pom.xml
index 89af27d50c..e40efb3930 100644
--- a/linkrest/pom.xml
+++ b/linkrest/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
linkrest
0.0.1-SNAPSHOT
@@ -44,7 +45,6 @@
${project.basedir}/src/main/resources/linkrest.map.xml
-
diff --git a/logging-modules/flogger/pom.xml b/logging-modules/flogger/pom.xml
index e9189c8460..b96025f277 100644
--- a/logging-modules/flogger/pom.xml
+++ b/logging-modules/flogger/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
flogger
@@ -18,20 +18,17 @@
flogger
${flogger.version}
-
com.google.flogger
flogger-system-backend
${flogger.version}
runtime
-
com.google.flogger
flogger-slf4j-backend
${flogger.version}
-
com.google.flogger
flogger-log4j-backend
@@ -51,7 +48,6 @@
-
log4j
log4j
@@ -67,6 +63,6 @@
0.4
1.2.17
-
+
\ No newline at end of file
diff --git a/logging-modules/log-mdc/pom.xml b/logging-modules/log-mdc/pom.xml
index 5e2155fde9..ddf1f23f8c 100644
--- a/logging-modules/log-mdc/pom.xml
+++ b/logging-modules/log-mdc/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
log-mdc
0.0.1-SNAPSHOT
@@ -37,14 +38,12 @@
jackson-databind
${jackson.version}
-
log4j
log4j
${log4j.version}
-
org.apache.logging.log4j
@@ -56,14 +55,12 @@
log4j-core
${log4j2.version}
-
com.lmax
disruptor
${disruptor.version}
-
org.jboss.logging
@@ -80,7 +77,6 @@
logging-service
-
@@ -95,14 +91,6 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
@@ -112,4 +100,4 @@
5.6.2
-
+
\ No newline at end of file
diff --git a/logging-modules/log4j/pom.xml b/logging-modules/log4j/pom.xml
index 15cd2d530f..864e2253b5 100644
--- a/logging-modules/log4j/pom.xml
+++ b/logging-modules/log4j/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
log4j
1.0-SNAPSHOT
@@ -26,7 +26,6 @@
apache-log4j-extras
${log4j.version}
-
org.apache.logging.log4j
diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml
index e09cbd5d33..aaf60a4216 100644
--- a/logging-modules/log4j2/pom.xml
+++ b/logging-modules/log4j2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
log4j2
log4j2
@@ -19,28 +20,24 @@
log4j-core
${log4j-core.version}
-
org.apache.logging.log4j
log4j-api
${log4j-core.version}
-
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
-
com.fasterxml.jackson.dataformat
jackson-dataformat-xml
${jackson.version}
-
com.h2database
@@ -52,7 +49,6 @@
commons-dbcp2
${commons-dbcp2.version}
-
org.apache.logging.log4j
diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml
index 9f5a3ef294..c11f20955b 100644
--- a/logging-modules/logback/pom.xml
+++ b/logging-modules/logback/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
logback
0.1-SNAPSHOT
@@ -71,4 +71,4 @@
1.1.1
-
+
\ No newline at end of file
diff --git a/logging-modules/pom.xml b/logging-modules/pom.xml
index b5354c7c23..6d036d5648 100644
--- a/logging-modules/pom.xml
+++ b/logging-modules/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
logging-modules
logging-modules
@@ -14,24 +15,15 @@
+ flogger
log4j
log4j2
logback
log-mdc
- flogger
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
-
-
5.6.2
+
diff --git a/lombok/pom.xml b/lombok/pom.xml
index e347515b40..334d1defc9 100644
--- a/lombok/pom.xml
+++ b/lombok/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
lombok
0.1-SNAPSHOT
@@ -42,9 +42,7 @@
true
-
-
org.projectlombok
lombok-maven-plugin
@@ -66,8 +64,9 @@
false
-
+
@@ -76,7 +75,6 @@
1.18.10
-
1.0.0.Final
@@ -84,4 +82,4 @@
3.8.0
-
+
\ No newline at end of file
diff --git a/lucene/pom.xml b/lucene/pom.xml
index 0a0e09f724..0f08abaee9 100644
--- a/lucene/pom.xml
+++ b/lucene/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
lucene
0.0.1-SNAPSHOT
diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml
index 9b416177e7..1434db0d54 100644
--- a/mapstruct/pom.xml
+++ b/mapstruct/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
mapstruct
1.0
@@ -79,4 +80,4 @@
3.16.1
-
+
\ No newline at end of file
diff --git a/maven-archetype/pom.xml b/maven-archetype/pom.xml
index be616ac299..2eab8ac614 100644
--- a/maven-archetype/pom.xml
+++ b/maven-archetype/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.archetypes
maven-archetype
@@ -26,4 +27,4 @@
3.0.1
-
+
\ No newline at end of file
diff --git a/maven-modules/compiler-plugin-java-9/pom.xml b/maven-modules/compiler-plugin-java-9/pom.xml
index 6baadb451c..1063ee2e8f 100644
--- a/maven-modules/compiler-plugin-java-9/pom.xml
+++ b/maven-modules/compiler-plugin-java-9/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
compiler-plugin-java-9
@@ -25,6 +25,6 @@
3.8.0
9
9
-
+
\ No newline at end of file
diff --git a/maven-modules/maven-copy-files/copy-rename-maven-plugin/pom.xml b/maven-modules/maven-copy-files/copy-rename-maven-plugin/pom.xml
new file mode 100644
index 0000000000..24a7c48499
--- /dev/null
+++ b/maven-modules/maven-copy-files/copy-rename-maven-plugin/pom.xml
@@ -0,0 +1,92 @@
+
+
+ 4.0.0
+
+ maven-copy-files
+ com.baeldung
+ 1.0-SNAPSHOT
+
+ org.baeldung
+ copy-rename-maven-plugin
+ 1.0-SNAPSHOT
+ copy-rename-maven-plugin
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+ com.coderplus.maven.plugins
+ copy-rename-maven-plugin
+ 1.0
+
+
+ copy-file
+ generate-sources
+
+ copy
+
+
+ source-files/foo.txt
+ target/destination-folder/foo.txt
+
+
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
diff --git a/maven-modules/maven-copy-files/copy-rename-maven-plugin/source-files/foo.txt b/maven-modules/maven-copy-files/copy-rename-maven-plugin/source-files/foo.txt
new file mode 100644
index 0000000000..b2fa85b97f
--- /dev/null
+++ b/maven-modules/maven-copy-files/copy-rename-maven-plugin/source-files/foo.txt
@@ -0,0 +1 @@
+Copy File Example
diff --git a/maven-modules/maven-copy-files/copy-rename-maven-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java b/maven-modules/maven-copy-files/copy-rename-maven-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
new file mode 100644
index 0000000000..a98db61fa9
--- /dev/null
+++ b/maven-modules/maven-copy-files/copy-rename-maven-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
@@ -0,0 +1,16 @@
+package org.baeldung;
+
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class CopyFileUnitTest {
+
+ @Test
+ public void whenCopyingAFileFromSourceToDestination_thenFileShouldBeInDestination() {
+ File destinationFile = new File("target/destination-folder/foo.txt");
+ assertEquals(true, destinationFile.exists());
+ }
+}
diff --git a/maven-modules/maven-copy-files/maven-antrun-plugin/pom.xml b/maven-modules/maven-copy-files/maven-antrun-plugin/pom.xml
new file mode 100644
index 0000000000..61017dd18a
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-antrun-plugin/pom.xml
@@ -0,0 +1,94 @@
+
+
+ 4.0.0
+
+ maven-copy-files
+ com.baeldung
+ 1.0-SNAPSHOT
+
+ org.baeldung
+ maven-antrun-plugin
+ 1.0-SNAPSHOT
+ maven-antrun-plugin
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+ maven-antrun-plugin
+ 3.0.0
+
+
+ generate-sources
+
+
+
+
+
+
+
+
+
+ run
+
+
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
diff --git a/maven-modules/maven-copy-files/maven-antrun-plugin/source-files/foo.txt b/maven-modules/maven-copy-files/maven-antrun-plugin/source-files/foo.txt
new file mode 100644
index 0000000000..b2fa85b97f
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-antrun-plugin/source-files/foo.txt
@@ -0,0 +1 @@
+Copy File Example
diff --git a/maven-modules/maven-copy-files/maven-antrun-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java b/maven-modules/maven-copy-files/maven-antrun-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
new file mode 100644
index 0000000000..a98db61fa9
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-antrun-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
@@ -0,0 +1,16 @@
+package org.baeldung;
+
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class CopyFileUnitTest {
+
+ @Test
+ public void whenCopyingAFileFromSourceToDestination_thenFileShouldBeInDestination() {
+ File destinationFile = new File("target/destination-folder/foo.txt");
+ assertEquals(true, destinationFile.exists());
+ }
+}
diff --git a/maven-modules/maven-copy-files/maven-resources-plugin/pom.xml b/maven-modules/maven-copy-files/maven-resources-plugin/pom.xml
new file mode 100644
index 0000000000..7dbe851f95
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-resources-plugin/pom.xml
@@ -0,0 +1,92 @@
+
+
+ 4.0.0
+
+ maven-copy-files
+ com.baeldung
+ 1.0-SNAPSHOT
+
+ org.baeldung
+ maven-resources-plugin
+ 1.0-SNAPSHOT
+ maven-resoures-plugin
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ copy-resource-one
+ generate-sources
+
+ copy-resources
+
+
+ ${basedir}/target/destination-folder
+
+
+ source-files
+
+ foo.txt
+
+
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
diff --git a/maven-modules/maven-copy-files/maven-resources-plugin/source-files/foo.txt b/maven-modules/maven-copy-files/maven-resources-plugin/source-files/foo.txt
new file mode 100644
index 0000000000..b2fa85b97f
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-resources-plugin/source-files/foo.txt
@@ -0,0 +1 @@
+Copy File Example
diff --git a/maven-modules/maven-copy-files/maven-resources-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java b/maven-modules/maven-copy-files/maven-resources-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
new file mode 100644
index 0000000000..a98db61fa9
--- /dev/null
+++ b/maven-modules/maven-copy-files/maven-resources-plugin/src/test/java/org/baeldung/CopyFileUnitTest.java
@@ -0,0 +1,16 @@
+package org.baeldung;
+
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class CopyFileUnitTest {
+
+ @Test
+ public void whenCopyingAFileFromSourceToDestination_thenFileShouldBeInDestination() {
+ File destinationFile = new File("target/destination-folder/foo.txt");
+ assertEquals(true, destinationFile.exists());
+ }
+}
diff --git a/maven-modules/maven-copy-files/pom.xml b/maven-modules/maven-copy-files/pom.xml
new file mode 100644
index 0000000000..b7b67286bc
--- /dev/null
+++ b/maven-modules/maven-copy-files/pom.xml
@@ -0,0 +1,80 @@
+
+
+ 4.0.0
+
+ maven-modules
+ com.baeldung
+ 0.0.1-SNAPSHOT
+
+ com.baeldung
+ maven-copy-files
+ 1.0-SNAPSHOT
+ pom
+ maven-copy-files
+
+ http://www.example.com
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
+ maven-resources-plugin
+ maven-antrun-plugin
+ copy-rename-maven-plugin
+
+
diff --git a/maven-modules/maven-custom-plugin/pom.xml b/maven-modules/maven-custom-plugin/pom.xml
index ad22c735ff..731abe472d 100644
--- a/maven-modules/maven-custom-plugin/pom.xml
+++ b/maven-modules/maven-custom-plugin/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
maven-custom-plugin
diff --git a/maven-modules/maven-exec-plugin/pom.xml b/maven-modules/maven-exec-plugin/pom.xml
index 6c12971e29..837f31edeb 100644
--- a/maven-modules/maven-exec-plugin/pom.xml
+++ b/maven-modules/maven-exec-plugin/pom.xml
@@ -1,19 +1,13 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
maven-exec-plugin
0.0.1-SNAPSHOT
maven-exec-plugin
-
- 3.8.1
- 1.8
- 1.2.3
-
-
ch.qos.logback
@@ -33,7 +27,6 @@
${java.version}
-
org.codehaus.mojo
exec-maven-plugin
@@ -50,4 +43,10 @@
-
+
+ 3.8.1
+ 1.8
+ 1.2.3
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-integration-test/pom.xml b/maven-modules/maven-integration-test/pom.xml
index 0031230bb1..4ab8de783d 100644
--- a/maven-modules/maven-integration-test/pom.xml
+++ b/maven-modules/maven-integration-test/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
maven-integration-test
0.0.1-SNAPSHOT
diff --git a/maven-modules/maven-multi-source/pom.xml b/maven-modules/maven-multi-source/pom.xml
index 0c85049df7..65e00419af 100644
--- a/maven-modules/maven-multi-source/pom.xml
+++ b/maven-modules/maven-multi-source/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
maven-multi-source
0.0.1-SNAPSHOT
diff --git a/maven-modules/maven-plugins/custom-rule/pom.xml b/maven-modules/maven-plugins/custom-rule/pom.xml
index 075a5c7943..3426f30457 100644
--- a/maven-modules/maven-plugins/custom-rule/pom.xml
+++ b/maven-modules/maven-plugins/custom-rule/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
custom-rule
@@ -45,12 +46,6 @@
-
- 3.0.0-M2
- 2.0.9
- 1.0-alpha-9
-
-
@@ -64,4 +59,10 @@
-
+
+ 3.0.0-M2
+ 2.0.9
+ 1.0-alpha-9
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-plugins/jaxws/README.md b/maven-modules/maven-plugins/jaxws/README.md
new file mode 100644
index 0000000000..d17df7a5f6
--- /dev/null
+++ b/maven-modules/maven-plugins/jaxws/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Generate WSDL Stubs with Maven](https://www.baeldung.com/maven-wsdl-stubs)
diff --git a/maven-modules/maven-plugins/jaxws/pom.xml b/maven-modules/maven-plugins/jaxws/pom.xml
new file mode 100644
index 0000000000..5783907140
--- /dev/null
+++ b/maven-modules/maven-plugins/jaxws/pom.xml
@@ -0,0 +1,46 @@
+
+
+ 4.0.0
+ jaxws
+
+
+ maven-plugins
+ com.baeldung
+ 0.0.1-SNAPSHOT
+
+
+
+
+
+ org.codehaus.mojo
+ jaxws-maven-plugin
+ 2.6
+
+
+
+ wsimport
+
+
+
+
+ ${project.basedir}/src/main/resources/
+ com.baeldung.soap.ws.client
+
+ ${project.build.directory}/generated-sources/
+
+
+
+
+ maven-verifier-plugin
+ ${maven.verifier.version}
+
+ ../input-resources/verifications.xml
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-plugins/jaxws/src/main/java/com/baeldung/soap/ws/client/CountryNotFoundException.java b/maven-modules/maven-plugins/jaxws/src/main/java/com/baeldung/soap/ws/client/CountryNotFoundException.java
new file mode 100644
index 0000000000..c68d65abb1
--- /dev/null
+++ b/maven-modules/maven-plugins/jaxws/src/main/java/com/baeldung/soap/ws/client/CountryNotFoundException.java
@@ -0,0 +1,8 @@
+package com.baeldung.soap.ws.client;
+
+public class CountryNotFoundException extends RuntimeException {
+
+ public CountryNotFoundException() {
+ super("Country not found!");
+ }
+}
diff --git a/maven-modules/maven-plugins/jaxws/src/main/java/com/baeldung/soap/ws/client/CountryServiceClient.java b/maven-modules/maven-plugins/jaxws/src/main/java/com/baeldung/soap/ws/client/CountryServiceClient.java
new file mode 100644
index 0000000000..d6175890f9
--- /dev/null
+++ b/maven-modules/maven-plugins/jaxws/src/main/java/com/baeldung/soap/ws/client/CountryServiceClient.java
@@ -0,0 +1,27 @@
+package com.baeldung.soap.ws.client;
+
+import java.util.Optional;
+
+public class CountryServiceClient {
+
+ private CountryService countryService;
+
+ public CountryServiceClient(CountryService countryService) {
+ this.countryService = countryService;
+ }
+
+ public String getCapitalByCountryName(String countryName) {
+ return Optional.of(countryService.findByName(countryName))
+ .map(Country::getCapital).orElseThrow(CountryNotFoundException::new);
+ }
+
+ public int getPopulationByCountryName(String countryName) {
+ return Optional.of(countryService.findByName(countryName))
+ .map(Country::getPopulation).orElseThrow(CountryNotFoundException::new);
+ }
+
+ public Currency getCurrencyByCountryName(String countryName) {
+ return Optional.of(countryService.findByName(countryName))
+ .map(Country::getCurrency).orElseThrow(CountryNotFoundException::new);
+ }
+}
diff --git a/maven-modules/maven-plugins/jaxws/src/main/resources/country.wsdl b/maven-modules/maven-plugins/jaxws/src/main/resources/country.wsdl
new file mode 100644
index 0000000000..b6efb7087f
--- /dev/null
+++ b/maven-modules/maven-plugins/jaxws/src/main/resources/country.wsdl
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-plugins/jaxws/src/main/resources/country.xsd b/maven-modules/maven-plugins/jaxws/src/main/resources/country.xsd
new file mode 100644
index 0000000000..c94b6047f9
--- /dev/null
+++ b/maven-modules/maven-plugins/jaxws/src/main/resources/country.xsd
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-plugins/jaxws/src/test/java/com/baeldung/soap/ws/client/CountryServiceClientUnitTest.java b/maven-modules/maven-plugins/jaxws/src/test/java/com/baeldung/soap/ws/client/CountryServiceClientUnitTest.java
new file mode 100644
index 0000000000..65c4f39ee4
--- /dev/null
+++ b/maven-modules/maven-plugins/jaxws/src/test/java/com/baeldung/soap/ws/client/CountryServiceClientUnitTest.java
@@ -0,0 +1,73 @@
+package com.baeldung.soap.ws.client;
+
+import org.junit.jupiter.api.*;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+class CountryServiceClientUnitTest {
+
+ CountryServiceClient countryServiceClient;
+ CountryService countryService;
+
+ @BeforeEach
+ void setUp() {
+ countryService = mock(CountryService.class);
+ countryServiceClient = new CountryServiceClient(countryService);
+ }
+
+ @DisplayName("Get capital by country name when country not found")
+ @Test
+ void givenCountryDoesNotExist_whenGetCapitalByCountryName_thenThrowsCountryNotFoundException() {
+ doThrow(CountryNotFoundException.class).when(countryService).findByName(any());
+ Assertions.assertThrows(CountryNotFoundException.class, () -> countryServiceClient.getCapitalByCountryName(any()));
+ }
+
+ @DisplayName("Get capital by country name when country is India then should return capital")
+ @Test
+ void givenCountryIndia_whenGetCapitalByCountryName_thenShouldReturnCapital() {
+ Country country = mock(Country.class);
+
+ doReturn("New Delhi").when(country).getCapital();
+ doReturn(country).when(countryService).findByName("India");
+
+ Assertions.assertEquals("New Delhi", countryServiceClient.getCapitalByCountryName("India"));
+ }
+
+ @DisplayName("Get population by country name when country not found")
+ @Test
+ void givenCountryDoesNotExist_getPopulationByCountryName_thenThrowsCountryNotFoundException() {
+ doThrow(CountryNotFoundException.class).when(countryService).findByName(any());
+ Assertions.assertThrows(CountryNotFoundException.class, () -> countryServiceClient.getPopulationByCountryName(any()));
+ }
+
+ @DisplayName("Get population by country name when country is India then should return population")
+ @Test
+ void givenCountryIndia_getPopulationByCountryName_thenShouldReturnPopulation() {
+ Country country = mock(Country.class);
+
+ doReturn(1000000).when(country).getPopulation();
+ doReturn(country).when(countryService).findByName("India");
+
+ Assertions.assertEquals(1000000, countryServiceClient.getPopulationByCountryName("India"));
+ }
+
+ @DisplayName("Get currency by country name when country not found")
+ @Test
+ void givenCountryDoesNotExist_getCurrencyByCountryName_thenThrowsCountryNotFoundException() {
+ doThrow(CountryNotFoundException.class).when(countryService).findByName(any());
+ Assertions.assertThrows(CountryNotFoundException.class, () -> countryServiceClient.getCurrencyByCountryName(any()));
+ }
+
+ @DisplayName("Get currency by country name when country is India then should return currency")
+ @Test
+ void givenCountryIndia_getCurrencyByCountryName_thenShouldReturnCurrency() {
+ Country country = mock(Country.class);
+
+ doReturn(Currency.INR).when(country).getCurrency();
+ doReturn(country).when(countryService).findByName("India");
+
+ Assertions.assertEquals(Currency.INR, countryServiceClient.getCurrencyByCountryName("India"));
+ }
+
+}
\ No newline at end of file
diff --git a/maven-modules/maven-plugins/maven-enforcer/pom.xml b/maven-modules/maven-plugins/maven-enforcer/pom.xml
index 01f97a061e..25c608ee36 100644
--- a/maven-modules/maven-plugins/maven-enforcer/pom.xml
+++ b/maven-modules/maven-plugins/maven-enforcer/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
maven-enforcer
maven-enforcer
@@ -18,13 +18,13 @@
org.apache.maven.plugins
maven-enforcer-plugin
3.0.0-M2
-
-
-
-
-
-
-
+
+
+
+
+
+
+
enforce
@@ -33,7 +33,7 @@
-
+
3.0
Invalid Maven version. It should, at least, be 3.0
@@ -55,7 +55,7 @@
WARN
-
+
diff --git a/maven-modules/maven-plugins/pom.xml b/maven-modules/maven-plugins/pom.xml
index 9f28871ec0..29b3b550ea 100644
--- a/maven-modules/maven-plugins/pom.xml
+++ b/maven-modules/maven-plugins/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
maven-plugins
@@ -17,6 +18,7 @@
custom-rule
maven-enforcer
+ jaxws
diff --git a/maven-modules/maven-printing-plugins/.gitignore b/maven-modules/maven-printing-plugins/.gitignore
new file mode 100644
index 0000000000..333c1e910a
--- /dev/null
+++ b/maven-modules/maven-printing-plugins/.gitignore
@@ -0,0 +1 @@
+logs/
diff --git a/maven-modules/maven-printing-plugins/pom.xml b/maven-modules/maven-printing-plugins/pom.xml
new file mode 100644
index 0000000000..6ea1ab2a84
--- /dev/null
+++ b/maven-modules/maven-printing-plugins/pom.xml
@@ -0,0 +1,85 @@
+
+
+ 4.0.0
+ maven-printing-plugins
+ maven-printing-plugins
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../..
+
+
+
+
+
+ maven-antrun-plugin
+ 3.0.0
+
+
+ antrun-plugin
+ validate
+
+ run
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.github.ekryd.echo-maven-plugin
+ echo-maven-plugin
+ 1.3.2
+
+
+ echo-maven-plugin-1
+ package
+
+ echo
+
+
+ Hello, world
+ Embed a line break: ${line.separator}
+ ArtifactId is ${project.artifactId}
+ INFO
+ /logs/log-echo.txt
+ true
+
+
+
+
+
+ org.codehaus.gmaven
+ groovy-maven-plugin
+ 2.1.1
+
+
+ validate
+
+ execute
+
+
+
+ log.info('Test message: {}', 'Hello, World!')
+ log.info('Embed a line break {}', System.lineSeparator())
+ log.info('ArtifactId is: ${project.artifactId}')
+ log.warn('Message only in debug mode')
+
+
+
+
+
+
+
+
diff --git a/maven-modules/maven-profiles/pom.xml b/maven-modules/maven-profiles/pom.xml
index f3aeb9d549..322dada104 100644
--- a/maven-modules/maven-profiles/pom.xml
+++ b/maven-modules/maven-profiles/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
maven-profiles
@@ -90,7 +90,7 @@
- 3.2.0
+ 3.2.0
\ No newline at end of file
diff --git a/maven-modules/maven-war-plugin/pom.xml b/maven-modules/maven-war-plugin/pom.xml
index 915be306ca..04188b8995 100644
--- a/maven-modules/maven-war-plugin/pom.xml
+++ b/maven-modules/maven-war-plugin/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
maven-war-plugin
diff --git a/maven-modules/optional-dependencies/main-project/pom.xml b/maven-modules/optional-dependencies/main-project/pom.xml
index 6a42683779..23da40dcf7 100644
--- a/maven-modules/optional-dependencies/main-project/pom.xml
+++ b/maven-modules/optional-dependencies/main-project/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
main-project
@@ -15,4 +15,5 @@
0.0.1-SNAPSHOT
+
\ No newline at end of file
diff --git a/maven-modules/optional-dependencies/optional-project/pom.xml b/maven-modules/optional-dependencies/optional-project/pom.xml
index 9ad4376c8d..7502e70c4a 100644
--- a/maven-modules/optional-dependencies/optional-project/pom.xml
+++ b/maven-modules/optional-dependencies/optional-project/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
optional-project
diff --git a/maven-modules/optional-dependencies/pom.xml b/maven-modules/optional-dependencies/pom.xml
index 12d028b2d7..761028ec95 100644
--- a/maven-modules/optional-dependencies/pom.xml
+++ b/maven-modules/optional-dependencies/pom.xml
@@ -1,19 +1,21 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ optional-dependencies
+ pom
+
maven-modules
com.baeldung
0.0.1-SNAPSHOT
- 4.0.0
- optional-dependencies
- pom
optional-project
project-with-optionals
main-project
+
\ No newline at end of file
diff --git a/maven-modules/optional-dependencies/project-with-optionals/pom.xml b/maven-modules/optional-dependencies/project-with-optionals/pom.xml
index 6a14f3260d..b95217d53d 100644
--- a/maven-modules/optional-dependencies/project-with-optionals/pom.xml
+++ b/maven-modules/optional-dependencies/project-with-optionals/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
project-with-optionals
@@ -16,4 +16,5 @@
true
+
\ No newline at end of file
diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml
index 86a7d5756c..0f146e26da 100644
--- a/maven-modules/pom.xml
+++ b/maven-modules/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
maven-modules
0.0.1-SNAPSHOT
@@ -14,19 +15,23 @@
-
- maven-custom-plugin
- maven-exec-plugin
+
+ maven-copy-files
+ maven-custom-plugin
+ maven-exec-plugin
maven-integration-test
maven-multi-source
maven-plugins
- maven-unused-dependencies
- maven-war-plugin
maven-profiles
maven-properties
- versions-maven-plugin
- version-collision
+
+ maven-unused-dependencies
+ maven-war-plugin
optional-dependencies
+ version-collision
+ version-overriding-plugins
+ versions-maven-plugin
+ maven-printing-plugins
diff --git a/maven-modules/version-collision/pom.xml b/maven-modules/version-collision/pom.xml
index 6d8441aa7b..9c1b9641c8 100644
--- a/maven-modules/version-collision/pom.xml
+++ b/maven-modules/version-collision/pom.xml
@@ -1,23 +1,24 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ version-collision
+ pom
+
maven-modules
com.baeldung
0.0.1-SNAPSHOT
- 4.0.0
- version-collision
- pom
project-a
project-b
project-collision
-
+
@@ -29,26 +30,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/version-collision/project-a/pom.xml b/maven-modules/version-collision/project-a/pom.xml
index 1b7af7e963..ca06c7daca 100644
--- a/maven-modules/version-collision/project-a/pom.xml
+++ b/maven-modules/version-collision/project-a/pom.xml
@@ -1,15 +1,15 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ project-a
+
version-collision
com.baeldung
0.0.1-SNAPSHOT
- 4.0.0
-
- project-a
@@ -18,4 +18,5 @@
22.0
+
\ No newline at end of file
diff --git a/maven-modules/version-collision/project-b/pom.xml b/maven-modules/version-collision/project-b/pom.xml
index 0b0f50aeb8..a7185ab22d 100644
--- a/maven-modules/version-collision/project-b/pom.xml
+++ b/maven-modules/version-collision/project-b/pom.xml
@@ -1,15 +1,15 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ project-b
+
version-collision
com.baeldung
0.0.1-SNAPSHOT
- 4.0.0
-
- project-b
@@ -18,4 +18,5 @@
29.0-jre
+
\ No newline at end of file
diff --git a/maven-modules/version-collision/project-collision/pom.xml b/maven-modules/version-collision/project-collision/pom.xml
index 3bec0ed54a..74f117cdbb 100644
--- a/maven-modules/version-collision/project-collision/pom.xml
+++ b/maven-modules/version-collision/project-collision/pom.xml
@@ -1,16 +1,15 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ project-collision
+
version-collision
com.baeldung
0.0.1-SNAPSHOT
- 4.0.0
-
- project-collision
-
@@ -18,12 +17,12 @@
project-a
0.0.1-SNAPSHOT
-
-
-
-
-
-
+
+
+
+
+
+
com.baeldung
@@ -31,4 +30,5 @@
0.0.1-SNAPSHOT
+
\ No newline at end of file
diff --git a/maven-modules/version-overriding-plugins/README.md b/maven-modules/version-overriding-plugins/README.md
new file mode 100644
index 0000000000..1542692ca0
--- /dev/null
+++ b/maven-modules/version-overriding-plugins/README.md
@@ -0,0 +1,5 @@
+Use `` mvn help:effective-pom`` to see the final generated pom.
+
+### Relevant Articles:
+
+- [Override Maven Plugin Configuration from Parent](https://www.baeldung.com/maven-plugin-override-parent)
diff --git a/maven-modules/version-overriding-plugins/child-a/pom.xml b/maven-modules/version-overriding-plugins/child-a/pom.xml
new file mode 100644
index 0000000000..45098ccef0
--- /dev/null
+++ b/maven-modules/version-overriding-plugins/child-a/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+ child-a
+ pom
+
+
+ version-overriding-plugins
+ com.baeldung
+ 0.0.1-SNAPSHOT
+
+
+
+
+
+ maven-resources-plugin
+
+
+
+ child-a-resources
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/version-overriding-plugins/child-b/pom.xml b/maven-modules/version-overriding-plugins/child-b/pom.xml
new file mode 100644
index 0000000000..f86a3c2096
--- /dev/null
+++ b/maven-modules/version-overriding-plugins/child-b/pom.xml
@@ -0,0 +1,14 @@
+
+
+ 4.0.0
+ child-b
+
+
+ version-overriding-plugins
+ com.baeldung
+ 0.0.1-SNAPSHOT
+
+
+
\ No newline at end of file
diff --git a/maven-modules/version-overriding-plugins/pom.xml b/maven-modules/version-overriding-plugins/pom.xml
new file mode 100644
index 0000000000..79109a83e1
--- /dev/null
+++ b/maven-modules/version-overriding-plugins/pom.xml
@@ -0,0 +1,57 @@
+
+
+ 4.0.0
+ version-overriding-plugins
+ pom
+
+
+ maven-modules
+ com.baeldung
+ 0.0.1-SNAPSHOT
+
+
+
+ child-a
+ child-b
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven.compiler.plugin}
+
+
+
+
+
+ maven-resources-plugin
+
+
+
+ parent-resources
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 11
+ 11
+ 512m
+
+
+
+
+
+
+ 3.8.0
+
+
+
\ No newline at end of file
diff --git a/maven-modules/versions-maven-plugin/original/pom.xml b/maven-modules/versions-maven-plugin/original/pom.xml
index c36a5913c2..2d81274611 100644
--- a/maven-modules/versions-maven-plugin/original/pom.xml
+++ b/maven-modules/versions-maven-plugin/original/pom.xml
@@ -8,37 +8,31 @@
0.0.1-SNAPSHOT
-
commons-io
commons-io
${commons-io.version}
-
org.apache.commons
commons-collections4
${commons-collections4.version}
-
org.apache.commons
commons-lang3
${commons-lang3.version}
-
org.apache.commons
commons-compress
${commons-compress-version}
-
commons-beanutils
commons-beanutils
${commons-beanutils.version}
-
@@ -70,12 +64,12 @@
-
+
1.15
2.3
4.0
1.9.1
2.7
-
+
\ No newline at end of file
diff --git a/maven-modules/versions-maven-plugin/pom.xml b/maven-modules/versions-maven-plugin/pom.xml
index ff49811430..9c837cefa0 100644
--- a/maven-modules/versions-maven-plugin/pom.xml
+++ b/maven-modules/versions-maven-plugin/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
versions-maven-plugin
@@ -14,25 +14,21 @@
commons-io
${commons.io.version}
-
org.apache.commons
commons-collections4
${commons.collections4.version}
-
org.apache.commons
commons-lang3
${commons.lang3.version}
-
org.apache.commons
commons-compress
${commons-compress-version}
-
commons-beanutils
commons-beanutils
diff --git a/maven-polyglot/maven-polyglot-json-extension/pom.xml b/maven-polyglot/maven-polyglot-json-extension/pom.xml
index 15166046c1..13d0b2099b 100644
--- a/maven-polyglot/maven-polyglot-json-extension/pom.xml
+++ b/maven-polyglot/maven-polyglot-json-extension/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.maven.polyglot
maven-polyglot-json-extension
diff --git a/maven-polyglot/pom.xml b/maven-polyglot/pom.xml
index eb4e629a96..496ce58bf2 100644
--- a/maven-polyglot/pom.xml
+++ b/maven-polyglot/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
maven-polyglot
0.0.1-SNAPSHOT
@@ -19,4 +20,4 @@
-
+
\ No newline at end of file
diff --git a/mesos-marathon/pom.xml b/mesos-marathon/pom.xml
index 42798bb209..58ca14ca93 100644
--- a/mesos-marathon/pom.xml
+++ b/mesos-marathon/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
mesos-marathon
mesos-marathon
diff --git a/metrics/pom.xml b/metrics/pom.xml
index 07adf15936..2020cd28cf 100644
--- a/metrics/pom.xml
+++ b/metrics/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
metrics
metrics
@@ -37,7 +38,6 @@
javax.servlet-api
${dep.ver.servlet}
-
com.netflix.servo
servo-core
@@ -50,19 +50,16 @@
${netflix.servo.ver}
test
-
io.micrometer
micrometer-registry-atlas
${micrometer.ver}
-
org.springframework.boot
spring-boot-starter-web
${spring-boot-starter-web.version}
-
com.fasterxml.jackson.core
jackson-databind
@@ -73,13 +70,11 @@
jackson-dataformat-smile
${jackson.version}
-
io.astefanutti.metrics.aspectj
metrics-aspectj-deps
${metrics-aspectj.version}
-
org.assertj
assertj-core
@@ -93,10 +88,10 @@
3.1.0
0.12.17
0.12.0.RELEASE
-
+
2.0.7.RELEASE
3.11.1
1.1.0
-
+
\ No newline at end of file
diff --git a/micronaut/pom.xml b/micronaut/pom.xml
index d6df6a0347..196218d856 100644
--- a/micronaut/pom.xml
+++ b/micronaut/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.micronaut
micronaut
@@ -90,10 +91,12 @@
-
+
${exec.mainClass}
-
+
@@ -102,12 +105,11 @@
org.codehaus.mojo
exec-maven-plugin
- ${exec.plugin.version}
java
-classpath
-
+
${exec.mainClass}
@@ -146,8 +148,7 @@
1.2.3
3.1.6.RELEASE
3.7.0
- 1.6.0
3.1.0
-
+
\ No newline at end of file
diff --git a/microprofile/pom.xml b/microprofile/pom.xml
index 5a32ad8dba..54ed3a9930 100644
--- a/microprofile/pom.xml
+++ b/microprofile/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
microprofile
1.0-SNAPSHOT
@@ -87,4 +88,4 @@
17.0.0.4
-
+
\ No newline at end of file
diff --git a/msf4j/pom.xml b/msf4j/pom.xml
index a220ce0229..99e25dbcbf 100644
--- a/msf4j/pom.xml
+++ b/msf4j/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.msf4j
msf4j
diff --git a/mustache/pom.xml b/mustache/pom.xml
index 9f2402f353..db72e693c1 100644
--- a/mustache/pom.xml
+++ b/mustache/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
mustache
mustache
@@ -19,22 +20,18 @@
compiler
${mustache.compiler.api.version}
-
org.assertj
assertj-core
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-mustache
-
org.springframework.boot
spring-boot-starter-test
diff --git a/mybatis/pom.xml b/mybatis/pom.xml
index 3b4695fb58..4cd705c917 100644
--- a/mybatis/pom.xml
+++ b/mybatis/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
mybatis
mybatis
diff --git a/netflix-modules/genie/pom.xml b/netflix-modules/genie/pom.xml
index 2c7c04b26b..61c0dac9ad 100644
--- a/netflix-modules/genie/pom.xml
+++ b/netflix-modules/genie/pom.xml
@@ -1,9 +1,10 @@
-
4.0.0
genie
- Genie
+ genie
jar
Sample project for Netflix Genie
diff --git a/netflix-modules/mantis/pom.xml b/netflix-modules/mantis/pom.xml
index 5d9611ccdf..474b8f6dbf 100644
--- a/netflix-modules/mantis/pom.xml
+++ b/netflix-modules/mantis/pom.xml
@@ -1,9 +1,10 @@
-
4.0.0
mantis
- Mantis
+ mantis
jar
Sample project for Netflix Mantis
@@ -15,13 +16,11 @@
-
org.springframework.boot
spring-boot-starter
2.1.3.RELEASE
-
io.mantisrx
mantis-runtime
@@ -33,39 +32,33 @@
-
com.fasterxml.jackson.core
jackson-databind
2.10.2
-
net.andreinc.mockneat
mockneat
0.3.8
-
org.projectlombok
lombok
1.18.12
-
org.springframework
spring-webflux
5.0.9.RELEASE
test
-
io.projectreactor.netty
reactor-netty
0.9.12.RELEASE
test
-
@@ -75,4 +68,4 @@
-
+
\ No newline at end of file
diff --git a/netflix-modules/pom.xml b/netflix-modules/pom.xml
index 538126fb34..d9660be6a1 100644
--- a/netflix-modules/pom.xml
+++ b/netflix-modules/pom.xml
@@ -1,9 +1,10 @@
-
+
4.0.0
netflix-modules
- Netflix Modules
+ netflix-modules
pom
Module for Netflix projects
diff --git a/ninja/pom.xml b/ninja/pom.xml
index 9b80dc26c8..93f22cf718 100644
--- a/ninja/pom.xml
+++ b/ninja/pom.xml
@@ -1,15 +1,12 @@
-
4.0.0
-
ninja
jar
com.baeldung
1.0.0
-
http://www.ninjaframework.org
@@ -148,8 +145,10 @@
-
-
+
+
ninja.standalone.NinjaJetty
diff --git a/oauth2-framework-impl/oauth2-authorization-server/pom.xml b/oauth2-framework-impl/oauth2-authorization-server/pom.xml
index e608c09188..f8ced851ba 100644
--- a/oauth2-framework-impl/oauth2-authorization-server/pom.xml
+++ b/oauth2-framework-impl/oauth2-authorization-server/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
oauth2-authorization-server
oauth2-authorization-server
@@ -74,4 +74,4 @@
1.62
-
+
\ No newline at end of file
diff --git a/oauth2-framework-impl/oauth2-client/pom.xml b/oauth2-framework-impl/oauth2-client/pom.xml
index febfe8dd27..814dabc664 100644
--- a/oauth2-framework-impl/oauth2-client/pom.xml
+++ b/oauth2-framework-impl/oauth2-client/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
oauth2-client
oauth2-client
@@ -27,4 +27,4 @@
9543
-
+
\ No newline at end of file
diff --git a/oauth2-framework-impl/oauth2-resource-server/pom.xml b/oauth2-framework-impl/oauth2-resource-server/pom.xml
index 62f5889290..8f135055a2 100644
--- a/oauth2-framework-impl/oauth2-resource-server/pom.xml
+++ b/oauth2-framework-impl/oauth2-resource-server/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
oauth2-resource-server
oauth2-resource-server
@@ -39,4 +39,4 @@
1.1
-
+
\ No newline at end of file
diff --git a/oauth2-framework-impl/pom.xml b/oauth2-framework-impl/pom.xml
index 24559d3c4d..31983b08ad 100644
--- a/oauth2-framework-impl/pom.xml
+++ b/oauth2-framework-impl/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
com.baeldung.oauth2
oauth2-framework-impl
@@ -95,4 +95,4 @@
1.3
-
+
\ No newline at end of file
diff --git a/open-liberty/pom.xml b/open-liberty/pom.xml
index 0e8b159043..aff951cfd8 100644
--- a/open-liberty/pom.xml
+++ b/open-liberty/pom.xml
@@ -1,9 +1,8 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung
open-liberty
1.0-SNAPSHOT
@@ -29,7 +28,6 @@
${version.derby}
provided
-
junit
@@ -87,7 +85,6 @@
maven-war-plugin
${version.maven-war-plugin}
-
@@ -97,7 +94,6 @@
UTF-8
UTF-8
false
-
8.0.0
3.2
@@ -109,7 +105,6 @@
3.2.6
1.0.4
3.3.1
-
openliberty
9080
diff --git a/optaplanner/pom.xml b/optaplanner/pom.xml
index d907cfc830..0e5fa9050e 100644
--- a/optaplanner/pom.xml
+++ b/optaplanner/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
optaplanner
optaplanner
diff --git a/orika/pom.xml b/orika/pom.xml
index 6974bd296e..c18bb58a51 100644
--- a/orika/pom.xml
+++ b/orika/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
orika
1.0
@@ -24,4 +25,4 @@
1.5.0
-
+
\ No newline at end of file
diff --git a/osgi/osgi-intro-sample-activator/pom.xml b/osgi/osgi-intro-sample-activator/pom.xml
index e6611dcf7d..3cabba4cb1 100644
--- a/osgi/osgi-intro-sample-activator/pom.xml
+++ b/osgi/osgi-intro-sample-activator/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
osgi-intro-sample-activator
osgi-intro-sample-activator
@@ -32,19 +33,16 @@
${project.groupId}.${project.artifactId}
${project.artifactId}
${project.version}
-
com.baeldung.osgi.sample.activator.HelloWorld
-
-
-
+
com.baeldung.osgi.sample.activator
-
-
+
\ No newline at end of file
diff --git a/osgi/osgi-intro-sample-client/pom.xml b/osgi/osgi-intro-sample-client/pom.xml
index e91b831db1..b1b04aef78 100644
--- a/osgi/osgi-intro-sample-client/pom.xml
+++ b/osgi/osgi-intro-sample-client/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
osgi-intro-sample-client
diff --git a/osgi/osgi-intro-sample-service/pom.xml b/osgi/osgi-intro-sample-service/pom.xml
index b44e1f9be3..af97d1c90d 100644
--- a/osgi/osgi-intro-sample-service/pom.xml
+++ b/osgi/osgi-intro-sample-service/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
osgi-intro-sample-service
osgi-intro-sample-service
diff --git a/osgi/pom.xml b/osgi/pom.xml
index afc980c8bd..3fa2dcdf02 100644
--- a/osgi/pom.xml
+++ b/osgi/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
osgi
1.0-SNAPSHOT
diff --git a/parent-boot-1/pom.xml b/parent-boot-1/pom.xml
index 2e9c767aa2..96f4b1cbe3 100644
--- a/parent-boot-1/pom.xml
+++ b/parent-boot-1/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml
index ace3e538c9..c67842e313 100644
--- a/parent-boot-2/pom.xml
+++ b/parent-boot-2/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -82,7 +81,7 @@
3.3.0
1.0.22.RELEASE
- 2.4.0
+ 2.4.3
1.9.1
3.4.0
diff --git a/parent-java/pom.xml b/parent-java/pom.xml
index 9170f45bbe..c1abe79b2e 100644
--- a/parent-java/pom.xml
+++ b/parent-java/pom.xml
@@ -1,8 +1,7 @@
-
+
4.0.0
parent-java
0.0.1-SNAPSHOT
@@ -32,18 +31,17 @@
org.openjdk.jmh
jmh-core
- ${jmh.version}
+ ${jmh-core.version}
org.openjdk.jmh
jmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
29.0-jre
- 1.19
2.3.7
2.2
diff --git a/parent-spring-4/pom.xml b/parent-spring-4/pom.xml
index 931cad374b..e0e91cec9a 100644
--- a/parent-spring-4/pom.xml
+++ b/parent-spring-4/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml
index 5893701c68..b70ca2bd0f 100644
--- a/parent-spring-5/pom.xml
+++ b/parent-spring-5/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -31,7 +30,7 @@
- 5.2.8.RELEASE
+ 5.3.3
5.2.3.RELEASE
1.5.10.RELEASE
diff --git a/patterns/clean-architecture/pom.xml b/patterns/clean-architecture/pom.xml
index 6e7de78751..c36f9b83af 100644
--- a/patterns/clean-architecture/pom.xml
+++ b/patterns/clean-architecture/pom.xml
@@ -15,10 +15,6 @@
../../parent-boot-2
-
- 1.8
-
-
com.h2database
@@ -73,7 +69,6 @@
-
@@ -84,4 +79,4 @@
-
+
\ No newline at end of file
diff --git a/patterns/cqrs-es/pom.xml b/patterns/cqrs-es/pom.xml
index 0829e35f34..826440b45d 100644
--- a/patterns/cqrs-es/pom.xml
+++ b/patterns/cqrs-es/pom.xml
@@ -5,13 +5,13 @@
cqrs-es
1.0-SNAPSHOT
cqrs-es
-
+
com.baeldung
patterns
1.0.0-SNAPSHOT
-
+
org.projectlombok
diff --git a/patterns/design-patterns-architectural/pom.xml b/patterns/design-patterns-architectural/pom.xml
index d1945a1d0a..c917744757 100644
--- a/patterns/design-patterns-architectural/pom.xml
+++ b/patterns/design-patterns-architectural/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
design-patterns-architectural
1.0
@@ -20,7 +21,6 @@
${assertj-core.version}
test
-
org.hibernate
hibernate-core
@@ -40,4 +40,4 @@
6.0.6
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-behavioral-2/pom.xml b/patterns/design-patterns-behavioral-2/pom.xml
index 3a6d21353e..f123a8f2f5 100644
--- a/patterns/design-patterns-behavioral-2/pom.xml
+++ b/patterns/design-patterns-behavioral-2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
design-patterns-behavioral-2
1.0
@@ -26,4 +27,4 @@
3.12.2
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-behavioral/pom.xml b/patterns/design-patterns-behavioral/pom.xml
index aceaabf582..93e07bb477 100644
--- a/patterns/design-patterns-behavioral/pom.xml
+++ b/patterns/design-patterns-behavioral/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
design-patterns-behavioral
1.0
@@ -30,7 +31,6 @@
commons-lang3
${commons-lang3.version}
-
org.assertj
assertj-core
@@ -44,4 +44,4 @@
3.9.1
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingOptional.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingOptional.java
index 099864589c..03bed5fedf 100644
--- a/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingOptional.java
+++ b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingOptional.java
@@ -38,8 +38,8 @@ public class UsingOptional {
.flatMap(list -> list.stream().findFirst());
}
- private Optional getOptionalList() {
- return Optional.ofNullable(getList());
+ private Optional> getOptionalList() {
+ return Optional.of(getList());
}
private String doSomething(boolean processed) {
diff --git a/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java
index 73797d48c8..576d2bacf3 100644
--- a/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java
+++ b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java
@@ -19,22 +19,22 @@ class UsingOptionalUnitTest {
}
@Test
- public void whenArgIsFalse_thenReturnEmptyResponse() {
+ void whenArgIsFalse_thenReturnEmptyResponse() {
Optional result = dataObject.process(false);
assertFalse(result.isPresent());
}
@Test
- public void whenArgIsTrue_thenReturnValidResponse() {
+ void whenArgIsTrue_thenReturnValidResponse() {
Optional result = dataObject.process(true);
assertTrue(result.isPresent());
}
@Test
- public void whenArgIsFalse_thenChainResponseAndThrowException() {
- assertThrows(Exception.class, () -> dataObject.process(false).orElseThrow(() -> new Exception()));
+ void whenArgIsFalse_thenChainResponseAndThrowException() {
+ assertThrows(Exception.class, () -> dataObject.process(false).orElseThrow(Exception::new));
}
@Test()
@@ -51,7 +51,4 @@ class UsingOptionalUnitTest {
void whenOptionalListFirst_returnsEmptyOptional() {
assertFalse(dataObject.optionalListFirst().isPresent());
}
-
-
-
}
\ No newline at end of file
diff --git a/patterns/design-patterns-cloud/pom.xml b/patterns/design-patterns-cloud/pom.xml
index 34defb7eac..950b6efb94 100644
--- a/patterns/design-patterns-cloud/pom.xml
+++ b/patterns/design-patterns-cloud/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
design-patterns-cloud
@@ -9,4 +9,4 @@
design-patterns-cloud
pom
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-creational/pom.xml b/patterns/design-patterns-creational/pom.xml
index 7c2742ade4..21bc13c21c 100644
--- a/patterns/design-patterns-creational/pom.xml
+++ b/patterns/design-patterns-creational/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
design-patterns-creational
1.0
@@ -25,7 +26,6 @@
jsr305
${javax.annotations.version}
-
org.assertj
assertj-core
@@ -40,4 +40,4 @@
3.9.1
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-functional/pom.xml b/patterns/design-patterns-functional/pom.xml
index e5166dc61e..b801781564 100644
--- a/patterns/design-patterns-functional/pom.xml
+++ b/patterns/design-patterns-functional/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
design-patterns-functional
1.0
@@ -13,4 +14,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/patterns/design-patterns-structural/pom.xml b/patterns/design-patterns-structural/pom.xml
index c37b6845be..f0bcb824b5 100644
--- a/patterns/design-patterns-structural/pom.xml
+++ b/patterns/design-patterns-structural/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
design-patterns-structural
1.0
@@ -21,4 +22,4 @@
-
+
\ No newline at end of file
diff --git a/patterns/dip/pom.xml b/patterns/dip/pom.xml
index 7217c4fdcc..44062aaede 100644
--- a/patterns/dip/pom.xml
+++ b/patterns/dip/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.dip
dip
@@ -27,4 +27,4 @@
3.12.1
-
+
\ No newline at end of file
diff --git a/patterns/front-controller/pom.xml b/patterns/front-controller/pom.xml
index dc10250946..d25bd774c6 100644
--- a/patterns/front-controller/pom.xml
+++ b/patterns/front-controller/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
front-controller
front-controller
@@ -36,5 +37,5 @@
-
-
+
+
\ No newline at end of file
diff --git a/patterns/hexagonal-architecture/pom.xml b/patterns/hexagonal-architecture/pom.xml
index 62f55c2efa..f8d4524514 100644
--- a/patterns/hexagonal-architecture/pom.xml
+++ b/patterns/hexagonal-architecture/pom.xml
@@ -1,12 +1,13 @@
-
- 4.0.0
- com.baeldung
- hexagonal-architecture
- 1.0
- hexagonal-architecture
- Project for hexagonal architecture in java
+
+ 4.0.0
+ com.baeldung
+ hexagonal-architecture
+ 1.0
+ hexagonal-architecture
+ Project for hexagonal architecture in java
com.baeldung
@@ -15,46 +16,41 @@
../../parent-boot-2
-
- 1.8
-
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
-
-
- org.springframework.boot
- spring-boot-starter-web
-
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+ org.mockito
+ mockito-core
+ test
+
+
-
- org.springframework.boot
- spring-boot-starter-data-mongodb
-
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.junit.vintage
- junit-vintage-engine
-
-
-
-
- org.mockito
- mockito-core
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
-
+
\ No newline at end of file
diff --git a/patterns/intercepting-filter/pom.xml b/patterns/intercepting-filter/pom.xml
index 7f2f57b5e1..ffc3309ddb 100644
--- a/patterns/intercepting-filter/pom.xml
+++ b/patterns/intercepting-filter/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
intercepting-filter
intercepting-filter
@@ -45,4 +46,4 @@
-
+
\ No newline at end of file
diff --git a/patterns/pom.xml b/patterns/pom.xml
index 112eecb606..3bde26cae2 100644
--- a/patterns/pom.xml
+++ b/patterns/pom.xml
@@ -1,15 +1,18 @@
-
+
4.0.0
patterns
patterns
pom
+
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+
design-patterns-architectural
design-patterns-behavioral
@@ -26,6 +29,7 @@
solid
clean-architecture
+
@@ -36,6 +40,7 @@
+
@@ -52,7 +57,9 @@
+
9.4.0.v20161208
+
\ No newline at end of file
diff --git a/patterns/solid/pom.xml b/patterns/solid/pom.xml
index ad76ea89fd..76ab54cbb2 100644
--- a/patterns/solid/pom.xml
+++ b/patterns/solid/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
solid
1.0-SNAPSHOT
@@ -13,4 +13,4 @@
1.0.0-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/pdf/pom.xml b/pdf/pom.xml
index 7d7754ee73..fb9508156e 100644
--- a/pdf/pom.xml
+++ b/pdf/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
pdf
pdf
@@ -94,4 +95,4 @@
9.1.20
-
+
\ No newline at end of file
diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml
index fb3f82df38..8d402865ef 100644
--- a/performance-tests/pom.xml
+++ b/performance-tests/pom.xml
@@ -1,5 +1,6 @@
-
+
4.0.0
performance-tests
1.0
@@ -22,13 +23,12 @@
com.github.dozermapper
dozer-core
${dozer.version}
-
+
org.mapstruct
mapstruct
${mapstruct.version}
-
org.modelmapper
modelmapper
@@ -42,17 +42,16 @@
org.openjdk.jmh
jmh-core
- ${jmh.version}
+ ${jmh-core.version}
org.openjdk.jmh
jmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
provided
-
@@ -67,7 +66,7 @@
org.openjdk.jmh
jmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
org.mapstruct
@@ -90,16 +89,14 @@
${uberjar.name}
-
+
org.openjdk.jmh.Main
-
+
*:*
META-INF/*.SF
@@ -147,33 +144,19 @@
maven-source-plugin
${source.plugin.version}
-
- maven-surefire-plugin
- ${surefire.plugin.version}
-
-
- 1.23
1.5.4
6.5.0
1.3.1.Final
2.3.8
- 1.6.1.CR2
-
-
+ 1.6.1.CR2
+
1.8
-
-
+
benchmarks
3.1.0
3.0.0-M1
@@ -185,7 +168,6 @@
3.1.0
3.9.1
3.2.1
- 2.17
-
+
\ No newline at end of file
diff --git a/persistence-modules/activejdbc/pom.xml b/persistence-modules/activejdbc/pom.xml
index 84ce1c2b48..5fdf27a679 100644
--- a/persistence-modules/activejdbc/pom.xml
+++ b/persistence-modules/activejdbc/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
activejdbc
1.0-SNAPSHOT
diff --git a/persistence-modules/apache-bookkeeper/pom.xml b/persistence-modules/apache-bookkeeper/pom.xml
index 32467b9997..2d86e3a912 100644
--- a/persistence-modules/apache-bookkeeper/pom.xml
+++ b/persistence-modules/apache-bookkeeper/pom.xml
@@ -2,7 +2,6 @@
-
4.0.0
apache-bookkeeper
0.0.1-SNAPSHOT
@@ -27,20 +26,17 @@
-
org.testcontainers
testcontainers
- 1.14.3
+ ${testcontainers.version}
test
-
4.10.0
+ 1.14.3
-
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/apache-cayenne/pom.xml b/persistence-modules/apache-cayenne/pom.xml
index d728e18b33..87bf6fe30b 100644
--- a/persistence-modules/apache-cayenne/pom.xml
+++ b/persistence-modules/apache-cayenne/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
apache-cayenne
0.0.1-SNAPSHOT
@@ -43,4 +44,4 @@
4.0.M5
-
+
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence-2/README.md b/persistence-modules/core-java-persistence-2/README.md
index 36c33cc6e1..cebd81388d 100644
--- a/persistence-modules/core-java-persistence-2/README.md
+++ b/persistence-modules/core-java-persistence-2/README.md
@@ -2,3 +2,4 @@
- [Getting Database URL From JDBC Connection Object](https://www.baeldung.com/jdbc-get-url-from-connection)
- [JDBC URL Format For Different Databases](https://www.baeldung.com/java-jdbc-url-format)
+- [How to Check if a Database Table Exists with JDBC](https://www.baeldung.com/jdbc-check-table-exists)
diff --git a/persistence-modules/core-java-persistence-2/pom.xml b/persistence-modules/core-java-persistence-2/pom.xml
index a1088b0801..092900b628 100644
--- a/persistence-modules/core-java-persistence-2/pom.xml
+++ b/persistence-modules/core-java-persistence-2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.core-java-persistence-2
core-java-persistence-2
@@ -31,24 +32,15 @@
mysql-connector-java
${mysql.driver.version}
-
+
com.microsoft.sqlserver
mssql-jdbc
${mssql.driver.version}
-
@@ -59,4 +51,4 @@
8.0.22
-
+
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/tableexists/DatabaseConfig.java b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/tableexists/DatabaseConfig.java
new file mode 100644
index 0000000000..4ea8a5203e
--- /dev/null
+++ b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/tableexists/DatabaseConfig.java
@@ -0,0 +1,21 @@
+package com.baeldung.tableexists;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+class DatabaseConfig {
+ static Connection connect() throws ClassNotFoundException, SQLException {
+ Class.forName("org.h2.Driver");
+ String url = "jdbc:h2:mem:testdb";
+ return DriverManager.getConnection(url, "user", "password");
+ }
+
+ static void createTables(Connection connection) throws SQLException {
+ connection.createStatement().executeUpdate("create table EMPLOYEE (id int primary key auto_increment, name VARCHAR(255))");
+ }
+
+ static void dropTables(Connection connection) throws SQLException {
+ connection.createStatement().executeUpdate("drop table EMPLOYEE");
+ }
+}
diff --git a/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/tableexists/TableChecker.java b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/tableexists/TableChecker.java
new file mode 100644
index 0000000000..e6b2ea2fcf
--- /dev/null
+++ b/persistence-modules/core-java-persistence-2/src/main/java/com/baeldung/tableexists/TableChecker.java
@@ -0,0 +1,35 @@
+package com.baeldung.tableexists;
+
+import java.sql.*;
+
+class TableChecker {
+ static void printAllTables(Connection connection, String tableName) throws SQLException {
+ DatabaseMetaData databaseMetaData = connection.getMetaData();
+ ResultSet resultSet = databaseMetaData.getTables(null, null, tableName, new String[] {"TABLE"});
+
+ while (resultSet.next()) {
+ String name = resultSet.getString("TABLE_NAME");
+ String schema = resultSet.getString("TABLE_SCHEM");
+ System.out.println(name + " on schema " + schema);
+ }
+ }
+
+ static boolean tableExists(Connection connection, String tableName) throws SQLException {
+ DatabaseMetaData meta = connection.getMetaData();
+ ResultSet resultSet = meta.getTables(null, null, tableName, new String[] {"TABLE"});
+
+ return resultSet.next();
+ }
+
+ static boolean tableExistsSQL(Connection connection, String tableName) throws SQLException {
+ PreparedStatement preparedStatement = connection.prepareStatement("SELECT count(*) " +
+ "FROM information_schema.tables " +
+ "WHERE table_name = ?" +
+ "LIMIT 1;");
+ preparedStatement.setString(1, tableName);
+
+ ResultSet resultSet = preparedStatement.executeQuery();
+ resultSet.next();
+ return resultSet.getInt(1) != 0;
+ }
+}
diff --git a/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/tableexists/TableCheckerTest.java b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/tableexists/TableCheckerTest.java
new file mode 100644
index 0000000000..d7322332a5
--- /dev/null
+++ b/persistence-modules/core-java-persistence-2/src/test/java/com/baeldung/tableexists/TableCheckerTest.java
@@ -0,0 +1,70 @@
+package com.baeldung.tableexists;
+
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class TableCheckerUnitTest {
+
+ @Test
+ void givenCreatedTable_shouldFindTable() throws SQLException, ClassNotFoundException {
+ // given
+ Connection connection = DatabaseConfig.connect();
+ DatabaseConfig.createTables(connection);
+
+ // when
+ boolean tableExists = TableChecker.tableExists(connection, "EMPLOYEE");
+
+ // then
+ TableChecker.printAllTables(connection, null);
+ assertTrue(tableExists);
+
+ DatabaseConfig.dropTables(connection);
+ }
+
+ @Test
+ void givenCreatedTable_shouldFindTableWithSQL() throws SQLException, ClassNotFoundException {
+ // given
+ Connection connection = DatabaseConfig.connect();
+ DatabaseConfig.createTables(connection);
+
+ // when
+ boolean tableExists = TableChecker.tableExistsSQL(connection, "EMPLOYEE");
+
+ // then
+ TableChecker.printAllTables(connection, null);
+ assertTrue(tableExists);
+
+ DatabaseConfig.dropTables(connection);
+ }
+
+ @Test
+ void givenNoTable_shouldNotFindTable() throws SQLException, ClassNotFoundException {
+ // given
+ Connection connection = DatabaseConfig.connect();
+
+ // when
+ boolean tableExists = TableChecker.tableExists(connection, "EMPLOYEE");
+
+ // then
+ TableChecker.printAllTables(connection, null);
+ assertFalse(tableExists);
+ }
+
+ @Test
+ void givenNoTable_shouldNotFindTableWithSQL() throws SQLException, ClassNotFoundException {
+ // given
+ Connection connection = DatabaseConfig.connect();
+
+ // when
+ boolean tableExists = TableChecker.tableExistsSQL(connection, "EMPLOYEE");
+
+ // then
+ TableChecker.printAllTables(connection, null);
+ assertFalse(tableExists);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml
index 3dd8da1b7a..f1d779cf2f 100644
--- a/persistence-modules/core-java-persistence/pom.xml
+++ b/persistence-modules/core-java-persistence/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.core-java-persistence
core-java-persistence
diff --git a/persistence-modules/deltaspike/pom.xml b/persistence-modules/deltaspike/pom.xml
index 955ad4abe8..af02ba76c0 100644
--- a/persistence-modules/deltaspike/pom.xml
+++ b/persistence-modules/deltaspike/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
deltaspike
1.0
@@ -16,44 +17,39 @@
-
-
-
+
javax.enterprise
cdi-api
provided
-
-
+
org.jboss.spec.javax.annotation
jboss-annotations-api_1.2_spec
provided
-
org.jboss.resteasy
jaxrs-api
provided
-
org.hibernate.javax.persistence
hibernate-jpa-2.1-api
provided
-
org.jboss.spec.javax.ejb
jboss-ejb-api_3.2_spec
provided
-
@@ -68,62 +64,54 @@
-
org.jboss.spec.javax.faces
jboss-jsf-api_2.2_spec
provided
-
-
org.hibernate
hibernate-jpamodelgen
provided
-
-
+
org.hibernate
hibernate-validator-annotation-processor
provided
-
-
+
org.jboss.arquillian.junit
arquillian-junit-container
test
-
org.jboss.arquillian.protocol
arquillian-protocol-servlet
test
-
org.jboss.shrinkwrap.resolver
shrinkwrap-resolver-impl-maven
test
-
org.apache.deltaspike.modules
deltaspike-data-module-api
compile
-
org.apache.deltaspike.modules
deltaspike-data-module-impl
runtime
-
com.mysema.querydsl
@@ -131,74 +119,64 @@
${querydsl.version}
provided
-
com.mysema.querydsl
querydsl-jpa
${querydsl.version}
-
org.apache.deltaspike.modules
deltaspike-test-control-module-api
test
-
org.apache.deltaspike.modules
deltaspike-test-control-module-impl
test
-
org.apache.deltaspike.cdictrl
deltaspike-cdictrl-weld
test
-
org.jboss.weld.se
weld-se-core
${weld.version}
test
-
org.hibernate
hibernate-core
provided
-
org.jboss
jandex
${jandex.version}
-
com.h2database
h2
${h2.version}
test
-
org.hibernate
hibernate-entitymanager
provided
-
org.apache.commons
commons-lang3
${commons-lang3.version}
-
-
+
${project.artifactId}
@@ -237,9 +215,9 @@
-
-
+
arq-wildfly-managed
@@ -259,6 +237,7 @@
http://www.apache.org/licenses/LICENSE-2.0.html
+
redhat-repository-techpreview
@@ -268,10 +247,12 @@
-
+
org.wildfly.bom
jboss-javaee-7.0-with-tools
@@ -310,4 +291,4 @@
1.2.5.Final-redhat-1
-
+
\ No newline at end of file
diff --git a/persistence-modules/elasticsearch/pom.xml b/persistence-modules/elasticsearch/pom.xml
index 654d43d622..f04cb3973f 100644
--- a/persistence-modules/elasticsearch/pom.xml
+++ b/persistence-modules/elasticsearch/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
elasticsearch
0.0.1-SNAPSHOT
@@ -29,5 +30,5 @@
6.3.1
-
-
+
+
\ No newline at end of file
diff --git a/persistence-modules/flyway-repair/pom.xml b/persistence-modules/flyway-repair/pom.xml
index 2c283cfc04..1a5384a916 100644
--- a/persistence-modules/flyway-repair/pom.xml
+++ b/persistence-modules/flyway-repair/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
flyway-repair
flyway-repair
@@ -39,7 +40,6 @@
-
h2
@@ -56,7 +56,6 @@
-
postgres
@@ -70,12 +69,10 @@
-
src/main/resources/application-${spring-boot.run.profiles}.properties
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml
index c4a3363bdc..65534b6f0a 100644
--- a/persistence-modules/flyway/pom.xml
+++ b/persistence-modules/flyway/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
flyway
flyway
@@ -65,7 +66,6 @@
5.2.3
5.0.2
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/hbase/pom.xml b/persistence-modules/hbase/pom.xml
index f54f2d8985..e38b73e137 100644
--- a/persistence-modules/hbase/pom.xml
+++ b/persistence-modules/hbase/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
hbase
hbase
diff --git a/persistence-modules/hibernate-annotations/README.md b/persistence-modules/hibernate-annotations/README.md
index 393cf82bfd..7d7740a069 100644
--- a/persistence-modules/hibernate-annotations/README.md
+++ b/persistence-modules/hibernate-annotations/README.md
@@ -8,3 +8,4 @@ This module contains articles about Annotations used in Hibernate.
- [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby)
- [Hibernate One to Many Annotation Tutorial](https://www.baeldung.com/hibernate-one-to-many)
- [Hibernate @WhereJoinTable Annotation](https://www.baeldung.com/hibernate-wherejointable)
+- [Usage of the Hibernate @LazyCollection Annotation](https://www.baeldung.com/hibernate-lazycollection)
diff --git a/persistence-modules/hibernate-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml
index d3b786d6c8..e5c19915a4 100644
--- a/persistence-modules/hibernate-annotations/pom.xml
+++ b/persistence-modules/hibernate-annotations/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
hibernate-annotations
@@ -20,32 +21,28 @@
hibernate-core
${hibernate-core.version}
-
com.h2database
h2
${h2.version}
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
-
org.hibernate
hibernate-testing
${hibernate-core.version}
-
org.hibernate
hibernate-spatial
${hibernate-core.version}
-
+
5.4.7.Final
1.4.200
@@ -55,4 +52,4 @@
1.4.200
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java
new file mode 100644
index 0000000000..de88647546
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Branch.java
@@ -0,0 +1,103 @@
+package com.baeldung.hibernate.lazycollection.model;
+
+import org.hibernate.annotations.LazyCollection;
+import org.hibernate.annotations.LazyCollectionOption;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OrderColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.Entity;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+public class Branch {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String name;
+
+ public Branch() {
+ }
+ public Branch(String name) {
+ this.name = name;
+ }
+
+ @OneToMany(mappedBy = "mainBranch")
+ @LazyCollection(LazyCollectionOption.TRUE)
+ private List mainEmployees;
+
+ @OneToMany(mappedBy = "subBranch")
+ @LazyCollection(LazyCollectionOption.FALSE)
+ private List subEmployees;
+
+ @OneToMany(mappedBy = "additionalBranch")
+ @LazyCollection(LazyCollectionOption.EXTRA)
+ @OrderColumn(name = "order_id")
+ private List additionalEmployees;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getMainEmployees() {
+ return mainEmployees;
+ }
+
+ public void setMainEmployees(List mainEmployees) {
+ this.mainEmployees = mainEmployees;
+ }
+
+ public List getSubEmployees() {
+ return subEmployees;
+ }
+
+ public void setSubEmployees(List subEmployees) {
+ this.subEmployees = subEmployees;
+ }
+
+ public List getAdditionalEmployees() {
+ return additionalEmployees;
+ }
+
+ public void setAdditionalEmployees(List additionalEmployees) {
+ this.additionalEmployees = additionalEmployees;
+ }
+
+ public void addMainEmployee(Employee employee) {
+ if (this.mainEmployees == null) {
+ this.mainEmployees = new ArrayList<>();
+ }
+ this.mainEmployees.add(employee);
+ }
+
+ public void addSubEmployee(Employee employee) {
+ if (this.subEmployees == null) {
+ this.subEmployees = new ArrayList<>();
+ }
+ this.subEmployees.add(employee);
+ }
+
+ public void addAdditionalEmployee(Employee employee) {
+ if (this.additionalEmployees == null) {
+ this.additionalEmployees = new ArrayList<>();
+ }
+ this.additionalEmployees.add(employee);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java
new file mode 100644
index 0000000000..831518a365
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/lazycollection/model/Employee.java
@@ -0,0 +1,88 @@
+package com.baeldung.hibernate.lazycollection.model;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OrderColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Entity;
+
+@Entity
+public class Employee {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String name;
+
+ private String address;
+
+ public Employee() {
+
+ }
+
+ public Employee(String name, Branch mainBranch, Branch subBranch, Branch additionalBranch) {
+ this.name = name;
+ this.mainBranch = mainBranch;
+ this.subBranch = subBranch;
+ this.additionalBranch = additionalBranch;
+ }
+
+ @ManyToOne
+ private Branch mainBranch;
+
+ @ManyToOne
+ private Branch subBranch;
+
+ @ManyToOne
+ private Branch additionalBranch;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public Branch getMainBranch() {
+ return mainBranch;
+ }
+
+ public void setMainBranch(Branch mainBranch) {
+ this.mainBranch = mainBranch;
+ }
+
+ public Branch getSubBranch() {
+ return subBranch;
+ }
+
+ public void setSubBranch(Branch subBranch) {
+ this.subBranch = subBranch;
+ }
+
+ public Branch getAdditionalBranch() {
+ return additionalBranch;
+ }
+
+ public void setAdditionalBranch(Branch additionalBranch) {
+ this.additionalBranch = additionalBranch;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/lazycollection/LazyCollectionIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/lazycollection/LazyCollectionIntegrationTest.java
new file mode 100644
index 0000000000..97888471a4
--- /dev/null
+++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/lazycollection/LazyCollectionIntegrationTest.java
@@ -0,0 +1,104 @@
+package com.baeldung.hibernate.lazycollection;
+
+import com.baeldung.hibernate.lazycollection.model.Branch;
+import com.baeldung.hibernate.lazycollection.model.Employee;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.service.ServiceRegistry;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.annotation.PostConstruct;
+
+public class LazyCollectionIntegrationTest {
+
+ private static SessionFactory sessionFactory;
+
+ private Session session;
+
+ Branch branch;
+
+ @BeforeClass
+ public static void beforeTests() {
+ Configuration configuration = new Configuration().addAnnotatedClass(Branch.class)
+ .addAnnotatedClass(Employee.class).setProperty("hibernate.dialect", H2Dialect.class.getName())
+ .setProperty("hibernate.connection.driver_class", org.h2.Driver.class.getName())
+ .setProperty("hibernate.connection.url", "jdbc:h2:mem:test")
+ .setProperty("hibernate.connection.username", "sa").setProperty("hibernate.connection.password", "")
+ .setProperty("hibernate.hbm2ddl.auto", "update");
+
+ ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
+ .applySettings(configuration.getProperties()).build();
+
+ sessionFactory = configuration.buildSessionFactory(serviceRegistry);
+
+ }
+
+ @Before
+ public void setUp() {
+ session = sessionFactory.openSession();
+ session.beginTransaction();
+
+ branch = new Branch("Main Branch");
+
+ session.save(branch);
+
+ Employee mainEmployee1 = new Employee("main employee 1", branch, null, null);
+ Employee mainEmployee2 = new Employee("main employee 2", branch, null, null);
+ Employee mainEmployee3 = new Employee("main employee 3", branch, null, null);
+
+ session.save(mainEmployee1);
+ session.save(mainEmployee2);
+ session.save(mainEmployee3);
+
+ Employee subEmployee1 = new Employee("sub employee 1", null, branch, null);
+ Employee subEmployee2 = new Employee("sub employee 2", null, branch, null);
+ Employee subEmployee3 = new Employee("sub employee 3", null, branch, null);
+
+ session.save(subEmployee1);
+ session.save(subEmployee2);
+ session.save(subEmployee3);
+
+ Employee additionalEmployee1 = new Employee("additional employee 1", null, null, branch);
+ Employee additionalEmployee2 = new Employee("additional employee 2", null, null, branch);
+ Employee additionalEmployee3 = new Employee("additional employee 3", null, null, branch);
+
+ session.save(additionalEmployee1);
+ session.save(additionalEmployee2);
+ session.save(additionalEmployee3);
+
+ session.flush();
+ session.refresh(branch);
+ session.getTransaction().commit();
+ session.close();
+ }
+
+ @Test
+ public void testLazyFetching() {
+ Assert.assertFalse(Hibernate.isInitialized(branch.getMainEmployees()));
+ }
+
+ @Test
+ public void testEagerFetching() {
+ Assert.assertTrue(Hibernate.isInitialized(branch.getSubEmployees()));
+ }
+
+ @Test
+ public void testExtraFetching() {
+ Assert.assertFalse(Hibernate.isInitialized(branch.getAdditionalEmployees()));
+ }
+
+ @AfterClass
+ public static void afterTests() {
+ sessionFactory.close();
+ }
+}
diff --git a/persistence-modules/hibernate-enterprise/pom.xml b/persistence-modules/hibernate-enterprise/pom.xml
index c088cc1eca..dadfa211be 100644
--- a/persistence-modules/hibernate-enterprise/pom.xml
+++ b/persistence-modules/hibernate-enterprise/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
hibernate-enterprise
0.0.1-SNAPSHOT
@@ -92,4 +92,4 @@
2.3.4
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-exceptions/pom.xml b/persistence-modules/hibernate-exceptions/pom.xml
index f7eee22960..89e1f4ca7e 100644
--- a/persistence-modules/hibernate-exceptions/pom.xml
+++ b/persistence-modules/hibernate-exceptions/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
hibernate-exceptions
0.0.1-SNAPSHOT
@@ -35,4 +36,4 @@
2.3.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml
index 07b1ee1c51..6d300c620b 100644
--- a/persistence-modules/hibernate-jpa/pom.xml
+++ b/persistence-modules/hibernate-jpa/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
hibernate-jpa
0.0.1-SNAPSHOT
@@ -79,7 +79,7 @@
org.openjdk.jmh
jmh-generator-annprocess
- ${openjdk-jmh.version}
+ ${jmh-generator.version}
org.postgresql
@@ -94,8 +94,7 @@
42.2.11
2.2.3
3.8.0
- 1.21
2.1.7.RELEASE
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-libraries/pom.xml b/persistence-modules/hibernate-libraries/pom.xml
index f67309cf43..19537156aa 100644
--- a/persistence-modules/hibernate-libraries/pom.xml
+++ b/persistence-modules/hibernate-libraries/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
hibernate-libraries
@@ -125,7 +126,7 @@
- hibernate-types
+ hibernate-libraries
src/main/resources
@@ -158,7 +159,7 @@
-
+
@@ -175,7 +176,6 @@
2.0.0
1.2.3
3.0.2
- 2.22.2
3.8.1
3.8.1
8.0.19
@@ -183,4 +183,4 @@
2.1.3.RELEASE
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-mapping/README.md b/persistence-modules/hibernate-mapping/README.md
index b5d0cb2f99..984f49bb70 100644
--- a/persistence-modules/hibernate-mapping/README.md
+++ b/persistence-modules/hibernate-mapping/README.md
@@ -13,3 +13,4 @@ This module contains articles about Object-relational Mapping (ORM) with Hiberna
- [Hibernate – Mapping Date and Time](https://www.baeldung.com/hibernate-date-time)
- [Mapping LOB Data in Hibernate](https://www.baeldung.com/hibernate-lob)
- [FetchMode in Hibernate](https://www.baeldung.com/hibernate-fetchmode)
+- [Mapping PostgreSQL Array With Hibernate](https://www.baeldung.com/java-hibernate-map-postgresql-array)
diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml
index ebc854a621..0248f0cb04 100644
--- a/persistence-modules/hibernate-mapping/pom.xml
+++ b/persistence-modules/hibernate-mapping/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
hibernate-mapping
hibernate-mapping
@@ -13,11 +13,22 @@
+
+ org.postgresql
+ postgresql
+ ${postgresql.version}
+ test
+
org.hibernate
hibernate-core
${hibernate.version}
+
+ com.vladmihalcea
+ hibernate-types-52
+ ${hibernate-types.version}
+
org.assertj
assertj-core
@@ -61,16 +72,17 @@
commons-io
${commons-io.version}
-
+ 42.2.20
5.4.12.Final
+ 2.10.4
3.8.0
6.0.16.Final
- 3.0.1-b11
+ 3.0.1-b11
1.0.3
1.3
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java
new file mode 100644
index 0000000000..233bb95dc1
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomIntegerArrayType.java
@@ -0,0 +1,85 @@
+package com.baeldung.hibernate.arraymapping;
+
+import java.io.Serializable;
+import java.sql.Array;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Arrays;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.usertype.UserType;
+
+public class CustomIntegerArrayType implements UserType {
+
+ @Override
+ public int[] sqlTypes() {
+ return new int[]{Types.ARRAY};
+ }
+
+ @Override
+ public Class returnedClass() {
+ return Integer[].class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if (x instanceof Integer[] && y instanceof Integer[]) {
+ return Arrays.deepEquals((Integer[])x, (Integer[])y);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return Arrays.hashCode((Integer[])x);
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner)
+ throws HibernateException, SQLException {
+ Array array = rs.getArray(names[0]);
+ return array != null ? array.getArray() : null;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session)
+ throws HibernateException, SQLException {
+ if (value != null && st != null) {
+ Array array = session.connection().createArrayOf("int", (Integer[])value);
+ st.setArray(index, array);
+ } else {
+ st.setNull(index, sqlTypes()[0]);
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+ Integer[] a = (Integer[])value;
+ return Arrays.copyOf(a, a.length);
+ }
+
+ @Override
+ public boolean isMutable() {
+ return false;
+ }
+
+ @Override
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ @Override
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ @Override
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+
+}
diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java
new file mode 100644
index 0000000000..7bd284def7
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/CustomStringArrayType.java
@@ -0,0 +1,85 @@
+package com.baeldung.hibernate.arraymapping;
+
+import java.io.Serializable;
+import java.sql.Array;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Arrays;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.usertype.UserType;
+
+public class CustomStringArrayType implements UserType {
+
+ @Override
+ public int[] sqlTypes() {
+ return new int[]{Types.ARRAY};
+ }
+
+ @Override
+ public Class returnedClass() {
+ return String[].class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if (x instanceof String[] && y instanceof String[]) {
+ return Arrays.deepEquals((String[])x, (String[])y);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return Arrays.hashCode((String[])x);
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner)
+ throws HibernateException, SQLException {
+ Array array = rs.getArray(names[0]);
+ return array != null ? array.getArray() : null;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session)
+ throws HibernateException, SQLException {
+ if (value != null && st != null) {
+ Array array = session.connection().createArrayOf("text", (String[])value);
+ st.setArray(index, array);
+ } else {
+ st.setNull(index, sqlTypes()[0]);
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+ String[] a = (String[])value;
+ return Arrays.copyOf(a, a.length);
+ }
+
+ @Override
+ public boolean isMutable() {
+ return false;
+ }
+
+ @Override
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ @Override
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ @Override
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+
+}
diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/HibernateSessionUtil.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/HibernateSessionUtil.java
new file mode 100644
index 0000000000..dc3ec93a9d
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/HibernateSessionUtil.java
@@ -0,0 +1,61 @@
+package com.baeldung.hibernate.arraymapping;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
+
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.service.ServiceRegistry;
+
+import com.baeldung.hibernate.arraymapping.User;
+
+public class HibernateSessionUtil {
+
+ private static SessionFactory sessionFactory;
+ private static String PROPERTY_FILE_NAME;
+
+ public static SessionFactory getSessionFactory() throws IOException {
+ return getSessionFactory(null);
+ }
+
+ public static SessionFactory getSessionFactory(String propertyFileName) throws IOException {
+ PROPERTY_FILE_NAME = propertyFileName;
+ if (sessionFactory == null) {
+ ServiceRegistry serviceRegistry = configureServiceRegistry();
+ sessionFactory = makeSessionFactory(serviceRegistry);
+ }
+ return sessionFactory;
+ }
+
+ private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) {
+ MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+ metadataSources.addAnnotatedClass(User.class);
+
+ Metadata metadata = metadataSources.buildMetadata();
+ return metadata.getSessionFactoryBuilder()
+ .build();
+
+ }
+
+ private static ServiceRegistry configureServiceRegistry() throws IOException {
+ Properties properties = getProperties();
+ return new StandardServiceRegistryBuilder().applySettings(properties)
+ .build();
+ }
+
+ private static Properties getProperties() throws IOException {
+ Properties properties = new Properties();
+ URL propertiesURL = Thread.currentThread()
+ .getContextClassLoader()
+ .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate_postgres.properties"));
+ try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) {
+ properties.load(inputStream);
+ }
+ return properties;
+ }
+}
diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java
new file mode 100644
index 0000000000..018bedc349
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/arraymapping/User.java
@@ -0,0 +1,82 @@
+package com.baeldung.hibernate.arraymapping;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Type;
+
+import com.vladmihalcea.hibernate.type.array.StringArrayType;
+
+import org.hibernate.annotations.*;
+
+@TypeDefs({
+ @TypeDef(
+ name = "string-array",
+ typeClass = StringArrayType.class
+ )
+})
+@Entity
+public class User {
+
+ @Id
+ private Long id;
+
+ private String name;
+
+ @Column(columnDefinition = "text[]")
+ @Type(type = "com.baeldung.hibernate.arraymapping.CustomStringArrayType")
+ private String[] roles;
+
+ @Column(columnDefinition = "int[]")
+ @Type(type = "com.baeldung.hibernate.arraymapping.CustomIntegerArrayType")
+ private Integer[] locations;
+
+ @Type(type = "string-array")
+ @Column(
+ name = "phone_numbers",
+ columnDefinition = "text[]"
+ )
+ private String[] phoneNumbers;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String[] getRoles() {
+ return roles;
+ }
+
+ public void setRoles(String[] roles) {
+ this.roles = roles;
+ }
+
+ public Integer[] getLocations() {
+ return locations;
+ }
+
+ public void setLocations(Integer[] locations) {
+ this.locations = locations;
+ }
+
+ public String[] getPhoneNumbers() {
+ return phoneNumbers;
+ }
+
+ public void setPhoneNumbers(String[] phoneNumbers) {
+ this.phoneNumbers = phoneNumbers;
+ }
+
+}
diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/arraymapping/ArrayMappingIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/arraymapping/ArrayMappingIntegrationTest.java
new file mode 100644
index 0000000000..ba0ccc2aa2
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/arraymapping/ArrayMappingIntegrationTest.java
@@ -0,0 +1,133 @@
+package com.baeldung.hibernate.arraymapping;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+
+public class ArrayMappingIntegrationTest {
+
+ private Session session;
+ private Transaction transaction;
+
+ @BeforeEach
+ public void setup() throws IOException {
+ try {
+ session = HibernateSessionUtil.getSessionFactory().openSession();
+ transaction = session.beginTransaction();
+
+ bootstrapData();
+
+ } catch (HibernateException | IOException e) {
+ System.out.println("Can't connect to a PostgreSQL DB");
+ }
+ }
+
+ @AfterEach
+ public void cleanup() {
+ if (null != session) {
+ transaction.rollback();
+ session.close();
+ }
+ }
+
+ @Test
+ public void givenArrayMapping_whenQueried_thenReturnArraysFromDB() throws HibernateException, IOException {
+ if (null != session) {
+ User user = session.find(User.class, 1L);
+
+ assertEquals("john", user.getName());
+ assertEquals("superuser", user.getRoles()[0]);
+ assertEquals("admin", user.getRoles()[1]);
+ assertEquals(100, user.getLocations()[0]);
+ assertEquals(389, user.getLocations()[1]);
+ assertEquals("7000000000", user.getPhoneNumbers()[0]);
+ assertEquals("8000000000", user.getPhoneNumbers()[1]);
+ }
+ }
+
+ @Test
+ public void givenArrayMapping_whenArraysAreInserted_thenPersistInDB() throws HibernateException, IOException {
+ if (null != session) {
+ transaction = session.beginTransaction();
+
+ User user = new User();
+ user.setId(2L);
+ user.setName("smith");
+
+ String[] roles = {"admin", "employee"};
+ user.setRoles(roles);
+
+ Integer[] locations = {190, 578};
+ user.setLocations(locations);
+
+ session.persist(user);
+ session.flush();
+ session.clear();
+
+ transaction.commit();
+
+ User userDBObj = session.find(User.class, 2L);
+
+ assertEquals("smith", userDBObj.getName());
+ assertEquals("admin", userDBObj.getRoles()[0]);
+ assertEquals(578, userDBObj.getLocations()[1]);
+ }
+ }
+
+ @Test
+ public void givenArrayMapping_whenArrayIsUpdated_thenPersistInDB() throws HibernateException, IOException {
+ if (null != session) {
+ transaction = session.beginTransaction();
+
+ User user = session.find(User.class, 1L);
+
+ String[] updatedRoles = {"superuser", "superadmin"};
+ String[] updatedPhoneNumbers = {"9000000000"};
+
+ user.setRoles(updatedRoles);
+ user.setPhoneNumbers(updatedPhoneNumbers);
+
+ session.persist(user);
+ session.flush();
+ session.clear();
+
+ User userDBObj = session.find(User.class, 1L);
+
+ assertEquals("john", userDBObj.getName());
+ assertEquals("superadmin", userDBObj.getRoles()[1]);
+ assertEquals("9000000000", userDBObj.getPhoneNumbers()[0]);
+ }
+ }
+
+ public void bootstrapData() {
+ session.createQuery("delete from User").executeUpdate();
+
+ User user = new User();
+ user.setId(1L);
+ user.setName("john");
+
+ String[] roles = {"superuser", "admin"};
+ user.setRoles(roles);
+
+ Integer[] locations = {100, 389};
+ user.setLocations(locations);
+
+ String[] phoneNumbers = {"7000000000", "8000000000"};
+ user.setPhoneNumbers(phoneNumbers);
+
+ session.persist(user);
+ session.flush();
+ session.clear();
+
+ transaction.commit();
+ }
+
+}
diff --git a/persistence-modules/hibernate-mapping/src/test/resources/hibernate_postgres.properties b/persistence-modules/hibernate-mapping/src/test/resources/hibernate_postgres.properties
new file mode 100644
index 0000000000..72e3dcd781
--- /dev/null
+++ b/persistence-modules/hibernate-mapping/src/test/resources/hibernate_postgres.properties
@@ -0,0 +1,14 @@
+hibernate.connection.driver_class=org.postgresql.Driver
+hibernate.connection.url=jdbc:postgresql://localhost:5432/postgres
+hibernate.connection.username=web
+hibernate.connection.autocommit=true
+jdbc.password=
+
+hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=none
+
+hibernate.c3p0.min_size=5
+hibernate.c3p0.max_size=20
+hibernate.c3p0.acquire_increment=5
+hibernate.c3p0.timeout=1800
diff --git a/persistence-modules/hibernate-ogm/pom.xml b/persistence-modules/hibernate-ogm/pom.xml
index 8f42c28eee..58098ebb65 100644
--- a/persistence-modules/hibernate-ogm/pom.xml
+++ b/persistence-modules/hibernate-ogm/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
hibernate-ogm
0.0.1-SNAPSHOT
@@ -45,5 +46,5 @@
1.4
5.5.23.Final
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml
index 4374c833c2..4a8c578aba 100644
--- a/persistence-modules/hibernate-queries/pom.xml
+++ b/persistence-modules/hibernate-queries/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
hibernate-queries
0.0.1-SNAPSHOT
@@ -53,7 +53,7 @@
org.openjdk.jmh
jmh-generator-annprocess
- ${openjdk-jmh.version}
+ ${jmh-generator.version}
@@ -61,7 +61,6 @@
6.0.6
2.2.3
3.8.0
- 1.21
-
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml
index 3feffc98fd..9b4ffff739 100644
--- a/persistence-modules/hibernate5/pom.xml
+++ b/persistence-modules/hibernate5/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
hibernate5
0.0.1-SNAPSHOT
@@ -55,11 +55,10 @@
jackson-databind
${jackson.version}
-
org.openjdk.jmh
jmh-generator-annprocess
- ${openjdk-jmh.version}
+ ${jmh-generator.version}
@@ -68,7 +67,6 @@
6.0.6
2.2.3
3.8.0
- 1.21
-
+
\ No newline at end of file
diff --git a/persistence-modules/influxdb/pom.xml b/persistence-modules/influxdb/pom.xml
index 23ae64dca1..401e4c3ea7 100644
--- a/persistence-modules/influxdb/pom.xml
+++ b/persistence-modules/influxdb/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
influxdb
0.1-SNAPSHOT
@@ -20,7 +21,6 @@
influxdb-java
${influxdb.sdk.version}
-
org.projectlombok
lombok
@@ -34,4 +34,4 @@
2.8
-
+
\ No newline at end of file
diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml
index 091efaeff4..ad80fc8a83 100644
--- a/persistence-modules/java-cassandra/pom.xml
+++ b/persistence-modules/java-cassandra/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
java-cassandra
@@ -25,14 +26,12 @@
-
org.cassandraunit
cassandra-unit
${cassandra-unit.version}
-
com.datastax.oss
@@ -53,4 +52,4 @@
4.1.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/java-cockroachdb/pom.xml b/persistence-modules/java-cockroachdb/pom.xml
index e8c6365ca3..588ad29cb1 100644
--- a/persistence-modules/java-cockroachdb/pom.xml
+++ b/persistence-modules/java-cockroachdb/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
java-cockroachdb
1.0-SNAPSHOT
diff --git a/persistence-modules/java-jdbi/pom.xml b/persistence-modules/java-jdbi/pom.xml
index eb0de45593..e08b3a3c35 100644
--- a/persistence-modules/java-jdbi/pom.xml
+++ b/persistence-modules/java-jdbi/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
java-jdbi
1.0-SNAPSHOT
diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml
index ab5bb39dfc..daa775f39d 100644
--- a/persistence-modules/java-jpa-2/pom.xml
+++ b/persistence-modules/java-jpa-2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
java-jpa-2
java-jpa-2
@@ -27,14 +28,12 @@
h2
${h2.version}
-
javax.persistence
javax.persistence-api
${javax.persistence-api.version}
-
org.eclipse.persistence
@@ -59,7 +58,6 @@
querydsl-jpa
${querydsl.version}
-
org.assertj
assertj-core
@@ -149,4 +147,4 @@
4.3.1
-
+
\ No newline at end of file
diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml
index 7c02cc6c8e..11673935b1 100644
--- a/persistence-modules/java-jpa-3/pom.xml
+++ b/persistence-modules/java-jpa-3/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
java-jpa-3
java-jpa-3
@@ -30,17 +31,17 @@
mysql
mysql-connector-java
- 8.0.21
+ ${mysql.version}
com.fasterxml.jackson.core
jackson-databind
- 2.11.3
+ ${jackson.version}
com.fasterxml.jackson.datatype
jackson-datatype-hibernate5
- 2.9.8
+ ${jackson.version}
@@ -48,7 +49,6 @@
javax.persistence-api
${javax.persistence-api.version}
-
org.eclipse.persistence
@@ -87,6 +87,7 @@
5.4.14.Final
2.7.4
42.2.5
+ 8.0.21
2.2
3.11.1
3.5.1
@@ -94,4 +95,4 @@
3.0.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java
index 9285c23dfa..d121c81c6b 100644
--- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/ignorable/fields/HibernateConfig.java
@@ -9,6 +9,7 @@ import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry;
public class HibernateConfig {
+
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
@@ -16,12 +17,12 @@ public class HibernateConfig {
Configuration configuration = new Configuration();
Properties settings = new Properties();
- settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver");
- settings.put(Environment.URL, "jdbc:mysql://localhost:3306/app_db?useSSL=false");
- settings.put(Environment.USER, "root");
- settings.put(Environment.PASS, "password");
- settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect");
- settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
+ settings.put(Environment.DRIVER, "org.h2.Driver");
+ settings.put(Environment.URL, "jdbc:h2:mem:test");
+ settings.put(Environment.USER, "sa");
+ settings.put(Environment.PASS, "");
+ settings.put(Environment.DIALECT, "org.hibernate.dialect.H2Dialect");
+ settings.put(Environment.HBM2DDL_AUTO, "create-drop");
configuration.setProperties(settings);
configuration.addAnnotatedClass(User.class);
diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldUnitTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldUnitTest.java
index 114a4cca4c..6d4eba2c29 100644
--- a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldUnitTest.java
+++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/ignorable/fields/TransientFieldUnitTest.java
@@ -1,18 +1,24 @@
package com.baeldung.ignorable.fields;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-
-import java.io.*;
-import java.util.List;
-import java.util.Random;
-
-import org.junit.Test;
-
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Random;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
public class TransientFieldUnitTest {
@@ -34,18 +40,20 @@ public class TransientFieldUnitTest {
@Test
public void givenFieldWithTransientAnnotation_whenSerializingObject_thenFieldSerialized() throws IOException, ClassNotFoundException {
- FileOutputStream fout = new FileOutputStream("test.obj");
- ObjectOutputStream out = new ObjectOutputStream(fout);
- out.writeObject(user);
- out.flush();
- out.close();
+ try (FileOutputStream fout = new FileOutputStream("test.obj")) {
+ ObjectOutputStream out = new ObjectOutputStream(fout);
+ out.writeObject(user);
+ out.flush();
+ }
- FileInputStream fin = new FileInputStream("test.obj");
- ObjectInputStream in = new ObjectInputStream(fin);
- User savedUser = (User) in.readObject();
- in.close();
+ try (FileInputStream fin = new FileInputStream("test.obj")) {
+ ObjectInputStream in = new ObjectInputStream(fin);
+ User savedUser = (User) in.readObject();
- assertEquals(user.getCurrentDevice(), savedUser.getCurrentDevice());
+ assertEquals(user.getCurrentDevice(), savedUser.getCurrentDevice());
+ }
+
+ Files.deleteIfExists(Paths.get("test.obj"));
}
@Test
diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml
index 3601721dac..bb87c10edb 100644
--- a/persistence-modules/java-jpa/pom.xml
+++ b/persistence-modules/java-jpa/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
java-jpa
java-jpa
@@ -28,15 +28,13 @@
h2
${h2.version}
-
-
+
javax.persistence
javax.persistence-api
${javax.persistence-api.version}
-
-
+
org.eclipse.persistence
eclipselink
@@ -81,7 +79,6 @@
-
org.codehaus.mojo
build-helper-maven-plugin
diff --git a/persistence-modules/java-mongodb/pom.xml b/persistence-modules/java-mongodb/pom.xml
index d62240927a..15d904b12c 100644
--- a/persistence-modules/java-mongodb/pom.xml
+++ b/persistence-modules/java-mongodb/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
java-mongodb
1.0-SNAPSHOT
@@ -25,7 +25,6 @@
mongo-java-driver
${mongo.version}
-
dev.morphia.morphia
core
@@ -39,4 +38,4 @@
1.5.3
-
+
\ No newline at end of file
diff --git a/persistence-modules/jnosql/jnosql-artemis/pom.xml b/persistence-modules/jnosql/jnosql-artemis/pom.xml
index 8570d1072f..0c1a6967d3 100644
--- a/persistence-modules/jnosql/jnosql-artemis/pom.xml
+++ b/persistence-modules/jnosql/jnosql-artemis/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
jnosql-artemis
jnosql-artemis
@@ -83,4 +83,4 @@
8.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/jnosql/jnosql-diana/pom.xml b/persistence-modules/jnosql/jnosql-diana/pom.xml
index 79c455646c..f1a4e746cf 100644
--- a/persistence-modules/jnosql/jnosql-diana/pom.xml
+++ b/persistence-modules/jnosql/jnosql-diana/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
jnosql-diana
jnosql-diana
@@ -13,7 +13,7 @@
-
+
org.jnosql.diana
diana-document
@@ -24,8 +24,7 @@
mongodb-driver
${jnosql.version}
-
-
+
org.jnosql.diana
diana-column
@@ -36,8 +35,7 @@
cassandra-driver
${jnosql.version}
-
-
+
org.jnosql.diana
diana-key-value
@@ -55,7 +53,6 @@
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
document
diff --git a/persistence-modules/jnosql/pom.xml b/persistence-modules/jnosql/pom.xml
index 81c62ee562..090350e6e3 100644
--- a/persistence-modules/jnosql/pom.xml
+++ b/persistence-modules/jnosql/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.jnosql
jnosql
@@ -24,4 +24,4 @@
0.0.6
-
+
\ No newline at end of file
diff --git a/persistence-modules/jooq/pom.xml b/persistence-modules/jooq/pom.xml
index f0c5a27a96..f4751f412a 100644
--- a/persistence-modules/jooq/pom.xml
+++ b/persistence-modules/jooq/pom.xml
@@ -1,11 +1,11 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
jooq
0.0.1-SNAPSHOT
- jooq-examples
+ jooq
jar
jOOQ Examples
@@ -19,28 +19,34 @@
org.jooq
jooq
- 3.13.4
+ ${jooq.version}
org.jooq
jooq-meta
- 3.13.4
+ ${jooq.version}
org.jooq
jooq-codegen
- 3.13.4
+ ${jooq.version}
org.postgresql
postgresql
- 42.2.16
+ ${postgresql.version}
com.h2database
h2
- 1.4.200
+ ${h2.version}
-
+
+ 3.13.4
+ 42.2.16
+ 1.4.200
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/jpa-hibernate-cascade-type/pom.xml b/persistence-modules/jpa-hibernate-cascade-type/pom.xml
index e8117290b0..467fe11bc3 100644
--- a/persistence-modules/jpa-hibernate-cascade-type/pom.xml
+++ b/persistence-modules/jpa-hibernate-cascade-type/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
jpa-hibernate-cascade-type
diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml
index af1af2259e..2fc5803037 100644
--- a/persistence-modules/liquibase/pom.xml
+++ b/persistence-modules/liquibase/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
liquibase
liquibase
diff --git a/persistence-modules/orientdb/pom.xml b/persistence-modules/orientdb/pom.xml
index 5b28fb01b0..1468f5b611 100644
--- a/persistence-modules/orientdb/pom.xml
+++ b/persistence-modules/orientdb/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
orientdb
0.0.1-SNAPSHOT
@@ -42,4 +43,4 @@
2.6.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/persistence-libraries/pom.xml b/persistence-modules/persistence-libraries/pom.xml
index 42f3a33a40..a3f0ccb728 100644
--- a/persistence-modules/persistence-libraries/pom.xml
+++ b/persistence-modules/persistence-libraries/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
persistence-libraries
1.0-SNAPSHOT
@@ -31,4 +32,4 @@
1.6.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index 8789a8473b..5e0cd59d18 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
persistence-modules
persistence-modules
@@ -38,6 +39,7 @@
java-jdbi
java-jpa
java-jpa-2
+ java-jpa-3
java-mongodb
jnosql
jooq
@@ -64,7 +66,6 @@
spring-data-elasticsearch
spring-data-gemfire
spring-data-geode
-
spring-data-jpa-annotations
spring-data-jpa-crud
spring-data-jpa-enterprise
@@ -73,16 +74,14 @@
spring-data-jpa-query-2
spring-data-jpa-repo
spring-data-jpa-repo-2
-
spring-data-jdbc
-
spring-data-keyvalue
spring-data-mongodb
spring-data-neo4j
spring-data-redis
spring-data-solr
spring-hibernate-3
- spring-hibernate-5
+ spring-hibernate-5
spring-jpa
spring-jpa-2
spring-jdbc
@@ -100,4 +99,5 @@
5.6.2
4.13
-
+
+
\ No newline at end of file
diff --git a/persistence-modules/querydsl/pom.xml b/persistence-modules/querydsl/pom.xml
index a611c309b6..c4b01d787c 100644
--- a/persistence-modules/querydsl/pom.xml
+++ b/persistence-modules/querydsl/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
querydsl
0.1-SNAPSHOT
@@ -20,14 +21,12 @@
querydsl-jpa
${querydsl.version}
-
com.querydsl
querydsl-apt
${querydsl.version}
provided
-
org.hibernate
@@ -35,14 +34,12 @@
${hibernate.version}
compile
-
org.hibernate.javax.persistence
hibernate-jpa-2.1-api
${hibernate-jpa.version}
compile
-
commons-dbcp
commons-dbcp
@@ -50,7 +47,6 @@
jar
compile
-
commons-pool
commons-pool
@@ -58,14 +54,12 @@
jar
compile
-
org.hsqldb
hsqldb
${hsqldb.version}
-
org.springframework
@@ -78,13 +72,11 @@
-
org.springframework
spring-webmvc
${spring.version}
-
org.springframework
spring-orm
@@ -92,13 +84,11 @@
jar
compile
-
org.springframework
spring-aop
${spring.version}
-
org.springframework
spring-test
@@ -121,7 +111,6 @@
-proc:none
-
com.mysema.maven
diff --git a/persistence-modules/r2dbc/pom.xml b/persistence-modules/r2dbc/pom.xml
index 01f1b351cd..ae4ca4d91d 100644
--- a/persistence-modules/r2dbc/pom.xml
+++ b/persistence-modules/r2dbc/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.examples.r2dbc
r2dbc
@@ -14,7 +14,7 @@
parent-boot-2
0.0.1-SNAPSHOT
../../parent-boot-2
-
+
@@ -25,7 +25,6 @@
org.springframework.boot
spring-boot-starter-validation
-
org.springframework.boot
spring-boot-starter-test
@@ -36,15 +35,12 @@
reactor-test
test
-
-
io.r2dbc
r2dbc-h2
${r2dbc-h2.version}
-
org.springframework.boot
spring-boot-configuration-processor
@@ -68,7 +64,6 @@
0.8.1.RELEASE
1.4.200
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/redis/pom.xml b/persistence-modules/redis/pom.xml
index fa82bebc64..c407482788 100644
--- a/persistence-modules/redis/pom.xml
+++ b/persistence-modules/redis/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
redis
0.1-SNAPSHOT
@@ -19,17 +20,14 @@
org.springframework.boot
spring-boot-starter
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-data-redis
-
redis.clients
jedis
@@ -56,7 +54,7 @@
-
+
0.6
3.13.1
3.3.0
@@ -64,4 +62,4 @@
-
+
\ No newline at end of file
diff --git a/persistence-modules/sirix/pom.xml b/persistence-modules/sirix/pom.xml
index 67de507cca..85379dc566 100644
--- a/persistence-modules/sirix/pom.xml
+++ b/persistence-modules/sirix/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
io.sirix
sirix
@@ -47,11 +47,10 @@
- UTF-8
11
0.9.3
3.8.0
6.1
-
+
\ No newline at end of file
diff --git a/persistence-modules/solr/pom.xml b/persistence-modules/solr/pom.xml
index fd993e0c67..de0bd5a4a2 100644
--- a/persistence-modules/solr/pom.xml
+++ b/persistence-modules/solr/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
solr
diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml
index 834d1d1e64..ed3f7d9279 100644
--- a/persistence-modules/spring-boot-mysql/pom.xml
+++ b/persistence-modules/spring-boot-mysql/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-boot-mysql
0.1.0
@@ -39,7 +40,6 @@
8.0.12
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-2/pom.xml b/persistence-modules/spring-boot-persistence-2/pom.xml
index ca6ec93340..b51ab17659 100644
--- a/persistence-modules/spring-boot-persistence-2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.boot.persistence
spring-boot-persistence-2
@@ -31,13 +31,11 @@
pom
import
-
org.jdbi
jdbi3-spring4
${jdbi.version}
-
org.jdbi
jdbi3-sqlobject
@@ -51,22 +49,18 @@
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-data-jpa
-
org.jdbi
jdbi3-spring4
-
org.jdbi
jdbi3-sqlobject
-
org.springframework.boot
spring-boot-devtools
@@ -93,23 +87,19 @@
spring-boot-starter-test
test
-
com.mchange
c3p0
${c3p0.version}
-
org.apache.commons
commons-dbcp2
-
org.apache.tomcat
tomcat-jdbc
-
mysql
mysql-connector-java
@@ -126,7 +116,6 @@
org.hsqldb
hsqldb
-
com.oracle.database.jdbc
ojdbc8
@@ -160,4 +149,4 @@
19.6.0.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java
similarity index 98%
rename from persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java
rename to persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java
index 93083f6c4c..ac5661afbc 100644
--- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java
+++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationIntegrationTest.java
@@ -24,7 +24,7 @@ import lombok.extern.slf4j.Slf4j;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringBootJdbiApplication.class, JdbiConfiguration.class})
@Slf4j
-public class SpringBootJdbiApplicationUnitTest {
+public class SpringBootJdbiApplicationIntegrationTest {
@Autowired
diff --git a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java
similarity index 97%
rename from persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java
rename to persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java
index be16f8f563..6956df0b13 100644
--- a/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java
+++ b/persistence-modules/spring-boot-persistence-2/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerIntegrationTest.java
@@ -20,7 +20,7 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
-public class CustomerControllerUnitTest {
+public class CustomerControllerIntegrationTest {
private static MediaType MEDIA_TYPE_JSON;
diff --git a/persistence-modules/spring-boot-persistence-h2/pom.xml b/persistence-modules/spring-boot-persistence-h2/pom.xml
index c06c35cfee..023e20837b 100644
--- a/persistence-modules/spring-boot-persistence-h2/pom.xml
+++ b/persistence-modules/spring-boot-persistence-h2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.h2db
spring-boot-persistence-h2
@@ -46,7 +46,6 @@
com.baeldung.h2db.demo.server.SpringBootApp
1.0.4
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence-mongodb/pom.xml b/persistence-modules/spring-boot-persistence-mongodb/pom.xml
index 5167483aa3..724fa38f7e 100644
--- a/persistence-modules/spring-boot-persistence-mongodb/pom.xml
+++ b/persistence-modules/spring-boot-persistence-mongodb/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-boot-persistence-mongodb
spring-boot-persistence-mongodb
@@ -36,6 +36,4 @@
-
-
\ No newline at end of file
diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml
index 9e44a7b9c1..deac0c2a57 100644
--- a/persistence-modules/spring-boot-persistence/pom.xml
+++ b/persistence-modules/spring-boot-persistence/pom.xml
@@ -78,4 +78,4 @@
2.0.1.Final
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml
index f2f71bceac..630e13583b 100644
--- a/persistence-modules/spring-data-cassandra-reactive/pom.xml
+++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
spring-data-cassandra-reactive
@@ -56,4 +57,4 @@
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cassandra/pom.xml b/persistence-modules/spring-data-cassandra/pom.xml
index 9de1cbf20e..e43e3821ae 100644
--- a/persistence-modules/spring-data-cassandra/pom.xml
+++ b/persistence-modules/spring-data-cassandra/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-data-cassandra
spring-data-cassandra
@@ -107,4 +108,4 @@
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-cosmosdb/pom.xml b/persistence-modules/spring-data-cosmosdb/pom.xml
index 19a66648b2..30dc4f999c 100644
--- a/persistence-modules/spring-data-cosmosdb/pom.xml
+++ b/persistence-modules/spring-data-cosmosdb/pom.xml
@@ -4,21 +4,16 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-data-cosmosdb
- spring-data-cosmos-db
+ spring-data-cosmosdb
tutorial for spring-data-cosmosdb
+
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
../../parent-boot-2
-
-
- 1.8
- 2.3.0
-
-
org.springframework.boot
@@ -39,7 +34,7 @@
lombok
-
+
@@ -49,4 +44,8 @@
-
+
+ 2.3.0
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-couchbase-2/pom.xml b/persistence-modules/spring-data-couchbase-2/pom.xml
index 0a20a3ff0e..c860f809fd 100644
--- a/persistence-modules/spring-data-couchbase-2/pom.xml
+++ b/persistence-modules/spring-data-couchbase-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
spring-data-couchbase-2
@@ -38,20 +38,17 @@
spring-data-couchbase
${spring-data-couchbase.version}
-
org.hibernate
hibernate-validator
${hibernate-validator.version}
-
joda-time
joda-time
${joda-time.version}
-
org.springframework
@@ -79,4 +76,4 @@
3.0.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-dynamodb/pom.xml b/persistence-modules/spring-data-dynamodb/pom.xml
index 377e35b635..28127179c2 100644
--- a/persistence-modules/spring-data-dynamodb/pom.xml
+++ b/persistence-modules/spring-data-dynamodb/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-data-dynamodb
spring-data-dynamodb
@@ -184,4 +185,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-eclipselink/pom.xml b/persistence-modules/spring-data-eclipselink/pom.xml
index 4ae43de07a..a344d64864 100644
--- a/persistence-modules/spring-data-eclipselink/pom.xml
+++ b/persistence-modules/spring-data-eclipselink/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-data-eclipselink
spring-data-eclipselink
@@ -67,4 +68,4 @@
2.7.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml
index 6a983145ee..7e91a5b15c 100644
--- a/persistence-modules/spring-data-elasticsearch/pom.xml
+++ b/persistence-modules/spring-data-elasticsearch/pom.xml
@@ -1,5 +1,6 @@
-
+
4.0.0
spring-data-elasticsearch
spring-data-elasticsearch
@@ -18,31 +19,26 @@
spring-web
${spring.version}
-
org.springframework.data
spring-data-elasticsearch
${spring-data-elasticsearch.version}
-
org.elasticsearch
elasticsearch
${elasticsearch.version}
-
com.alibaba
fastjson
${fastjson.version}
-
org.locationtech.spatial4j
spatial4j
${spatial4j.version}
-
org.locationtech.jts
jts-core
@@ -54,7 +50,6 @@
-
org.springframework
spring-test
@@ -70,4 +65,5 @@
0.7
1.15.0
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-gemfire/pom.xml b/persistence-modules/spring-data-gemfire/pom.xml
index a0cc4d5360..53ce67fb6d 100644
--- a/persistence-modules/spring-data-gemfire/pom.xml
+++ b/persistence-modules/spring-data-gemfire/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-data-gemfire
spring-data-gemfire
@@ -18,7 +19,6 @@
spring-data-gemfire
${spring-data-gemfire-version}
-
com.gemstone.gemfire
gemfire
@@ -30,7 +30,6 @@
google-collections
${google-collections-version}
-
org.springframework
spring-context
diff --git a/persistence-modules/spring-data-geode/pom.xml b/persistence-modules/spring-data-geode/pom.xml
index 07aa65463c..0673701f42 100644
--- a/persistence-modules/spring-data-geode/pom.xml
+++ b/persistence-modules/spring-data-geode/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-data-geode
spring-data-geode
@@ -41,7 +42,6 @@
spring-geode-starter
${spring-geode-starter-version}
-
org.springframework.boot
spring-boot-autoconfigure
@@ -61,7 +61,7 @@
com.mysema.maven
maven-apt-plugin
- 1.0
+ ${maven-apt-plugin.version}
generate-sources
@@ -88,6 +88,7 @@
com.baeldung.springdatageode.app.ClientCacheApp
1.1.1.RELEASE
2.1.9.RELEASE
+ 1.0
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jdbc/pom.xml b/persistence-modules/spring-data-jdbc/pom.xml
index 15f8d7fb95..2672405dd6 100644
--- a/persistence-modules/spring-data-jdbc/pom.xml
+++ b/persistence-modules/spring-data-jdbc/pom.xml
@@ -1,32 +1,30 @@
- 4.0.0
-
- com.baeldung
- parent-boot-2
- 0.0.1-SNAPSHOT
- ../../parent-boot-2
-
- spring-data-jdbc
- spring-data-jdbc
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+ spring-data-jdbc
+ spring-data-jdbc
-
-
- org.springframework.boot
- spring-boot-starter
-
-
- org.springframework.boot
- spring-boot-starter-data-jdbc
-
-
- com.h2database
- h2
- runtime
-
-
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jdbc
+
+
+ com.h2database
+ h2
+ runtime
+
+
-
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/Application.java b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/Application.java
index 7f50aa87f1..8fff82de32 100644
--- a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/Application.java
+++ b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/Application.java
@@ -50,7 +50,7 @@ public class Application implements CommandLineRunner {
LOGGER.info("@@ findByFirstName() call...");
repository.findByFirstName("Franz")
.forEach(person -> LOGGER.info(person.toString()));
- LOGGER.info("@@ findByFirstName() call...");
+ LOGGER.info("@@ updateByFirstName() call...");
repository.updateByFirstName(2L, "Date Inferno");
repository.findAll()
.forEach(person -> LOGGER.info(person.toString()));
diff --git a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java
index 2f2329caec..b2f026fa0c 100644
--- a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java
+++ b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java
@@ -1,23 +1,20 @@
package com.baeldung.springdatajdbcintro.repository;
-import java.util.List;
-
+import com.baeldung.springdatajdbcintro.entity.Person;
import org.springframework.data.jdbc.repository.query.Modifying;
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
-import com.baeldung.springdatajdbcintro.entity.Person;
+import java.util.List;
@Repository
-public interface PersonRepository extends CrudRepository {
+public interface PersonRepository extends CrudRepository {
- @Query("select * from person where first_name=:firstName")
- List findByFirstName(@Param("firstName") String firstName);
+ List findByFirstName(String firstName);
@Modifying
@Query("UPDATE person SET first_name = :name WHERE id = :id")
boolean updateByFirstName(@Param("id") Long id, @Param("name") String name);
-
}
diff --git a/persistence-modules/spring-data-jpa-annotations/README.md b/persistence-modules/spring-data-jpa-annotations/README.md
index 1ee579cf6c..3892e75733 100644
--- a/persistence-modules/spring-data-jpa-annotations/README.md
+++ b/persistence-modules/spring-data-jpa-annotations/README.md
@@ -6,7 +6,6 @@ This module contains articles about annotations used in Spring Data JPA
- [DDD Aggregates and @DomainEvents](https://www.baeldung.com/spring-data-ddd)
- [JPA @Embedded And @Embeddable](https://www.baeldung.com/jpa-embedded-embeddable)
-- [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation)
- [Spring JPA @Embedded and @EmbeddedId](https://www.baeldung.com/spring-jpa-embedded-method-parameters)
- [Programmatic Transaction Management in Spring](https://www.baeldung.com/spring-programmatic-transaction-management)
- [JPA Entity Lifecycle Events](https://www.baeldung.com/jpa-entity-lifecycle-events)
diff --git a/persistence-modules/spring-data-jpa-annotations/pom.xml b/persistence-modules/spring-data-jpa-annotations/pom.xml
index ff30790eaf..113d6e5dc6 100644
--- a/persistence-modules/spring-data-jpa-annotations/pom.xml
+++ b/persistence-modules/spring-data-jpa-annotations/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
spring-data-jpa-annotations
@@ -25,12 +26,10 @@
org.hibernate
hibernate-envers
-
com.h2database
h2
-
org.testcontainers
@@ -38,13 +37,11 @@
${testcontainers.postgresql.version}
test
-
org.postgresql
postgresql
-
org.springframework.security
spring-security-test
@@ -59,7 +56,6 @@
spring-boot-starter-test
test
-
com.google.guava
guava
@@ -72,7 +68,6 @@
1.10.6
42.2.5
21.0
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-crud/pom.xml b/persistence-modules/spring-data-jpa-crud/pom.xml
index 16ee74aa62..8f9a3cc0e8 100644
--- a/persistence-modules/spring-data-jpa-crud/pom.xml
+++ b/persistence-modules/spring-data-jpa-crud/pom.xml
@@ -1,7 +1,7 @@
4.0.0
spring-data-jpa-crud
@@ -47,7 +47,6 @@
h2
runtime
-
org.testcontainers
@@ -64,4 +63,4 @@
1.12.2
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-enterprise/README.md b/persistence-modules/spring-data-jpa-enterprise/README.md
index 81398b1f00..42fbecc880 100644
--- a/persistence-modules/spring-data-jpa-enterprise/README.md
+++ b/persistence-modules/spring-data-jpa-enterprise/README.md
@@ -12,6 +12,7 @@ This module contains articles about Spring Data JPA used in enterprise applicati
- [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections)
- [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming)
- [Partial Data Update with Spring Data](https://www.baeldung.com/spring-data-partial-update)
+- [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
diff --git a/persistence-modules/spring-data-jpa-enterprise/pom.xml b/persistence-modules/spring-data-jpa-enterprise/pom.xml
index 7ff2f00fdf..4367a11222 100644
--- a/persistence-modules/spring-data-jpa-enterprise/pom.xml
+++ b/persistence-modules/spring-data-jpa-enterprise/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-data-jpa-enterprise
@@ -12,58 +13,49 @@
0.0.1-SNAPSHOT
../../parent-boot-2
-
+
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-data-jpa
-
org.springframework.boot
spring-boot-starter-data-jdbc
-
org.springframework.boot
spring-boot-starter-cache
-
com.h2database
h2
-
-
+
org.hibernate
hibernate-envers
-
com.google.guava
guava
${guava.version}
-
org.mapstruct
mapstruct-jdk8
${mapstruct.version}
provided
-
org.springframework.security
spring-security-test
test
-
-
+
org.testcontainers
postgresql
@@ -78,7 +70,7 @@
maven-compiler-plugin
- 3.8.1
+ ${maven-compiler-plugin.version}
1.8
1.8
@@ -86,7 +78,7 @@
org.mapstruct
mapstruct-processor
- 1.3.1.Final
+ ${mapstruct.version}
@@ -98,7 +90,6 @@
1.3.1.Final
21.0
1.12.2
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/boot/daos/user/UserRepository.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/boot/daos/user/UserRepository.java
index 53f692ff28..cfa99414c6 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/boot/daos/user/UserRepository.java
+++ b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/boot/daos/user/UserRepository.java
@@ -93,6 +93,9 @@ public interface UserRepository extends JpaRepository , UserRepos
@Query("delete User u where u.active = false")
int deleteDeactivatedUsers();
+ @Query("delete User u where u.active = false")
+ int deleteDeactivatedUsersWithNoModifyingAnnotation();
+
@Modifying(clearAutomatically = true, flushAutomatically = true)
@Query(value = "alter table USERS add column deleted int(1) not null default 0", nativeQuery = true)
void addDeletedColumn();
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java
index b2581b8034..e8841d921c 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java
+++ b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java
@@ -3,6 +3,7 @@ package com.baeldung.boot.daos;
import org.junit.After;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
@@ -21,6 +22,7 @@ import java.util.function.Predicate;
import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.Assert.*;
public class UserRepositoryCommon {
@@ -520,6 +522,22 @@ public class UserRepositoryCommon {
assertEquals(1, deletedUsersCount);
}
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenDeleteDeactivatedUsersWithNoModifyingAnnotation_ThenException() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ usr01.setLastLoginDate(LocalDate.now());
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.com", 0);
+ usr02.setLastLoginDate(LocalDate.of(2018, 7, 20));
+ usr02.setActive(false);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ assertThatThrownBy(() -> userRepository.deleteDeactivatedUsersWithNoModifyingAnnotation())
+ .isInstanceOf(InvalidDataAccessApiUsageException.class);
+ }
+
@Test
@Transactional
public void givenTwoUsers_whenAddDeletedColumn_ThenUsersHaveDeletedColumn() {
diff --git a/persistence-modules/spring-data-jpa-filtering/pom.xml b/persistence-modules/spring-data-jpa-filtering/pom.xml
index 25ef68fe4c..038fd24723 100644
--- a/persistence-modules/spring-data-jpa-filtering/pom.xml
+++ b/persistence-modules/spring-data-jpa-filtering/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
spring-data-jpa-filtering
@@ -25,12 +26,10 @@
org.hibernate
hibernate-envers
-
com.h2database
h2
-
org.testcontainers
@@ -38,13 +37,11 @@
${testcontainers.postgresql.version}
test
-
org.postgresql
postgresql
-
org.springframework.security
spring-security-test
@@ -59,7 +56,6 @@
spring-boot-starter-test
test
-
com.google.guava
guava
@@ -72,7 +68,6 @@
1.10.6
42.2.5
21.0
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-filtering/src/main/resources/logback.xml b/persistence-modules/spring-data-jpa-filtering/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-filtering/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-filtering/src/test/java/com/baeldung/projection/JpaProjectionIntegrationTest.java b/persistence-modules/spring-data-jpa-filtering/src/test/java/com/baeldung/projection/JpaProjectionIntegrationTest.java
index 96eaf4ed07..5fdcf6a787 100644
--- a/persistence-modules/spring-data-jpa-filtering/src/test/java/com/baeldung/projection/JpaProjectionIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-filtering/src/test/java/com/baeldung/projection/JpaProjectionIntegrationTest.java
@@ -6,18 +6,15 @@ import com.baeldung.projection.repository.PersonRepository;
import com.baeldung.projection.view.AddressView;
import com.baeldung.projection.view.PersonDto;
import com.baeldung.projection.view.PersonView;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.jdbc.Sql;
-import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD;
@DataJpaTest
-@RunWith(SpringRunner.class)
@Sql(scripts = "/projection-insert-data.sql")
@Sql(scripts = "/projection-clean-up-data.sql", executionPhase = AFTER_TEST_METHOD)
public class JpaProjectionIntegrationTest {
diff --git a/persistence-modules/spring-data-jpa-query-2/pom.xml b/persistence-modules/spring-data-jpa-query-2/pom.xml
index 282a1ff83a..96585d9325 100644
--- a/persistence-modules/spring-data-jpa-query-2/pom.xml
+++ b/persistence-modules/spring-data-jpa-query-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-data-jpa-query-2
spring-data-jpa-query-2
@@ -22,17 +22,14 @@
org.springframework.security
spring-security-core
-
com.h2database
h2
-
com.fasterxml.jackson.core
jackson-databind
-
org.hibernate
hibernate-envers
@@ -90,4 +87,5 @@
5.2.10.Final
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-query/pom.xml b/persistence-modules/spring-data-jpa-query/pom.xml
index 1576fd729d..c231afdd17 100644
--- a/persistence-modules/spring-data-jpa-query/pom.xml
+++ b/persistence-modules/spring-data-jpa-query/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-data-jpa-query
spring-data-jpa-query
@@ -18,23 +18,19 @@
org.springframework.boot
spring-boot-starter-data-jpa
-
com.h2database
h2
-
net.ttddyy
datasource-proxy
${datasource-proxy.version}
-
com.fasterxml.jackson.core
jackson-databind
-
org.springframework
spring-oxm
@@ -43,7 +39,6 @@
1.4.1
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-repo-2/pom.xml b/persistence-modules/spring-data-jpa-repo-2/pom.xml
index 3be1068d8c..b382e35e28 100644
--- a/persistence-modules/spring-data-jpa-repo-2/pom.xml
+++ b/persistence-modules/spring-data-jpa-repo-2/pom.xml
@@ -1,8 +1,10 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-data-jpa-repo-2
+ spring-data-jpa-repo-2
com.baeldung
@@ -11,9 +13,6 @@
../../parent-boot-2
- spring-data-jpa-repo-2
- spring-data-jpa-repo-2
-
@@ -32,7 +31,6 @@
com.h2database
h2
-
com.google.guava
@@ -43,6 +41,5 @@
29.0-jre
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-repo/pom.xml b/persistence-modules/spring-data-jpa-repo/pom.xml
index 16a214fd7f..26fff365a1 100644
--- a/persistence-modules/spring-data-jpa-repo/pom.xml
+++ b/persistence-modules/spring-data-jpa-repo/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-data-jpa-repo
spring-data-jpa-repo
@@ -17,39 +18,30 @@
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-data-jpa
-
org.springframework.boot
spring-boot-starter-data-jdbc
-
mysql
mysql-connector-java
-
org.postgresql
postgresql
-
com.h2database
h2
-
org.springframework
spring-oxm
-
-
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-keyvalue/pom.xml b/persistence-modules/spring-data-keyvalue/pom.xml
index 3aaee2f00c..aa2696dd12 100644
--- a/persistence-modules/spring-data-keyvalue/pom.xml
+++ b/persistence-modules/spring-data-keyvalue/pom.xml
@@ -1,5 +1,6 @@
-
+
4.0.0
spring-data-keyvalue
spring-data-keyvalue
@@ -16,19 +17,13 @@
org.springframework.boot
spring-boot-starter
-
org.springframework.data
spring-data-keyvalue
-
org.springframework.boot
spring-boot-starter-test
-
-
-
-
\ No newline at end of file
diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml
index 448b635667..ef5a0f0550 100644
--- a/persistence-modules/spring-data-mongodb/pom.xml
+++ b/persistence-modules/spring-data-mongodb/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
spring-data-mongodb
@@ -18,32 +19,27 @@
spring-data-mongodb
${org.springframework.data.version}
-
org.mongodb
mongodb-driver-sync
${mongodb-driver.version}
-
org.mongodb
mongodb-driver-reactivestreams
${mongodb-reactivestreams.version}
-
io.projectreactor
reactor-core
${projectreactor.version}
-
io.projectreactor
reactor-test
${projectreactor.version}
test
-
org.springframework
spring-core
@@ -107,7 +103,6 @@
4.1.0
3.2.0.RELEASE
4.0.5
-
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml
index d827c32a3c..8c5030779b 100644
--- a/persistence-modules/spring-data-neo4j/pom.xml
+++ b/persistence-modules/spring-data-neo4j/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-data-neo4j
1.0
@@ -97,4 +98,4 @@
3.1.2
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml
index d271df31c7..5e17f27c06 100644
--- a/persistence-modules/spring-data-redis/pom.xml
+++ b/persistence-modules/spring-data-redis/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
spring-data-redis
@@ -32,7 +33,6 @@
reactor-test
test
-
org.springframework
spring-test
@@ -42,7 +42,6 @@
spring-boot-starter-test
test
-
org.junit.jupiter
junit-jupiter-api
@@ -52,25 +51,21 @@
junit-platform-runner
test
-
cglib
cglib-nodep
${cglib.version}
-
redis.clients
jedis
jar
-
com.lordofthejars
nosqlunit-redis
${nosqlunit.version}
-
com.github.kstyrc
embedded-redis
@@ -100,4 +95,4 @@
0.6
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-solr/pom.xml b/persistence-modules/spring-data-solr/pom.xml
index 38b5bf8238..d7523e6de2 100644
--- a/persistence-modules/spring-data-solr/pom.xml
+++ b/persistence-modules/spring-data-solr/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
spring-data-solr
@@ -45,7 +46,6 @@
2.0.5.RELEASE
-
\ No newline at end of file
diff --git a/persistence-modules/spring-hibernate-3/pom.xml b/persistence-modules/spring-hibernate-3/pom.xml
index b28895f86d..9b143597c7 100644
--- a/persistence-modules/spring-hibernate-3/pom.xml
+++ b/persistence-modules/spring-hibernate-3/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
spring-hibernate-3
@@ -84,4 +85,4 @@
19.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml
index 8a8b6c15e3..caa1598af4 100644
--- a/persistence-modules/spring-hibernate-5/pom.xml
+++ b/persistence-modules/spring-hibernate-5/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-hibernate-5
0.1-SNAPSHOT
@@ -13,9 +14,7 @@
-
-
org.springframework
spring-context
@@ -32,9 +31,7 @@
spring-aspects
${org.springframework.version}
-
-
org.springframework
spring-orm
@@ -65,32 +62,25 @@
hibernate-search-orm
${hibernatesearch.version}
-
org.apache.tomcat
tomcat-dbcp
${tomcat-dbcp.version}
-
-
-
com.google.guava
guava
${guava.version}
-
-
org.apache.commons
commons-lang3
${commons-lang3.version}
test
-
org.springframework
spring-test
@@ -103,25 +93,21 @@
${org.springframework.security.version}
test
-
org.hsqldb
hsqldb
${hsqldb.version}
-
mysql
mysql-connector-java
${mysql-connector-java.version}
-
com.h2database
h2
${h2.version}
-
@@ -129,7 +115,6 @@
5.0.2.RELEASE
1.10.6.RELEASE
4.2.1.RELEASE
-
5.2.10.Final
5.8.2.Final
@@ -137,9 +122,8 @@
9.0.0.M26
1.1
2.3.4
-
21.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java
index 72d4dea377..c7ca9f1ffd 100644
--- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java
+++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/criteria/view/ApplicationView.java
@@ -162,6 +162,25 @@ public class ApplicationView {
return betweenItems;
}
+ // To get records having itemName in 'Skate Board', 'Paint' and 'Glue'
+ public String[] inCriteria() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final CriteriaBuilder cb = session.getCriteriaBuilder();
+ final CriteriaQuery- cr = cb.createQuery(Item.class);
+ final Root
- root = cr.from(Item.class);
+ cr.select(root)
+ .where(root.get("itemName").in("Skate Board", "Paint", "Glue"));
+ Query
- query = session.createQuery(cr);
+ final List
- inItemsList = query.getResultList();
+ final String inItems[] = new String[inItemsList.size()];
+ for (int i = 0; i < inItemsList.size(); i++) {
+ inItems[i] = inItemsList.get(i)
+ .getItemName();
+ }
+ session.close();
+ return inItems;
+ }
+
// To check if the given property is null
public String[] nullCriteria() {
final Session session = HibernateUtil.getHibernateSession();
diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java
index 7d95e0f342..a1f88f3387 100644
--- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java
+++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/criteria/HibernateCriteriaIntegrationTest.java
@@ -189,6 +189,18 @@ public class HibernateCriteriaIntegrationTest {
assertArrayEquals(expectedPriceBetweenItems, av.betweenCriteria());
}
+ @Test
+ public void inCriteriaQuery() {
+ final Session session = HibernateUtil.getHibernateSession();
+ final List
- expectedInList = session.createQuery("From Item where itemName in ('Skate Board', 'Paint', 'Glue')").list();
+ final String expectedNameInItems[] = new String[expectedInList.size()];
+ for (int i = 0; i < expectedInList.size(); i++) {
+ expectedNameInItems[i] = expectedInList.get(i).getItemName();
+ }
+ session.close();
+ assertArrayEquals(expectedNameInItems, av.inCriteria());
+ }
+
@Test
public void givenNewItemPrice_whenCriteriaUpdate_thenReturnAffectedResult() {
diff --git a/persistence-modules/spring-jdbc/pom.xml b/persistence-modules/spring-jdbc/pom.xml
index 8a5786e1a5..28a858dd43 100644
--- a/persistence-modules/spring-jdbc/pom.xml
+++ b/persistence-modules/spring-jdbc/pom.xml
@@ -1,8 +1,10 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-jdbc
+ spring-jdbc
com.baeldung
@@ -11,9 +13,6 @@
../../parent-boot-2
- spring-jdbc
- spring-jdbc
-
org.springframework.data
@@ -34,6 +33,4 @@
-
-
\ No newline at end of file
diff --git a/persistence-modules/spring-jooq/README.md b/persistence-modules/spring-jooq/README.md
index 515ab8be3c..d0cb946614 100644
--- a/persistence-modules/spring-jooq/README.md
+++ b/persistence-modules/spring-jooq/README.md
@@ -5,6 +5,7 @@ This module contains articles about Spring with jOOQ
### Relevant Articles:
- [Spring Boot Support for jOOQ](https://www.baeldung.com/spring-boot-support-for-jooq)
- [Introduction to jOOQ with Spring](https://www.baeldung.com/jooq-with-spring)
+- [Count Query In jOOQ](https://www.baeldung.com/jooq-count-query)
In order to fix the error "Plugin execution not covered by lifecycle configuration: org.jooq:jooq-codegen-maven:3.7.3:generate (execution: default, phase: generate-sources)", right-click on the error message and choose "Mark goal generated as ignore in pom.xml". Until version 1.4.x, the maven-plugin-plugin was covered by the default lifecycle mapping that ships with m2e.
diff --git a/persistence-modules/spring-jooq/pom.xml b/persistence-modules/spring-jooq/pom.xml
index 6b3d565175..4c195a6c92 100644
--- a/persistence-modules/spring-jooq/pom.xml
+++ b/persistence-modules/spring-jooq/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-jooq
spring-jooq
@@ -32,14 +33,12 @@
jooq
${org.jooq.version}
-
com.h2database
h2
${h2.version}
-
org.springframework
@@ -63,7 +62,6 @@
org.springframework.boot
spring-boot-starter-test
-
org.springframework
@@ -74,7 +72,6 @@
-
org.apache.maven.plugins
@@ -84,7 +81,6 @@
0
-
org.codehaus.mojo
properties-maven-plugin
@@ -103,7 +99,6 @@
-
org.codehaus.mojo
sql-maven-plugin
@@ -133,7 +128,6 @@
-
org.jooq
jooq-codegen-maven
@@ -164,11 +158,11 @@
-
-
+
org.eclipse.m2e
lifecycle-mapping
diff --git a/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java b/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java
new file mode 100644
index 0000000000..7edcc2cd4b
--- /dev/null
+++ b/persistence-modules/spring-jooq/src/test/java/com/baeldung/jooq/introduction/CountQueryIntegrationTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.jooq.introduction;
+
+import static com.baeldung.jooq.introduction.db.public_.tables.Author.AUTHOR;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jooq.Condition;
+import org.jooq.DSLContext;
+import org.jooq.Record2;
+import org.jooq.Result;
+import org.jooq.impl.DSL;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+@ContextConfiguration(classes = PersistenceContextIntegrationTest.class)
+@Transactional(transactionManager = "transactionManager")
+@RunWith(SpringJUnit4ClassRunner.class)
+public class CountQueryIntegrationTest {
+
+ @Autowired
+ private DSLContext dsl;
+
+ @Test
+ public void givenValidData_whenSimpleSelect_thenSucceed() {
+ int count = dsl.select().from(AUTHOR).execute();
+ Assert.assertEquals(3, count);
+ }
+
+ @Test
+ public void givenValidData_whenSelectCount_thenSucceed() {
+ int count = dsl.selectCount().from(AUTHOR)
+ .where(AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan"))
+ .fetchOne(0, int.class);
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenCount_thenSucceed() {
+ int count = dsl.select(DSL.count())
+ .from(AUTHOR).fetchOne(0, int.class);
+ Assert.assertEquals(3, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCount_thenSucceed() {
+ int count = dsl.fetchCount(DSL.selectFrom(AUTHOR)
+ .where(AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan")));
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCountWithoutCondition_thenSucceed() {
+ int count = dsl.fetchCount(DSL.selectFrom(AUTHOR));
+ Assert.assertEquals(3, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCountWithSingleCondition_thenSucceed() {
+ int count = dsl.fetchCount(AUTHOR, AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan"));
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCountWithMultipleConditions_thenSucceed() {
+ Condition firstCond = AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan");
+ Condition secondCond = AUTHOR.ID.notEqual(1);
+ List conditions = new ArrayList<>();
+ conditions.add(firstCond);
+ conditions.add(secondCond);
+ int count = dsl.fetchCount(AUTHOR, conditions);
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenFetchCountWithConditionsInVarargs_thenSucceed() {
+ Condition firstCond = AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan");
+ Condition secondCond = AUTHOR.ID.notEqual(1);
+ int count = dsl.fetchCount(AUTHOR, firstCond, secondCond);
+ Assert.assertEquals(1, count);
+ }
+
+ @Test
+ public void givenValidData_whenCountwithGroupBy_thenSucceed() {
+ final Result> result = dsl.select(AUTHOR.FIRST_NAME, DSL.count())
+ .from(AUTHOR).groupBy(AUTHOR.FIRST_NAME).fetch();
+ Assert.assertEquals(3, result.size());
+ Assert.assertEquals(result.get(0).get(0), "Bert");
+ Assert.assertEquals(result.get(0).get(1), 1);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/pom.xml b/persistence-modules/spring-jpa-2/pom.xml
index 7770c0e045..16168036be 100644
--- a/persistence-modules/spring-jpa-2/pom.xml
+++ b/persistence-modules/spring-jpa-2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-jpa-2
0.1-SNAPSHOT
@@ -25,7 +26,6 @@
spring-boot-starter-data-jpa
${spring-boot.version}
-
org.springframework
spring-orm
@@ -42,7 +42,6 @@
spring-context
${org.springframework.version}
-
org.hibernate
@@ -59,19 +58,12 @@
tomcat-dbcp
${tomcat-dbcp.version}
-
com.google.guava
guava
${guava.version}
-
- net.bytebuddy
- byte-buddy
- ${byte-buddy.version}
-
-
org.springframework.boot
@@ -84,20 +76,16 @@
${org.springframework.version}
test
-
5.1.5.RELEASE
2.2.6.RELEASE
-
9.0.0.M26
-
21.0
- 1.10.16
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml
index e389886d8d..1dca2baa98 100644
--- a/persistence-modules/spring-jpa/pom.xml
+++ b/persistence-modules/spring-jpa/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-jpa
0.1-SNAPSHOT
@@ -36,9 +37,7 @@
spring-webmvc
${org.springframework.version}
-
-
org.hibernate
hibernate-core
@@ -70,9 +69,7 @@
h2
${h2.version}
-
-
org.hibernate
hibernate-validator
@@ -83,7 +80,6 @@
javax.el-api
${javax.el-api.version}
-
javax.servlet
@@ -96,9 +92,7 @@
provided
${javax.servlet.servlet-api.version}
-
-
com.google.guava
guava
@@ -109,41 +103,33 @@
assertj-core
${assertj.version}
-
-
org.apache.commons
commons-lang3
${commons-lang3.version}
test
-
org.springframework
spring-test
${org.springframework.version}
test
-
5.1.5.RELEASE
3.21.0-GA
-
6.0.6
2.1.5.RELEASE
-
2.5
-
6.0.15.Final
1.4.01
2.2.5
-
21.0
3.8.0
diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml
index 40d4d915ab..9247d59fe4 100644
--- a/persistence-modules/spring-mybatis/pom.xml
+++ b/persistence-modules/spring-mybatis/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-mybatis
0.1-SNAPSHOT
@@ -14,76 +15,61 @@
-
-
org.springframework
spring-context
${org.springframework.version}
-
org.springframework
spring-beans
${org.springframework.version}
-
-
org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis-spring-boot-starter.version}
-
-
com.h2database
h2
${h2.version}
-
org.springframework
spring-jdbc
${org.springframework.version}
-
org.mybatis
mybatis
${mybatis.version}
-
org.mybatis
mybatis-spring
${spring-mybatis.version}
-
-
org.springframework.boot
spring-boot-starter-test
-
org.springframework
spring-test
${org.springframework.version}
test
-
org.assertj
assertj-core
${assertj-core.version}
test
-
@@ -99,15 +85,13 @@
5.1.8.RELEASE
-
2.0.2
3.5.2
2.1.0
1.4.197
-
3.8.0
-
+
\ No newline at end of file
diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml
index 13898d01e7..437a439b99 100644
--- a/persistence-modules/spring-persistence-simple/pom.xml
+++ b/persistence-modules/spring-persistence-simple/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-persistence-simple
0.1-SNAPSHOT
@@ -24,7 +25,6 @@
spring-context
${org.springframework.version}
-
javax.persistence
@@ -57,14 +57,12 @@
${h2.version}
test
-
com.github.h-thurow
simple-jndi
${simple-jndi.version}
-
org.springframework
@@ -100,4 +98,5 @@
3.3.3
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index ccdc91ffe0..d8bf527184 100644
--- a/pom.xml
+++ b/pom.xml
@@ -412,6 +412,7 @@
google-web-toolkit
+
graphql/graphql-java
grpc
@@ -471,7 +472,7 @@
json-path
jsoup
jta
-
+ kubernetes
language-interop
libraries-2
@@ -614,13 +615,15 @@
spring-aop
spring-apache-camel
- spring-batch
- spring-batch-2
+ spring-batch
+ spring-batch-2
spring-bom
spring-boot-modules
spring-boot-rest
+ spring-boot-rest-2
spring-caching
+ spring-caching-2
spring-cloud
spring-cloud-bus
@@ -875,6 +878,7 @@
google-web-toolkit
+
graphql/graphql-java
grpc
@@ -930,6 +934,7 @@
jooby
jsf
json
+ json-2
json-path
jsoup
jta
@@ -1068,11 +1073,14 @@
spring-apache-camel
spring-batch
+ spring-batch-2
spring-bom
spring-boot-modules
spring-boot-rest
+ spring-boot-rest-2
spring-caching
+ spring-caching-2
spring-cloud
spring-cloud-bus
@@ -1089,6 +1097,7 @@
spring-data-rest
spring-data-rest-querydsl
spring-di
+ spring-di-2
spring-drools
spring-ejb
@@ -1267,13 +1276,14 @@
+ spring-boot-modules/spring-boot-cassandre
core-java-modules/core-java-9
core-java-modules/core-java-9-improvements
core-java-modules/core-java-9-jigsaw
core-java-modules/core-java-9-streams
core-java-modules/core-java-10
- core-java-modules/core-java-11
+ core-java-modules/core-java-11-2
@@ -1318,6 +1328,7 @@
core-java-modules/core-java-9-streams
core-java-modules/core-java-10
core-java-modules/core-java-11
+ core-java-modules/core-java-11-2
@@ -1350,14 +1361,14 @@
true
false
false
- false
- false
+ false
+ true
4.12
2.2
1.3
3.3.0
- 1.10.5
+ 1.10.22
1.7.30
@@ -1367,13 +1378,12 @@
2.21.0
3.8.1
- 1.6.0
+ 3.0.0
1.8
1.2.17
- 2.1.0.1
- 1.19
- 1.19
- 1.6.0
+ 2.2.2.0
+ 1.28
+ 1.28
2.21.0
2.8.0
2.6
@@ -1391,7 +1401,7 @@
0.3.1
2.5.2
0.0.1
- 3.8
+ 3.12.2
3.0.0
3.13.0
diff --git a/protobuffer/pom.xml b/protobuffer/pom.xml
index e57495e93c..cf8dbe417e 100644
--- a/protobuffer/pom.xml
+++ b/protobuffer/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
protobuffer
protobuffer
diff --git a/quarkus-extension/pom.xml b/quarkus-extension/pom.xml
index 394376e59e..c2ae66a3a0 100644
--- a/quarkus-extension/pom.xml
+++ b/quarkus-extension/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.quarkus.extension
quarkus-extension
@@ -14,10 +14,10 @@
parent-modules
1.0.0-SNAPSHOT
-
+
quarkus-liquibase
quarkus-app
-
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-app/pom.xml b/quarkus-extension/quarkus-app/pom.xml
index 6d3f4c7c28..f609261c5a 100644
--- a/quarkus-extension/quarkus-app/pom.xml
+++ b/quarkus-extension/quarkus-app/pom.xml
@@ -1,7 +1,7 @@
-
+
4.0.0
com.baeldung.quarkus.app
quarkus-app
@@ -27,7 +27,7 @@
com.baeldung.quarkus.liquibase
- quarkus-liquibase-runtime
+ runtime
${project.version}
@@ -57,4 +57,4 @@
1.0.0.Final
-
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/deployment/pom.xml b/quarkus-extension/quarkus-liquibase/deployment/pom.xml
index d7f1f995ff..9a9e4485cd 100644
--- a/quarkus-extension/quarkus-liquibase/deployment/pom.xml
+++ b/quarkus-extension/quarkus-liquibase/deployment/pom.xml
@@ -1,8 +1,9 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ com.baeldung.quarkus.liquibase
deployment
deployment
@@ -30,7 +31,7 @@
com.baeldung.quarkus.liquibase
- quarkus-liquibase-runtime
+ runtime
${project.version}
@@ -58,4 +59,4 @@
3.8.1
-
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/pom.xml b/quarkus-extension/quarkus-liquibase/pom.xml
index fdede2000e..1a86aeb75c 100644
--- a/quarkus-extension/quarkus-liquibase/pom.xml
+++ b/quarkus-extension/quarkus-liquibase/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung.quarkus.liquibase
quarkus-liquibase
@@ -13,7 +13,7 @@
quarkus-extension
1.0-SNAPSHOT
-
+
runtime
deployment
@@ -23,4 +23,4 @@
1.0.0.Final
-
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/runtime/pom.xml b/quarkus-extension/quarkus-liquibase/runtime/pom.xml
index 5d3b05ef92..6656556c4b 100644
--- a/quarkus-extension/quarkus-liquibase/runtime/pom.xml
+++ b/quarkus-extension/quarkus-liquibase/runtime/pom.xml
@@ -1,7 +1,9 @@
-
4.0.0
+ com.baeldung.quarkus.liquibase
runtime
runtime
@@ -41,7 +43,7 @@
extension-descriptor
- ${project.groupId}:quarkus-liquibase-deployment:${project.version}
+ ${project.groupId}:deployment:${project.version}
@@ -70,4 +72,4 @@
3.8.1
-
+
\ No newline at end of file
diff --git a/quarkus/pom.xml b/quarkus/pom.xml
index 9c14afca3c..6e250a2858 100644
--- a/quarkus/pom.xml
+++ b/quarkus/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.quarkus
quarkus
@@ -97,7 +98,6 @@
maven-surefire-plugin
- ${surefire-plugin.version}
1
true
@@ -136,7 +136,6 @@
maven-failsafe-plugin
- ${surefire-plugin.version}
@@ -157,9 +156,8 @@
- 2.22.0
1.7.0.Final
5.6.0
-
+
\ No newline at end of file
diff --git a/rabbitmq/pom.xml b/rabbitmq/pom.xml
index 33ccf5402f..8a707a15dd 100644
--- a/rabbitmq/pom.xml
+++ b/rabbitmq/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
rabbitmq
0.1-SNAPSHOT
diff --git a/ratpack/pom.xml b/ratpack/pom.xml
index 9ad654fa7d..c57934d8b7 100644
--- a/ratpack/pom.xml
+++ b/ratpack/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
ratpack
1.0-SNAPSHOT
@@ -93,4 +94,4 @@
1.6.1
-
+
\ No newline at end of file
diff --git a/reactive-systems/inventory-service/pom.xml b/reactive-systems/inventory-service/pom.xml
index 4c04afb5cb..86575d498c 100644
--- a/reactive-systems/inventory-service/pom.xml
+++ b/reactive-systems/inventory-service/pom.xml
@@ -15,10 +15,6 @@
../../parent-boot-2
-
- 1.8
-
-
org.springframework.boot
@@ -32,7 +28,6 @@
org.springframework.kafka
spring-kafka
-
org.projectlombok
lombok
@@ -69,4 +64,5 @@
+
\ No newline at end of file
diff --git a/reactive-systems/order-service/pom.xml b/reactive-systems/order-service/pom.xml
index c793f448b5..e6453732b4 100644
--- a/reactive-systems/order-service/pom.xml
+++ b/reactive-systems/order-service/pom.xml
@@ -15,10 +15,6 @@
../../parent-boot-2
-
- 1.8
-
-
org.springframework.boot
@@ -32,7 +28,6 @@
org.springframework.kafka
spring-kafka
-
org.projectlombok
lombok
@@ -70,4 +65,4 @@
-
+
\ No newline at end of file
diff --git a/reactive-systems/pom.xml b/reactive-systems/pom.xml
index bce2575d9e..81462090b8 100644
--- a/reactive-systems/pom.xml
+++ b/reactive-systems/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
reactive-systems
0.0.1-SNAPSHOT
@@ -19,4 +20,4 @@
order-service
-
+
\ No newline at end of file
diff --git a/reactive-systems/shipping-service/pom.xml b/reactive-systems/shipping-service/pom.xml
index 72487e691e..f725ca72d1 100644
--- a/reactive-systems/shipping-service/pom.xml
+++ b/reactive-systems/shipping-service/pom.xml
@@ -15,10 +15,6 @@
../../parent-boot-2
-
- 1.8
-
-
org.springframework.boot
@@ -28,12 +24,10 @@
org.springframework.kafka
spring-kafka
-
com.fasterxml.jackson.core
jackson-databind
-
org.projectlombok
lombok
@@ -71,4 +65,4 @@
-
+
\ No newline at end of file
diff --git a/reactor-core/README.md b/reactor-core/README.md
index 0214aa26fd..08dac354ab 100644
--- a/reactor-core/README.md
+++ b/reactor-core/README.md
@@ -8,3 +8,4 @@ This module contains articles about Reactor Core.
- [Combining Publishers in Project Reactor](https://www.baeldung.com/reactor-combine-streams)
- [Programmatically Creating Sequences with Project Reactor](https://www.baeldung.com/flux-sequences-reactor)
- [How to Extract a Mono’s Content in Java](https://www.baeldung.com/java-string-from-mono)
+- [How to Convert Mono> Into Flux](https://www.baeldung.com/java-mono-list-to-flux)
diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml
index 317cbde6e2..6eead97bc2 100644
--- a/reactor-core/pom.xml
+++ b/reactor-core/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
org.baeldung
reactor-core
@@ -38,4 +39,4 @@
3.6.1
-
+
\ No newline at end of file
diff --git a/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java b/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java
index f9e67b0a2f..0c6e0c07ef 100644
--- a/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java
+++ b/reactor-core/src/test/java/com/baeldung/mono/MonoUnitTest.java
@@ -1,10 +1,14 @@
package com.baeldung.mono;
import org.junit.Test;
+import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
import static org.junit.Assert.assertEquals;
@@ -40,4 +44,40 @@ public class MonoUnitTest {
// blocking
return Mono.just("Hello world!");
}
+
+ @Test
+ public void whenMonoProducesListOfElements_thenConvertToFluxofElements() {
+
+ Mono> monoList = monoOfList();
+
+ StepVerifier.create(monoTofluxUsingFlatMapIterable(monoList))
+ .expectNext("one", "two", "three", "four")
+ .verifyComplete();
+
+ StepVerifier.create(monoTofluxUsingFlatMapMany(monoList))
+ .expectNext("one", "two", "three", "four")
+ .verifyComplete();
+ }
+
+ private Flux monoTofluxUsingFlatMapIterable(Mono> monoList) {
+ return monoList
+ .flatMapIterable(list -> list)
+ .log();
+ }
+
+ private Flux monoTofluxUsingFlatMapMany(Mono> monoList) {
+ return monoList
+ .flatMapMany(Flux::fromIterable)
+ .log();
+ }
+
+ private Mono> monoOfList() {
+ List list = new ArrayList<>();
+ list.add("one");
+ list.add("two");
+ list.add("three");
+ list.add("four");
+
+ return Mono.just(list);
+ }
}
diff --git a/resteasy/pom.xml b/resteasy/pom.xml
index ffb6adb3df..d35fc852ba 100644
--- a/resteasy/pom.xml
+++ b/resteasy/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
resteasy
1.0
@@ -26,27 +27,22 @@
-
org.jboss.resteasy
resteasy-client
${resteasy.version}
-
-
org.jboss.resteasy
resteasy-jaxb-provider
${resteasy.version}
-
org.jboss.resteasy
resteasy-jackson-provider
${resteasy.version}
-
commons-io
commons-io
diff --git a/rsocket/pom.xml b/rsocket/pom.xml
index 5b407c2bd0..57c927253f 100644
--- a/rsocket/pom.xml
+++ b/rsocket/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
rsocket
0.0.1-SNAPSHOT
@@ -30,4 +31,4 @@
0.11.13
-
+
\ No newline at end of file
diff --git a/rule-engines/easy-rules/pom.xml b/rule-engines/easy-rules/pom.xml
index b9661cd1c3..a8159f2813 100644
--- a/rule-engines/easy-rules/pom.xml
+++ b/rule-engines/easy-rules/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.easyrules
easy-rules
@@ -25,4 +26,4 @@
3.0.0
-
+
\ No newline at end of file
diff --git a/rule-engines/jess/pom.xml b/rule-engines/jess/pom.xml
index 40d50fae70..f5db0374ef 100644
--- a/rule-engines/jess/pom.xml
+++ b/rule-engines/jess/pom.xml
@@ -1,9 +1,8 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.rules.jess
jess
1.0-SNAPSHOT
diff --git a/rule-engines/openl-tablets/pom.xml b/rule-engines/openl-tablets/pom.xml
index 25c4b8365a..03b286e409 100644
--- a/rule-engines/openl-tablets/pom.xml
+++ b/rule-engines/openl-tablets/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.openltablets
openl-tablets
@@ -30,4 +31,4 @@
5.19.4
-
+
\ No newline at end of file
diff --git a/rule-engines/pom.xml b/rule-engines/pom.xml
index 27748a5c3e..db6b2e47ef 100644
--- a/rule-engines/pom.xml
+++ b/rule-engines/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
rule-engines
rule-engines
@@ -19,4 +20,4 @@
-
+
\ No newline at end of file
diff --git a/rule-engines/rulebook/pom.xml b/rule-engines/rulebook/pom.xml
index 95ededa5f9..55b77c50df 100644
--- a/rule-engines/rulebook/pom.xml
+++ b/rule-engines/rulebook/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.rulebook
rulebook
@@ -25,4 +26,4 @@
0.6.2
-
+
\ No newline at end of file
diff --git a/rxjava-core/pom.xml b/rxjava-core/pom.xml
index daec1f783f..cd6075e127 100644
--- a/rxjava-core/pom.xml
+++ b/rxjava-core/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
rxjava-core
1.0-SNAPSHOT
diff --git a/rxjava-libraries/pom.xml b/rxjava-libraries/pom.xml
index 45c1907a58..5d2c9ec3bb 100644
--- a/rxjava-libraries/pom.xml
+++ b/rxjava-libraries/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
rxjava-libraries
1.0-SNAPSHOT
diff --git a/rxjava-observables/pom.xml b/rxjava-observables/pom.xml
index 3cedfc4afc..feb4fc1f39 100644
--- a/rxjava-observables/pom.xml
+++ b/rxjava-observables/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
rxjava-observables
1.0-SNAPSHOT
diff --git a/rxjava-operators/pom.xml b/rxjava-operators/pom.xml
index 8064613f45..ba85dc428b 100644
--- a/rxjava-operators/pom.xml
+++ b/rxjava-operators/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
rxjava-operators
1.0-SNAPSHOT
diff --git a/saas/pom.xml b/saas/pom.xml
index be5d18f020..87f273939c 100644
--- a/saas/pom.xml
+++ b/saas/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
saas
0.1.0-SNAPSHOT
@@ -35,12 +36,10 @@
true
-
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
java
com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
@@ -48,7 +47,7 @@
-Xmx300m
-XX:+UseParallelGC
-classpath
-
+
com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
diff --git a/slack/pom.xml b/slack/pom.xml
index ebe5ce2f60..690bf5132c 100644
--- a/slack/pom.xml
+++ b/slack/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.examples
slack
@@ -45,7 +46,6 @@
org.codehaus.mojo
exec-maven-plugin
- 1.6.0
com.baeldung.examples.slack.MainClass
@@ -58,4 +58,4 @@
2.4
-
+
\ No newline at end of file
diff --git a/software-security/sql-injection-samples/pom.xml b/software-security/sql-injection-samples/pom.xml
index 6cacaa4ad0..7953e43ebe 100644
--- a/software-security/sql-injection-samples/pom.xml
+++ b/software-security/sql-injection-samples/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
sql-injection-samples
0.0.1-SNAPSHOT
diff --git a/spark-java/pom.xml b/spark-java/pom.xml
index 686cf75058..b5538b4ec3 100644
--- a/spark-java/pom.xml
+++ b/spark-java/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spark-java
0.1.0-SNAPSHOT
@@ -32,4 +33,4 @@
2.8.0
-
+
\ No newline at end of file
diff --git a/spf4j/pom.xml b/spf4j/pom.xml
index b0568e9f7a..6d325947cf 100644
--- a/spf4j/pom.xml
+++ b/spf4j/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.spf4j
spf4j
@@ -18,4 +19,4 @@
spf4j-aspects-app
-
+
\ No newline at end of file
diff --git a/spf4j/spf4j-aspects-app/pom.xml b/spf4j/spf4j-aspects-app/pom.xml
index 24a419233e..4a4c7cb804 100644
--- a/spf4j/spf4j-aspects-app/pom.xml
+++ b/spf4j/spf4j-aspects-app/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spf4j-aspects-app
0.0.1-SNAPSHOT
@@ -87,4 +87,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/spf4j/spf4j-core-app/pom.xml b/spf4j/spf4j-core-app/pom.xml
index 280a59e0d9..2961174a35 100644
--- a/spf4j/spf4j-core-app/pom.xml
+++ b/spf4j/spf4j-core-app/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spf4j-core-app
0.0.1-SNAPSHOT
@@ -87,4 +87,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/spring-4/pom.xml b/spring-4/pom.xml
index cd6b232317..21de925d99 100644
--- a/spring-4/pom.xml
+++ b/spring-4/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-4
spring-4
@@ -8,7 +9,7 @@
jar
-
+
com.baeldung
parent-boot-1
0.0.1-SNAPSHOT
@@ -83,7 +84,6 @@
${easymock.version}
test
-
org.hsqldb
hsqldb
@@ -115,4 +115,4 @@
2.4.0
-
+
\ No newline at end of file
diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml
index 0fb689f16d..5f12636280 100644
--- a/spring-5-data-reactive/pom.xml
+++ b/spring-5-data-reactive/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-5-data-reactive
spring-5-data-reactive
@@ -44,7 +45,6 @@
io.reactivex.rxjava2
rxjava
-
org.springframework
spring-test
@@ -59,18 +59,15 @@
de.flapdoodle.embed.mongo
test
-
org.springframework.boot
spring-boot-starter-webflux
-
org.springframework
spring-tx
${spring-tx.version}
-
org.springframework.data
spring-data-r2dbc
@@ -118,14 +115,12 @@
${java.version}
-
+
default-compile
none
-
+
default-testCompile
none
@@ -160,5 +155,4 @@
2.2.6.RELEASE
-
-
+
\ No newline at end of file
diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md
index 397f6be57c..98a5f26433 100644
--- a/spring-5-reactive-2/README.md
+++ b/spring-5-reactive-2/README.md
@@ -9,4 +9,5 @@ This module contains articles about reactive Spring 5
- [Debugging Reactive Streams in Java](https://www.baeldung.com/spring-debugging-reactive-streams)
- [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content)
- [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events)
+- [Backpressure Mechanism in Spring WebFlux](https://www.baeldung.com/spring-webflux-backpressure)
- More articles: [[<-- prev]](/spring-5-reactive)
diff --git a/spring-5-reactive-2/pom.xml b/spring-5-reactive-2/pom.xml
index 093be0f03c..0758365932 100644
--- a/spring-5-reactive-2/pom.xml
+++ b/spring-5-reactive-2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-5-reactive-2
0.0.1-SNAPSHOT
@@ -33,19 +34,16 @@
reactor-spring
${reactor-spring.version}
-
org.projectlombok
lombok
provided
-
org.springframework.boot
spring-boot-starter-test
test
-
com.github.tomakehurst
wiremock-jre8
@@ -82,4 +80,4 @@
2.24.0
-
+
\ No newline at end of file
diff --git a/spring-5-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java
new file mode 100644
index 0000000000..e7cb60dbf9
--- /dev/null
+++ b/spring-5-reactive-2/src/test/java/com/baeldung/backpressure/BackpressureUnitTest.java
@@ -0,0 +1,82 @@
+package com.baeldung.backpressure;
+
+import org.junit.jupiter.api.Test;
+import reactor.core.publisher.BaseSubscriber;
+import reactor.core.publisher.Flux;
+import reactor.test.StepVerifier;
+
+public class BackpressureUnitTest {
+
+ @Test
+ public void whenLimitRateSet_thenSplitIntoChunks() throws InterruptedException {
+ Flux limit = Flux.range(1, 25);
+
+ limit.limitRate(10);
+ limit.subscribe(
+ value -> System.out.println(value),
+ err -> err.printStackTrace(),
+ () -> System.out.println("Finished!!"),
+ subscription -> subscription.request(15)
+ );
+
+ StepVerifier.create(limit)
+ .expectSubscription()
+ .thenRequest(15)
+ .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+ .expectNext(11, 12, 13, 14, 15)
+ .thenRequest(10)
+ .expectNext(16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
+ .verifyComplete();
+ }
+
+ @Test
+ public void whenRequestingChunks10_thenMessagesAreReceived() {
+ Flux request = Flux.range(1, 50);
+
+ request.subscribe(
+ System.out::println,
+ err -> err.printStackTrace(),
+ () -> System.out.println("All 50 items have been successfully processed!!!"),
+ subscription -> {
+ for (int i = 0; i < 5; i++) {
+ System.out.println("Requesting the next 10 elements!!!");
+ subscription.request(10);
+ }
+ }
+ );
+
+ StepVerifier.create(request)
+ .expectSubscription()
+ .thenRequest(10)
+ .expectNext(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+ .thenRequest(10)
+ .expectNext(11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
+ .thenRequest(10)
+ .expectNext(21, 22, 23, 24, 25, 26, 27 , 28, 29 ,30)
+ .thenRequest(10)
+ .expectNext(31, 32, 33, 34, 35, 36, 37 , 38, 39 ,40)
+ .thenRequest(10)
+ .expectNext(41, 42, 43, 44, 45, 46, 47 , 48, 49 ,50)
+ .verifyComplete();
+ }
+
+ @Test
+ public void whenCancel_thenSubscriptionFinished() {
+ Flux cancel = Flux.range(1, 10).log();
+
+ cancel.subscribe(new BaseSubscriber() {
+ @Override
+ protected void hookOnNext(Integer value) {
+ request(3);
+ System.out.println(value);
+ cancel();
+ }
+ });
+
+ StepVerifier.create(cancel)
+ .expectNext(1, 2, 3)
+ .thenCancel()
+ .verify();
+ }
+}
+
diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml
index 7ae7ba6edd..136f31b49e 100644
--- a/spring-5-reactive-client/pom.xml
+++ b/spring-5-reactive-client/pom.xml
@@ -1,6 +1,5 @@
-
4.0.0
@@ -72,7 +71,6 @@
${okhttp.version}
test
-
org.springframework.boot
@@ -84,7 +82,6 @@
h2
runtime
-
org.springframework
spring-test
@@ -100,14 +97,12 @@
2.26.0
test
-
org.apache.commons
commons-collections4
${commons-collections4.version}
test
-
org.projectlombok
lombok
@@ -150,21 +145,6 @@
1.8
-
- maven-surefire-plugin
- 2.22.0
-
-
- maven-surefire-plugin
- 2.19.1
-
-
- org.junit.platform
- junit-platform-surefire-provider
- 1.0.1
-
-
-
@@ -174,8 +154,8 @@
1.0
1.0
4.1
- 1.0.3
+ 1.1.6
4.0.1
-
+
\ No newline at end of file
diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/webclient/timeout/WebClientTimeoutProvider.java b/spring-5-reactive-client/src/main/java/com/baeldung/webclient/timeout/WebClientTimeoutProvider.java
new file mode 100644
index 0000000000..6bb5a2db38
--- /dev/null
+++ b/spring-5-reactive-client/src/main/java/com/baeldung/webclient/timeout/WebClientTimeoutProvider.java
@@ -0,0 +1,89 @@
+package com.baeldung.webclient.timeout;
+
+import io.netty.channel.ChannelOption;
+import io.netty.channel.epoll.EpollChannelOption;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.timeout.ReadTimeoutHandler;
+import io.netty.handler.timeout.WriteTimeoutHandler;
+import lombok.experimental.UtilityClass;
+import org.springframework.http.client.reactive.ReactorClientHttpConnector;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.netty.http.client.HttpClient;
+import reactor.netty.tcp.SslProvider;
+import reactor.netty.transport.ProxyProvider;
+
+import java.time.Duration;
+import java.util.concurrent.TimeUnit;
+
+@UtilityClass
+public class WebClientTimeoutProvider {
+
+ public static WebClient defaultWebClient() {
+ HttpClient httpClient = HttpClient.create();
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient responseTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .responseTimeout(Duration.ofSeconds(1));
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient connectionTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000);
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient connectionTimeoutWithKeepAliveClient() {
+ HttpClient httpClient = HttpClient.create()
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
+ .option(ChannelOption.SO_KEEPALIVE, true)
+ .option(EpollChannelOption.TCP_KEEPIDLE, 300)
+ .option(EpollChannelOption.TCP_KEEPINTVL, 60)
+ .option(EpollChannelOption.TCP_KEEPCNT, 8);
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient readWriteTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .doOnConnected(conn -> conn
+ .addHandler(new ReadTimeoutHandler(5, TimeUnit.SECONDS))
+ .addHandler(new WriteTimeoutHandler(5)));
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient sslTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .secure(spec -> spec
+ .sslContext(SslContextBuilder.forClient())
+ .defaultConfiguration(SslProvider.DefaultConfigurationType.TCP)
+ .handshakeTimeout(Duration.ofSeconds(30))
+ .closeNotifyFlushTimeout(Duration.ofSeconds(10))
+ .closeNotifyReadTimeout(Duration.ofSeconds(10)));
+
+ return buildWebClient(httpClient);
+ }
+
+ public WebClient proxyTimeoutClient() {
+ HttpClient httpClient = HttpClient.create()
+ .proxy(spec -> spec
+ .type(ProxyProvider.Proxy.HTTP)
+ .host("http://proxy")
+ .port(8080)
+ .connectTimeoutMillis(3000));
+
+ return buildWebClient(httpClient);
+ }
+
+ private WebClient buildWebClient(HttpClient httpClient) {
+ return WebClient.builder()
+ .clientConnector(new ReactorClientHttpConnector(httpClient))
+ .build();
+ }
+}
diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/webclient/timeout/WebClientTimeoutIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/webclient/timeout/WebClientTimeoutIntegrationTest.java
new file mode 100644
index 0000000000..d2e009fe6a
--- /dev/null
+++ b/spring-5-reactive-client/src/test/java/com/baeldung/webclient/timeout/WebClientTimeoutIntegrationTest.java
@@ -0,0 +1,129 @@
+package com.baeldung.webclient.timeout;
+
+import com.github.tomakehurst.wiremock.WireMockServer;
+import io.netty.handler.timeout.ReadTimeoutException;
+import lombok.val;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.reactive.function.client.WebClientRequestException;
+import reactor.core.publisher.Mono;
+import reactor.netty.http.client.HttpClientRequest;
+
+
+import java.time.Duration;
+import java.util.concurrent.TimeoutException;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.configureFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class WebClientTimeoutIntegrationTest {
+
+ private WireMockServer wireMockServer;
+
+ @Before
+ public void setup() {
+ wireMockServer = new WireMockServer(wireMockConfig().dynamicPort());
+ wireMockServer.start();
+ configureFor("localhost", wireMockServer.port());
+ }
+
+ @After
+ public void tearDown() {
+ wireMockServer.stop();
+ }
+
+ @AfterEach
+ public void tearDownEach() {
+ wireMockServer.resetAll();
+ }
+
+ @Test
+ public void givenResponseTimeoutClientWhenRequestTimeoutThenReadTimeoutException() {
+ val path = "/response-timeout";
+ val delay = Math.toIntExact(Duration.ofSeconds(2).toMillis());
+ stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay)
+ .withStatus(HttpStatus.OK.value())));
+
+ val webClient = WebClientTimeoutProvider.responseTimeoutClient();
+
+ val ex = assertThrows(RuntimeException.class, () ->
+ webClient.get()
+ .uri(wireMockServer.baseUrl() + path)
+ .exchangeToMono(Mono::just)
+ .log()
+ .block());
+ assertThat(ex).isInstanceOf(WebClientRequestException.class)
+ .getCause().isInstanceOf(ReadTimeoutException.class);
+ }
+
+ @Test
+ public void givenReadWriteTimeoutClientWhenRequestTimeoutThenReadTimeoutException() {
+ val path = "/read-write-timeout";
+ val delay = Math.toIntExact(Duration.ofSeconds(6).toMillis());
+ stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay)
+ .withStatus(HttpStatus.OK.value())));
+
+ val webClient = WebClientTimeoutProvider.readWriteTimeoutClient();
+
+ val ex = assertThrows(RuntimeException.class, () ->
+ webClient.get()
+ .uri(wireMockServer.baseUrl() + path)
+ .exchangeToMono(Mono::just)
+ .log()
+ .block());
+ assertThat(ex).isInstanceOf(WebClientRequestException.class)
+ .getCause().isInstanceOf(ReadTimeoutException.class);
+ }
+
+ @Test
+ public void givenNoTimeoutClientAndReactorTimeoutWhenRequestTimeoutThenTimeoutException() {
+ val path = "/reactor-timeout";
+ val delay = Math.toIntExact(Duration.ofSeconds(5).toMillis());
+ stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay)
+ .withStatus(HttpStatus.OK.value())));
+
+ val webClient = WebClientTimeoutProvider.defaultWebClient();
+
+ val ex = assertThrows(RuntimeException.class, () ->
+ webClient.get()
+ .uri(wireMockServer.baseUrl() + path)
+ .exchangeToMono(Mono::just)
+ .timeout(Duration.ofSeconds(1))
+ .log()
+ .block());
+ assertThat(ex).hasMessageContaining("Did not observe any item")
+ .getCause().isInstanceOf(TimeoutException.class);
+ }
+
+ @Test
+ public void givenNoTimeoutClientAndTimeoutHttpRequestWhenRequestTimeoutThenReadTimeoutException() {
+ val path = "/reactor-http-request-timeout";
+ val delay = Math.toIntExact(Duration.ofSeconds(5).toMillis());
+ stubFor(get(urlEqualTo(path)).willReturn(aResponse().withFixedDelay(delay)
+ .withStatus(HttpStatus.OK.value())));
+
+ val webClient = WebClientTimeoutProvider.defaultWebClient();
+
+ val ex = assertThrows(RuntimeException.class, () ->
+ webClient.get()
+ .uri(wireMockServer.baseUrl() + path)
+ .httpRequest(httpRequest -> {
+ HttpClientRequest reactorRequest = httpRequest.getNativeRequest();
+ reactorRequest.responseTimeout(Duration.ofSeconds(1));
+ })
+ .exchangeToMono(Mono::just)
+ .log()
+ .block());
+ assertThat(ex).isInstanceOf(WebClientRequestException.class)
+ .getCause().isInstanceOf(ReadTimeoutException.class);
+ }
+}
diff --git a/spring-5-reactive-oauth/pom.xml b/spring-5-reactive-oauth/pom.xml
index 15f5dcacaa..8e8b472881 100644
--- a/spring-5-reactive-oauth/pom.xml
+++ b/spring-5-reactive-oauth/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.reactive.oauth
spring-5-reactive-oauth
@@ -25,12 +26,10 @@
org.springframework.boot
spring-boot-starter-webflux
-
org.springframework.security
spring-security-oauth2-client
-
org.springframework.boot
spring-boot-starter-test
@@ -64,4 +63,4 @@
-
+
\ No newline at end of file
diff --git a/spring-5-reactive-security/pom.xml b/spring-5-reactive-security/pom.xml
index 2024cb5138..267a683fa7 100644
--- a/spring-5-reactive-security/pom.xml
+++ b/spring-5-reactive-security/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-5-reactive-security
0.0.1-SNAPSHOT
@@ -60,9 +61,7 @@
org.apache.commons
commons-lang3
-
-
org.springframework.boot
spring-boot-devtools
@@ -77,14 +76,12 @@
spring-boot-starter-test
test
-
org.apache.commons
commons-collections4
${commons-collections4.version}
test
-
io.reactivex.rxjava2
rxjava
@@ -130,4 +127,4 @@
3.1.6.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml
index 40791faaaf..408573198b 100644
--- a/spring-5-reactive/pom.xml
+++ b/spring-5-reactive/pom.xml
@@ -52,9 +52,7 @@
org.apache.commons
commons-lang3
-
-
org.springframework.boot
spring-boot-devtools
@@ -79,8 +77,6 @@
reactor-test
test
-
-
org.springframework.boot
@@ -102,14 +98,12 @@
org.springframework.session
spring-session-data-redis
-
org.apache.commons
commons-collections4
${commons-collections4.version}
test
-
io.reactivex.rxjava2
rxjava
@@ -162,4 +156,4 @@
4.1
-
+
\ No newline at end of file
diff --git a/spring-5-webflux/README.md b/spring-5-webflux/README.md
index 9f9a12f997..bd667468fb 100644
--- a/spring-5-webflux/README.md
+++ b/spring-5-webflux/README.md
@@ -9,3 +9,5 @@ This module contains articles about Spring 5 WebFlux
- [Spring WebClient Requests with Parameters](https://www.baeldung.com/webflux-webclient-parameters)
- [RSocket Using Spring Boot](https://www.baeldung.com/spring-boot-rsocket)
- [Spring MVC Async vs Spring WebFlux](https://www.baeldung.com/spring-mvc-async-vs-webflux)
+- [Set a Timeout in Spring 5 Webflux WebClient](https://www.baeldung.com/spring-webflux-timeout)
+- [Guide to Retry in Spring WebFlux](https://www.baeldung.com/spring-webflux-retry)
diff --git a/spring-5-webflux/pom.xml b/spring-5-webflux/pom.xml
index 48b5b823fb..ad1a66943c 100644
--- a/spring-5-webflux/pom.xml
+++ b/spring-5-webflux/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-5-webflux
1.0-SNAPSHOT
@@ -31,28 +32,28 @@
org.springframework.boot
spring-boot-starter-webflux
-
org.springframework.boot
spring-boot-starter-rsocket
-
org.projectlombok
lombok
-
org.springframework.boot
spring-boot-starter-test
test
-
io.projectreactor
reactor-test
test
+
+ com.squareup.okhttp3
+ mockwebserver
+
@@ -68,4 +69,4 @@
2.3.3.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ExternalConnector.java b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ExternalConnector.java
new file mode 100644
index 0000000000..baace095a7
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ExternalConnector.java
@@ -0,0 +1,73 @@
+package com.baeldung.spring.retry;
+
+import java.time.Duration;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import lombok.AllArgsConstructor;
+import reactor.core.publisher.Mono;
+import reactor.util.retry.Retry;
+
+@Component
+@AllArgsConstructor
+public class ExternalConnector {
+
+ private static final String PATH_BY_ID = "/data/{id}";
+
+ private final WebClient webClient;
+
+ public Mono getData(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .onStatus(HttpStatus::is5xxServerError, response -> Mono.error(new ServiceException("Server error", response.rawStatusCode())))
+ .bodyToMono(String.class)
+ .retryWhen(Retry.backoff(3, Duration.ofSeconds(2))
+ .filter(throwable -> throwable instanceof ServiceException)
+ .onRetryExhaustedThrow((retryBackoffSpec, retrySignal) -> {
+ throw new ServiceException("External Service failed to process after max retries", HttpStatus.SERVICE_UNAVAILABLE.value());
+ }));
+ }
+
+ public Mono getDataWithRetry(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .bodyToMono(String.class)
+ .retryWhen(Retry.max(3));
+ }
+
+ public Mono getDataWithRetryFixedDelay(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .bodyToMono(String.class)
+ .retryWhen(Retry.fixedDelay(3, Duration.ofSeconds(2)));
+ }
+
+ public Mono getDataWithRetryBackoff(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .bodyToMono(String.class)
+ .retryWhen(Retry.backoff(3, Duration.ofSeconds(2)));
+ }
+
+ public Mono getDataWithRetryBackoffJitter(String stockId) {
+ return webClient.get()
+ .uri(PATH_BY_ID, stockId)
+ .accept(MediaType.APPLICATION_JSON)
+ .retrieve()
+ .bodyToMono(String.class)
+ .retryWhen(Retry.backoff(3, Duration.ofSeconds(2))
+ .jitter(1));
+ }
+
+}
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ServiceException.java b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ServiceException.java
new file mode 100644
index 0000000000..cbfa71f986
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/ServiceException.java
@@ -0,0 +1,15 @@
+package com.baeldung.spring.retry;
+
+public class ServiceException extends RuntimeException {
+
+ private final int statusCode;
+
+ public ServiceException(String message, int statusCode) {
+ super(message);
+ this.statusCode = statusCode;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+}
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockController.java b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockController.java
new file mode 100644
index 0000000000..b03558d53f
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockController.java
@@ -0,0 +1,23 @@
+package com.baeldung.spring.retry;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import lombok.AllArgsConstructor;
+import reactor.core.publisher.Mono;
+
+@AllArgsConstructor
+@RestController
+@RequestMapping("/stocks/data")
+public class StockController {
+
+ private final ExternalConnector externalConnector;
+
+ @GetMapping("/{stockId}")
+ public Mono getData(@PathVariable String stockId) {
+ return externalConnector.getData(stockId);
+ }
+
+}
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockDataApp.java b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockDataApp.java
new file mode 100644
index 0000000000..cfd1852f62
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/retry/StockDataApp.java
@@ -0,0 +1,18 @@
+package com.baeldung.spring.retry;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.reactive.function.client.WebClient;
+
+@SpringBootApplication
+public class StockDataApp {
+ public static void main(String[] args) {
+ SpringApplication.run(StockDataApp.class, args);
+ }
+
+ @Bean
+ public WebClient webClient() {
+ return WebClient.create();
+ }
+}
diff --git a/spring-5-webflux/src/test/java/com/baeldung/spring/retry/ExternalConnectorIntegrationTest.java b/spring-5-webflux/src/test/java/com/baeldung/spring/retry/ExternalConnectorIntegrationTest.java
new file mode 100644
index 0000000000..60d22def74
--- /dev/null
+++ b/spring-5-webflux/src/test/java/com/baeldung/spring/retry/ExternalConnectorIntegrationTest.java
@@ -0,0 +1,90 @@
+package com.baeldung.spring.retry;
+
+import static io.netty.handler.codec.http.HttpResponseStatus.SERVICE_UNAVAILABLE;
+import static io.netty.handler.codec.http.HttpResponseStatus.UNAUTHORIZED;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.web.reactive.function.client.WebClient;
+import org.springframework.web.reactive.function.client.WebClientResponseException;
+
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+import reactor.test.StepVerifier;
+
+class ExternalConnectorIntegrationTest {
+
+ private ExternalConnector externalConnector;
+
+ private MockWebServer mockExternalService;
+
+ @BeforeEach
+ void setup() throws IOException {
+ externalConnector = new ExternalConnector(WebClient.builder()
+ .baseUrl("http://localhost:8090")
+ .build());
+ mockExternalService = new MockWebServer();
+ mockExternalService.start(8090);
+ }
+
+ @AfterEach
+ void tearDown() throws IOException {
+ mockExternalService.shutdown();
+ }
+
+ @Test
+ void givenExternalServiceReturnsError_whenGettingData_thenRetryAndReturnResponse() throws Exception {
+
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setBody("stock data"));
+
+ StepVerifier.create(externalConnector.getData("ABC"))
+ .expectNextMatches(response -> response.equals("stock data"))
+ .verifyComplete();
+
+ verifyNumberOfGetRequests(4);
+ }
+
+ @Test
+ void givenExternalServiceReturnsClientError_whenGettingData_thenNoRetry() throws Exception {
+
+ mockExternalService.enqueue(new MockResponse().setResponseCode(UNAUTHORIZED.code()));
+
+ StepVerifier.create(externalConnector.getData("ABC"))
+ .expectError(WebClientResponseException.class)
+ .verify();
+
+ verifyNumberOfGetRequests(1);
+ }
+
+ @Test
+ void givenExternalServiceRetryAttemptsExhausted_whenGettingData_thenRetryAndReturnError() throws Exception {
+
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+ mockExternalService.enqueue(new MockResponse().setResponseCode(SERVICE_UNAVAILABLE.code()));
+
+ StepVerifier.create(externalConnector.getData("ABC"))
+ .expectError(ServiceException.class)
+ .verify();
+
+ verifyNumberOfGetRequests(4);
+ }
+
+ private void verifyNumberOfGetRequests(int times) throws Exception {
+ for (int i = 0; i < times; i++) {
+ RecordedRequest recordedRequest = mockExternalService.takeRequest();
+ assertThat(recordedRequest.getMethod()).isEqualTo("GET");
+ assertThat(recordedRequest.getPath()).isEqualTo("/data/ABC");
+ }
+ }
+
+}
diff --git a/spring-5-webflux/src/test/java/com/baeldung/spring/retry/StockControllerIntegrationTest.java b/spring-5-webflux/src/test/java/com/baeldung/spring/retry/StockControllerIntegrationTest.java
new file mode 100644
index 0000000000..2ad94f4d6a
--- /dev/null
+++ b/spring-5-webflux/src/test/java/com/baeldung/spring/retry/StockControllerIntegrationTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.spring.retry;
+
+import static org.mockito.BDDMockito.given;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+import reactor.core.publisher.Mono;
+
+@RunWith(SpringRunner.class)
+@WebFluxTest
+public class StockControllerIntegrationTest {
+
+ @Autowired
+ private WebTestClient webClient;
+
+ @MockBean
+ private ExternalConnector externalConnector;
+
+ @Test
+ public void shouldReturnStockData() {
+ given(externalConnector.getData("ABC")).willReturn(Mono.just("stock data"));
+
+ webClient.get()
+ .uri("/stocks/data/{id}", "ABC")
+ .exchange()
+ .expectStatus()
+ .isOk()
+ .expectBody(String.class)
+ .isEqualTo("stock data");
+ }
+}
diff --git a/spring-5/pom.xml b/spring-5/pom.xml
index e368bcacba..5ebeb4dadf 100644
--- a/spring-5/pom.xml
+++ b/spring-5/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-5
0.0.1-SNAPSHOT
@@ -55,9 +55,7 @@
org.apache.commons
commons-lang3
-
-
org.springframework.boot
spring-boot-devtools
@@ -68,7 +66,6 @@
h2
runtime
-
org.springframework
spring-test
@@ -133,7 +130,7 @@
-
+
@@ -142,7 +139,6 @@
1.5.6
4.1
${project.build.directory}/generated-snippets
- 2.21.0
-
+
\ No newline at end of file
diff --git a/spring-5/src/test/java/com/baeldung/README.md b/spring-5/src/test/java/com/baeldung/README.md
deleted file mode 100644
index 0ff61914d5..0000000000
--- a/spring-5/src/test/java/com/baeldung/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Concurrent Test Execution in Spring 5](https://www.baeldung.com/spring-5-concurrent-tests)
diff --git a/spring-activiti/pom.xml b/spring-activiti/pom.xml
index a8557b4f56..c685207cc4 100644
--- a/spring-activiti/pom.xml
+++ b/spring-activiti/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-activiti
spring-activiti
@@ -8,7 +9,8 @@
Demo project for Spring Boot
-
+
com.baeldung
parent-boot-1
0.0.1-SNAPSHOT
@@ -30,7 +32,6 @@
org.springframework.boot
spring-boot-starter-thymeleaf
-
com.h2database
h2
@@ -60,4 +61,4 @@
6.0.0
-
+
\ No newline at end of file
diff --git a/spring-akka/pom.xml b/spring-akka/pom.xml
index 23535a8ccc..fb7a6198c3 100644
--- a/spring-akka/pom.xml
+++ b/spring-akka/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-akka
0.1-SNAPSHOT
diff --git a/spring-amqp/pom.xml b/spring-amqp/pom.xml
index f32db5b8b4..1a0b78c26e 100755
--- a/spring-amqp/pom.xml
+++ b/spring-amqp/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-amqp
1.0.0-SNAPSHOT
@@ -25,4 +26,4 @@
com.baeldung.springamqp.simple.HelloWorldMessageApp
-
+
\ No newline at end of file
diff --git a/spring-aop/README.md b/spring-aop/README.md
index c92e132d1e..707e0fbf81 100644
--- a/spring-aop/README.md
+++ b/spring-aop/README.md
@@ -12,3 +12,4 @@ This module contains articles about Spring aspect oriented programming (AOP)
- [Introduction to Advice Types in Spring](https://www.baeldung.com/spring-aop-advice-tutorial)
- [When Does Java Throw UndeclaredThrowableException?](https://www.baeldung.com/java-undeclaredthrowableexception)
- [Get Advised Method Info in Spring AOP](https://www.baeldung.com/spring-aop-get-advised-method-info)
+- [Advise Methods on Annotated Classes With AspectJ](https://www.baeldung.com/aspectj-advise-methods)
diff --git a/spring-aop/pom.xml b/spring-aop/pom.xml
index 74b6f48b46..464a830383 100644
--- a/spring-aop/pom.xml
+++ b/spring-aop/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
spring-aop
@@ -14,6 +15,14 @@
+
+ org.aspectj
+ aspectjrt
+
+
+ org.aspectj
+ aspectjweaver
+
org.springframework.boot
spring-boot-starter-aop
@@ -23,7 +32,43 @@
spring-boot-starter-test
test
+
+ org.mockito
+ mockito-core
+ test
+
-
+
+
+
+ org.codehaus.mojo
+ aspectj-maven-plugin
+ ${aspectj-plugin.version}
+
+ ${java.version}
+ ${java.version}
+ ${java.version}
+ true
+ true
+ ignore
+ UTF-8
+
+ **/pointcutadvice/**
+
+
+
+
+
+ compile
+
+
+
+
+
+
+
+ 1.11
+
+
\ No newline at end of file
diff --git a/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedService.java b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedService.java
new file mode 100644
index 0000000000..7c6934e67e
--- /dev/null
+++ b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedService.java
@@ -0,0 +1,19 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.stereotype.Component;
+
+@Trace
+@Component
+public class MyTracedService {
+ private static final Log LOG = LogFactory.getLog(MyTracedService.class);
+
+ public void performSomeLogic() {
+ LOG.info("Inside performSomeLogic...");
+ }
+
+ public void performSomeAdditionalLogic() {
+ LOG.info("Inside performSomeAdditionalLogic...");
+ }
+}
diff --git a/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumer.java b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumer.java
new file mode 100644
index 0000000000..1d5a017230
--- /dev/null
+++ b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumer.java
@@ -0,0 +1,12 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class MyTracedServiceConsumer {
+
+ public MyTracedServiceConsumer(MyTracedService myTracedService) {
+ myTracedService.performSomeLogic();
+ myTracedService.performSomeAdditionalLogic();
+ }
+}
diff --git a/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/Trace.java b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/Trace.java
new file mode 100644
index 0000000000..0ab1547eeb
--- /dev/null
+++ b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/Trace.java
@@ -0,0 +1,12 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface Trace {
+
+}
diff --git a/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/TracingAspect.aj b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/TracingAspect.aj
new file mode 100644
index 0000000000..20a42940b8
--- /dev/null
+++ b/spring-aop/src/main/java/com/baeldung/aspectj/classmethodadvice/TracingAspect.aj
@@ -0,0 +1,24 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public aspect TracingAspect {
+ private static final Log LOG = LogFactory.getLog(TracingAspect.class);
+
+ pointcut traceAnnotatedClasses(): within(@Trace *) && execution(* *(..));
+
+ Object around() : traceAnnotatedClasses() {
+ String signature = thisJoinPoint.getSignature().toShortString();
+ LOG.trace("Entering " + signature);
+ try {
+ return proceed();
+ } finally {
+ LOG.trace("Exiting " + signature);
+ }
+ }
+
+ after() throwing (Exception e) : traceAnnotatedClasses() {
+ LOG.trace("Exception thrown from " + thisJoinPoint.getSignature().toShortString(), e);
+ }
+}
diff --git a/spring-aop/src/main/resources/logback.xml b/spring-aop/src/main/resources/logback.xml
index 4eaa556705..84885fae62 100644
--- a/spring-aop/src/main/resources/logback.xml
+++ b/spring-aop/src/main/resources/logback.xml
@@ -17,6 +17,8 @@
+
+
diff --git a/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumerUnitTest.java b/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumerUnitTest.java
new file mode 100644
index 0000000000..605ffc62c6
--- /dev/null
+++ b/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceConsumerUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.verify;
+
+public class MyTracedServiceConsumerUnitTest {
+
+ @Rule
+ public MockitoRule mockitoRule = MockitoJUnit.rule();
+
+ @Spy
+ private MyTracedService myTracedService;
+
+ @Test
+ public void whenCallingConsumer_thenServiceIsCalled() {
+ doNothing().when(myTracedService)
+ .performSomeLogic();
+ doNothing().when(myTracedService)
+ .performSomeAdditionalLogic();
+
+ new MyTracedServiceConsumer(myTracedService);
+
+ verify(myTracedService).performSomeLogic();
+ verify(myTracedService).performSomeAdditionalLogic();
+ }
+}
\ No newline at end of file
diff --git a/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceUnitTest.java b/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceUnitTest.java
new file mode 100644
index 0000000000..a5c3280d9e
--- /dev/null
+++ b/spring-aop/src/test/java/com/baeldung/aspectj/classmethodadvice/MyTracedServiceUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.aspectj.classmethodadvice;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.springframework.boot.test.system.OutputCaptureRule;
+
+import static org.junit.Assert.assertTrue;
+
+/*
+ * When running this test class, the tests may fail unless you build the code with Maven first. You
+ * must ensure the AspectJ compiler executes to weave in the Aspect's logic. Without the Aspect
+ * weaved into the class under test, the trace logging will not be written to stdout.
+ */
+public class MyTracedServiceUnitTest {
+
+ @Rule
+ public OutputCaptureRule outputCaptureRule = new OutputCaptureRule();
+
+ @Test
+ public void whenPerformingSomeLogic_thenTraceAndInfoOutputIsWritten() {
+ MyTracedService myTracedService = new MyTracedService();
+ myTracedService.performSomeLogic();
+
+ String output = outputCaptureRule.getOut();
+ assertTrue(output.contains("TracingAspect - Entering MyTracedService.performSomeLogic"));
+ assertTrue(output.contains("MyTracedService - Inside performSomeLogic"));
+ assertTrue(output.contains("TracingAspect - Exiting MyTracedService.performSomeLogic"));
+ }
+
+ @Test
+ public void whenPerformingSomeAdditionalLogic_thenTraceAndInfoOutputIsWritten() {
+ MyTracedService myTracedService = new MyTracedService();
+ myTracedService.performSomeAdditionalLogic();
+
+ String output = outputCaptureRule.getOut();
+ assertTrue(output.contains("TracingAspect - Entering MyTracedService.performSomeAdditionalLogic"));
+ assertTrue(output.contains("MyTracedService - Inside performSomeAdditionalLogic"));
+ assertTrue(output.contains("TracingAspect - Exiting MyTracedService.performSomeAdditionalLogic"));
+ }
+}
\ No newline at end of file
diff --git a/spring-apache-camel/pom.xml b/spring-apache-camel/pom.xml
index 9c7cc14381..de7bd1287a 100644
--- a/spring-apache-camel/pom.xml
+++ b/spring-apache-camel/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
org.apache.camel
spring-apache-camel
@@ -65,4 +66,4 @@
4.3.4.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-batch-2/pom.xml b/spring-batch-2/pom.xml
index 183ad610f3..c429c272bd 100644
--- a/spring-batch-2/pom.xml
+++ b/spring-batch-2/pom.xml
@@ -51,4 +51,4 @@
2.5.1
-
+
\ No newline at end of file
diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml
index 75ec0d4877..b195ff8d13 100644
--- a/spring-batch/pom.xml
+++ b/spring-batch/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
spring-batch
@@ -24,21 +25,18 @@
${jaxb.version}
runtime
-
org.glassfish.jaxb
jaxb-runtime
${jaxb.version}
runtime
-
org.xerial
sqlite-jdbc
${sqlite.version}
-
org.springframework
spring-oxm
@@ -50,42 +48,35 @@
-
org.springframework
spring-jdbc
${spring.version}
-
org.springframework.batch
spring-batch-core
${spring.batch.version}
-
org.springframework.batch
spring-batch-test
${spring.batch.version}
-
com.opencsv
opencsv
${opencsv.version}
-
org.springframework.boot
spring-boot-starter-batch
-
org.hsqldb
hsqldb
runtime
-
org.awaitility
awaitility
@@ -103,4 +94,4 @@
3.1.1
-
+
\ No newline at end of file
diff --git a/spring-bom/pom.xml b/spring-bom/pom.xml
index e82c650fa9..7ba21ee285 100644
--- a/spring-bom/pom.xml
+++ b/spring-bom/pom.xml
@@ -1,6 +1,7 @@
-
-
+
+
4.0.0
spring-bom
1.0.0-SNAPSHOT
@@ -39,4 +40,4 @@
4.3.8.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index 263d2af089..7c94d5b7d7 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -1,13 +1,12 @@
-
+
4.0.0
-
com.baeldung.spring-boot-modules
spring-boot-modules
1.0.0-SNAPSHOT
pom
-
spring-boot-modules
@@ -34,6 +33,7 @@
spring-boot-ctx-fluent
spring-boot-deployment
spring-boot-di
+ spring-boot-disable-logging
spring-boot-camel
spring-boot-ci-cd
@@ -54,6 +54,7 @@
spring-boot-mvc-2
spring-boot-mvc-3
spring-boot-mvc-birt
+ spring-boot-mvc-jersey
spring-boot-nashorn
spring-boot-parent
spring-boot-performance
@@ -72,9 +73,9 @@
spring-boot-xml
spring-boot-actuator
spring-boot-data-2
+ spring-boot-react
-
@@ -105,17 +106,9 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.2
-
-
-
-
5.6.2
+ 2.22.2
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-1/pom.xml b/spring-boot-modules/spring-boot-1/pom.xml
index d44120b21e..9f91cc8f2e 100644
--- a/spring-boot-modules/spring-boot-1/pom.xml
+++ b/spring-boot-modules/spring-boot-1/pom.xml
@@ -1,13 +1,14 @@
-
+
4.0.0
spring-boot-1
jar
Module for Spring Boot version 1.x
-
+
com.baeldung
parent-boot-1
0.0.1-SNAPSHOT
@@ -43,4 +44,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-actuator/README.md b/spring-boot-modules/spring-boot-actuator/README.md
index 3e8ef3411b..9e2f30786f 100644
--- a/spring-boot-modules/spring-boot-actuator/README.md
+++ b/spring-boot-modules/spring-boot-actuator/README.md
@@ -10,3 +10,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Liveness and Readiness Probes in Spring Boot](https://www.baeldung.com/spring-liveness-readiness-probes)
- [Custom Information in Spring Boot Info Endpoint](https://www.baeldung.com/spring-boot-info-actuator-custom)
- [Health Indicators in Spring Boot](https://www.baeldung.com/spring-boot-health-indicators)
+- [How to Enable All Endpoints in Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuator-enable-endpoints)
diff --git a/spring-boot-modules/spring-boot-actuator/pom.xml b/spring-boot-modules/spring-boot-actuator/pom.xml
index a808b8cb1b..1865974ab0 100644
--- a/spring-boot-modules/spring-boot-actuator/pom.xml
+++ b/spring-boot-modules/spring-boot-actuator/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-boot-actuator
spring-boot-actuator
@@ -12,7 +12,7 @@
org.springframework.boot
spring-boot-starter-parent
2.3.2.RELEASE
-
+
@@ -28,11 +28,14 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.springframework.boot
+ spring-boot-starter-security
+
com.h2database
h2
-
org.springframework.boot
spring-boot-starter-test
@@ -44,6 +47,11 @@
+
+ org.springframework.security
+ spring-security-test
+ test
+
@@ -53,9 +61,10 @@
spring-boot-maven-plugin
com.baeldung.probes.ProbesApplication
+ com.baeldung.endpoints.enabling.EndpointEnablingApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/EndpointEnablingApplication.java b/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/EndpointEnablingApplication.java
new file mode 100644
index 0000000000..2e8024dcd5
--- /dev/null
+++ b/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/EndpointEnablingApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.endpoints.enabling;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+
+@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class }, scanBasePackages = "com.baeldung.endpoints.enabling")
+public class EndpointEnablingApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(EndpointEnablingApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/SecurityConfiguration.java b/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/SecurityConfiguration.java
new file mode 100644
index 0000000000..894c24693e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-actuator/src/main/java/com/baeldung/endpoints/enabling/SecurityConfiguration.java
@@ -0,0 +1,36 @@
+package com.baeldung.endpoints.enabling;
+
+import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+ PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
+ auth.inMemoryAuthentication()
+ .withUser("user")
+ .password(encoder.encode("password"))
+ .roles("USER")
+ .and()
+ .withUser("admin")
+ .password(encoder.encode("admin"))
+ .roles("USER", "ADMIN");
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.requestMatcher(EndpointRequest.toAnyEndpoint())
+ .authorizeRequests((requests) -> requests.anyRequest()
+ .hasRole("ADMIN"));
+ http.httpBasic();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-actuator/src/main/resources/application.properties b/spring-boot-modules/spring-boot-actuator/src/main/resources/application.properties
index de7be417a8..e69c763eeb 100644
--- a/spring-boot-modules/spring-boot-actuator/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-actuator/src/main/resources/application.properties
@@ -11,3 +11,6 @@ info.app.name=Spring Sample Application
info.app.description=This is my first spring boot application G1
info.app.version=1.0.0
info.java-vendor = ${java.specification.vendor}
+
+management.endpoints.web.exposure.include=*
+management.endpoint.shutdown.enabled=true
diff --git a/spring-boot-modules/spring-boot-actuator/src/test/java/com/baeldung/endpoints/enabling/EndpointEnablingIntegrationTest.java b/spring-boot-modules/spring-boot-actuator/src/test/java/com/baeldung/endpoints/enabling/EndpointEnablingIntegrationTest.java
new file mode 100644
index 0000000000..8274619517
--- /dev/null
+++ b/spring-boot-modules/spring-boot-actuator/src/test/java/com/baeldung/endpoints/enabling/EndpointEnablingIntegrationTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.endpoints.enabling;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.web.servlet.MockMvc;
+
+@SpringBootTest
+@AutoConfigureMockMvc
+public class EndpointEnablingIntegrationTest {
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Test
+ @WithMockUser(username = "user", password = "password", roles = "USER")
+ public void givenWrongAuthentication_whenCallingActuator_thenReturns401() throws Exception {
+ mockMvc.perform(get("/actuator"))
+ .andExpect(status().isForbidden());
+ }
+
+ @Test
+ @WithMockUser(username = "admin", password = "admin", roles = "ADMIN")
+ public void givenProperAuthentication_whenCallingActuator_thenReturnsExpectedEndpoints() throws Exception {
+ mockMvc.perform(get("/actuator"))
+ .andExpect(jsonPath("$._links").exists())
+ .andExpect(jsonPath("$._links.beans").exists())
+ .andExpect(jsonPath("$._links.env").exists())
+ .andExpect(jsonPath("$._links.shutdown").exists());
+ }
+}
diff --git a/spring-boot-modules/spring-boot-admin/pom.xml b/spring-boot-modules/spring-boot-admin/pom.xml
index 6109081723..b995b6f02e 100644
--- a/spring-boot-modules/spring-boot-admin/pom.xml
+++ b/spring-boot-modules/spring-boot-admin/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ spring-boot-admin
+ 0.0.1-SNAPSHOT
+ pom
+ spring-boot-admin
com.baeldung.spring-boot-modules
@@ -10,14 +15,9 @@
../
- spring-boot-admin
- 0.0.1-SNAPSHOT
- pom
-
- spring-boot-admin
-
spring-boot-admin-server
spring-boot-admin-client
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml
index eb40bfe8ea..a565b94c79 100644
--- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml
+++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-client/pom.xml
@@ -1,7 +1,13 @@
-
+
4.0.0
+ spring-boot-admin-client
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-admin-client
+ Spring Boot Admin Client
com.baeldung.spring-boot-modules
@@ -10,13 +16,6 @@
../
- spring-boot-admin-client
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-admin-client
- Spring Boot Admin Client
-
org.springframework.boot
@@ -61,7 +60,8 @@
- 2.2.2
+ 2.4.0
2.0.4.RELEASE
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml
index 558aed8b26..b53394cdef 100644
--- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml
+++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/pom.xml
@@ -1,7 +1,13 @@
-
+
4.0.0
+ spring-boot-admin-server
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-admin-server
+ Spring Boot Admin Server
com.baeldung.spring-boot-modules
@@ -10,19 +16,11 @@
../
- spring-boot-admin-server
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-admin-server
- Spring Boot Admin Server
-
org.springframework.boot
spring-boot-starter-web
-
@@ -30,7 +28,6 @@
spring-boot-admin-starter-server
${spring-boot-admin-server.version}
-
de.codecentric
@@ -45,7 +42,6 @@
com.hazelcast
hazelcast
-
de.codecentric
@@ -53,12 +49,10 @@
${spring-boot-admin-starter-client.version}
-
org.springframework.boot
spring-boot-starter-mail
-
org.springframework.boot
spring-boot-starter-test
@@ -82,10 +76,10 @@
- 2.2.2
- 2.2.2
+ 2.4.0
+ 2.4.0
1.5.7
2.0.4.RELEASE
- 2.3.3.RELEASE
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java
index e934086cf4..5a713c7e8f 100644
--- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java
+++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java
@@ -1,11 +1,12 @@
package com.baeldung.springbootadminserver;
+import de.codecentric.boot.admin.server.config.AdminServerHazelcastAutoConfiguration;
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableAdminServer
-@SpringBootApplication
+@SpringBootApplication(exclude = AdminServerHazelcastAutoConfiguration.class)
public class SpringBootAdminServerApplication {
public static void main(String[] args) {
diff --git a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java
index d38b0e933c..d53707c19a 100644
--- a/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java
+++ b/spring-boot-modules/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java
@@ -1,12 +1,13 @@
package com.baeldung.springbootadminserver.configs;
import com.hazelcast.config.Config;
+import com.hazelcast.config.EvictionConfig;
import com.hazelcast.config.EvictionPolicy;
import com.hazelcast.config.InMemoryFormat;
import com.hazelcast.config.MapConfig;
import com.hazelcast.config.MergePolicyConfig;
import com.hazelcast.config.TcpIpConfig;
-import com.hazelcast.map.merge.PutIfAbsentMapMergePolicy;
+import com.hazelcast.spi.merge.PutIfAbsentMergePolicy;
import java.util.Collections;
@@ -16,32 +17,27 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class HazelcastConfig {
- @Bean
- public Config hazelcast() {
- MapConfig eventStoreMap = new MapConfig("spring-boot-admin-event-store").setInMemoryFormat(InMemoryFormat.OBJECT)
- .setBackupCount(1)
- .setEvictionPolicy(EvictionPolicy.NONE)
- .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100));
+ @Bean
+ public Config hazelcast() {
+ MapConfig eventStoreMap = new MapConfig("spring-boot-admin-event-store")
+ .setInMemoryFormat(InMemoryFormat.OBJECT).setBackupCount(1)
+ .setEvictionConfig(new EvictionConfig().setEvictionPolicy(EvictionPolicy.NONE))
+ .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMergePolicy.class.getName(), 100));
- MapConfig sentNotificationsMap = new MapConfig("spring-boot-admin-application-store").setInMemoryFormat(InMemoryFormat.OBJECT)
- .setBackupCount(1)
- .setEvictionPolicy(EvictionPolicy.LRU)
- .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100));
+ MapConfig sentNotificationsMap = new MapConfig("spring-boot-admin-application-store")
+ .setInMemoryFormat(InMemoryFormat.OBJECT).setBackupCount(1)
+ .setEvictionConfig(new EvictionConfig().setEvictionPolicy(EvictionPolicy.LRU))
+ .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMergePolicy.class.getName(), 100));
- Config config = new Config();
- config.addMapConfig(eventStoreMap);
- config.addMapConfig(sentNotificationsMap);
- config.setProperty("hazelcast.jmx", "true");
+ Config config = new Config();
+ config.addMapConfig(eventStoreMap);
+ config.addMapConfig(sentNotificationsMap);
+ config.setProperty("hazelcast.jmx", "true");
- config.getNetworkConfig()
- .getJoin()
- .getMulticastConfig()
- .setEnabled(false);
- TcpIpConfig tcpIpConfig = config.getNetworkConfig()
- .getJoin()
- .getTcpIpConfig();
- tcpIpConfig.setEnabled(true);
- tcpIpConfig.setMembers(Collections.singletonList("127.0.0.1"));
- return config;
- }
+ config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
+ TcpIpConfig tcpIpConfig = config.getNetworkConfig().getJoin().getTcpIpConfig();
+ tcpIpConfig.setEnabled(true);
+ tcpIpConfig.setMembers(Collections.singletonList("127.0.0.1"));
+ return config;
+ }
}
diff --git a/spring-boot-modules/spring-boot-angular/pom.xml b/spring-boot-modules/spring-boot-angular/pom.xml
index ac63d21bb8..89a8814d2f 100644
--- a/spring-boot-modules/spring-boot-angular/pom.xml
+++ b/spring-boot-modules/spring-boot-angular/pom.xml
@@ -1,7 +1,13 @@
-
+
4.0.0
+ com.baeldung.springbootangular
+ spring-boot-angular
+ 1.0
+ jar
+ spring-boot-angular
com.baeldung.spring-boot-modules
@@ -10,13 +16,6 @@
../
- com.baeldung.springbootangular
- spring-boot-angular
- 1.0
- jar
-
- spring-boot-angular
-
org.springframework.boot
@@ -52,4 +51,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-annotations/pom.xml b/spring-boot-modules/spring-boot-annotations/pom.xml
index 799692d51b..b495c5de04 100644
--- a/spring-boot-modules/spring-boot-annotations/pom.xml
+++ b/spring-boot-modules/spring-boot-annotations/pom.xml
@@ -1,7 +1,11 @@
-
+
4.0.0
+ spring-boot-annotations
+ war
+ spring-boot-annotations
com.baeldung.spring-boot-modules
@@ -10,23 +14,16 @@
../
- spring-boot-annotations
- war
-
- spring-boot-annotations
-
org.aspectj
aspectjweaver
${aspectjweaver.version}
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-data-jpa
@@ -37,12 +34,10 @@
-
org.hibernate
hibernate-core
-
org.springframework.boot
@@ -50,5 +45,5 @@
test
-
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-artifacts-2/pom.xml b/spring-boot-modules/spring-boot-artifacts-2/pom.xml
index abea13151e..8cf78b79e0 100644
--- a/spring-boot-modules/spring-boot-artifacts-2/pom.xml
+++ b/spring-boot-modules/spring-boot-artifacts-2/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ spring-boot-artifacts-2
+ jar
+ spring-boot-artifacts-2
+ Demo project for Spring Boot
com.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-artifacts-2
- jar
-
- spring-boot-artifacts-2
- Demo project for Spring Boot
-
org.springframework.boot
@@ -45,4 +44,4 @@
com.baeldung.demo.DemoApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-artifacts/pom.xml b/spring-boot-modules/spring-boot-artifacts/pom.xml
index 467f931559..7ed91a6626 100644
--- a/spring-boot-modules/spring-boot-artifacts/pom.xml
+++ b/spring-boot-modules/spring-boot-artifacts/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ spring-boot-artifacts
+ war
+ spring-boot-artifacts
+ Demo project for Spring Boot
com.baeldung.spring-boot-modules
@@ -10,88 +15,69 @@
../
- spring-boot-artifacts
- war
-
- spring-boot-artifacts
- Demo project for Spring Boot
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-thymeleaf
provided
-
org.springframework.boot
spring-boot-starter-test
test
-
org.springframework.boot
spring-boot-starter-data-jpa
-
org.springframework.boot
spring-boot-starter-mail
-
org.springframework.boot
spring-boot-starter-actuator
-
com.h2database
h2
runtime
-
javax.persistence
javax.persistence-api
${jpa.version}
-
com.google.guava
guava
${guava.version}
-
org.subethamail
subethasmtp
${subethasmtp.version}
test
-
org.webjars
bootstrap
${bootstrap.version}
-
org.webjars
jquery
${jquery.version}
-
org.apache.httpcomponents
httpclient
${httpclient.version}
-
@@ -116,8 +102,8 @@
maven-failsafe-plugin
2.18
-
+
integration-tests
@@ -125,8 +111,8 @@
verify
-
+
**/ExternalPropertyFileLoaderIntegrationTest.java
@@ -134,7 +120,6 @@
-
pl.project13.maven
git-commit-id-plugin
@@ -160,7 +145,6 @@
${project.build.outputDirectory}/git.properties
-
@@ -213,4 +197,4 @@
4.5.8
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-autoconfiguration/pom.xml b/spring-boot-modules/spring-boot-autoconfiguration/pom.xml
index 269d87bbb9..bf8bcc5a87 100644
--- a/spring-boot-modules/spring-boot-autoconfiguration/pom.xml
+++ b/spring-boot-modules/spring-boot-autoconfiguration/pom.xml
@@ -1,7 +1,13 @@
-
4.0.0
+ spring-boot-autoconfiguration
+ 0.0.1-SNAPSHOT
+ war
+ spring-boot-autoconfiguration
+ This is simple boot application demonstrating a custom auto-configuration
com.baeldung.spring-boot-modules
@@ -10,13 +16,6 @@
../
- spring-boot-autoconfiguration
- 0.0.1-SNAPSHOT
- war
-
- spring-boot-autoconfiguration
- This is simple boot application demonstrating a custom auto-configuration
-
org.springframework.boot
@@ -39,19 +38,15 @@
spring-boot-starter-test
test
-
mysql
mysql-connector-java
-
org.springframework.boot
spring-boot-configuration-processor
- 2.1.6.RELEASE
true
-
org.hsqldb
hsqldb
@@ -60,21 +55,19 @@
- spring-boot
+ spring-boot-autoconfiguration
src/main/resources
true
-
org.apache.maven.plugins
maven-war-plugin
-
diff --git a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml
index 3ce9266ebe..d42a7fd3de 100644
--- a/spring-boot-modules/spring-boot-basic-customization-2/pom.xml
+++ b/spring-boot-modules/spring-boot-basic-customization-2/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-basic-customization-2
+ jar
+ spring-boot-basic-customization-2
+ Module For Spring Boot Basic Customization 2
com.baeldung.spring-boot-modules
@@ -11,18 +15,11 @@
../
- spring-boot-basic-customization-2
- jar
-
- spring-boot-basic-customization-2
- Module For Spring Boot Basic Customization 2
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-test
@@ -30,4 +27,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-basic-customization/pom.xml b/spring-boot-modules/spring-boot-basic-customization/pom.xml
index fc34994a85..5ab747cff1 100644
--- a/spring-boot-modules/spring-boot-basic-customization/pom.xml
+++ b/spring-boot-modules/spring-boot-basic-customization/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-basic-customization
+ jar
+ spring-boot-basic-customization
+ Module For Spring Boot Basic Customization
com.baeldung.spring-boot-modules
@@ -11,28 +15,19 @@
../
- spring-boot-basic-customization
- jar
-
- spring-boot-basic-customization
- Module For Spring Boot Basic Customization
-
org.springframework.boot
spring-boot-starter
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-thymeleaf
-
org.springframework.boot
spring-boot-starter-test
@@ -44,4 +39,5 @@
com.baeldung.changeport.CustomApplication
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-bootstrap/pom.xml b/spring-boot-modules/spring-boot-bootstrap/pom.xml
index 6a1be7a2c8..f94ee9ca31 100644
--- a/spring-boot-modules/spring-boot-bootstrap/pom.xml
+++ b/spring-boot-modules/spring-boot-bootstrap/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ spring-boot-bootstrap
+ jar
+ spring-boot-bootstrap
+ Demo project for Spring Boot
com.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-bootstrap
- jar
-
- spring-boot-bootstrap
- Demo project for Spring Boot
-
org.springframework.boot
@@ -167,7 +166,7 @@
org.springframework.cloud
spring-cloud-dependencies
- Greenwich.RELEASE
+ ${spring-cloud.version}
pom
import
@@ -177,12 +176,12 @@
org.springframework.cloud
spring-cloud-gcp-starter
- 1.0.0.RELEASE
+ ${spring-cloud-gcp.version}
org.springframework.cloud
spring-cloud-gcp-starter-sql-mysql
- 1.0.0.RELEASE
+ ${spring-cloud-gcp.version}
@@ -215,7 +214,7 @@
org.springframework.cloud
spring-cloud-dependencies
- Greenwich.RELEASE
+ ${spring-cloud.version}
pom
import
@@ -332,6 +331,8 @@
4.0.0
+ Greenwich.RELEASE
+ 1.0.0.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-camel/pom.xml b/spring-boot-modules/spring-boot-camel/pom.xml
index 46a90b4722..0069dfdbff 100644
--- a/spring-boot-modules/spring-boot-camel/pom.xml
+++ b/spring-boot-modules/spring-boot-camel/pom.xml
@@ -1,12 +1,13 @@
-
4.0.0
com.example
spring-boot-camel
0.0.1-SNAPSHOT
- spring-boot-camel
-
+ spring-boot-camel
+
com.baeldung
parent-boot-2
@@ -48,7 +49,6 @@
spring-boot:run
-
org.springframework.boot
@@ -68,4 +68,4 @@
3.0.0-M4
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-cassandre/README.md b/spring-boot-modules/spring-boot-cassandre/README.md
new file mode 100644
index 0000000000..14ffbb7d6b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/README.md
@@ -0,0 +1,11 @@
+# Cassandre trading bot example
+
+This project is an example of a trading bot developed with Cassandre
+
+## Running the examples
+
+* `mvn test` - Run strategy backtesting
+* `mvn spring-boot:run` - Run the bot
+
+## Relevant Articles
+- [Build a Trading Bot with Cassandre Spring Boot Starter](https://www.baeldung.com/build-a-trading-bot-with-cassandre-spring-boot-starter/)
diff --git a/spring-boot-modules/spring-boot-cassandre/pom.xml b/spring-boot-modules/spring-boot-cassandre/pom.xml
new file mode 100644
index 0000000000..75163d2c2b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/pom.xml
@@ -0,0 +1,68 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.5
+
+
+ com.example
+ demo
+ 0.0.1-SNAPSHOT
+ Cassandre trading bot tutorial
+ Cassandre trading bot tutorial
+
+ 11
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ tech.cassandre.trading.bot
+ cassandre-trading-bot-spring-boot-starter
+ 4.2.1
+
+
+ org.knowm.xchange
+ xchange-kucoin
+ 5.0.7
+
+
+ org.hsqldb
+ hsqldb
+ 2.5.1
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ tech.cassandre.trading.bot
+ cassandre-trading-bot-spring-boot-starter-test
+ 4.2.1
+ test
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.4.5
+
+
+
+
+
diff --git a/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/DemoApplication.java b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/DemoApplication.java
new file mode 100644
index 0000000000..094d95b93f
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/DemoApplication.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/MyFirstStrategy.java b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/MyFirstStrategy.java
new file mode 100644
index 0000000000..ea8ae74aa6
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/main/java/com/example/demo/MyFirstStrategy.java
@@ -0,0 +1,66 @@
+package com.example.demo;
+
+import static tech.cassandre.trading.bot.dto.position.PositionStatusDTO.CLOSED;
+import static tech.cassandre.trading.bot.dto.position.PositionStatusDTO.OPENED;
+import static tech.cassandre.trading.bot.dto.util.CurrencyDTO.BTC;
+import static tech.cassandre.trading.bot.dto.util.CurrencyDTO.USDT;
+
+import java.math.BigDecimal;
+import java.util.Optional;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import tech.cassandre.trading.bot.dto.market.TickerDTO;
+import tech.cassandre.trading.bot.dto.position.PositionDTO;
+import tech.cassandre.trading.bot.dto.position.PositionRulesDTO;
+import tech.cassandre.trading.bot.dto.user.AccountDTO;
+import tech.cassandre.trading.bot.dto.util.CurrencyPairDTO;
+import tech.cassandre.trading.bot.strategy.BasicCassandreStrategy;
+import tech.cassandre.trading.bot.strategy.CassandreStrategy;
+
+@CassandreStrategy
+public class MyFirstStrategy extends BasicCassandreStrategy {
+
+ private final Logger logger = LoggerFactory.getLogger(MyFirstStrategy.class);
+
+ @Override
+ public Set getRequestedCurrencyPairs() {
+ return Set.of(new CurrencyPairDTO(BTC, USDT));
+ }
+
+ @Override
+ public Optional getTradeAccount(Set accounts) {
+ return accounts.stream()
+ .filter(a -> "trade".equals(a.getName()))
+ .findFirst();
+ }
+
+ @Override
+ public void onTickerUpdate(TickerDTO ticker) {
+ logger.info("Received a new ticker : {}", ticker);
+
+ if (new BigDecimal("56000").compareTo(ticker.getLast()) == -1) {
+
+ if (canBuy(new CurrencyPairDTO(BTC, USDT), new BigDecimal("0.01"))) {
+ PositionRulesDTO rules = PositionRulesDTO.builder()
+ .stopGainPercentage(4f)
+ .stopLossPercentage(25f)
+ .build();
+ createLongPosition(new CurrencyPairDTO(BTC, USDT), new BigDecimal("0.01"), rules);
+ }
+
+ }
+ }
+
+ @Override
+ public void onPositionStatusUpdate(PositionDTO position) {
+ if (position.getStatus() == OPENED) {
+ logger.info("> New position opened : {}", position.getPositionId());
+ }
+ if (position.getStatus() == CLOSED) {
+ logger.info("> Position closed : {}", position.getDescription());
+ }
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-cassandre/src/main/resources/application.properties b/spring-boot-modules/spring-boot-cassandre/src/main/resources/application.properties
new file mode 100644
index 0000000000..5ecdabd47a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/main/resources/application.properties
@@ -0,0 +1,22 @@
+#
+# Exchange configuration.
+cassandre.trading.bot.exchange.name=kucoin
+cassandre.trading.bot.exchange.username=kucoin.cassandre.test@gmail.com
+cassandre.trading.bot.exchange.passphrase=cassandre
+cassandre.trading.bot.exchange.key=6054ad25365ac6000689a998
+cassandre.trading.bot.exchange.secret=af080d55-afe3-47c9-8ec1-4b479fbcc5e7
+#
+# Modes
+cassandre.trading.bot.exchange.modes.sandbox=true
+cassandre.trading.bot.exchange.modes.dry=false
+#
+# Exchange API calls rates (ms or standard ISO 8601 duration like 'PT5S').
+cassandre.trading.bot.exchange.rates.account=2000
+cassandre.trading.bot.exchange.rates.ticker=2000
+cassandre.trading.bot.exchange.rates.trade=2000
+#
+# Database configuration.
+cassandre.trading.bot.database.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
+cassandre.trading.bot.database.datasource.url=jdbc:hsqldb:mem:cassandre
+cassandre.trading.bot.database.datasource.username=sa
+cassandre.trading.bot.database.datasource.password=
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/DemoApplicationTests.java b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/DemoApplicationTests.java
new file mode 100644
index 0000000000..eaa99696e2
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/DemoApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DemoApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/MyFirstStrategyUnitTest.java b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/MyFirstStrategyUnitTest.java
new file mode 100644
index 0000000000..bf7c353821
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/java/com/example/demo/MyFirstStrategyUnitTest.java
@@ -0,0 +1,55 @@
+package com.example.demo;
+
+import static org.awaitility.Awaitility.await;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static tech.cassandre.trading.bot.dto.position.PositionStatusDTO.OPENED;
+import static tech.cassandre.trading.bot.dto.util.CurrencyDTO.USDT;
+
+import java.util.HashMap;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Import;
+
+import tech.cassandre.trading.bot.dto.util.CurrencyDTO;
+import tech.cassandre.trading.bot.dto.util.GainDTO;
+import tech.cassandre.trading.bot.test.mock.TickerFluxMock;
+
+@SpringBootTest
+@Import(TickerFluxMock.class)
+@DisplayName("Simple strategy test")
+public class MyFirstStrategyUnitTest {
+
+ private final Logger logger = LoggerFactory.getLogger(MyFirstStrategyUnitTest.class);
+
+ @Autowired
+ private MyFirstStrategy strategy;
+
+ @Autowired
+ private TickerFluxMock tickerFluxMock;
+
+ @Test
+ @DisplayName("Check gains")
+ public void whenTickersArrives_thenCheckGains() {
+ await().forever().until(() -> tickerFluxMock.isFluxDone());
+
+ final HashMap gains = strategy.getGains();
+
+ logger.info("Cumulated gains:");
+ gains.forEach((currency, gain) -> logger.info(currency + " : " + gain.getAmount()));
+
+ logger.info("Position still opened :");
+ strategy.getPositions()
+ .values()
+ .stream()
+ .filter(p -> p.getStatus().equals(OPENED))
+ .forEach(p -> logger.info(" - {} " + p.getDescription()));
+
+ assertTrue(gains.get(USDT).getPercentage() > 0);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/resources/application.properties b/spring-boot-modules/spring-boot-cassandre/src/test/resources/application.properties
new file mode 100644
index 0000000000..3d6feb09d7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/resources/application.properties
@@ -0,0 +1,22 @@
+#
+# Exchange configuration.
+cassandre.trading.bot.exchange.name=kucoin
+cassandre.trading.bot.exchange.username=kucoin.cassandre.test@gmail.com
+cassandre.trading.bot.exchange.passphrase=cassandre
+cassandre.trading.bot.exchange.key=6054ad25365ac6000689a998
+cassandre.trading.bot.exchange.secret=af080d55-afe3-47c9-8ec1-4b479fbcc5e7
+#
+# Modes
+cassandre.trading.bot.exchange.modes.sandbox=true
+cassandre.trading.bot.exchange.modes.dry=true
+#
+# Exchange API calls rates (ms or standard ISO 8601 duration like 'PT5S').
+cassandre.trading.bot.exchange.rates.account=2000
+cassandre.trading.bot.exchange.rates.ticker=2000
+cassandre.trading.bot.exchange.rates.trade=2000
+#
+# Database configuration.
+cassandre.trading.bot.database.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
+cassandre.trading.bot.database.datasource.url=jdbc:hsqldb:mem:cassandre
+cassandre.trading.bot.database.datasource.username=sa
+cassandre.trading.bot.database.datasource.password=
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/resources/tickers-btc-usdt.tsv b/spring-boot-modules/spring-boot-cassandre/src/test/resources/tickers-btc-usdt.tsv
new file mode 100644
index 0000000000..b89bd96bdc
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/resources/tickers-btc-usdt.tsv
@@ -0,0 +1,89 @@
+1612569600 38294.4 39195.5 40964.2 38217.5 3882.29460938 153897343.463150723
+1612656000 39195.4 38807.6 39623.6 37341.4 2389.96820017 91972455.834535369
+1612742400 38807.6 46373.5 46767.9 38010 4971.54731481 212132648.426718929
+1612828800 46374.6 46434.8 48139.3 44961 4330.72854712 201891604.027160303
+1612915200 46430 44812.2 47300 43687.5 4351.84907778 198189685.592028516
+1613001600 44806.1 47941.5 48647.6 44005.8 4045.91883504 188171651.974437139
+1613088000 47963.1 47310.7 48958.8 46181.2 3356.01832119 159561721.419695848
+1613174400 47305.4 47152.6 48120.5 46225.5 2740.99221759 129227867.922246174
+1613260800 47152.5 48591.9 49686.9 47026.3 3359.4690565 163299915.839307312
+1613347200 48587.2 47904.4 49003.6 42841.6 3974.98461358 188990056.26923591
+1613433600 47913.1 49147.7 50619.3 47023.9 3599.85370182 176084748.845657596
+1613520000 49147.7 52118.1 52609.6 48931.1 3356.85082847 170893567.530348564
+1613606400 52114.3 51568.9 52522.9 50906.4 2183.18379408 113272339.172174965
+1613692800 51561.1 55890.5 56317.7 50727 3749.6920105 200656740.865959032
+1613779200 55893.6 55851.5 57622.6 53463.3 3394.87226216 190744601.429330887
+1613865600 55851.4 57423 58336.3 55489.6 2514.02340013 143658132.671448082
+1613952000 57420.6 54096.6 57517.8 44160 6125.32442907 330513978.457310237
+1614038400 54085.9 48908.3 54174.2 44900 8048.96505298 389277314.445372085
+1614124800 48902.9 49685.2 51361.9 47003.2 4816.75027676 239303706.844272809
+1614211200 49676.5 47082.7 52019.6 46624.4 3701.80236678 184044004.383578525
+1614297600 47082 46289.6 48408.8 44135 5329.77125908 247604118.914146591
+1614384000 46290.2 46114.4 48381.9 44836.5 2872.64640734 134946360.020429589
+1614470400 46111.3 45141.6 46626.1 43004.3 3940.17863714 175990962.484551548
+1614556800 45136.5 49590.3 49771.3 44958.9 3548.51026561 169389196.772247159
+1614643200 49590.3 48441.2 50201.6 47052.8 2936.94454126 142575425.463057812
+1614729600 48440.6 50345.5 52623.9 48100 3177.38943911 160801620.821885745
+1614816000 50347.6 48374.5 51762.1 47505.7 3624.17683614 178873453.27515484
+1614902400 48374.5 48758.9 49450 46189.8 3697.34556922 176318969.507294567
+1614988800 48746.9 48871.9 49255.1 47001 1949.15311354 94201823.810314647
+1615075200 48885 50930.4 51424.7 48885 2444.3584982 122962479.787996993
+1615161600 50956.6 52377 52387.5 49287.5 2710.99151191 137751640.241286989
+1615248000 52376.9 54867.6 54867.6 51833.8 3070.93581512 165487483.114064122
+1615334400 54867.5 55865.5 57364 52911.4 4049.50553851 224565244.752334892
+1615420800 55863.7 57781.1 58150 54238 3403.69441456 191915265.020541521
+1615507200 57781 57238.5 58057.5 55013.7 4031.0376629 228810606.091302364
+1615593600 57220.7 61180.9 61815.3 56059.3 4394.62318443 259602986.875738328
+1615680000 61174.3 59000 61700 59000 3084.33952274 186155667.656432156
+1615766400 59000 55607.1 60632.9 54525.6 5910.33518227 338468393.188725572
+1615852800 55607.1 56880.3 56918.9 53240.3 7410.49057723 409052587.523700888
+1615939200 56880.3 58875.8 58951.8 54147.5 5828.79026943 328135601.648660052
+1616025600 58882.9 57648.9 60107.7 57000 5073.7458698 297279816.540519693
+1616112000 57648.9 58024.2 59450.1 56071 3727.09434161 217005823.723994618
+1616198400 58024.3 58113.5 59874.6 57825.6 2746.52973805 161565114.165299707
+1616284800 58113.5 57350.2 58591.6 55501 3265.35649781 186845535.507151609
+1616371200 57345.3 54096.1 58415.5 53667 4219.99501831 237141977.003568352
+1616457600 54086.8 54348.4 55823.1 52986.3 4374.34046303 239135883.538398977
+1616544000 54348.4 52307.4 57200 51499.6 6416.76024581 351202326.218690674
+1616630400 52307.1 51301.7 53239.1 50455 7242.6466396 375950351.557038048
+1616716800 51301.7 55032 55062.5 51225.3 4609.48192944 245299757.451540308
+1616803200 55031.9 55820.4 56628.6 53967.5 3634.73588532 200758048.816804103
+1616889600 55820.3 55772.9 56541 54666.6 3158.20452681 176119911.151714842
+1616976000 55772.8 57628.9 58400.5 54926.5 4413.63121553 251384747.301649587
+1617062400 57630.8 58754.6 59351.9 57072.8 3563.87315049 208118726.050535887
+1617148800 58753.2 58745.9 59800 56357.5 4921.45848213 288469053.074870873
+1617235200 58745.5 58735.7 59487.1 57879 3163.98213108 186078130.901422269
+1617321600 58735.7 58963.6 60179.1 58460.7 2553.76427314 151446539.609794648
+1617408000 58963.6 57058.3 59795 56721.2 2512.19109578 147434403.06515736
+1617494400 57052.5 58201.4 58481.2 56432.6 2069.14670128 119228330.17272614
+1617580800 58201.4 59116.2 59254.1 56501 3003.76043377 174821106.684799505
+1617667200 59116.2 57988.3 59497.5 57304.8 2964.86183859 173169186.845682699
+1617753600 57988.3 55958.2 58668.6 55439 5277.04906389 299996660.411940246
+1617840000 55958.2 58076.7 58141 55700.6 3175.60482079 181817013.517575328
+1617926400 58076.7 58131.6 58900 57666.9 3516.19104669 204849717.059779284
+1618012800 58138.2 59770.2 61350 57902.1 5533.50675561 332014577.538990658
+1618099200 59770.2 60007.6 60687.4 59247.6 3896.37426019 233158562.799039154
+1618185600 60007.6 59863.4 61270.7 59417.4 4611.409014 277430208.743380477
+1618272000 59863.4 63578.7 63759.7 59815 6906.310253 430518557.569547626
+1618358400 63578.7 62958.7 64840 61000 7696.509177 487298143.928065301
+1618444800 62954.4 63152.6 63772.1 62023.9 4709.82427144 296178401.81115496
+1618531200 63152.6 61342.6 63509.7 59930.8 8295.32523869 510423835.691643255
+1618617600 61342.7 59995.2 62497.8 59599.6 5367.42979289 328364887.709585395
+1618704000 59995.3 56150.6 60409.5 49001 11485.97101449 637797282.448645379
+1618790400 56152.7 55618.8 57583.4 54205.2 7721.306905 432634348.931871989
+1618876800 55618.7 56427.8 57061.6 53328 8677.75606016 480164200.559836543
+1618963200 56426.1 53793.6 56761.7 53602 6240.82191836 345339357.806167462
+1619049600 53793.5 51696.4 55474.7 50400 8879.16016304 475394174.249706678
+1619136000 51691.2 51102.7 52112.1 47502.1 8885.07060366 441295812.644904319
+1619222400 51109.8 50033 51157.9 48676.5 4833.41744745 241336360.887795675
+1619308800 50041.5 49086.9 50554.6 46966.2 4805.34664069 237153315.222670555
+1619395200 49069 54000.2 54336.4 48775.8 6695.12934907 353727728.269533971
+1619481600 53997.1 55014.3 55439 53240.8 4344.22291318 237020455.905144335
+1619568000 55014.2 54833.2 56399.1 53808.3 4801.04618634 262912695.604761319
+1619654400 54833.1 53558.4 55181.2 52340.1 4356.05177188 234153663.397444462
+1619740800 53558.5 57697.3 57936.4 53042.6 5000.47557303 277531927.921795199
+1619827200 57697.3 57794.7 58471.4 57006.3 3639.78966647 210179438.189007639
+1619913600 57794.7 56568.5 57903.7 56044.3 3508.52428767 199206958.05741809
+1620000000 56568.5 57159.7 58977.9 56451.3 4780.43387226 276554749.540429296
+1620086400 57159.7 53196.3 57188.2 53083.3 7079.55804728 390469293.396018923
+1620172800 53196.3 57834.5 57979.7 52888 4224.63060355 233779565.506303973
diff --git a/spring-boot-modules/spring-boot-cassandre/src/test/resources/user-trade.tsv b/spring-boot-modules/spring-boot-cassandre/src/test/resources/user-trade.tsv
new file mode 100644
index 0000000000..d0fa4e9767
--- /dev/null
+++ b/spring-boot-modules/spring-boot-cassandre/src/test/resources/user-trade.tsv
@@ -0,0 +1,3 @@
+BTC 1
+USDT 100000
+ETH 10
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-ci-cd/pom.xml b/spring-boot-modules/spring-boot-ci-cd/pom.xml
index 61a2e299fb..fb1810c62e 100644
--- a/spring-boot-modules/spring-boot-ci-cd/pom.xml
+++ b/spring-boot-modules/spring-boot-ci-cd/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-ci-cd
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-ci-cd
com.baeldung.spring-boot-modules
@@ -11,18 +15,11 @@
../
- spring-boot-ci-cd
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-ci-cd
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-actuator
@@ -73,7 +70,8 @@
spring-boot-ci-cd
- java $JAVA_OPTS -jar -Dserver.port=$PORT target/${project.build.finalName}.jar
+ java $JAVA_OPTS -jar -Dserver.port=$PORT
+ target/${project.build.finalName}.jar
diff --git a/spring-boot-modules/spring-boot-client/pom.xml b/spring-boot-modules/spring-boot-client/pom.xml
index aa832497e9..7f54d0e541 100644
--- a/spring-boot-modules/spring-boot-client/pom.xml
+++ b/spring-boot-modules/spring-boot-client/pom.xml
@@ -1,7 +1,13 @@
-
4.0.0
+ spring-boot-client
+ 0.0.1-SNAPSHOT
+ war
+ spring-boot-client
+ This is simple boot client application for Spring boot actuator test
com.baeldung.spring-boot-modules
@@ -10,13 +16,6 @@
../
- spring-boot-client
- 0.0.1-SNAPSHOT
- war
-
- spring-boot-client
- This is simple boot client application for Spring boot actuator test
-
org.springframework.boot
@@ -48,7 +47,6 @@
org.springframework
spring-messaging
-
@@ -59,22 +57,17 @@
true
-
-
org.apache.maven.plugins
maven-war-plugin
-
pl.project13.maven
git-commit-id-plugin
${git-commit-id-plugin.version}
-
-
@@ -116,7 +109,7 @@
18.0
- 2.2.4
+ 2.2.4
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/pom.xml b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/pom.xml
index 9a311adfec..12a39b75fe 100644
--- a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/pom.xml
+++ b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-application/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
data-jpa-application
0.0.1-SNAPSHOT
diff --git a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/pom.xml b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/pom.xml
index 2da9e5aa2c..c8be287abd 100644
--- a/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/pom.xml
+++ b/spring-boot-modules/spring-boot-config-jpa-error/data-jpa-library/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
data-jpa-library
0.0.1-SNAPSHOT
diff --git a/spring-boot-modules/spring-boot-config-jpa-error/pom.xml b/spring-boot-modules/spring-boot-config-jpa-error/pom.xml
index d236a581d8..b5207f8997 100644
--- a/spring-boot-modules/spring-boot-config-jpa-error/pom.xml
+++ b/spring-boot-modules/spring-boot-config-jpa-error/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ com.baeldung.spring-boot-config-jpa-error
+ spring-boot-config-jpa-error
+ 0.0.1-SNAPSHOT
+ pom
com.baeldung.spring-boot-modules
@@ -10,11 +15,6 @@
../
- com.baeldung.spring-boot-config-jpa-error
- spring-boot-config-jpa-error
- 0.0.1-SNAPSHOT
- pom
-
data-jpa-library
data-jpa-application
@@ -38,14 +38,12 @@
spring-boot-starter-data-jpa
${spring-boot.version}
-
org.springframework.boot
spring-boot-starter-test
${spring-boot.version}
test
-
com.h2database
h2
diff --git a/spring-boot-modules/spring-boot-crud/pom.xml b/spring-boot-modules/spring-boot-crud/pom.xml
index cf1bfe6da0..79eccf2fba 100644
--- a/spring-boot-modules/spring-boot-crud/pom.xml
+++ b/spring-boot-modules/spring-boot-crud/pom.xml
@@ -1,8 +1,10 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4.0.0
+ spring-boot-crud
+ spring-boot-crud
com.baeldung.spring-boot-modules
@@ -11,10 +13,6 @@
../
- spring-boot-crud
-
- spring-boot-crud
-
org.springframework.boot
@@ -86,4 +84,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-ctx-fluent/pom.xml b/spring-boot-modules/spring-boot-ctx-fluent/pom.xml
index cfbc6ffac0..8a7aca076e 100644
--- a/spring-boot-modules/spring-boot-ctx-fluent/pom.xml
+++ b/spring-boot-modules/spring-boot-ctx-fluent/pom.xml
@@ -1,7 +1,12 @@
-
4.0.0
+ spring-boot-ctx-fluent
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-ctx-fluent
com.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-ctx-fluent
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-ctx-fluent
-
org.springframework.boot
@@ -23,4 +22,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-library/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-library/pom.xml
index 34cc530f2f..5c9d477502 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-library/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-library/pom.xml
@@ -1,11 +1,12 @@
-
+
4.0.0
greeter-library
0.0.1-SNAPSHOT
- greeter-library
-
+ greeter-library
+
com.baeldung.spring-boot-modules
spring-boot-custom-starter
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
index 532f45cf3e..d7f437633d 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
greeter-spring-boot-autoconfigure
0.0.1-SNAPSHOT
@@ -18,27 +19,23 @@
spring-boot
${spring-boot.version}
-
org.springframework.boot
spring-boot-autoconfigure
${spring-boot.version}
-
org.springframework.boot
spring-boot-configuration-processor
${spring-boot.version}
true
-
com.baeldung.spring-boot-modules
greeter-library
${greeter.version}
true
-
org.springframework.boot
spring-boot-starter-test
@@ -62,7 +59,6 @@
- UTF-8
2.2.6.RELEASE
0.0.1-SNAPSHOT
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
index 6291756d21..815c3e8366 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
@@ -1,10 +1,11 @@
-
4.0.0
greeter-spring-boot-sample-app
0.0.1-SNAPSHOT
- greeter-spring-boot-sample-app
+ greeter-spring-boot-sample-app
com.baeldung.spring-boot-modules
@@ -12,34 +13,34 @@
0.0.1-SNAPSHOT
../
-
+
com.baeldung.spring-boot-modules
greeter-spring-boot-starter
${greeter-starter.version}
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
- ${spring-boot.version}
-
-
-
-
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+
0.0.1-SNAPSHOT
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
index 0e8fb4cbc9..0ea27a839f 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
@@ -1,10 +1,11 @@
-
+
4.0.0
greeter-spring-boot-starter
0.0.1-SNAPSHOT
- greeter-spring-boot-starter
+ greeter-spring-boot-starter
com.baeldung.spring-boot-modules
@@ -13,25 +14,21 @@
-
org.springframework.boot
spring-boot-starter
${spring-boot.version}
-
com.baeldung.spring-boot-modules
greeter-spring-boot-autoconfigure
${project.version}
-
com.baeldung.spring-boot-modules
greeter-library
${greeter.version}
-
@@ -49,7 +46,6 @@
- UTF-8
0.0.1-SNAPSHOT
2.2.6.RELEASE
diff --git a/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml b/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml
index 47296990aa..f96880b1cf 100644
--- a/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/greeter/pom.xml
@@ -1,16 +1,17 @@
-
4.0.0
greeter
0.0.1-SNAPSHOT
- greeter
-
+ greeter
+
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
../../../parent-boot-2
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/application/pom.xml b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/application/pom.xml
index fb235bc479..948482b21b 100644
--- a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/application/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/application/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
com.baeldung.example
diff --git a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/library/pom.xml b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/library/pom.xml
index d979f1d9bf..5d45de0d1d 100644
--- a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/library/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/library/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
com.baeldung.example
diff --git a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/pom.xml b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/pom.xml
index 75ff927789..2a483a8fef 100644
--- a/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/parent-multi-module/pom.xml
@@ -1,5 +1,6 @@
-
4.0.0
com.baeldung
diff --git a/spring-boot-modules/spring-boot-custom-starter/pom.xml b/spring-boot-modules/spring-boot-custom-starter/pom.xml
index 338bf22f46..27e3a03153 100644
--- a/spring-boot-modules/spring-boot-custom-starter/pom.xml
+++ b/spring-boot-modules/spring-boot-custom-starter/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ spring-boot-custom-starter
+ 0.0.1-SNAPSHOT
+ spring-boot-custom-starter
+ pom
com.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-custom-starter
- 0.0.1-SNAPSHOT
- pom
-
- spring-boot-custom-starter
-
greeter-library
greeter
@@ -24,4 +23,5 @@
greeter-spring-boot-sample-app
parent-multi-module
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-data-2/README.md b/spring-boot-modules/spring-boot-data-2/README.md
index d5020ce354..875ee502b4 100644
--- a/spring-boot-modules/spring-boot-data-2/README.md
+++ b/spring-boot-modules/spring-boot-data-2/README.md
@@ -1,3 +1,5 @@
### Relevant Articles:
- [Spring Boot: Customize the Jackson ObjectMapper](https://www.baeldung.com/spring-boot-customize-jackson-objectmapper)
+- [“HttpMessageNotWritableException: No converter found for return value of type”](https://www.baeldung.com/spring-no-converter-found)
+- [Creating a Read-Only Repository with Spring Data](https://www.baeldung.com/spring-data-read-only-repository)
diff --git a/spring-boot-modules/spring-boot-data-2/pom.xml b/spring-boot-modules/spring-boot-data-2/pom.xml
index fb0d5f2053..b7006782c8 100644
--- a/spring-boot-modules/spring-boot-data-2/pom.xml
+++ b/spring-boot-modules/spring-boot-data-2/pom.xml
@@ -1,16 +1,17 @@
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ spring-boot-data-2
+
com.baeldung.spring-boot-modules
spring-boot-modules
1.0.0-SNAPSHOT
../
- 4.0.0
- spring-boot-data-2
org.springframework.boot
diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/Book.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/Book.java
new file mode 100644
index 0000000000..ff0a8a1bb3
--- /dev/null
+++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/Book.java
@@ -0,0 +1,39 @@
+package com.baeldung.boot.readonlyrepository;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class Book
+{
+ @Id
+ @GeneratedValue
+ private Long id;
+ private String author;
+ private String title;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/BookReadOnlyRepository.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/BookReadOnlyRepository.java
new file mode 100644
index 0000000000..6327ef5a56
--- /dev/null
+++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/BookReadOnlyRepository.java
@@ -0,0 +1,10 @@
+package com.baeldung.boot.readonlyrepository;
+
+import java.util.List;
+
+public interface BookReadOnlyRepository extends ReadOnlyRepository {
+
+ List findByAuthor(String author);
+
+ List findByTitle(String title);
+}
diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/ReadOnlyRepository.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/ReadOnlyRepository.java
new file mode 100644
index 0000000000..16f3fd429e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/ReadOnlyRepository.java
@@ -0,0 +1,15 @@
+package com.baeldung.boot.readonlyrepository;
+
+import org.springframework.data.repository.NoRepositoryBean;
+import org.springframework.data.repository.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@NoRepositoryBean
+public interface ReadOnlyRepository extends Repository {
+
+ Optional findById(ID id);
+
+ List findAll();
+}
diff --git a/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/ReadOnlyRepositoryApplication.java b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/ReadOnlyRepositoryApplication.java
new file mode 100644
index 0000000000..f5a67197ad
--- /dev/null
+++ b/spring-boot-modules/spring-boot-data-2/src/main/java/com/baeldung/boot/readonlyrepository/ReadOnlyRepositoryApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.boot.readonlyrepository;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ReadOnlyRepositoryApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ReadOnlyRepositoryApplication.class, args);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/noconverterfound/NoConverterFoundIntegrationTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/noconverterfound/NoConverterFoundIntegrationTest.java
index 3304a33957..f8ded91e65 100644
--- a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/noconverterfound/NoConverterFoundIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/noconverterfound/NoConverterFoundIntegrationTest.java
@@ -22,7 +22,8 @@ public class NoConverterFoundIntegrationTest {
@Autowired
private MockMvc mockMvc;
- @Test
+ /* Remove Getters from Student class to successfully run this test case
+ * @Test
public void whenGettersNotDefined_thenThrowException() throws Exception {
String url = "/api/student/1";
@@ -35,6 +36,7 @@ public class NoConverterFoundIntegrationTest {
.contains("No converter found for return value of type"));
}
+ */
@Test
public void whenGettersAreDefined_thenReturnObject() throws Exception {
diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/BookRepository.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/BookRepository.java
new file mode 100644
index 0000000000..363b310c8c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/BookRepository.java
@@ -0,0 +1,6 @@
+package com.baeldung.boot.readonlyrepository;
+
+import org.springframework.data.repository.CrudRepository;
+
+public interface BookRepository extends BookReadOnlyRepository, CrudRepository {
+}
diff --git a/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/ReadOnlyRepositoryUnitTest.java b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/ReadOnlyRepositoryUnitTest.java
new file mode 100644
index 0000000000..cdb6065f23
--- /dev/null
+++ b/spring-boot-modules/spring-boot-data-2/src/test/java/com/baeldung/boot/readonlyrepository/ReadOnlyRepositoryUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.boot.readonlyrepository;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+
+@SpringBootTest( classes = ReadOnlyRepositoryApplication.class )
+public class ReadOnlyRepositoryUnitTest
+{
+ @Autowired
+ private BookRepository bookRepository;
+
+ @Autowired
+ private BookReadOnlyRepository bookReadOnlyRepository;
+
+ @Test
+ public void givenBooks_whenUsingReadOnlyRepository_thenGetThem() {
+ Book aChristmasCarolCharlesDickens = new Book();
+ aChristmasCarolCharlesDickens.setTitle("A Christmas Carol");
+ aChristmasCarolCharlesDickens.setAuthor("Charles Dickens");
+ bookRepository.save(aChristmasCarolCharlesDickens);
+
+ Book greatExpectationsCharlesDickens = new Book();
+ greatExpectationsCharlesDickens.setTitle("Great Expectations");
+ greatExpectationsCharlesDickens.setAuthor("Charles Dickens");
+ bookRepository.save(greatExpectationsCharlesDickens);
+
+ Book greatExpectationsKathyAcker = new Book();
+ greatExpectationsKathyAcker.setTitle("Great Expectations");
+ greatExpectationsKathyAcker.setAuthor("Kathy Acker");
+ bookRepository.save(greatExpectationsKathyAcker);
+
+ List charlesDickensBooks = bookReadOnlyRepository.findByAuthor("Charles Dickens");
+ Assertions.assertEquals(2, charlesDickensBooks.size());
+
+ List greatExpectationsBooks = bookReadOnlyRepository.findByTitle("Great Expectations");
+ Assertions.assertEquals(2, greatExpectationsBooks.size());
+
+ List allBooks = bookReadOnlyRepository.findAll();
+ Assertions.assertEquals(3, allBooks.size());
+
+ Long bookId = allBooks.get(0).getId();
+ Book book = bookReadOnlyRepository.findById(bookId).orElseThrow(NoSuchElementException::new);
+ Assertions.assertNotNull(book);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-data/pom.xml b/spring-boot-modules/spring-boot-data/pom.xml
index 06f09c70fe..447b730c02 100644
--- a/spring-boot-modules/spring-boot-data/pom.xml
+++ b/spring-boot-modules/spring-boot-data/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ spring-boot-data
+ war
+ spring-boot-data
+ Spring Boot Data Module
com.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-data
- war
-
- spring-boot-data
- Spring Boot Data Module
-
org.springframework.boot
@@ -63,7 +62,6 @@
true
-
org.apache.maven.plugins
@@ -173,5 +171,5 @@
1.8
1.8
-
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-deployment/pom.xml b/spring-boot-modules/spring-boot-deployment/pom.xml
index 94a4018103..7c78d20afc 100644
--- a/spring-boot-modules/spring-boot-deployment/pom.xml
+++ b/spring-boot-modules/spring-boot-deployment/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-boot-deployment
spring-boot-deployment
@@ -19,83 +20,64 @@
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-thymeleaf
provided
-
org.springframework.boot
spring-boot-starter-test
test
-
org.springframework.boot
spring-boot-starter-data-jpa
-
org.springframework.boot
spring-boot-starter-mail
-
org.springframework.boot
spring-boot-starter-actuator
-
com.h2database
h2
runtime
-
javax.persistence
javax.persistence-api
${jpa.version}
-
com.google.guava
guava
${guava.version}
-
org.subethamail
subethasmtp
${subethasmtp.version}
test
-
org.webjars
bootstrap
${bootstrap.version}
-
org.webjars
jquery
${jquery.version}
-
-
- org.springframework.cloud
- spring-cloud-context
- ${springcloud.version}
-
-
org.apache.httpcomponents
httpclient
${httpclient.version}
-
@@ -129,8 +111,8 @@
maven-failsafe-plugin
2.18
-
+
integration-tests
@@ -138,8 +120,8 @@
verify
-
+
**/ExternalPropertyFileLoaderIntegrationTest.java
@@ -195,9 +177,7 @@
2.2
18.0
3.1.7
- 2.0.2.RELEASE
4.5.8
- 2.3.3.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-di/pom.xml b/spring-boot-modules/spring-boot-di/pom.xml
index 58b427a4a8..0e9fb49a95 100644
--- a/spring-boot-modules/spring-boot-di/pom.xml
+++ b/spring-boot-modules/spring-boot-di/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-di
+ jar
+ spring-boot-di
+ Module For Spring Boot DI
com.baeldung.spring-boot-modules
@@ -11,34 +15,24 @@
../
- spring-boot-di
- jar
-
- spring-boot-di
- Module For Spring Boot DI
-
org.aspectj
aspectjweaver
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-actuator
-
org.springframework.boot
spring-boot-starter-tomcat
provided
-
org.apache.tomcat.embed
tomcat-embed-jasper
@@ -49,7 +43,6 @@
spring-boot-starter-test
test
-
@@ -69,4 +62,4 @@
com.baeldung.SpringBootDiApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-disable-logging/README.md b/spring-boot-modules/spring-boot-disable-logging/README.md
new file mode 100644
index 0000000000..348c0f6dba
--- /dev/null
+++ b/spring-boot-modules/spring-boot-disable-logging/README.md
@@ -0,0 +1,8 @@
+## Spring Boot Disable Logging
+
+This module contains articles about disabling logging in Spring Boot
+
+
+### Relevant Articles:
+
+- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging)
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/.gitignore b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/.gitignore
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/.gitignore
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/.gitignore
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/pom.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/pom.xml
similarity index 84%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/pom.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/pom.xml
index 77629ffdd1..deee4e435f 100644
--- a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/pom.xml
+++ b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/pom.xml
@@ -1,14 +1,15 @@
-
+
4.0.0
disabling-console-jul
disabling-console-jul
-
+
com.baeldung.spring-boot-modules
- spring-boot-runtime
+ spring-boot-disable-logging
1.0.0-SNAPSHOT
../
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/resources/application.properties b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/resources/application.properties
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/resources/application.properties
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/resources/application.properties
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/resources/logging.properties b/spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/resources/logging.properties
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-jul/src/main/resources/logging.properties
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-jul/src/main/resources/logging.properties
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/.gitignore b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/.gitignore
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/.gitignore
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/.gitignore
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/pom.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/pom.xml
similarity index 84%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/pom.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/pom.xml
index fd57eccbbf..0524f9d401 100644
--- a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/pom.xml
+++ b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/pom.xml
@@ -1,14 +1,15 @@
-
+
4.0.0
disabling-console-log4j2
disabling-console-log4j2
-
+
com.baeldung.spring-boot-modules
- spring-boot-runtime
+ spring-boot-disable-logging
1.0.0-SNAPSHOT
../
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/resources/log4j2.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/resources/log4j2.xml
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-log4j2/src/main/resources/log4j2.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-log4j2/src/main/resources/log4j2.xml
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/.gitignore b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/.gitignore
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/.gitignore
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/.gitignore
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/pom.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/pom.xml
similarity index 73%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/pom.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/pom.xml
index 8cb0e24bb7..0990209ff9 100644
--- a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/pom.xml
+++ b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/pom.xml
@@ -1,14 +1,14 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
disabling-console-logback
disabling-console-logback
com.baeldung.spring-boot-modules
- spring-boot-runtime
+ spring-boot-disable-logging
1.0.0-SNAPSHOT
../
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/resources/application.properties b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/resources/application.properties
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/resources/application.properties
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/resources/application.properties
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/resources/logback-spring.xml b/spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/resources/logback-spring.xml
similarity index 100%
rename from spring-boot-modules/spring-boot-runtime/disabling-console-logback/src/main/resources/logback-spring.xml
rename to spring-boot-modules/spring-boot-disable-logging/disabling-console-logback/src/main/resources/logback-spring.xml
diff --git a/spring-boot-modules/spring-boot-disable-logging/pom.xml b/spring-boot-modules/spring-boot-disable-logging/pom.xml
new file mode 100644
index 0000000000..65de521c63
--- /dev/null
+++ b/spring-boot-modules/spring-boot-disable-logging/pom.xml
@@ -0,0 +1,24 @@
+
+
+ 4.0.0
+ spring-boot-disable-logging
+ 1.0.0-SNAPSHOT
+ pom
+ spring-boot-disable-logging
+
+
+ com.baeldung.spring-boot-modules
+ spring-boot-modules
+ 1.0.0-SNAPSHOT
+ ../
+
+
+
+ disabling-console-jul
+ disabling-console-log4j2
+ disabling-console-logback
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-environment/pom.xml b/spring-boot-modules/spring-boot-environment/pom.xml
index a3aab63a2d..5327825409 100644
--- a/spring-boot-modules/spring-boot-environment/pom.xml
+++ b/spring-boot-modules/spring-boot-environment/pom.xml
@@ -3,6 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-environment
+ war
+ spring-boot-environment
+ Demo project for Spring Boot
com.baeldung.spring-boot-modules
@@ -11,24 +15,16 @@
../
- spring-boot-environment
- war
-
- spring-boot-environment
- Demo project for Spring Boot
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-thymeleaf
provided
-
org.springframework.boot
spring-boot-starter-test
@@ -45,58 +41,48 @@
-
org.springframework.boot
spring-boot-starter-data-jpa
-
org.springframework.boot
spring-boot-starter-mail
-
org.springframework.boot
spring-boot-starter-actuator
-
com.h2database
h2
runtime
-
javax.persistence
javax.persistence-api
${jpa.version}
-
com.google.guava
guava
${guava.version}
-
org.subethamail
subethasmtp
${subethasmtp.version}
test
-
org.springframework.cloud
spring-cloud-context
-
org.apache.httpcomponents
httpclient
${httpclient.version}
-
@@ -169,4 +155,4 @@
2020.0.0
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-exceptions/pom.xml b/spring-boot-modules/spring-boot-exceptions/pom.xml
index 1bfe8e6751..c0c335f55c 100644
--- a/spring-boot-modules/spring-boot-exceptions/pom.xml
+++ b/spring-boot-modules/spring-boot-exceptions/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ spring-boot-exceptions
+ jar
+ spring-boot-exceptions
+ Demo project for working with Spring Boot exceptions
com.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-exceptions
- jar
-
- spring-boot-exceptions
- Demo project for working with Spring Boot exceptions
-
spring-boot-exceptions
@@ -26,4 +25,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-flowable/pom.xml b/spring-boot-modules/spring-boot-flowable/pom.xml
index f1121ea6a0..fee4d9fdfc 100644
--- a/spring-boot-modules/spring-boot-flowable/pom.xml
+++ b/spring-boot-modules/spring-boot-flowable/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-flowable
+ war
+ spring-boot-flowable
+ Spring Boot Flowable Module
com.baeldung.spring-boot-modules
@@ -11,12 +15,6 @@
../
- spring-boot-flowable
- war
-
- spring-boot-flowable
- Spring Boot Flowable Module
-
org.springframework.boot
@@ -61,4 +59,5 @@
6.4.1
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-groovy/pom.xml b/spring-boot-modules/spring-boot-groovy/pom.xml
index 3392532081..ea9f3231cd 100644
--- a/spring-boot-modules/spring-boot-groovy/pom.xml
+++ b/spring-boot-modules/spring-boot-groovy/pom.xml
@@ -1,21 +1,20 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ com.baeldung.app
+ spring-boot-groovy
+ spring-boot-groovy
+ war
+ Spring Boot Todo Application with Groovy
- 4.0.0
- com.baeldung.app
- spring-boot-groovy
- spring-boot-groovy
- war
- Spring Boot Todo Application with Groovy
-
-
+
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
../../parent-boot-2
-
+
@@ -30,7 +29,6 @@
org.codehaus.groovy
groovy
-
org.springframework.boot
spring-boot-starter-test
@@ -41,7 +39,7 @@
h2
runtime
-
+
@@ -54,7 +52,7 @@
gmavenplus-plugin
1.9.0
-
+
addSources
addTestSources
@@ -65,7 +63,7 @@
removeStubs
removeTestStubs
-
+
@@ -75,4 +73,4 @@
com.baeldung.springwithgroovy.SpringBootGroovyApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-jasypt/pom.xml b/spring-boot-modules/spring-boot-jasypt/pom.xml
index 2f0c8a27b4..1032500de7 100644
--- a/spring-boot-modules/spring-boot-jasypt/pom.xml
+++ b/spring-boot-modules/spring-boot-jasypt/pom.xml
@@ -1,7 +1,13 @@
-
+
4.0.0
+ com.example.jasypt
+ spring-boot-jasypt
+ jar
+ spring-boot-jasypt
+ Demo project for Spring Boot
com.baeldung.spring-boot-modules
@@ -10,31 +16,21 @@
../
- com.example.jasypt
- spring-boot-jasypt
- jar
-
- spring-boot-jasypt
- Demo project for Spring Boot
-
org.springframework.boot
spring-boot-starter
-
org.springframework.boot
spring-boot-starter-test
test
-
com.github.ulisesbocchio
jasypt-spring-boot-starter
${jasypt.version}
-
com.github.ulisesbocchio
jasypt-spring-boot
@@ -55,4 +51,4 @@
2.0.0
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-keycloak/pom.xml b/spring-boot-modules/spring-boot-keycloak/pom.xml
index cfcdcf2c37..37d57d6556 100644
--- a/spring-boot-modules/spring-boot-keycloak/pom.xml
+++ b/spring-boot-modules/spring-boot-keycloak/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
com.baeldung.keycloak
spring-boot-keycloak
@@ -41,7 +42,6 @@
org.springframework.boot
spring-boot-starter-data-jpa
-
org.springframework.boot
spring-boot-starter-test
@@ -79,4 +79,4 @@
11.0.2
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-libraries-2/README.md b/spring-boot-modules/spring-boot-libraries-2/README.md
index 4218dfc1be..7bf51b5424 100644
--- a/spring-boot-modules/spring-boot-libraries-2/README.md
+++ b/spring-boot-modules/spring-boot-libraries-2/README.md
@@ -5,3 +5,4 @@ This module contains articles about various Spring Boot libraries
### Relevant Articles:
- [Background Jobs in Spring with JobRunr](https://www.baeldung.com/java-jobrunr-spring)
+- [Open API Server Implementation Using OpenAPI Generator](https://www.baeldung.com/java-openapi-generator-server)
diff --git a/spring-boot-modules/spring-boot-libraries-2/pom.xml b/spring-boot-modules/spring-boot-libraries-2/pom.xml
index 35dec54450..669c07c23a 100644
--- a/spring-boot-modules/spring-boot-libraries-2/pom.xml
+++ b/spring-boot-modules/spring-boot-libraries-2/pom.xml
@@ -1,35 +1,56 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ spring-boot-libraries-2
+
spring-boot-modules
com.baeldung.spring-boot-modules
1.0.0-SNAPSHOT
- 4.0.0
-
- spring-boot-libraries-2
org.springframework.boot
spring-boot-starter-web
-
+
+ ch.qos.logback
+ logback-classic
+
+
+ org.springframework.data
+ spring-data-jpa
+
org.jobrunr
jobrunr-spring-boot-starter
${jobrunr.version}
-
+
+
+ org.openapitools
+ openapi-generator
+ ${openapi-generator.version}
+
+
+ org.openapitools
+ jackson-databind-nullable
+ ${jackson-databind.version}
+
+
+ io.springfox
+ springfox-swagger2
+ ${springfox.version}
+
org.springframework.boot
spring-boot-starter-test
test
-
org.awaitility
awaitility
@@ -38,9 +59,44 @@
+
+
+
+ org.openapitools
+ openapi-generator-maven-plugin
+ ${openapi-generator.version}
+
+
+
+ generate
+
+
+
+ ${project.basedir}/src/main/resources/petstore.yml
+
+ spring
+ com.baeldung.openapi.api
+ com.baeldung.openapi.model
+
+ ApiUtil.java
+
+
+ true
+
+
+
+
+
+
+
+
1.1.0
4.0.3
+ 5.1.0
+ 2.4.5
+ 0.2.1
+ 2.9.2
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/jobrunr/JobRunrSpringBootApp.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/JobRunrSpringBootApp.java
similarity index 97%
rename from spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/jobrunr/JobRunrSpringBootApp.java
rename to spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/JobRunrSpringBootApp.java
index d72e9464d9..77297feb92 100644
--- a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/jobrunr/JobRunrSpringBootApp.java
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/JobRunrSpringBootApp.java
@@ -1,4 +1,4 @@
-package com.baeldung.jobrunr;
+package com.baeldung;
import com.baeldung.jobrunr.service.SampleJobService;
import org.jobrunr.jobs.mappers.JobMapper;
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/resources/petstore.yml b/spring-boot-modules/spring-boot-libraries-2/src/main/resources/petstore.yml
new file mode 100644
index 0000000000..3265a18c3e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/resources/petstore.yml
@@ -0,0 +1,111 @@
+openapi: "3.0.0"
+info:
+ version: 1.0.0
+ title: Swagger Petstore
+ license:
+ name: MIT
+servers:
+ - url: http://localhost:8080/
+paths:
+ /pets:
+ get:
+ summary: List all pets
+ operationId: listPets
+ tags:
+ - pets
+ parameters:
+ - name: limit
+ in: query
+ description: How many items to return at one time (max 100)
+ required: false
+ schema:
+ type: integer
+ format: int32
+ responses:
+ '200':
+ description: A paged array of pets
+ headers:
+ x-next:
+ description: A link to the next page of responses
+ schema:
+ type: string
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Pets"
+ default:
+ description: unexpected error
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Error"
+ post:
+ summary: Create a pet
+ operationId: createPets
+ tags:
+ - pets
+ responses:
+ '201':
+ description: Null response
+ default:
+ description: unexpected error
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Error"
+ /pets/{petId}:
+ get:
+ summary: Info for a specific pet
+ operationId: showPetById
+ tags:
+ - pets
+ parameters:
+ - name: petId
+ in: path
+ required: true
+ description: The id of the pet to retrieve
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Expected response to a valid request
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Pet"
+ default:
+ description: unexpected error
+ content:
+ application/json:
+ schema:
+ $ref: "#/components/schemas/Error"
+components:
+ schemas:
+ Pet:
+ type: object
+ required:
+ - id
+ - name
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ tag:
+ type: string
+ Pets:
+ type: array
+ items:
+ $ref: "#/components/schemas/Pet"
+ Error:
+ type: object
+ required:
+ - code
+ - message
+ properties:
+ code:
+ type: integer
+ format: int32
+ message:
+ type: string
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/jobrunr/JobRunrLiveTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/jobrunr/JobRunrLiveTest.java
index 83222e7726..2c259b6879 100644
--- a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/jobrunr/JobRunrLiveTest.java
+++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/jobrunr/JobRunrLiveTest.java
@@ -10,6 +10,8 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.test.context.junit4.SpringRunner;
+import com.baeldung.JobRunrSpringBootApp;
+
import java.net.URI;
import java.util.concurrent.TimeUnit;
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/openapi/OpenApiPetsIntegrationTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/openapi/OpenApiPetsIntegrationTest.java
new file mode 100644
index 0000000000..b56c19d94c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/openapi/OpenApiPetsIntegrationTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.openapi;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@AutoConfigureMockMvc
+public class OpenApiPetsIntegrationTest {
+
+ private static final String PETS_PATH = "/pets/";
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Test
+ public void whenReadAll_thenStatusIsNotImplemented() throws Exception {
+ this.mockMvc.perform(get(PETS_PATH))
+ .andExpect(status().isNotImplemented());
+ }
+
+ @Test
+ public void whenReadOne_thenStatusIsNotImplemented() throws Exception {
+ this.mockMvc.perform(get(PETS_PATH + 1))
+ .andExpect(status().isNotImplemented());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-libraries/pom.xml b/spring-boot-modules/spring-boot-libraries/pom.xml
index c96a881573..ad00629e14 100644
--- a/spring-boot-modules/spring-boot-libraries/pom.xml
+++ b/spring-boot-modules/spring-boot-libraries/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-boot-libraries
spring-boot-libraries
@@ -36,20 +36,17 @@
spring-boot-starter-test
test
-
org.togglz
togglz-spring-boot-starter
${togglz.version}
-
org.togglz
togglz-spring-security
${togglz.version}
-
com.graphql-java
@@ -65,15 +62,13 @@
com.graphql-java
graphiql-spring-boot-starter
${graphql-spring-boot-starter.version}
-
-
+
org.zalando
problem-spring-web
${problem-spring-web.version}
-
net.javacrumbs.shedlock
@@ -130,11 +125,11 @@
org.springframework.boot
spring-boot-starter-cache
-
+
javax.cache
cache-api
-
+
com.github.ben-manes.caffeine
caffeine
@@ -162,14 +157,11 @@
true
-
-
org.apache.maven.plugins
maven-war-plugin
-
pl.project13.maven
git-commit-id-plugin
@@ -195,9 +187,7 @@
${project.build.outputDirectory}/git.properties
-
-
@@ -261,4 +251,4 @@
2.8.2
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml
index 4422405187..2f69870961 100644
--- a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml
+++ b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-boot-logging-log4j2
spring-boot-logging-log4j2
@@ -8,12 +9,11 @@
Demo project for Spring Boot Logging with Log4J2
-
org.springframework.boot
spring-boot-starter-parent
2.2.2.RELEASE
-
+
@@ -41,7 +41,6 @@
${lombok.version}
provided
-
@@ -83,4 +82,4 @@
1.18.4
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-2/pom.xml b/spring-boot-modules/spring-boot-mvc-2/pom.xml
index 580224cfd0..43e1f12efc 100644
--- a/spring-boot-modules/spring-boot-mvc-2/pom.xml
+++ b/spring-boot-modules/spring-boot-mvc-2/pom.xml
@@ -3,6 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-mvc-2
+ jar
+ spring-boot-mvc-2
+ Module For Spring Boot MVC Web Fn
com.baeldung.spring-boot-modules
@@ -11,69 +15,53 @@
../
- spring-boot-mvc-2
- jar
-
- spring-boot-mvc-2
- Module For Spring Boot MVC Web Fn
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-validation
-
org.springframework.boot
spring-boot-devtools
true
-
io.springfox
springfox-swagger2
${spring.fox.version}
-
io.springfox
springfox-swagger-ui
${spring.fox.version}
-
io.springfox
springfox-spring-webmvc
${spring.fox.version}
-
org.apache.commons
commons-lang3
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
-
-
-
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
com.h2database
h2
-
-
+
com.thoughtworks.xstream
xstream
${xstream.version}
@@ -101,7 +89,6 @@
-
3.0.0
com.baeldung.swagger2boot.SpringBootSwaggerApplication
diff --git a/spring-boot-modules/spring-boot-mvc-3/pom.xml b/spring-boot-modules/spring-boot-mvc-3/pom.xml
index 5a5d4c3cd8..a46837e315 100644
--- a/spring-boot-modules/spring-boot-mvc-3/pom.xml
+++ b/spring-boot-modules/spring-boot-mvc-3/pom.xml
@@ -3,6 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-mvc-3
+ jar
+ spring-boot-mvc-3
+ Module For Spring Boot MVC Web
com.baeldung.spring-boot-modules
@@ -11,12 +15,6 @@
../
- spring-boot-mvc-3
- jar
-
- spring-boot-mvc-3
- Module For Spring Boot MVC Web
-
org.springframework.boot
@@ -37,4 +35,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/charencoding/controller/CharEncodingCheckControllerUnitTest.java b/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/charencoding/controller/CharEncodingCheckControllerUnitTest.java
index 6dcbfe390f..8467a25acd 100644
--- a/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/charencoding/controller/CharEncodingCheckControllerUnitTest.java
+++ b/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/charencoding/controller/CharEncodingCheckControllerUnitTest.java
@@ -1,34 +1,35 @@
package com.baeldung.charencoding.controller;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import java.io.IOException;
+import org.junit.jupiter.api.Test;
+import org.springframework.mock.web.MockFilterChain;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.web.filter.CharacterEncodingFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
-import org.junit.jupiter.api.Test;
-import org.springframework.web.filter.CharacterEncodingFilter;
+import static org.junit.jupiter.api.Assertions.assertEquals;
class CharEncodingCheckControllerUnitTest {
@Test
void whenCharEncodingFilter_thenVerifyEncoding() throws ServletException, IOException {
- HttpServletRequest request = mock(HttpServletRequest.class);
- HttpServletResponse response = mock(HttpServletResponse.class);
- FilterChain chain = mock(FilterChain.class);
-
+ HttpServletRequest request = new MockHttpServletRequest();
+ HttpServletResponse response = new MockHttpServletResponse();
+ FilterChain chain = new MockFilterChain();
+
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
-
+
filter.doFilter(request, response, chain);
-
- verify(request).setCharacterEncoding("UTF-8");
- verify(response).setCharacterEncoding("UTF-8");
+
+ assertEquals("UTF-8", request.getCharacterEncoding());
+ assertEquals("UTF-8", response.getCharacterEncoding());
}
}
diff --git a/spring-boot-modules/spring-boot-mvc-birt/pom.xml b/spring-boot-modules/spring-boot-mvc-birt/pom.xml
index 4963cc3036..54a5091559 100644
--- a/spring-boot-modules/spring-boot-mvc-birt/pom.xml
+++ b/spring-boot-modules/spring-boot-mvc-birt/pom.xml
@@ -1,31 +1,28 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-mvc-birt
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-mvc-birt
+ Module For Spring Boot Integration with BIRT
-
+
org.springframework.boot
spring-boot-starter-parent
2.1.1.RELEASE
-
+
- spring-boot-mvc-birt
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-mvc-birt
- Module For Spring Boot Integration with BIRT
-
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-logging
@@ -36,13 +33,11 @@
-
org.springframework.boot
spring-boot-starter-test
test
-
com.innoventsolutions.birt.runtime
org.eclipse.birt.runtime_4.8.0-20180626
@@ -58,7 +53,6 @@
lombok
provided
-
@@ -78,4 +72,4 @@
1.2.17
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/README.md b/spring-boot-modules/spring-boot-mvc-jersey/README.md
new file mode 100644
index 0000000000..192658c4a5
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/README.md
@@ -0,0 +1,8 @@
+## Spring Boot Admin
+
+This module contains articles about Spring Boot: JAX-RS vs Spring
+
+
+### Relevant Articles:
+
+- [REST API: JAX-RS vs Spring](https://www.baeldung.com/rest-api-jax-rs-vs-spring)
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/pom.xml b/spring-boot-modules/spring-boot-mvc-jersey/pom.xml
new file mode 100644
index 0000000000..e5e4e09721
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+ spring-boot-mvc-jersey
+ 0.0.1-SNAPSHOT
+ pom
+ spring-boot-mvc-jersey
+
+
+ com.baeldung.spring-boot-modules
+ spring-boot-modules
+ 1.0.0-SNAPSHOT
+ ../
+
+
+
+ spring-boot-jersey
+ spring-boot-mvc
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/pom.xml b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/pom.xml
new file mode 100644
index 0000000000..e0b261510c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+ com.baeldung.boot
+ spring-boot-jersey
+ 0.0.1-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.2
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jersey
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/main/java/com/baeldung/boot/jersey/JerseyApplication.java b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/main/java/com/baeldung/boot/jersey/JerseyApplication.java
new file mode 100644
index 0000000000..b8ee0d0115
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/main/java/com/baeldung/boot/jersey/JerseyApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.boot.jersey;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class JerseyApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(JerseyApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/main/java/com/baeldung/boot/jersey/controllers/HelloController.java b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/main/java/com/baeldung/boot/jersey/controllers/HelloController.java
new file mode 100644
index 0000000000..2774e458de
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/main/java/com/baeldung/boot/jersey/controllers/HelloController.java
@@ -0,0 +1,20 @@
+package com.baeldung.boot.jersey.controllers;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/hello")
+public class HelloController {
+
+ @GET
+ @Path("/{name}")
+ @Produces(MediaType.TEXT_PLAIN)
+ public Response hello(@PathParam("name") String name) {
+ return Response.ok("Hello, " + name).build();
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/main/resources/application.properties b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/main/resources/application.properties
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/test/java/com/baeldung/boot/jersey/JerseyApplicationIntegrationTests.java b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/test/java/com/baeldung/boot/jersey/JerseyApplicationIntegrationTests.java
new file mode 100644
index 0000000000..9bd6bbf029
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/test/java/com/baeldung/boot/jersey/JerseyApplicationIntegrationTests.java
@@ -0,0 +1,13 @@
+package com.baeldung.boot.jersey;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class JerseyApplicationIntegrationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/test/java/com/baeldung/boot/jersey/controllers/HelloControllerUnitTest.java b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/test/java/com/baeldung/boot/jersey/controllers/HelloControllerUnitTest.java
new file mode 100644
index 0000000000..e0c48da5bd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-jersey/src/test/java/com/baeldung/boot/jersey/controllers/HelloControllerUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.boot.jersey.controllers;
+
+import javax.ws.rs.core.Response;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@Import(HelloController.class)
+@ExtendWith(SpringExtension.class)
+public class HelloControllerUnitTest {
+
+ @Autowired
+ private HelloController helloController;
+
+ @Test
+ public void whenHelloIsInvokedWithCaio_thenReturn200AsStatusAndHelloCaioAsBody() {
+ Response response = this.helloController.hello("Caio");
+ assertThat(response.getStatus()).isEqualTo(200);
+ assertThat(response.getEntity()).isEqualTo("Hello, Caio");
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/pom.xml b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/pom.xml
new file mode 100644
index 0000000000..77c8027974
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+ com.baeldung.boot
+ spring-boot-mvc
+ 0.0.1-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.2
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/main/java/com/baeldung/boot/mvc/MvcApplication.java b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/main/java/com/baeldung/boot/mvc/MvcApplication.java
new file mode 100644
index 0000000000..9c42c72fd7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/main/java/com/baeldung/boot/mvc/MvcApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.boot.mvc;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class MvcApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(MvcApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/main/java/com/baeldung/boot/mvc/controllers/HelloController.java b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/main/java/com/baeldung/boot/mvc/controllers/HelloController.java
new file mode 100644
index 0000000000..0b4c569ba9
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/main/java/com/baeldung/boot/mvc/controllers/HelloController.java
@@ -0,0 +1,21 @@
+package com.baeldung.boot.mvc.controllers;
+
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/hello")
+public class HelloController {
+
+ @GetMapping(value = "/{name}", produces = MediaType.TEXT_PLAIN_VALUE)
+ public ResponseEntity> hello(@PathVariable String name) {
+ return new ResponseEntity<>("Hello, " + name, HttpStatus.OK);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/main/resources/application.properties b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/main/resources/application.properties
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/test/java/com/baeldung/boot/mvc/MvcApplicationIntegrationTests.java b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/test/java/com/baeldung/boot/mvc/MvcApplicationIntegrationTests.java
new file mode 100644
index 0000000000..d05cb97e47
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/test/java/com/baeldung/boot/mvc/MvcApplicationIntegrationTests.java
@@ -0,0 +1,13 @@
+package com.baeldung.boot.mvc;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class MvcApplicationIntegrationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/test/java/com/baeldung/boot/mvc/controllers/HelloControllerUnitTest.java b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/test/java/com/baeldung/boot/mvc/controllers/HelloControllerUnitTest.java
new file mode 100644
index 0000000000..3bef9df4fd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-jersey/spring-boot-mvc/src/test/java/com/baeldung/boot/mvc/controllers/HelloControllerUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.boot.mvc.controllers;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Import;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@Import(HelloController.class)
+@ExtendWith(SpringExtension.class)
+public class HelloControllerUnitTest {
+
+ @Autowired
+ private HelloController helloController;
+
+ @Test
+ public void whenHelloIsInvokedWithCaio_thenReturn200AsStatusAndHelloCaioAsBody() {
+ ResponseEntity response = this.helloController.hello("Caio");
+ assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+ assertThat(response.getBody()).isEqualTo("Hello, Caio");
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-mvc/pom.xml b/spring-boot-modules/spring-boot-mvc/pom.xml
index 560ea1cffa..fdaedb51df 100644
--- a/spring-boot-modules/spring-boot-mvc/pom.xml
+++ b/spring-boot-modules/spring-boot-mvc/pom.xml
@@ -3,6 +3,10 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-mvc
+ jar
+ spring-boot-mvc
+ Module For Spring Boot MVC
com.baeldung.spring-boot-modules
@@ -11,14 +15,7 @@
../
- spring-boot-mvc
- jar
-
- spring-boot-mvc
- Module For Spring Boot MVC
-
-
org.springframework.boot
spring-boot-starter-web
@@ -44,39 +41,33 @@
org.springframework.boot
spring-boot-starter-data-rest
-
mysql
mysql-connector-java
-
org.hsqldb
hsqldb
runtime
-
org.glassfish
javax.faces
${javax.faces.version}
-
org.springframework.boot
spring-boot-starter-test
test
-
com.rometools
rome
${rome.version}
-
org.hibernate.validator
@@ -90,14 +81,12 @@
org.springframework.boot
spring-boot-starter-validation
-
io.springfox
springfox-boot-starter
${spring.fox.version}
-
org.aspectj
@@ -109,7 +98,6 @@
aspectjweaver
${aspectjweaver.version}
-
@@ -133,4 +121,4 @@
com.baeldung.springbootmvc.SpringBootMvcApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-nashorn/pom.xml b/spring-boot-modules/spring-boot-nashorn/pom.xml
index ca0b726a47..debde50595 100644
--- a/spring-boot-modules/spring-boot-nashorn/pom.xml
+++ b/spring-boot-modules/spring-boot-nashorn/pom.xml
@@ -1,8 +1,13 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ com.baeldung.nashorn
+ spring-boot-nashorn
+ 1.0
+ jar
+ spring-boot-nashorn
com.baeldung.spring-boot-modules
@@ -11,13 +16,6 @@
../
- com.baeldung.nashorn
- spring-boot-nashorn
- 1.0
- jar
-
- spring-boot-nashorn
-
org.springframework.boot
@@ -50,5 +48,5 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-parent/pom.xml b/spring-boot-modules/spring-boot-parent/pom.xml
index ebd3cd5d36..365a3a2639 100644
--- a/spring-boot-modules/spring-boot-parent/pom.xml
+++ b/spring-boot-modules/spring-boot-parent/pom.xml
@@ -1,8 +1,13 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-parent
+ 1.0.0-SNAPSHOT
+ pom
+ spring-boot-parent
+ spring-boot-parent
com.baeldung.spring-boot-modules
@@ -11,15 +16,9 @@
../
- spring-boot-parent
- 1.0.0-SNAPSHOT
- pom
-
- spring-boot-parent
- spring-boot-parent
-
spring-boot-with-starter-parent
spring-boot-with-custom-parent
-
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-parent/spring-boot-with-custom-parent/pom.xml b/spring-boot-modules/spring-boot-parent/spring-boot-with-custom-parent/pom.xml
index 5f5d3a9f6a..a61a5fd057 100644
--- a/spring-boot-modules/spring-boot-parent/spring-boot-with-custom-parent/pom.xml
+++ b/spring-boot-modules/spring-boot-parent/spring-boot-with-custom-parent/pom.xml
@@ -1,8 +1,11 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-with-custom-parent
+ 1.0.0-SNAPSHOT
+ spring-boot-with-custom-parent
com.baeldung.spring-boot-modules
@@ -11,11 +14,6 @@
../
- spring-boot-with-custom-parent
- 1.0.0-SNAPSHOT
-
- spring-boot-with-custom-parent
-
org.springframework.boot
@@ -23,8 +21,4 @@
-
- 1.8
-
-
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml b/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
index 108e66b68e..184becb657 100644
--- a/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
+++ b/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ com.baeldung
+ spring-boot-with-starter-parent
+ 1.0.0-SNAPSHOT
+ spring-boot-with-starter-parent
com.baeldung.spring-boot-modules
@@ -11,12 +15,6 @@
../
- com.baeldung
- spring-boot-with-starter-parent
- 1.0.0-SNAPSHOT
-
- spring-boot-with-starter-parent
-
@@ -39,7 +37,6 @@
- 1.8
2.2.5.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-performance/pom.xml b/spring-boot-modules/spring-boot-performance/pom.xml
index 053f68eea3..02cef986d0 100644
--- a/spring-boot-modules/spring-boot-performance/pom.xml
+++ b/spring-boot-modules/spring-boot-performance/pom.xml
@@ -1,7 +1,11 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-performance
+ war
+ spring-boot-performance
+ This is a simple Spring Boot application taking advantage of the latest Spring Boot improvements/features. Current version: 2.2
com.baeldung.spring-boot-modules
@@ -10,23 +14,15 @@
../
- spring-boot-performance
- war
-
- spring-boot-performance
- This is a simple Spring Boot application taking advantage of the latest Spring Boot improvements/features. Current version: 2.2
-
org.springframework.boot
spring-boot-starter
-
org.springframework.boot
spring-boot-starter-web
-
de.codecentric
chaos-monkey-spring-boot
@@ -42,7 +38,6 @@
true
-
org.apache.maven.plugins
@@ -56,4 +51,4 @@
com.baeldung.lazyinitialization.Application
2.0.0
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-performance/src/main/java/com/baeldung/lazyinitialization/Application.java b/spring-boot-modules/spring-boot-performance/src/main/java/com/baeldung/lazyinitialization/Application.java
index 195b260399..72c55e2de5 100644
--- a/spring-boot-modules/spring-boot-performance/src/main/java/com/baeldung/lazyinitialization/Application.java
+++ b/spring-boot-modules/spring-boot-performance/src/main/java/com/baeldung/lazyinitialization/Application.java
@@ -3,6 +3,7 @@ package com.baeldung.lazyinitialization;
import com.baeldung.lazyinitialization.services.Writer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
@@ -20,7 +21,9 @@ public class Application {
}
public static void main(String[] args) {
+
ApplicationContext ctx = SpringApplication.run(Application.class, args);
+
System.out.println("Application context initialized!!!");
Writer writer1 = ctx.getBean("writer1", Writer.class);
@@ -29,4 +32,23 @@ public class Application {
Writer writer2 = ctx.getBean("writer2", Writer.class);
writer2.write("Second message");
}
+
+ /*
+ This method shows how to set lazy initialization and start the application using SpringApplicationBuilder
+ */
+ private static ApplicationContext runUsingSpringApplicationBuilder(String[] args){
+ return new SpringApplicationBuilder(Application.class)
+ .lazyInitialization(true)
+ .build(args)
+ .run();
+ }
+
+ /*
+ This method shows how to set lazy initialization and start the application using SpringApplication
+ */
+ private static ApplicationContext runUsingSpringApplication(String[] args){
+ SpringApplication app = new SpringApplication(Application.class);
+ app.setLazyInitialization(true);
+ return app.run(args);
+ }
}
diff --git a/spring-boot-modules/spring-boot-properties-2/pom.xml b/spring-boot-modules/spring-boot-properties-2/pom.xml
index e777b8f318..62f23da450 100644
--- a/spring-boot-modules/spring-boot-properties-2/pom.xml
+++ b/spring-boot-modules/spring-boot-properties-2/pom.xml
@@ -1,7 +1,13 @@
-
+
4.0.0
+ spring-boot-properties-2
+ jar
+ 0.0.1-SNAPSHOT
+ spring-boot-properties-2
+ Spring Boot Properties Module
com.baeldung.spring-boot-modules
@@ -10,13 +16,6 @@
../
- spring-boot-properties-2
- jar
- 0.0.1-SNAPSHOT
-
- spring-boot-properties-2
- Spring Boot Properties Module
-
org.springframework.boot
@@ -28,4 +27,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties-3/pom.xml b/spring-boot-modules/spring-boot-properties-3/pom.xml
index 809fd6e2d4..400229a662 100644
--- a/spring-boot-modules/spring-boot-properties-3/pom.xml
+++ b/spring-boot-modules/spring-boot-properties-3/pom.xml
@@ -1,7 +1,13 @@
-
+
4.0.0
+ spring-boot-properties-3
+ 0.0.1-SNAPSHOT
+ spring-boot-properties-3
+ Spring Boot Properties Module
+
com.baeldung.spring-boot-modules
spring-boot-modules
@@ -9,14 +15,6 @@
../
- spring-boot-properties-3
- 0.0.1-SNAPSHOT
- spring-boot-properties-3
- Spring Boot Properties Module
-
-
- 1.8
-
org.springframework.boot
@@ -42,4 +40,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml
index 10570bb738..0f048ffa14 100644
--- a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml
+++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml
@@ -15,6 +15,7 @@ spring:
username: SA
bael:
property: stagingValue
+ stagingProperty: stagingPropertyValue
---
application:
servers:
diff --git a/spring-boot-modules/spring-boot-properties-3/src/test/java/com/baeldung/boot/properties/multidocument/StagingMultidocumentFilesIntegrationTest.java b/spring-boot-modules/spring-boot-properties-3/src/test/java/com/baeldung/boot/properties/multidocument/StagingMultidocumentFilesIntegrationTest.java
index 8040c93ee0..851d5e0432 100644
--- a/spring-boot-modules/spring-boot-properties-3/src/test/java/com/baeldung/boot/properties/multidocument/StagingMultidocumentFilesIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties-3/src/test/java/com/baeldung/boot/properties/multidocument/StagingMultidocumentFilesIntegrationTest.java
@@ -2,6 +2,7 @@ package com.baeldung.boot.properties.multidocument;
import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
@@ -16,13 +17,18 @@ public class StagingMultidocumentFilesIntegrationTest {
@Value("${bael.property}")
private String baelCustomProperty;
-
+
+ @Value("${bael.stagingProperty}")
+ private String baelStagingProperty;
+
@Value("${bael.root-level-property}")
private String baelRootProperty;
@Test
public void givenProductionProfileActive_whenApplicationStarts_thenDefaultPropertiesUser() {
- assertThat(baelCustomProperty).isEqualTo("stagingValue");
+ assertThat(baelStagingProperty).isEqualTo("stagingPropertyValue");
+ // application.properties is loaded after the application.yml file and overrides the values
+ assertThat(baelCustomProperty).isEqualTo("defaultValue");
assertThat(baelRootProperty).isEqualTo("defaultRootLevelValue");
}
}
diff --git a/spring-boot-modules/spring-boot-properties/pom.xml b/spring-boot-modules/spring-boot-properties/pom.xml
index 40668f47fd..adeb41e976 100644
--- a/spring-boot-modules/spring-boot-properties/pom.xml
+++ b/spring-boot-modules/spring-boot-properties/pom.xml
@@ -3,6 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-properties
+ jar
+ 0.0.1-SNAPSHOT
+ spring-boot-properties
+ Spring Boot Properties Module
com.baeldung.spring-boot-modules
@@ -11,13 +16,6 @@
../
- spring-boot-properties
- jar
- 0.0.1-SNAPSHOT
-
- spring-boot-properties
- Spring Boot Properties Module
-
commons-configuration
@@ -76,7 +74,6 @@
true
-
org.apache.maven.plugins
@@ -134,7 +131,6 @@
- 1.8
2020.0.0-M5
1.10
20.0
@@ -143,4 +139,4 @@
com.baeldung.yaml.MyApplication
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-property-exp/pom.xml b/spring-boot-modules/spring-boot-property-exp/pom.xml
index 2da25fca31..0d55a531c0 100644
--- a/spring-boot-modules/spring-boot-property-exp/pom.xml
+++ b/spring-boot-modules/spring-boot-property-exp/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
spring-boot-property-exp
spring-boot-property-exp
@@ -18,4 +19,4 @@
property-exp-custom-config
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/pom.xml b/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/pom.xml
index f0df50cf76..08fd911e6a 100644
--- a/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/pom.xml
+++ b/spring-boot-modules/spring-boot-property-exp/property-exp-custom-config/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
property-exp-custom-config
0.0.1-SNAPSHOT
@@ -69,7 +70,6 @@
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
com.baeldung.propertyexpansion.SpringBootPropertyExpansionApp
@@ -80,7 +80,6 @@
Custom Property Value
2.7
- 1.6.0
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/pom.xml b/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/pom.xml
index 79e194a3b5..496004b0e2 100644
--- a/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/pom.xml
+++ b/spring-boot-modules/spring-boot-property-exp/property-exp-default-config/pom.xml
@@ -1,6 +1,7 @@
-
+
4.0.0
property-exp-default-config
0.0.1-SNAPSHOT
@@ -37,4 +38,4 @@
Custom Property Value
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/README.md b/spring-boot-modules/spring-boot-react/README.md
new file mode 100644
index 0000000000..439e9368be
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [CRUD Application With React and Spring Boot](https://www.baeldung.com/spring-boot-react-crud)
diff --git a/spring-boot-modules/spring-boot-react/frontend/.gitignore b/spring-boot-modules/spring-boot-react/frontend/.gitignore
new file mode 100644
index 0000000000..bb730b5e42
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/.gitignore
@@ -0,0 +1,11 @@
+# binaries
+bin/
+dist/
+lib/
+
+# editors
+*.swp
+.idea/
+.vs/
+.vscode/
+.DS_Store
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/frontend/README.md b/spring-boot-modules/spring-boot-react/frontend/README.md
new file mode 100644
index 0000000000..0c83cde2ce
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/README.md
@@ -0,0 +1,70 @@
+# Getting Started with Create React App
+
+This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
+
+## Available Scripts
+
+In the project directory, you can run:
+
+### `npm start`
+
+Runs the app in the development mode.\
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
+
+The page will reload if you make edits.\
+You will also see any lint errors in the console.
+
+### `npm test`
+
+Launches the test runner in the interactive watch mode.\
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
+
+### `npm run build`
+
+Builds the app for production to the `build` folder.\
+It correctly bundles React in production mode and optimizes the build for the best performance.
+
+The build is minified and the filenames include the hashes.\
+Your app is ready to be deployed!
+
+See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
+
+### `npm run eject`
+
+**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
+
+If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
+
+Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.
+
+You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.
+
+## Learn More
+
+You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
+
+To learn React, check out the [React documentation](https://reactjs.org/).
+
+### Code Splitting
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
+
+### Analyzing the Bundle Size
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
+
+### Making a Progressive Web App
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
+
+### Advanced Configuration
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
+
+### Deployment
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
+
+### `npm run build` fails to minify
+
+This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
diff --git a/spring-boot-modules/spring-boot-react/frontend/package-lock.json b/spring-boot-modules/spring-boot-react/frontend/package-lock.json
new file mode 100644
index 0000000000..5ec0d06578
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/package-lock.json
@@ -0,0 +1,16760 @@
+{
+ "name": "frontend",
+ "version": "0.1.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+ "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "requires": {
+ "@babel/highlight": "^7.12.13"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz",
+ "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ=="
+ },
+ "@babel/core": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz",
+ "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.1",
+ "@babel/parser": "^7.12.3",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "@babel/generator": {
+ "version": "7.13.9",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz",
+ "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==",
+ "requires": {
+ "@babel/types": "^7.13.0",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz",
+ "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==",
+ "requires": {
+ "@babel/types": "^7.12.13"
+ }
+ },
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz",
+ "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==",
+ "requires": {
+ "@babel/helper-explode-assignable-expression": "^7.12.13",
+ "@babel/types": "^7.12.13"
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.13.13",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz",
+ "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==",
+ "requires": {
+ "@babel/compat-data": "^7.13.12",
+ "@babel/helper-validator-option": "^7.12.17",
+ "browserslist": "^4.14.5",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/helper-create-class-features-plugin": {
+ "version": "7.13.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz",
+ "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==",
+ "requires": {
+ "@babel/helper-function-name": "^7.12.13",
+ "@babel/helper-member-expression-to-functions": "^7.13.0",
+ "@babel/helper-optimise-call-expression": "^7.12.13",
+ "@babel/helper-replace-supers": "^7.13.0",
+ "@babel/helper-split-export-declaration": "^7.12.13"
+ }
+ },
+ "@babel/helper-create-regexp-features-plugin": {
+ "version": "7.12.17",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz",
+ "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.12.13",
+ "regexpu-core": "^4.7.1"
+ }
+ },
+ "@babel/helper-define-polyfill-provider": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz",
+ "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==",
+ "requires": {
+ "@babel/helper-compilation-targets": "^7.13.0",
+ "@babel/helper-module-imports": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/traverse": "^7.13.0",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2",
+ "semver": "^6.1.2"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz",
+ "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==",
+ "requires": {
+ "@babel/types": "^7.13.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
+ "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.12.13",
+ "@babel/template": "^7.12.13",
+ "@babel/types": "^7.12.13"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
+ "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
+ "requires": {
+ "@babel/types": "^7.12.13"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz",
+ "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==",
+ "requires": {
+ "@babel/traverse": "^7.13.0",
+ "@babel/types": "^7.13.0"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
+ "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
+ "requires": {
+ "@babel/types": "^7.13.12"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
+ "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
+ "requires": {
+ "@babel/types": "^7.13.12"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz",
+ "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.13.12",
+ "@babel/helper-replace-supers": "^7.13.12",
+ "@babel/helper-simple-access": "^7.13.12",
+ "@babel/helper-split-export-declaration": "^7.12.13",
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "@babel/template": "^7.12.13",
+ "@babel/traverse": "^7.13.0",
+ "@babel/types": "^7.13.12"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
+ "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
+ "requires": {
+ "@babel/types": "^7.12.13"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz",
+ "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ=="
+ },
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz",
+ "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.12.13",
+ "@babel/helper-wrap-function": "^7.13.0",
+ "@babel/types": "^7.13.0"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
+ "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.13.12",
+ "@babel/helper-optimise-call-expression": "^7.12.13",
+ "@babel/traverse": "^7.13.0",
+ "@babel/types": "^7.13.12"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
+ "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
+ "requires": {
+ "@babel/types": "^7.13.12"
+ }
+ },
+ "@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
+ "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
+ "requires": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
+ "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
+ "requires": {
+ "@babel/types": "^7.12.13"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw=="
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.12.17",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
+ "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw=="
+ },
+ "@babel/helper-wrap-function": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz",
+ "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==",
+ "requires": {
+ "@babel/helper-function-name": "^7.12.13",
+ "@babel/template": "^7.12.13",
+ "@babel/traverse": "^7.13.0",
+ "@babel/types": "^7.13.0"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz",
+ "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==",
+ "requires": {
+ "@babel/template": "^7.12.13",
+ "@babel/traverse": "^7.13.0",
+ "@babel/types": "^7.13.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.13.13",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz",
+ "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw=="
+ },
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz",
+ "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+ "@babel/plugin-proposal-optional-chaining": "^7.13.12"
+ }
+ },
+ "@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.13.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz",
+ "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-remap-async-to-generator": "^7.13.0",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ }
+ },
+ "@babel/plugin-proposal-class-properties": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz",
+ "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.13.0",
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-proposal-decorators": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz",
+ "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-decorators": "^7.12.1"
+ }
+ },
+ "@babel/plugin-proposal-dynamic-import": {
+ "version": "7.13.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz",
+ "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz",
+ "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-json-strings": {
+ "version": "7.13.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz",
+ "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.13.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz",
+ "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.13.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz",
+ "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-numeric-separator": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz",
+ "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.13.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz",
+ "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==",
+ "requires": {
+ "@babel/compat-data": "^7.13.8",
+ "@babel/helper-compilation-targets": "^7.13.8",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.13.0"
+ }
+ },
+ "@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.13.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz",
+ "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-optional-chaining": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz",
+ "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-private-methods": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz",
+ "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.13.0",
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz",
+ "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-decorators": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz",
+ "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ }
+ },
+ "@babel/plugin-syntax-flow": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz",
+ "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz",
+ "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-top-level-await": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz",
+ "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-typescript": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz",
+ "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-arrow-functions": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz",
+ "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-transform-async-to-generator": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz",
+ "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-remap-async-to-generator": "^7.13.0"
+ }
+ },
+ "@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz",
+ "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-block-scoping": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz",
+ "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-classes": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz",
+ "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.12.13",
+ "@babel/helper-function-name": "^7.12.13",
+ "@babel/helper-optimise-call-expression": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-replace-supers": "^7.13.0",
+ "@babel/helper-split-export-declaration": "^7.12.13",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/plugin-transform-computed-properties": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz",
+ "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-transform-destructuring": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz",
+ "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-transform-dotall-regex": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz",
+ "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-duplicate-keys": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz",
+ "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz",
+ "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==",
+ "requires": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-flow-strip-types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz",
+ "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-flow": "^7.12.1"
+ }
+ },
+ "@babel/plugin-transform-for-of": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz",
+ "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-transform-function-name": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz",
+ "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==",
+ "requires": {
+ "@babel/helper-function-name": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-literals": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz",
+ "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-member-expression-literals": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz",
+ "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz",
+ "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==",
+ "requires": {
+ "@babel/helper-module-transforms": "^7.13.0",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-commonjs": {
+ "version": "7.13.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz",
+ "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==",
+ "requires": {
+ "@babel/helper-module-transforms": "^7.13.0",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-simple-access": "^7.12.13",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-systemjs": {
+ "version": "7.13.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz",
+ "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==",
+ "requires": {
+ "@babel/helper-hoist-variables": "^7.13.0",
+ "@babel/helper-module-transforms": "^7.13.0",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-umd": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz",
+ "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==",
+ "requires": {
+ "@babel/helper-module-transforms": "^7.13.0",
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz",
+ "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-new-target": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz",
+ "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-object-super": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz",
+ "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13",
+ "@babel/helper-replace-supers": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz",
+ "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-transform-property-literals": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz",
+ "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-react-constant-elements": {
+ "version": "7.13.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz",
+ "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-transform-react-display-name": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz",
+ "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-react-jsx": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.13.12.tgz",
+ "integrity": "sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.12.13",
+ "@babel/helper-module-imports": "^7.13.12",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/plugin-syntax-jsx": "^7.12.13",
+ "@babel/types": "^7.13.12"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-development": {
+ "version": "7.12.17",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz",
+ "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==",
+ "requires": {
+ "@babel/plugin-transform-react-jsx": "^7.12.17"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-self": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz",
+ "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-source": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz",
+ "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz",
+ "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-regenerator": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz",
+ "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==",
+ "requires": {
+ "regenerator-transform": "^0.14.2"
+ }
+ },
+ "@babel/plugin-transform-reserved-words": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz",
+ "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-runtime": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz",
+ "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "resolve": "^1.8.1",
+ "semver": "^5.5.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "@babel/plugin-transform-shorthand-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz",
+ "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-spread": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz",
+ "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
+ }
+ },
+ "@babel/plugin-transform-sticky-regex": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz",
+ "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-template-literals": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz",
+ "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0"
+ }
+ },
+ "@babel/plugin-transform-typeof-symbol": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz",
+ "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-typescript": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz",
+ "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.13.0",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/plugin-syntax-typescript": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-unicode-escapes": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz",
+ "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-transform-unicode-regex": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz",
+ "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/preset-env": {
+ "version": "7.13.12",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz",
+ "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==",
+ "requires": {
+ "@babel/compat-data": "^7.13.12",
+ "@babel/helper-compilation-targets": "^7.13.10",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-validator-option": "^7.12.17",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12",
+ "@babel/plugin-proposal-async-generator-functions": "^7.13.8",
+ "@babel/plugin-proposal-class-properties": "^7.13.0",
+ "@babel/plugin-proposal-dynamic-import": "^7.13.8",
+ "@babel/plugin-proposal-export-namespace-from": "^7.12.13",
+ "@babel/plugin-proposal-json-strings": "^7.13.8",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8",
+ "@babel/plugin-proposal-numeric-separator": "^7.12.13",
+ "@babel/plugin-proposal-object-rest-spread": "^7.13.8",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.13.8",
+ "@babel/plugin-proposal-optional-chaining": "^7.13.12",
+ "@babel/plugin-proposal-private-methods": "^7.13.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.12.13",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-top-level-await": "^7.12.13",
+ "@babel/plugin-transform-arrow-functions": "^7.13.0",
+ "@babel/plugin-transform-async-to-generator": "^7.13.0",
+ "@babel/plugin-transform-block-scoped-functions": "^7.12.13",
+ "@babel/plugin-transform-block-scoping": "^7.12.13",
+ "@babel/plugin-transform-classes": "^7.13.0",
+ "@babel/plugin-transform-computed-properties": "^7.13.0",
+ "@babel/plugin-transform-destructuring": "^7.13.0",
+ "@babel/plugin-transform-dotall-regex": "^7.12.13",
+ "@babel/plugin-transform-duplicate-keys": "^7.12.13",
+ "@babel/plugin-transform-exponentiation-operator": "^7.12.13",
+ "@babel/plugin-transform-for-of": "^7.13.0",
+ "@babel/plugin-transform-function-name": "^7.12.13",
+ "@babel/plugin-transform-literals": "^7.12.13",
+ "@babel/plugin-transform-member-expression-literals": "^7.12.13",
+ "@babel/plugin-transform-modules-amd": "^7.13.0",
+ "@babel/plugin-transform-modules-commonjs": "^7.13.8",
+ "@babel/plugin-transform-modules-systemjs": "^7.13.8",
+ "@babel/plugin-transform-modules-umd": "^7.13.0",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13",
+ "@babel/plugin-transform-new-target": "^7.12.13",
+ "@babel/plugin-transform-object-super": "^7.12.13",
+ "@babel/plugin-transform-parameters": "^7.13.0",
+ "@babel/plugin-transform-property-literals": "^7.12.13",
+ "@babel/plugin-transform-regenerator": "^7.12.13",
+ "@babel/plugin-transform-reserved-words": "^7.12.13",
+ "@babel/plugin-transform-shorthand-properties": "^7.12.13",
+ "@babel/plugin-transform-spread": "^7.13.0",
+ "@babel/plugin-transform-sticky-regex": "^7.12.13",
+ "@babel/plugin-transform-template-literals": "^7.13.0",
+ "@babel/plugin-transform-typeof-symbol": "^7.12.13",
+ "@babel/plugin-transform-unicode-escapes": "^7.12.13",
+ "@babel/plugin-transform-unicode-regex": "^7.12.13",
+ "@babel/preset-modules": "^0.1.4",
+ "@babel/types": "^7.13.12",
+ "babel-plugin-polyfill-corejs2": "^0.1.4",
+ "babel-plugin-polyfill-corejs3": "^0.1.3",
+ "babel-plugin-polyfill-regenerator": "^0.1.2",
+ "core-js-compat": "^3.9.0",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/preset-modules": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ }
+ },
+ "@babel/preset-react": {
+ "version": "7.13.13",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz",
+ "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/helper-validator-option": "^7.12.17",
+ "@babel/plugin-transform-react-display-name": "^7.12.13",
+ "@babel/plugin-transform-react-jsx": "^7.13.12",
+ "@babel/plugin-transform-react-jsx-development": "^7.12.17",
+ "@babel/plugin-transform-react-pure-annotations": "^7.12.1"
+ }
+ },
+ "@babel/preset-typescript": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz",
+ "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-transform-typescript": "^7.12.1"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz",
+ "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz",
+ "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==",
+ "requires": {
+ "core-js-pure": "^3.0.0",
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/template": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz",
+ "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
+ "requires": {
+ "@babel/code-frame": "^7.12.13",
+ "@babel/parser": "^7.12.13",
+ "@babel/types": "^7.12.13"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.13.13",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz",
+ "integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==",
+ "requires": {
+ "@babel/code-frame": "^7.12.13",
+ "@babel/generator": "^7.13.9",
+ "@babel/helper-function-name": "^7.12.13",
+ "@babel/helper-split-export-declaration": "^7.12.13",
+ "@babel/parser": "^7.13.13",
+ "@babel/types": "^7.13.13",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.13.13",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.13.tgz",
+ "integrity": "sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
+ },
+ "@cnakazawa/watch": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
+ "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
+ "requires": {
+ "exec-sh": "^0.3.2",
+ "minimist": "^1.2.0"
+ }
+ },
+ "@csstools/convert-colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
+ "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw=="
+ },
+ "@csstools/normalize.css": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz",
+ "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
+ },
+ "@eslint/eslintrc": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+ "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+ }
+ }
+ },
+ "@hapi/address": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
+ "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ=="
+ },
+ "@hapi/bourne": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
+ "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA=="
+ },
+ "@hapi/hoek": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
+ "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow=="
+ },
+ "@hapi/joi": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz",
+ "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
+ "requires": {
+ "@hapi/address": "2.x.x",
+ "@hapi/bourne": "1.x.x",
+ "@hapi/hoek": "8.x.x",
+ "@hapi/topo": "3.x.x"
+ }
+ },
+ "@hapi/topo": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
+ "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
+ "requires": {
+ "@hapi/hoek": "^8.3.0"
+ }
+ },
+ "@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "requires": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+ }
+ }
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="
+ },
+ "@jest/console": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz",
+ "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^26.6.2",
+ "jest-util": "^26.6.2",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/core": {
+ "version": "26.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz",
+ "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==",
+ "requires": {
+ "@jest/console": "^26.6.2",
+ "@jest/reporters": "^26.6.2",
+ "@jest/test-result": "^26.6.2",
+ "@jest/transform": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.4",
+ "jest-changed-files": "^26.6.2",
+ "jest-config": "^26.6.3",
+ "jest-haste-map": "^26.6.2",
+ "jest-message-util": "^26.6.2",
+ "jest-regex-util": "^26.0.0",
+ "jest-resolve": "^26.6.2",
+ "jest-resolve-dependencies": "^26.6.3",
+ "jest-runner": "^26.6.3",
+ "jest-runtime": "^26.6.3",
+ "jest-snapshot": "^26.6.2",
+ "jest-util": "^26.6.2",
+ "jest-validate": "^26.6.2",
+ "jest-watcher": "^26.6.2",
+ "micromatch": "^4.0.2",
+ "p-each-series": "^2.1.0",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-resolve": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz",
+ "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^26.6.2",
+ "read-pkg-up": "^7.0.1",
+ "resolve": "^1.18.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/environment": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz",
+ "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==",
+ "requires": {
+ "@jest/fake-timers": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/node": "*",
+ "jest-mock": "^26.6.2"
+ }
+ },
+ "@jest/fake-timers": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz",
+ "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "@sinonjs/fake-timers": "^6.0.1",
+ "@types/node": "*",
+ "jest-message-util": "^26.6.2",
+ "jest-mock": "^26.6.2",
+ "jest-util": "^26.6.2"
+ }
+ },
+ "@jest/globals": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz",
+ "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==",
+ "requires": {
+ "@jest/environment": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "expect": "^26.6.2"
+ }
+ },
+ "@jest/reporters": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz",
+ "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==",
+ "requires": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^26.6.2",
+ "@jest/test-result": "^26.6.2",
+ "@jest/transform": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "graceful-fs": "^4.2.4",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.3",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "jest-haste-map": "^26.6.2",
+ "jest-resolve": "^26.6.2",
+ "jest-util": "^26.6.2",
+ "jest-worker": "^26.6.2",
+ "node-notifier": "^8.0.0",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^4.0.1",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^7.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-resolve": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz",
+ "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^26.6.2",
+ "read-pkg-up": "^7.0.1",
+ "resolve": "^1.18.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/source-map": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz",
+ "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==",
+ "requires": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.4",
+ "source-map": "^0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "@jest/test-result": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz",
+ "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==",
+ "requires": {
+ "@jest/console": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ }
+ },
+ "@jest/test-sequencer": {
+ "version": "26.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz",
+ "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==",
+ "requires": {
+ "@jest/test-result": "^26.6.2",
+ "graceful-fs": "^4.2.4",
+ "jest-haste-map": "^26.6.2",
+ "jest-runner": "^26.6.3",
+ "jest-runtime": "^26.6.3"
+ }
+ },
+ "@jest/transform": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz",
+ "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==",
+ "requires": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^26.6.2",
+ "babel-plugin-istanbul": "^6.0.0",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.4",
+ "jest-haste-map": "^26.6.2",
+ "jest-regex-util": "^26.0.0",
+ "jest-util": "^26.6.2",
+ "micromatch": "^4.0.2",
+ "pirates": "^4.0.1",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jest/types": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
+ "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^15.0.0",
+ "chalk": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+ "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
+ "requires": {
+ "@nodelib/fs.stat": "2.0.4",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+ "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q=="
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+ "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.4",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@npmcli/move-file": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
+ "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+ "requires": {
+ "mkdirp": "^1.0.4",
+ "rimraf": "^3.0.2"
+ },
+ "dependencies": {
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+ }
+ }
+ },
+ "@pmmmwh/react-refresh-webpack-plugin": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz",
+ "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==",
+ "requires": {
+ "ansi-html": "^0.0.7",
+ "error-stack-parser": "^2.0.6",
+ "html-entities": "^1.2.1",
+ "native-url": "^0.2.6",
+ "schema-utils": "^2.6.5",
+ "source-map": "^0.7.3"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+ }
+ }
+ },
+ "@rollup/plugin-node-resolve": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz",
+ "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==",
+ "requires": {
+ "@rollup/pluginutils": "^3.0.8",
+ "@types/resolve": "0.0.8",
+ "builtin-modules": "^3.1.0",
+ "is-module": "^1.0.0",
+ "resolve": "^1.14.2"
+ }
+ },
+ "@rollup/plugin-replace": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
+ "requires": {
+ "@rollup/pluginutils": "^3.1.0",
+ "magic-string": "^0.25.7"
+ }
+ },
+ "@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "requires": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "dependencies": {
+ "@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
+ }
+ }
+ },
+ "@sinonjs/commons": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz",
+ "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==",
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "@sinonjs/fake-timers": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
+ "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
+ "requires": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "@surma/rollup-plugin-off-main-thread": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz",
+ "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==",
+ "requires": {
+ "ejs": "^2.6.1",
+ "magic-string": "^0.25.0"
+ }
+ },
+ "@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg=="
+ },
+ "@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg=="
+ },
+ "@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA=="
+ },
+ "@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ=="
+ },
+ "@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
+ "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg=="
+ },
+ "@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
+ "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw=="
+ },
+ "@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
+ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q=="
+ },
+ "@svgr/babel-plugin-transform-svg-component": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
+ "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ=="
+ },
+ "@svgr/babel-preset": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
+ "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+ "requires": {
+ "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
+ "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+ }
+ },
+ "@svgr/core": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
+ "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+ "requires": {
+ "@svgr/plugin-jsx": "^5.5.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^7.0.0"
+ }
+ },
+ "@svgr/hast-util-to-babel-ast": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
+ "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+ "requires": {
+ "@babel/types": "^7.12.6"
+ }
+ },
+ "@svgr/plugin-jsx": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
+ "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+ "requires": {
+ "@babel/core": "^7.12.3",
+ "@svgr/babel-preset": "^5.5.0",
+ "@svgr/hast-util-to-babel-ast": "^5.5.0",
+ "svg-parser": "^2.0.2"
+ }
+ },
+ "@svgr/plugin-svgo": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
+ "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+ "requires": {
+ "cosmiconfig": "^7.0.0",
+ "deepmerge": "^4.2.2",
+ "svgo": "^1.2.2"
+ }
+ },
+ "@svgr/webpack": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
+ "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+ "requires": {
+ "@babel/core": "^7.12.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.12.1",
+ "@babel/preset-env": "^7.12.1",
+ "@babel/preset-react": "^7.12.5",
+ "@svgr/core": "^5.5.0",
+ "@svgr/plugin-jsx": "^5.5.0",
+ "@svgr/plugin-svgo": "^5.5.0",
+ "loader-utils": "^2.0.0"
+ }
+ },
+ "@testing-library/dom": {
+ "version": "7.30.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.30.1.tgz",
+ "integrity": "sha512-RQUvqqq2lxTCOffhSNxpX/9fCoR+nwuQPmG5uhuuEH5KBAzNf2bK3OzBoWjm5zKM78SLjnGRAKt8hRjQA4E46A==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^4.2.0",
+ "aria-query": "^4.2.2",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.4",
+ "lz-string": "^1.4.4",
+ "pretty-format": "^26.6.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@testing-library/jest-dom": {
+ "version": "5.11.10",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.10.tgz",
+ "integrity": "sha512-FuKiq5xuk44Fqm0000Z9w0hjOdwZRNzgx7xGGxQYepWFZy+OYUMOT/wPI4nLYXCaVltNVpU1W/qmD88wLWDsqQ==",
+ "requires": {
+ "@babel/runtime": "^7.9.2",
+ "@types/testing-library__jest-dom": "^5.9.1",
+ "aria-query": "^4.2.2",
+ "chalk": "^3.0.0",
+ "css": "^3.0.0",
+ "css.escape": "^1.5.1",
+ "lodash": "^4.17.15",
+ "redent": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "css": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz",
+ "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==",
+ "requires": {
+ "inherits": "^2.0.4",
+ "source-map": "^0.6.1",
+ "source-map-resolve": "^0.6.0"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "source-map-resolve": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
+ "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
+ "requires": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@testing-library/react": {
+ "version": "11.2.5",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.5.tgz",
+ "integrity": "sha512-yEx7oIa/UWLe2F2dqK0FtMF9sJWNXD+2PPtp39BvE0Kh9MJ9Kl0HrZAgEuhUJR+Lx8Di6Xz+rKwSdEPY2UV8ZQ==",
+ "requires": {
+ "@babel/runtime": "^7.12.5",
+ "@testing-library/dom": "^7.28.1"
+ }
+ },
+ "@testing-library/user-event": {
+ "version": "12.8.3",
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz",
+ "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==",
+ "requires": {
+ "@babel/runtime": "^7.12.5"
+ }
+ },
+ "@types/anymatch": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz",
+ "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA=="
+ },
+ "@types/aria-query": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz",
+ "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg=="
+ },
+ "@types/babel__core": {
+ "version": "7.1.14",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz",
+ "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==",
+ "requires": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "@types/babel__generator": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz",
+ "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==",
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__template": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz",
+ "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==",
+ "requires": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__traverse": {
+ "version": "7.11.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz",
+ "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==",
+ "requires": {
+ "@babel/types": "^7.3.0"
+ }
+ },
+ "@types/cookie": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz",
+ "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow=="
+ },
+ "@types/eslint": {
+ "version": "7.2.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.7.tgz",
+ "integrity": "sha512-EHXbc1z2GoQRqHaAT7+grxlTJ3WE2YNeD6jlpPoRc83cCoThRY+NUWjCUZaYmk51OICkPXn2hhphcWcWXgNW0Q==",
+ "requires": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.47",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz",
+ "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg=="
+ },
+ "@types/glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+ "requires": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/graceful-fs": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
+ "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "requires": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "@types/html-minifier-terser": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+ "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA=="
+ },
+ "@types/istanbul-lib-coverage": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+ "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw=="
+ },
+ "@types/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "requires": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "@types/istanbul-reports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+ "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+ "requires": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "@types/jest": {
+ "version": "26.0.22",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.22.tgz",
+ "integrity": "sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw==",
+ "requires": {
+ "jest-diff": "^26.0.0",
+ "pretty-format": "^26.0.0"
+ }
+ },
+ "@types/json-schema": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
+ "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA=="
+ },
+ "@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4="
+ },
+ "@types/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA=="
+ },
+ "@types/node": {
+ "version": "14.14.37",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz",
+ "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw=="
+ },
+ "@types/normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA=="
+ },
+ "@types/object-assign": {
+ "version": "4.0.30",
+ "resolved": "https://registry.npmjs.org/@types/object-assign/-/object-assign-4.0.30.tgz",
+ "integrity": "sha1-iUk3HVqZ9Dge4PHfCpt6GH4H5lI="
+ },
+ "@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+ },
+ "@types/prettier": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz",
+ "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA=="
+ },
+ "@types/prop-types": {
+ "version": "15.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
+ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
+ },
+ "@types/q": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
+ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
+ },
+ "@types/react": {
+ "version": "17.0.3",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz",
+ "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==",
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
+ "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/scheduler": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz",
+ "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA=="
+ },
+ "@types/source-list-map": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
+ "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA=="
+ },
+ "@types/stack-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz",
+ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw=="
+ },
+ "@types/tapable": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz",
+ "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ=="
+ },
+ "@types/testing-library__jest-dom": {
+ "version": "5.9.5",
+ "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.5.tgz",
+ "integrity": "sha512-ggn3ws+yRbOHog9GxnXiEZ/35Mow6YtPZpd7Z5mKDeZS/o7zx3yAle0ov/wjhVB5QT4N2Dt+GNoGCdqkBGCajQ==",
+ "requires": {
+ "@types/jest": "*"
+ }
+ },
+ "@types/uglify-js": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz",
+ "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==",
+ "requires": {
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "@types/webpack": {
+ "version": "4.41.27",
+ "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.27.tgz",
+ "integrity": "sha512-wK/oi5gcHi72VMTbOaQ70VcDxSQ1uX8S2tukBK9ARuGXrYM/+u4ou73roc7trXDNmCxCoerE8zruQqX/wuHszA==",
+ "requires": {
+ "@types/anymatch": "*",
+ "@types/node": "*",
+ "@types/tapable": "^1",
+ "@types/uglify-js": "*",
+ "@types/webpack-sources": "*",
+ "source-map": "^0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "@types/webpack-sources": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz",
+ "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==",
+ "requires": {
+ "@types/node": "*",
+ "@types/source-list-map": "*",
+ "source-map": "^0.7.3"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+ }
+ }
+ },
+ "@types/yargs": {
+ "version": "15.0.13",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz",
+ "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==",
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "@types/yargs-parser": {
+ "version": "20.2.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz",
+ "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA=="
+ },
+ "@typescript-eslint/eslint-plugin": {
+ "version": "4.19.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.19.0.tgz",
+ "integrity": "sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw==",
+ "requires": {
+ "@typescript-eslint/experimental-utils": "4.19.0",
+ "@typescript-eslint/scope-manager": "4.19.0",
+ "debug": "^4.1.1",
+ "functional-red-black-tree": "^1.0.1",
+ "lodash": "^4.17.15",
+ "regexpp": "^3.0.0",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ }
+ },
+ "@typescript-eslint/experimental-utils": {
+ "version": "4.19.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.19.0.tgz",
+ "integrity": "sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA==",
+ "requires": {
+ "@types/json-schema": "^7.0.3",
+ "@typescript-eslint/scope-manager": "4.19.0",
+ "@typescript-eslint/types": "4.19.0",
+ "@typescript-eslint/typescript-estree": "4.19.0",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^2.0.0"
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "4.19.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.19.0.tgz",
+ "integrity": "sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA==",
+ "requires": {
+ "@typescript-eslint/scope-manager": "4.19.0",
+ "@typescript-eslint/types": "4.19.0",
+ "@typescript-eslint/typescript-estree": "4.19.0",
+ "debug": "^4.1.1"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "4.19.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.19.0.tgz",
+ "integrity": "sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g==",
+ "requires": {
+ "@typescript-eslint/types": "4.19.0",
+ "@typescript-eslint/visitor-keys": "4.19.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "4.19.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.19.0.tgz",
+ "integrity": "sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA=="
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "4.19.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.19.0.tgz",
+ "integrity": "sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA==",
+ "requires": {
+ "@typescript-eslint/types": "4.19.0",
+ "@typescript-eslint/visitor-keys": "4.19.0",
+ "debug": "^4.1.1",
+ "globby": "^11.0.1",
+ "is-glob": "^4.0.1",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "4.19.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.19.0.tgz",
+ "integrity": "sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A==",
+ "requires": {
+ "@typescript-eslint/types": "4.19.0",
+ "eslint-visitor-keys": "^2.0.0"
+ }
+ },
+ "@webassemblyjs/ast": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+ "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+ "requires": {
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0"
+ }
+ },
+ "@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+ "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA=="
+ },
+ "@webassemblyjs/helper-api-error": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+ "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw=="
+ },
+ "@webassemblyjs/helper-buffer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+ "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA=="
+ },
+ "@webassemblyjs/helper-code-frame": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+ "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+ "requires": {
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "@webassemblyjs/helper-fsm": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+ "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw=="
+ },
+ "@webassemblyjs/helper-module-context": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+ "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0"
+ }
+ },
+ "@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+ "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw=="
+ },
+ "@webassemblyjs/helper-wasm-section": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+ "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0"
+ }
+ },
+ "@webassemblyjs/ieee754": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+ "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+ "requires": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "@webassemblyjs/leb128": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+ "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+ "requires": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/utf8": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+ "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w=="
+ },
+ "@webassemblyjs/wasm-edit": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+ "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/helper-wasm-section": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-opt": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wasm-gen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+ "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wasm-opt": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+ "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wasm-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+ "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wast-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+ "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-code-frame": "1.9.0",
+ "@webassemblyjs/helper-fsm": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/wast-printer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+ "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+ },
+ "@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+ },
+ "abab": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
+ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+ },
+ "acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng=="
+ },
+ "acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
+ },
+ "address": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
+ "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA=="
+ },
+ "adjust-sourcemap-loader": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz",
+ "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==",
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "regex-parser": "^2.2.11"
+ }
+ },
+ "aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "requires": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-errors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ=="
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+ },
+ "alphanum-sort": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+ },
+ "ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "requires": {
+ "type-fest": "^0.21.3"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="
+ }
+ }
+ },
+ "ansi-html": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+ },
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "aria-query": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
+ "requires": {
+ "@babel/runtime": "^7.10.2",
+ "@babel/runtime-corejs3": "^7.10.2"
+ }
+ },
+ "arity-n": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz",
+ "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U="
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "array-flatten": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
+ },
+ "array-includes": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz",
+ "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.2",
+ "get-intrinsic": "^1.1.1",
+ "is-string": "^1.0.5"
+ }
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "array.prototype.flat": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz",
+ "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ }
+ },
+ "array.prototype.flatmap": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz",
+ "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "requires": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "assert": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+ "requires": {
+ "object-assign": "^4.1.1",
+ "util": "0.10.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "requires": {
+ "inherits": "2.0.1"
+ }
+ }
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ },
+ "ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+ },
+ "async": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+ "requires": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "async-each": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
+ },
+ "async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+ },
+ "autoprefixer": {
+ "version": "9.8.6",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+ "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
+ "requires": {
+ "browserslist": "^4.12.0",
+ "caniuse-lite": "^1.0.30001109",
+ "colorette": "^1.2.1",
+ "normalize-range": "^0.1.2",
+ "num2fraction": "^1.2.2",
+ "postcss": "^7.0.32",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+ },
+ "aws4": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
+ },
+ "axe-core": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.3.tgz",
+ "integrity": "sha512-vwPpH4Aj4122EW38mxO/fxhGKtwWTMLDIJfZ1He0Edbtjcfna/R3YB67yVhezUMzqc3Jr3+Ii50KRntlENL4xQ=="
+ },
+ "axobject-query": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
+ },
+ "babel-eslint": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+ "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.7.0",
+ "@babel/traverse": "^7.7.0",
+ "@babel/types": "^7.7.0",
+ "eslint-visitor-keys": "^1.0.0",
+ "resolve": "^1.12.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+ }
+ }
+ },
+ "babel-extract-comments": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz",
+ "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==",
+ "requires": {
+ "babylon": "^6.18.0"
+ }
+ },
+ "babel-jest": {
+ "version": "26.6.3",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz",
+ "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==",
+ "requires": {
+ "@jest/transform": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/babel__core": "^7.1.7",
+ "babel-plugin-istanbul": "^6.0.0",
+ "babel-preset-jest": "^26.6.2",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "babel-loader": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
+ "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
+ "requires": {
+ "find-cache-dir": "^2.1.0",
+ "loader-utils": "^1.4.0",
+ "mkdirp": "^0.5.3",
+ "pify": "^4.0.1",
+ "schema-utils": "^2.6.5"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "requires": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "babel-plugin-istanbul": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+ "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^4.0.0",
+ "test-exclude": "^6.0.0"
+ }
+ },
+ "babel-plugin-jest-hoist": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz",
+ "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==",
+ "requires": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.0.0",
+ "@types/babel__traverse": "^7.0.6"
+ }
+ },
+ "babel-plugin-macros": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
+ "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
+ "requires": {
+ "@babel/runtime": "^7.7.2",
+ "cosmiconfig": "^6.0.0",
+ "resolve": "^1.12.0"
+ },
+ "dependencies": {
+ "cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ }
+ }
+ }
+ },
+ "babel-plugin-named-asset-import": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz",
+ "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw=="
+ },
+ "babel-plugin-polyfill-corejs2": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz",
+ "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==",
+ "requires": {
+ "@babel/compat-data": "^7.13.0",
+ "@babel/helper-define-polyfill-provider": "^0.1.5",
+ "semver": "^6.1.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "babel-plugin-polyfill-corejs3": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz",
+ "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==",
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.1.5",
+ "core-js-compat": "^3.8.1"
+ }
+ },
+ "babel-plugin-polyfill-regenerator": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz",
+ "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==",
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.1.5"
+ }
+ },
+ "babel-plugin-syntax-object-rest-spread": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+ "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U="
+ },
+ "babel-plugin-transform-object-rest-spread": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+ "requires": {
+ "babel-plugin-syntax-object-rest-spread": "^6.8.0",
+ "babel-runtime": "^6.26.0"
+ }
+ },
+ "babel-plugin-transform-react-remove-prop-types": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
+ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
+ },
+ "babel-preset-current-node-syntax": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+ "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+ "requires": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.8.3",
+ "@babel/plugin-syntax-import-meta": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-top-level-await": "^7.8.3"
+ }
+ },
+ "babel-preset-jest": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz",
+ "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==",
+ "requires": {
+ "babel-plugin-jest-hoist": "^26.6.2",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ }
+ },
+ "babel-preset-react-app": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz",
+ "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==",
+ "requires": {
+ "@babel/core": "7.12.3",
+ "@babel/plugin-proposal-class-properties": "7.12.1",
+ "@babel/plugin-proposal-decorators": "7.12.1",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1",
+ "@babel/plugin-proposal-numeric-separator": "7.12.1",
+ "@babel/plugin-proposal-optional-chaining": "7.12.1",
+ "@babel/plugin-transform-flow-strip-types": "7.12.1",
+ "@babel/plugin-transform-react-display-name": "7.12.1",
+ "@babel/plugin-transform-runtime": "7.12.1",
+ "@babel/preset-env": "7.12.1",
+ "@babel/preset-react": "7.12.1",
+ "@babel/preset-typescript": "7.12.1",
+ "@babel/runtime": "7.12.1",
+ "babel-plugin-macros": "2.8.0",
+ "babel-plugin-transform-react-remove-prop-types": "0.4.24"
+ },
+ "dependencies": {
+ "@babel/plugin-proposal-class-properties": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz",
+ "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz",
+ "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+ }
+ },
+ "@babel/plugin-proposal-numeric-separator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz",
+ "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-optional-chaining": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz",
+ "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+ }
+ },
+ "@babel/plugin-transform-react-display-name": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz",
+ "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/preset-env": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz",
+ "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==",
+ "requires": {
+ "@babel/compat-data": "^7.12.1",
+ "@babel/helper-compilation-targets": "^7.12.1",
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-validator-option": "^7.12.1",
+ "@babel/plugin-proposal-async-generator-functions": "^7.12.1",
+ "@babel/plugin-proposal-class-properties": "^7.12.1",
+ "@babel/plugin-proposal-dynamic-import": "^7.12.1",
+ "@babel/plugin-proposal-export-namespace-from": "^7.12.1",
+ "@babel/plugin-proposal-json-strings": "^7.12.1",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1",
+ "@babel/plugin-proposal-numeric-separator": "^7.12.1",
+ "@babel/plugin-proposal-object-rest-spread": "^7.12.1",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.12.1",
+ "@babel/plugin-proposal-optional-chaining": "^7.12.1",
+ "@babel/plugin-proposal-private-methods": "^7.12.1",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.12.1",
+ "@babel/plugin-syntax-async-generators": "^7.8.0",
+ "@babel/plugin-syntax-class-properties": "^7.12.1",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.0",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0",
+ "@babel/plugin-syntax-top-level-await": "^7.12.1",
+ "@babel/plugin-transform-arrow-functions": "^7.12.1",
+ "@babel/plugin-transform-async-to-generator": "^7.12.1",
+ "@babel/plugin-transform-block-scoped-functions": "^7.12.1",
+ "@babel/plugin-transform-block-scoping": "^7.12.1",
+ "@babel/plugin-transform-classes": "^7.12.1",
+ "@babel/plugin-transform-computed-properties": "^7.12.1",
+ "@babel/plugin-transform-destructuring": "^7.12.1",
+ "@babel/plugin-transform-dotall-regex": "^7.12.1",
+ "@babel/plugin-transform-duplicate-keys": "^7.12.1",
+ "@babel/plugin-transform-exponentiation-operator": "^7.12.1",
+ "@babel/plugin-transform-for-of": "^7.12.1",
+ "@babel/plugin-transform-function-name": "^7.12.1",
+ "@babel/plugin-transform-literals": "^7.12.1",
+ "@babel/plugin-transform-member-expression-literals": "^7.12.1",
+ "@babel/plugin-transform-modules-amd": "^7.12.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.12.1",
+ "@babel/plugin-transform-modules-systemjs": "^7.12.1",
+ "@babel/plugin-transform-modules-umd": "^7.12.1",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1",
+ "@babel/plugin-transform-new-target": "^7.12.1",
+ "@babel/plugin-transform-object-super": "^7.12.1",
+ "@babel/plugin-transform-parameters": "^7.12.1",
+ "@babel/plugin-transform-property-literals": "^7.12.1",
+ "@babel/plugin-transform-regenerator": "^7.12.1",
+ "@babel/plugin-transform-reserved-words": "^7.12.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.12.1",
+ "@babel/plugin-transform-spread": "^7.12.1",
+ "@babel/plugin-transform-sticky-regex": "^7.12.1",
+ "@babel/plugin-transform-template-literals": "^7.12.1",
+ "@babel/plugin-transform-typeof-symbol": "^7.12.1",
+ "@babel/plugin-transform-unicode-escapes": "^7.12.1",
+ "@babel/plugin-transform-unicode-regex": "^7.12.1",
+ "@babel/preset-modules": "^0.1.3",
+ "@babel/types": "^7.12.1",
+ "core-js-compat": "^3.6.2",
+ "semver": "^5.5.0"
+ }
+ },
+ "@babel/preset-react": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz",
+ "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-transform-react-display-name": "^7.12.1",
+ "@babel/plugin-transform-react-jsx": "^7.12.1",
+ "@babel/plugin-transform-react-jsx-development": "^7.12.1",
+ "@babel/plugin-transform-react-jsx-self": "^7.12.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.12.1",
+ "@babel/plugin-transform-react-pure-annotations": "^7.12.1"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz",
+ "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ }
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "bfj": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz",
+ "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==",
+ "requires": {
+ "bluebird": "^3.5.5",
+ "check-types": "^11.1.1",
+ "hoopy": "^0.1.4",
+ "tryer": "^1.0.1"
+ }
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "optional": true
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "bn.js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
+ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "requires": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ }
+ }
+ },
+ "bonjour": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+ "requires": {
+ "array-flatten": "^2.1.0",
+ "deep-equal": "^1.0.1",
+ "dns-equal": "^1.0.0",
+ "dns-txt": "^2.0.2",
+ "multicast-dns": "^6.0.1",
+ "multicast-dns-service-types": "^1.1.0"
+ }
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+ },
+ "bootstrap": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.3.tgz",
+ "integrity": "sha512-rDFIzgXcof0jDyjNosjv4Sno77X4KuPeFxG2XZZv1/Kc8DRVGVADdoQyyOVDwPqL36DDmtCQbrpMCqvpPLJQ0w=="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+ },
+ "browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "requires": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "requires": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "requires": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "requires": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "requires": {
+ "pako": "~1.0.5"
+ }
+ },
+ "browserslist": {
+ "version": "4.16.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz",
+ "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
+ "requires": {
+ "caniuse-lite": "^1.0.30001181",
+ "colorette": "^1.2.1",
+ "electron-to-chromium": "^1.3.649",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.70"
+ }
+ },
+ "bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "requires": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "buffer": {
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+ "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
+ },
+ "buffer-indexof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+ },
+ "builtin-modules": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
+ "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA=="
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+ },
+ "cacache": {
+ "version": "15.0.6",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz",
+ "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==",
+ "requires": {
+ "@npmcli/move-file": "^1.0.1",
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "glob": "^7.1.4",
+ "infer-owner": "^1.0.4",
+ "lru-cache": "^6.0.0",
+ "minipass": "^3.1.1",
+ "minipass-collect": "^1.0.2",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.2",
+ "mkdirp": "^1.0.3",
+ "p-map": "^4.0.0",
+ "promise-inflight": "^1.0.1",
+ "rimraf": "^3.0.2",
+ "ssri": "^8.0.1",
+ "tar": "^6.0.2",
+ "unique-filename": "^1.1.1"
+ },
+ "dependencies": {
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+ }
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "caller-callsite": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+ "requires": {
+ "callsites": "^2.0.0"
+ },
+ "dependencies": {
+ "callsites": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
+ }
+ }
+ },
+ "caller-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+ "requires": {
+ "caller-callsite": "^2.0.0"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+ },
+ "camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "requires": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A=="
+ }
+ }
+ },
+ "camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg=="
+ },
+ "caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "requires": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001204",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz",
+ "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ=="
+ },
+ "capture-exit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
+ "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
+ "requires": {
+ "rsvp": "^4.8.4"
+ }
+ },
+ "case-sensitive-paths-webpack-plugin": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz",
+ "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ=="
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="
+ },
+ "check-types": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz",
+ "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ=="
+ },
+ "chokidar": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+ "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+ "optional": true,
+ "requires": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.1",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ }
+ },
+ "chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
+ },
+ "chrome-trace-event": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "cjs-module-lexer": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz",
+ "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw=="
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "classnames": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
+ "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
+ },
+ "clean-css": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
+ "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
+ "requires": {
+ "source-map": "~0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ },
+ "coa": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+ "requires": {
+ "@types/q": "^1.5.1",
+ "chalk": "^2.4.1",
+ "q": "^1.1.2"
+ }
+ },
+ "collect-v8-coverage": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg=="
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz",
+ "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==",
+ "requires": {
+ "color-convert": "^1.9.1",
+ "color-string": "^1.5.4"
+ }
+ },
+ "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==",
+ "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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "color-string": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz",
+ "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==",
+ "requires": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
+ },
+ "common-tags": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
+ "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw=="
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "compose-function": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz",
+ "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=",
+ "requires": {
+ "arity-n": "^1.0.4"
+ }
+ },
+ "compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "requires": {
+ "mime-db": ">= 1.43.0 < 2"
+ }
+ },
+ "compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "requires": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "confusing-browser-globals": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz",
+ "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA=="
+ },
+ "connect-history-api-fallback": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg=="
+ },
+ "console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+ },
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
+ },
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "copy-concurrently": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+ "requires": {
+ "aproba": "^1.1.1",
+ "fs-write-stream-atomic": "^1.0.8",
+ "iferr": "^0.1.5",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.0"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ },
+ "core-js": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz",
+ "integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg=="
+ },
+ "core-js-compat": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz",
+ "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==",
+ "requires": {
+ "browserslist": "^4.16.3",
+ "semver": "7.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
+ }
+ }
+ },
+ "core-js-pure": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.9.1.tgz",
+ "integrity": "sha512-laz3Zx0avrw9a4QEIdmIblnVuJz8W51leY9iLThatCsFawWxC3sE4guASC78JbCin+DkwMpCdp1AVAuzL/GN7A=="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "cosmiconfig": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+ "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ }
+ },
+ "create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "requires": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "requires": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "requires": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
+ },
+ "css": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
+ "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "source-map": "^0.6.1",
+ "source-map-resolve": "^0.5.2",
+ "urix": "^0.1.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "css-blank-pseudo": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
+ "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
+ "requires": {
+ "postcss": "^7.0.5"
+ }
+ },
+ "css-color-names": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+ "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
+ },
+ "css-declaration-sorter": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+ "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+ "requires": {
+ "postcss": "^7.0.1",
+ "timsort": "^0.3.0"
+ }
+ },
+ "css-has-pseudo": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
+ "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
+ "requires": {
+ "postcss": "^7.0.6",
+ "postcss-selector-parser": "^5.0.0-rc.4"
+ },
+ "dependencies": {
+ "cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
+ },
+ "postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "requires": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "css-loader": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz",
+ "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==",
+ "requires": {
+ "camelcase": "^6.0.0",
+ "cssesc": "^3.0.0",
+ "icss-utils": "^4.1.1",
+ "loader-utils": "^2.0.0",
+ "postcss": "^7.0.32",
+ "postcss-modules-extract-imports": "^2.0.0",
+ "postcss-modules-local-by-default": "^3.0.3",
+ "postcss-modules-scope": "^2.2.0",
+ "postcss-modules-values": "^3.0.0",
+ "postcss-value-parser": "^4.1.0",
+ "schema-utils": "^2.7.1",
+ "semver": "^7.3.2"
+ }
+ },
+ "css-prefers-color-scheme": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
+ "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
+ "requires": {
+ "postcss": "^7.0.5"
+ }
+ },
+ "css-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "css-select-base-adapter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
+ },
+ "css-tree": {
+ "version": "1.0.0-alpha.37",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+ "requires": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "css-what": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ=="
+ },
+ "css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
+ },
+ "cssdb": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz",
+ "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ=="
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+ },
+ "cssnano": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
+ "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
+ "requires": {
+ "cosmiconfig": "^5.0.0",
+ "cssnano-preset-default": "^4.0.7",
+ "is-resolvable": "^1.0.0",
+ "postcss": "^7.0.0"
+ },
+ "dependencies": {
+ "cosmiconfig": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "requires": {
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.13.1",
+ "parse-json": "^4.0.0"
+ }
+ },
+ "import-fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+ "requires": {
+ "caller-path": "^2.0.0",
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
+ }
+ }
+ },
+ "cssnano-preset-default": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
+ "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
+ "requires": {
+ "css-declaration-sorter": "^4.0.1",
+ "cssnano-util-raw-cache": "^4.0.1",
+ "postcss": "^7.0.0",
+ "postcss-calc": "^7.0.1",
+ "postcss-colormin": "^4.0.3",
+ "postcss-convert-values": "^4.0.1",
+ "postcss-discard-comments": "^4.0.2",
+ "postcss-discard-duplicates": "^4.0.2",
+ "postcss-discard-empty": "^4.0.1",
+ "postcss-discard-overridden": "^4.0.1",
+ "postcss-merge-longhand": "^4.0.11",
+ "postcss-merge-rules": "^4.0.3",
+ "postcss-minify-font-values": "^4.0.2",
+ "postcss-minify-gradients": "^4.0.2",
+ "postcss-minify-params": "^4.0.2",
+ "postcss-minify-selectors": "^4.0.2",
+ "postcss-normalize-charset": "^4.0.1",
+ "postcss-normalize-display-values": "^4.0.2",
+ "postcss-normalize-positions": "^4.0.2",
+ "postcss-normalize-repeat-style": "^4.0.2",
+ "postcss-normalize-string": "^4.0.2",
+ "postcss-normalize-timing-functions": "^4.0.2",
+ "postcss-normalize-unicode": "^4.0.1",
+ "postcss-normalize-url": "^4.0.1",
+ "postcss-normalize-whitespace": "^4.0.2",
+ "postcss-ordered-values": "^4.1.2",
+ "postcss-reduce-initial": "^4.0.3",
+ "postcss-reduce-transforms": "^4.0.2",
+ "postcss-svgo": "^4.0.2",
+ "postcss-unique-selectors": "^4.0.1"
+ }
+ },
+ "cssnano-util-get-arguments": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
+ "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8="
+ },
+ "cssnano-util-get-match": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
+ "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0="
+ },
+ "cssnano-util-raw-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+ "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "cssnano-util-same-parent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q=="
+ },
+ "csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "requires": {
+ "css-tree": "^1.1.2"
+ },
+ "dependencies": {
+ "css-tree": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz",
+ "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==",
+ "requires": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+ },
+ "cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "requires": {
+ "cssom": "~0.3.6"
+ },
+ "dependencies": {
+ "cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+ }
+ }
+ },
+ "csstype": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz",
+ "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g=="
+ },
+ "cyclist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
+ },
+ "d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "requires": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "damerau-levenshtein": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
+ "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug=="
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "data-urls": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "requires": {
+ "abab": "^2.0.3",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0"
+ }
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "decimal.js": {
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz",
+ "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw=="
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw="
+ },
+ "deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+ "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+ "requires": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+ },
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+ },
+ "default-gateway": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
+ "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+ "requires": {
+ "execa": "^1.0.0",
+ "ip-regex": "^2.1.0"
+ }
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "del": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+ "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+ "requires": {
+ "@types/glob": "^7.1.1",
+ "globby": "^6.1.0",
+ "is-path-cwd": "^2.0.0",
+ "is-path-in-cwd": "^2.0.0",
+ "p-map": "^2.0.0",
+ "pify": "^4.0.1",
+ "rimraf": "^2.6.3"
+ },
+ "dependencies": {
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "requires": {
+ "array-uniq": "^1.0.1"
+ }
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "requires": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ }
+ }
+ },
+ "p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ },
+ "des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ },
+ "detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="
+ },
+ "detect-node": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz",
+ "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw=="
+ },
+ "detect-port-alt": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+ "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+ "requires": {
+ "address": "^1.0.1",
+ "debug": "^2.6.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "diff-sequences": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
+ "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q=="
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "dns-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
+ },
+ "dns-packet": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+ "requires": {
+ "ip": "^1.1.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "dns-txt": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+ "requires": {
+ "buffer-indexof": "^1.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dom-accessibility-api": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.4.tgz",
+ "integrity": "sha512-TvrjBckDy2c6v6RLxPv5QXOnU+SmF9nBII5621Ve5fu6Z/BDrENurBEvlC1f44lKEUVqOpK4w9E5Idc5/EgkLQ=="
+ },
+ "dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "requires": {
+ "utila": "~0.4"
+ }
+ },
+ "dom-helpers": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
+ "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
+ "requires": {
+ "@babel/runtime": "^7.1.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
+ "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w=="
+ }
+ }
+ },
+ "domain-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
+ },
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+ },
+ "domexception": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "requires": {
+ "webidl-conversions": "^5.0.0"
+ },
+ "dependencies": {
+ "webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
+ }
+ }
+ },
+ "domhandler": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "requires": {
+ "domelementtype": "1"
+ }
+ },
+ "domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "requires": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A=="
+ }
+ }
+ },
+ "dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "requires": {
+ "is-obj": "^2.0.0"
+ }
+ },
+ "dotenv": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
+ "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
+ },
+ "dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
+ },
+ "duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
+ },
+ "duplexify": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+ "requires": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "ejs": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
+ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA=="
+ },
+ "electron-to-chromium": {
+ "version": "1.3.701",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz",
+ "integrity": "sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw=="
+ },
+ "elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "requires": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "emittery": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz",
+ "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ=="
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "enhanced-resolve": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+ "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.5.0",
+ "tapable": "^1.0.0"
+ },
+ "dependencies": {
+ "memory-fs": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+ "requires": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
+ },
+ "errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "requires": {
+ "prr": "~1.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "error-stack-parser": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz",
+ "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==",
+ "requires": {
+ "stackframe": "^1.1.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz",
+ "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.2",
+ "is-callable": "^1.2.3",
+ "is-negative-zero": "^2.0.1",
+ "is-regex": "^1.1.2",
+ "is-string": "^1.0.5",
+ "object-inspect": "^1.9.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.2",
+ "string.prototype.trimend": "^1.0.4",
+ "string.prototype.trimstart": "^1.0.4",
+ "unbox-primitive": "^1.0.0"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.53",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+ "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
+ "requires": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.3",
+ "next-tick": "~1.0.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "requires": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "escodegen": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+ "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ }
+ }
+ },
+ "eslint": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.23.0.tgz",
+ "integrity": "sha512-kqvNVbdkjzpFy0XOszNwjkKzZ+6TcwCQ/h+ozlcIWwaimBBuhlQ4nN6kbiM2L+OjDcznkTJxzYfRFH92sx4a0Q==",
+ "requires": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.21",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.4",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "globals": {
+ "version": "13.7.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz",
+ "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==",
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-react-app": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz",
+ "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==",
+ "requires": {
+ "confusing-browser-globals": "^1.0.10"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+ "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
+ "requires": {
+ "debug": "^2.6.9",
+ "resolve": "^1.13.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+ "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+ "requires": {
+ "debug": "^2.6.9",
+ "pkg-dir": "^2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ },
+ "pkg-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+ "requires": {
+ "find-up": "^2.1.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-flowtype": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.4.0.tgz",
+ "integrity": "sha512-O0s0iTT5UxYuoOpHMLSIO2qZMyvrb9shhk1EM5INNGtJ2CffrfUmsnh6TVsnoT41fkXIEndP630WNovhoO87xQ==",
+ "requires": {
+ "lodash": "^4.17.15",
+ "string-natural-compare": "^3.0.1"
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.22.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
+ "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
+ "requires": {
+ "array-includes": "^3.1.1",
+ "array.prototype.flat": "^1.2.3",
+ "contains-path": "^0.1.0",
+ "debug": "^2.6.9",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "^0.3.4",
+ "eslint-module-utils": "^2.6.0",
+ "has": "^1.0.3",
+ "minimatch": "^3.0.4",
+ "object.values": "^1.1.1",
+ "read-pkg-up": "^2.0.0",
+ "resolve": "^1.17.0",
+ "tsconfig-paths": "^3.9.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "requires": {
+ "esutils": "^2.0.2",
+ "isarray": "^1.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "eslint-plugin-jest": {
+ "version": "24.3.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.2.tgz",
+ "integrity": "sha512-cicWDr+RvTAOKS3Q/k03+Z3odt3VCiWamNUHWd6QWbVQWcYJyYgUTu8x0mx9GfeDEimawU5kQC+nQ3MFxIM6bw==",
+ "requires": {
+ "@typescript-eslint/experimental-utils": "^4.0.1"
+ }
+ },
+ "eslint-plugin-jsx-a11y": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz",
+ "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==",
+ "requires": {
+ "@babel/runtime": "^7.11.2",
+ "aria-query": "^4.2.2",
+ "array-includes": "^3.1.1",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^4.0.2",
+ "axobject-query": "^2.2.0",
+ "damerau-levenshtein": "^1.0.6",
+ "emoji-regex": "^9.0.0",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^3.1.0",
+ "language-tags": "^1.0.5"
+ },
+ "dependencies": {
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+ }
+ }
+ },
+ "eslint-plugin-react": {
+ "version": "7.23.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.23.1.tgz",
+ "integrity": "sha512-MvFGhZjI8Z4HusajmSw0ougGrq3Gs4vT/0WgwksZgf5RrLrRa2oYAw56okU4tZJl8+j7IYNuTM+2RnFEuTSdRQ==",
+ "requires": {
+ "array-includes": "^3.1.3",
+ "array.prototype.flatmap": "^1.2.4",
+ "doctrine": "^2.1.0",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.0.4",
+ "object.entries": "^1.1.3",
+ "object.fromentries": "^2.0.4",
+ "object.values": "^1.1.3",
+ "prop-types": "^15.7.2",
+ "resolve": "^2.0.0-next.3",
+ "string.prototype.matchall": "^4.0.4"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "resolve": {
+ "version": "2.0.0-next.3",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz",
+ "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==",
+ "requires": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ }
+ }
+ }
+ },
+ "eslint-plugin-react-hooks": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz",
+ "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ=="
+ },
+ "eslint-plugin-testing-library": {
+ "version": "3.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz",
+ "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==",
+ "requires": {
+ "@typescript-eslint/experimental-utils": "^3.10.1"
+ },
+ "dependencies": {
+ "@typescript-eslint/experimental-utils": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz",
+ "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==",
+ "requires": {
+ "@types/json-schema": "^7.0.3",
+ "@typescript-eslint/types": "3.10.1",
+ "@typescript-eslint/typescript-estree": "3.10.1",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^2.0.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz",
+ "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ=="
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz",
+ "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==",
+ "requires": {
+ "@typescript-eslint/types": "3.10.1",
+ "@typescript-eslint/visitor-keys": "3.10.1",
+ "debug": "^4.1.1",
+ "glob": "^7.1.6",
+ "is-glob": "^4.0.1",
+ "lodash": "^4.17.15",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz",
+ "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==",
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ=="
+ },
+ "eslint-webpack-plugin": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.3.tgz",
+ "integrity": "sha512-LewNevZf9ghDCxCGT6QltNWVi8KIYWc4LKcin8K9Azh1hypG7YAmobUDIU67fAPa+eMjRnU4rjEkLbYI1w5/UA==",
+ "requires": {
+ "@types/eslint": "^7.2.6",
+ "arrify": "^2.0.1",
+ "jest-worker": "^26.6.2",
+ "micromatch": "^4.0.2",
+ "schema-utils": "^3.0.0"
+ },
+ "dependencies": {
+ "schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "requires": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ }
+ }
+ },
+ "espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+ },
+ "estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ },
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+ },
+ "events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
+ },
+ "eventsource": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz",
+ "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==",
+ "requires": {
+ "original": "^1.0.0"
+ }
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "requires": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "exec-sh": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz",
+ "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w=="
+ },
+ "execa": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "requires": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
+ "exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "expect": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz",
+ "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "ansi-styles": "^4.0.0",
+ "jest-get-type": "^26.3.0",
+ "jest-matcher-utils": "^26.6.2",
+ "jest-message-util": "^26.6.2",
+ "jest-regex-util": "^26.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ }
+ }
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "requires": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ }
+ }
+ },
+ "ext": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
+ "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
+ "requires": {
+ "type": "^2.0.0"
+ },
+ "dependencies": {
+ "type": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
+ "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw=="
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "fast-glob": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
+ "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ },
+ "fastq": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz",
+ "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==",
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "faye-websocket": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+ "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+ "requires": {
+ "websocket-driver": ">=0.5.1"
+ }
+ },
+ "fb-watchman": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
+ "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+ "requires": {
+ "bser": "2.1.1"
+ }
+ },
+ "figgy-pudding": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "file-loader": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz",
+ "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==",
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "dependencies": {
+ "schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "requires": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ }
+ }
+ },
+ "filesize": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz",
+ "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg=="
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA=="
+ },
+ "flatten": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
+ "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg=="
+ },
+ "flush-write-stream": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.3.6"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "follow-redirects": {
+ "version": "1.13.3",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
+ "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA=="
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+ },
+ "fork-ts-checker-webpack-plugin": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz",
+ "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==",
+ "requires": {
+ "@babel/code-frame": "^7.5.5",
+ "chalk": "^2.4.1",
+ "micromatch": "^3.1.10",
+ "minimatch": "^3.0.4",
+ "semver": "^5.6.0",
+ "tapable": "^1.0.0",
+ "worker-rpc": "^0.1.0"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ }
+ }
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ },
+ "from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "fs-write-stream-atomic": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "iferr": "^0.1.5",
+ "imurmurhash": "^0.1.4",
+ "readable-stream": "1 || 2"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+ },
+ "get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
+ },
+ "get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "requires": {
+ "global-prefix": "^3.0.0"
+ }
+ },
+ "global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "requires": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+ },
+ "globby": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
+ "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
+ "slash": "^3.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
+ },
+ "growly": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+ "optional": true
+ },
+ "gzip-size": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
+ "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
+ "requires": {
+ "duplexer": "^0.1.1",
+ "pify": "^4.0.1"
+ }
+ },
+ "handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+ },
+ "har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "requires": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "harmony-reflect": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz",
+ "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA=="
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-bigints": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "requires": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
+ }
+ },
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
+ },
+ "hex-color-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
+ },
+ "history": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
+ "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
+ "requires": {
+ "@babel/runtime": "^7.1.2",
+ "loose-envify": "^1.2.0",
+ "resolve-pathname": "^3.0.0",
+ "tiny-invariant": "^1.0.2",
+ "tiny-warning": "^1.0.0",
+ "value-equal": "^1.0.1"
+ }
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "requires": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "requires": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "hoopy": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ=="
+ },
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
+ },
+ "hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "requires": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "hsl-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
+ "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4="
+ },
+ "hsla-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
+ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg="
+ },
+ "html-comment-regex": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
+ "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ=="
+ },
+ "html-encoding-sniffer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "requires": {
+ "whatwg-encoding": "^1.0.5"
+ }
+ },
+ "html-entities": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz",
+ "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA=="
+ },
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
+ },
+ "html-minifier-terser": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+ "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+ "requires": {
+ "camel-case": "^4.1.1",
+ "clean-css": "^4.2.3",
+ "commander": "^4.1.1",
+ "he": "^1.2.0",
+ "param-case": "^3.0.3",
+ "relateurl": "^0.2.7",
+ "terser": "^4.6.3"
+ }
+ },
+ "html-webpack-plugin": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz",
+ "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==",
+ "requires": {
+ "@types/html-minifier-terser": "^5.0.0",
+ "@types/tapable": "^1.0.5",
+ "@types/webpack": "^4.41.8",
+ "html-minifier-terser": "^5.0.1",
+ "loader-utils": "^1.2.3",
+ "lodash": "^4.17.15",
+ "pretty-error": "^2.1.1",
+ "tapable": "^1.1.3",
+ "util.promisify": "1.0.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "util.promisify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+ "requires": {
+ "define-properties": "^1.1.2",
+ "object.getownpropertydescriptors": "^2.0.3"
+ }
+ }
+ }
+ },
+ "htmlparser2": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "requires": {
+ "domelementtype": "^1.3.1",
+ "domhandler": "^2.3.0",
+ "domutils": "^1.5.1",
+ "entities": "^1.1.1",
+ "inherits": "^2.0.1",
+ "readable-stream": "^3.1.1"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+ }
+ }
+ },
+ "http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
+ },
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ }
+ }
+ },
+ "http-parser-js": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
+ "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg=="
+ },
+ "http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "requires": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+ "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+ "requires": {
+ "http-proxy": "^1.17.0",
+ "is-glob": "^4.0.0",
+ "lodash": "^4.17.11",
+ "micromatch": "^3.1.10"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
+ },
+ "human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "icss-utils": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
+ "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
+ "requires": {
+ "postcss": "^7.0.14"
+ }
+ },
+ "identity-obj-proxy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
+ "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=",
+ "requires": {
+ "harmony-reflect": "^1.4.6"
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "iferr": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
+ },
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
+ },
+ "immer": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz",
+ "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA=="
+ },
+ "import-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+ "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
+ "requires": {
+ "import-from": "^2.1.0"
+ }
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "import-from": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+ "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
+ "requires": {
+ "resolve-from": "^3.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
+ }
+ }
+ },
+ "import-local": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+ "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+ "requires": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "dependencies": {
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ }
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ },
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+ },
+ "indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+ },
+ "infer-owner": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+ "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+ },
+ "internal-ip": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
+ "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+ "requires": {
+ "default-gateway": "^4.2.0",
+ "ipaddr.js": "^1.9.0"
+ }
+ },
+ "internal-slot": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+ "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+ "requires": {
+ "get-intrinsic": "^1.1.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "ip": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
+ },
+ "ip-regex": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ },
+ "is-absolute-url": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+ "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY="
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-arguments": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+ "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+ "requires": {
+ "call-bind": "^1.0.0"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "is-bigint": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz",
+ "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg=="
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "optional": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-boolean-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz",
+ "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==",
+ "requires": {
+ "call-bind": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-callable": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+ "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ=="
+ },
+ "is-ci": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+ "requires": {
+ "ci-info": "^2.0.0"
+ }
+ },
+ "is-color-stop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
+ "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
+ "requires": {
+ "css-color-names": "^0.0.4",
+ "hex-color-regex": "^1.1.0",
+ "hsl-regex": "^1.0.0",
+ "hsla-regex": "^1.0.0",
+ "rgb-regex": "^1.0.1",
+ "rgba-regex": "^1.0.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+ "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "is-directory": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
+ },
+ "is-docker": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
+ "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw=="
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ },
+ "is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE="
+ },
+ "is-negative-zero": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
+ "is-number-object": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
+ "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw=="
+ },
+ "is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
+ },
+ "is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
+ },
+ "is-path-in-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+ "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+ "requires": {
+ "is-path-inside": "^2.1.0"
+ }
+ },
+ "is-path-inside": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+ "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+ "requires": {
+ "path-is-inside": "^1.0.2"
+ }
+ },
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-potential-custom-element-name": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
+ "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c="
+ },
+ "is-regex": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
+ "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
+ },
+ "is-root": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
+ "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg=="
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "is-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
+ },
+ "is-svg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
+ "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
+ "requires": {
+ "html-comment-regex": "^1.1.0"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "requires": {
+ "is-docker": "^2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "istanbul-lib-coverage": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+ "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg=="
+ },
+ "istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "requires": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
+ "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+ "requires": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+ "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
+ "requires": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ }
+ },
+ "jest": {
+ "version": "26.6.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz",
+ "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==",
+ "requires": {
+ "@jest/core": "^26.6.0",
+ "import-local": "^3.0.2",
+ "jest-cli": "^26.6.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-cli": {
+ "version": "26.6.3",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz",
+ "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==",
+ "requires": {
+ "@jest/core": "^26.6.3",
+ "@jest/test-result": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.4",
+ "import-local": "^3.0.2",
+ "is-ci": "^2.0.0",
+ "jest-config": "^26.6.3",
+ "jest-util": "^26.6.2",
+ "jest-validate": "^26.6.2",
+ "prompts": "^2.0.1",
+ "yargs": "^15.4.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-changed-files": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz",
+ "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "execa": "^4.0.0",
+ "throat": "^5.0.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "jest-circus": {
+ "version": "26.6.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz",
+ "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==",
+ "requires": {
+ "@babel/traverse": "^7.1.0",
+ "@jest/environment": "^26.6.0",
+ "@jest/test-result": "^26.6.0",
+ "@jest/types": "^26.6.0",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^0.7.0",
+ "expect": "^26.6.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^26.6.0",
+ "jest-matcher-utils": "^26.6.0",
+ "jest-message-util": "^26.6.0",
+ "jest-runner": "^26.6.0",
+ "jest-runtime": "^26.6.0",
+ "jest-snapshot": "^26.6.0",
+ "jest-util": "^26.6.0",
+ "pretty-format": "^26.6.0",
+ "stack-utils": "^2.0.2",
+ "throat": "^5.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-config": {
+ "version": "26.6.3",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz",
+ "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==",
+ "requires": {
+ "@babel/core": "^7.1.0",
+ "@jest/test-sequencer": "^26.6.3",
+ "@jest/types": "^26.6.2",
+ "babel-jest": "^26.6.3",
+ "chalk": "^4.0.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.2.4",
+ "jest-environment-jsdom": "^26.6.2",
+ "jest-environment-node": "^26.6.2",
+ "jest-get-type": "^26.3.0",
+ "jest-jasmine2": "^26.6.3",
+ "jest-regex-util": "^26.0.0",
+ "jest-resolve": "^26.6.2",
+ "jest-util": "^26.6.2",
+ "jest-validate": "^26.6.2",
+ "micromatch": "^4.0.2",
+ "pretty-format": "^26.6.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-resolve": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz",
+ "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^26.6.2",
+ "read-pkg-up": "^7.0.1",
+ "resolve": "^1.18.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-diff": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
+ "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
+ "requires": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^26.6.2",
+ "jest-get-type": "^26.3.0",
+ "pretty-format": "^26.6.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-docblock": {
+ "version": "26.0.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz",
+ "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==",
+ "requires": {
+ "detect-newline": "^3.0.0"
+ }
+ },
+ "jest-each": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz",
+ "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^26.3.0",
+ "jest-util": "^26.6.2",
+ "pretty-format": "^26.6.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-environment-jsdom": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz",
+ "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==",
+ "requires": {
+ "@jest/environment": "^26.6.2",
+ "@jest/fake-timers": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/node": "*",
+ "jest-mock": "^26.6.2",
+ "jest-util": "^26.6.2",
+ "jsdom": "^16.4.0"
+ }
+ },
+ "jest-environment-node": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz",
+ "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==",
+ "requires": {
+ "@jest/environment": "^26.6.2",
+ "@jest/fake-timers": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/node": "*",
+ "jest-mock": "^26.6.2",
+ "jest-util": "^26.6.2"
+ }
+ },
+ "jest-get-type": {
+ "version": "26.3.0",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+ "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig=="
+ },
+ "jest-haste-map": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz",
+ "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "@types/graceful-fs": "^4.1.2",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "fsevents": "^2.1.2",
+ "graceful-fs": "^4.2.4",
+ "jest-regex-util": "^26.0.0",
+ "jest-serializer": "^26.6.2",
+ "jest-util": "^26.6.2",
+ "jest-worker": "^26.6.2",
+ "micromatch": "^4.0.2",
+ "sane": "^4.0.3",
+ "walker": "^1.0.7"
+ }
+ },
+ "jest-jasmine2": {
+ "version": "26.6.3",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz",
+ "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==",
+ "requires": {
+ "@babel/traverse": "^7.1.0",
+ "@jest/environment": "^26.6.2",
+ "@jest/source-map": "^26.6.2",
+ "@jest/test-result": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "expect": "^26.6.2",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^26.6.2",
+ "jest-matcher-utils": "^26.6.2",
+ "jest-message-util": "^26.6.2",
+ "jest-runtime": "^26.6.3",
+ "jest-snapshot": "^26.6.2",
+ "jest-util": "^26.6.2",
+ "pretty-format": "^26.6.2",
+ "throat": "^5.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-leak-detector": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz",
+ "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==",
+ "requires": {
+ "jest-get-type": "^26.3.0",
+ "pretty-format": "^26.6.2"
+ }
+ },
+ "jest-matcher-utils": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz",
+ "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==",
+ "requires": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^26.6.2",
+ "jest-get-type": "^26.3.0",
+ "pretty-format": "^26.6.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-message-util": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz",
+ "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==",
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@jest/types": "^26.6.2",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "micromatch": "^4.0.2",
+ "pretty-format": "^26.6.2",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-mock": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz",
+ "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "@types/node": "*"
+ }
+ },
+ "jest-pnp-resolver": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
+ "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w=="
+ },
+ "jest-regex-util": {
+ "version": "26.0.0",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz",
+ "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A=="
+ },
+ "jest-resolve": {
+ "version": "26.6.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz",
+ "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==",
+ "requires": {
+ "@jest/types": "^26.6.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^26.6.0",
+ "read-pkg-up": "^7.0.1",
+ "resolve": "^1.17.0",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-resolve-dependencies": {
+ "version": "26.6.3",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz",
+ "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "jest-regex-util": "^26.0.0",
+ "jest-snapshot": "^26.6.2"
+ }
+ },
+ "jest-runner": {
+ "version": "26.6.3",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz",
+ "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==",
+ "requires": {
+ "@jest/console": "^26.6.2",
+ "@jest/environment": "^26.6.2",
+ "@jest/test-result": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.7.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.4",
+ "jest-config": "^26.6.3",
+ "jest-docblock": "^26.0.0",
+ "jest-haste-map": "^26.6.2",
+ "jest-leak-detector": "^26.6.2",
+ "jest-message-util": "^26.6.2",
+ "jest-resolve": "^26.6.2",
+ "jest-runtime": "^26.6.3",
+ "jest-util": "^26.6.2",
+ "jest-worker": "^26.6.2",
+ "source-map-support": "^0.5.6",
+ "throat": "^5.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-resolve": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz",
+ "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^26.6.2",
+ "read-pkg-up": "^7.0.1",
+ "resolve": "^1.18.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-runtime": {
+ "version": "26.6.3",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz",
+ "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==",
+ "requires": {
+ "@jest/console": "^26.6.2",
+ "@jest/environment": "^26.6.2",
+ "@jest/fake-timers": "^26.6.2",
+ "@jest/globals": "^26.6.2",
+ "@jest/source-map": "^26.6.2",
+ "@jest/test-result": "^26.6.2",
+ "@jest/transform": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/yargs": "^15.0.0",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^0.6.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.4",
+ "jest-config": "^26.6.3",
+ "jest-haste-map": "^26.6.2",
+ "jest-message-util": "^26.6.2",
+ "jest-mock": "^26.6.2",
+ "jest-regex-util": "^26.0.0",
+ "jest-resolve": "^26.6.2",
+ "jest-snapshot": "^26.6.2",
+ "jest-util": "^26.6.2",
+ "jest-validate": "^26.6.2",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0",
+ "yargs": "^15.4.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-resolve": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz",
+ "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^26.6.2",
+ "read-pkg-up": "^7.0.1",
+ "resolve": "^1.18.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-serializer": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz",
+ "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==",
+ "requires": {
+ "@types/node": "*",
+ "graceful-fs": "^4.2.4"
+ }
+ },
+ "jest-snapshot": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz",
+ "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==",
+ "requires": {
+ "@babel/types": "^7.0.0",
+ "@jest/types": "^26.6.2",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/prettier": "^2.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^26.6.2",
+ "graceful-fs": "^4.2.4",
+ "jest-diff": "^26.6.2",
+ "jest-get-type": "^26.3.0",
+ "jest-haste-map": "^26.6.2",
+ "jest-matcher-utils": "^26.6.2",
+ "jest-message-util": "^26.6.2",
+ "jest-resolve": "^26.6.2",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^26.6.2",
+ "semver": "^7.3.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "jest-resolve": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz",
+ "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^26.6.2",
+ "read-pkg-up": "^7.0.1",
+ "resolve": "^1.18.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-util": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz",
+ "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.4",
+ "is-ci": "^2.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-validate": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz",
+ "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "camelcase": "^6.0.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^26.3.0",
+ "leven": "^3.1.0",
+ "pretty-format": "^26.6.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-watch-typeahead": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz",
+ "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==",
+ "requires": {
+ "ansi-escapes": "^4.3.1",
+ "chalk": "^4.0.0",
+ "jest-regex-util": "^26.0.0",
+ "jest-watcher": "^26.3.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.1",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-watcher": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz",
+ "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==",
+ "requires": {
+ "@jest/test-result": "^26.6.2",
+ "@jest/types": "^26.6.2",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "jest-util": "^26.6.2",
+ "string-length": "^4.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+ },
+ "jsdom": {
+ "version": "16.5.1",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.1.tgz",
+ "integrity": "sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA==",
+ "requires": {
+ "abab": "^2.0.5",
+ "acorn": "^8.0.5",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.4.4",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^2.0.0",
+ "decimal.js": "^10.2.1",
+ "domexception": "^2.0.1",
+ "escodegen": "^2.0.0",
+ "html-encoding-sniffer": "^2.0.1",
+ "is-potential-custom-element-name": "^1.0.0",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "request": "^2.88.2",
+ "request-promise-native": "^1.0.9",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^2.0.0",
+ "webidl-conversions": "^6.1.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0",
+ "ws": "^7.4.4",
+ "xml-name-validator": "^3.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz",
+ "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA=="
+ }
+ }
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+ },
+ "json3": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
+ "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
+ },
+ "json5": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "jsx-ast-utils": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz",
+ "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==",
+ "requires": {
+ "array-includes": "^3.1.2",
+ "object.assign": "^4.1.2"
+ }
+ },
+ "killable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg=="
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+ },
+ "kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
+ },
+ "klona": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
+ "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA=="
+ },
+ "language-subtag-registry": {
+ "version": "0.3.21",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
+ "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg=="
+ },
+ "language-tags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+ "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
+ "requires": {
+ "language-subtag-registry": "~0.3.2"
+ }
+ },
+ "last-call-webpack-plugin": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
+ "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
+ "requires": {
+ "lodash": "^4.17.5",
+ "webpack-sources": "^1.1.0"
+ }
+ },
+ "leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ }
+ }
+ },
+ "loader-runner": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw=="
+ },
+ "loader-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+ "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ },
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+ },
+ "lodash.isfunction": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
+ "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw=="
+ },
+ "lodash.isobject": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0="
+ },
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+ },
+ "lodash.template": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+ "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+ "requires": {
+ "lodash._reinterpolate": "^3.0.0",
+ "lodash.templatesettings": "^4.0.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+ "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+ "requires": {
+ "lodash._reinterpolate": "^3.0.0"
+ }
+ },
+ "lodash.tonumber": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz",
+ "integrity": "sha1-C5azGzVnJ5Prf1pj7nkfG56QJdk="
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+ },
+ "loglevel": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz",
+ "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw=="
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "requires": {
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A=="
+ }
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "lz-string": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
+ "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY="
+ },
+ "magic-string": {
+ "version": "0.25.7",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+ "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+ "requires": {
+ "sourcemap-codec": "^1.4.4"
+ }
+ },
+ "make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "requires": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "makeerror": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+ "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+ "requires": {
+ "tmpl": "1.0.x"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ },
+ "memory-fs": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "requires": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "microevent.ts": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz",
+ "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g=="
+ },
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "requires": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.46.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz",
+ "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ=="
+ },
+ "mime-types": {
+ "version": "2.1.29",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz",
+ "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
+ "requires": {
+ "mime-db": "1.46.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ },
+ "min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="
+ },
+ "mini-css-extract-plugin": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz",
+ "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==",
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "normalize-url": "1.9.1",
+ "schema-utils": "^1.0.0",
+ "webpack-sources": "^1.1.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "minipass": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+ "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "minipass-collect": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+ "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "minipass-flush": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "requires": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ }
+ },
+ "mississippi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+ "requires": {
+ "concat-stream": "^1.5.0",
+ "duplexify": "^3.4.2",
+ "end-of-stream": "^1.1.0",
+ "flush-write-stream": "^1.0.0",
+ "from2": "^2.1.0",
+ "parallel-transform": "^1.1.0",
+ "pump": "^3.0.0",
+ "pumpify": "^1.3.3",
+ "stream-each": "^1.1.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "move-concurrently": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+ "requires": {
+ "aproba": "^1.1.1",
+ "copy-concurrently": "^1.0.0",
+ "fs-write-stream-atomic": "^1.0.8",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.3"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "multicast-dns": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+ "requires": {
+ "dns-packet": "^1.3.1",
+ "thunky": "^1.0.2"
+ }
+ },
+ "multicast-dns-service-types": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
+ },
+ "nanoid": {
+ "version": "3.1.22",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz",
+ "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ=="
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "native-url": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz",
+ "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==",
+ "requires": {
+ "querystring": "^0.2.0"
+ }
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+ },
+ "no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "requires": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A=="
+ }
+ }
+ },
+ "node-forge": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
+ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA=="
+ },
+ "node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs="
+ },
+ "node-libs-browser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+ "requires": {
+ "assert": "^1.1.1",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^4.3.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "crypto-browserify": "^3.11.0",
+ "domain-browser": "^1.1.1",
+ "events": "^3.0.0",
+ "https-browserify": "^1.0.0",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "0.0.1",
+ "process": "^0.11.10",
+ "punycode": "^1.2.4",
+ "querystring-es3": "^0.2.0",
+ "readable-stream": "^2.3.3",
+ "stream-browserify": "^2.0.1",
+ "stream-http": "^2.7.2",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
+ "tty-browserify": "0.0.0",
+ "url": "^0.11.0",
+ "util": "^0.11.0",
+ "vm-browserify": "^1.0.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ },
+ "dependencies": {
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "node-modules-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA="
+ },
+ "node-notifier": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz",
+ "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==",
+ "optional": true,
+ "requires": {
+ "growly": "^1.3.0",
+ "is-wsl": "^2.2.0",
+ "semver": "^7.3.2",
+ "shellwords": "^0.1.1",
+ "uuid": "^8.3.0",
+ "which": "^2.0.2"
+ },
+ "dependencies": {
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "optional": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "node-releases": {
+ "version": "1.1.71",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
+ "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg=="
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+ },
+ "normalize-url": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+ "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+ "requires": {
+ "object-assign": "^4.0.1",
+ "prepend-http": "^1.0.0",
+ "query-string": "^4.1.0",
+ "sort-keys": "^1.0.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "requires": {
+ "path-key": "^2.0.0"
+ }
+ },
+ "nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "requires": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+ },
+ "nwsapi": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
+ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-inspect": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
+ "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw=="
+ },
+ "object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz",
+ "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1",
+ "has": "^1.0.3"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz",
+ "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.2",
+ "has": "^1.0.3"
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz",
+ "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.2"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "object.values": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz",
+ "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.2",
+ "has": "^1.0.3"
+ }
+ },
+ "obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "open": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+ "requires": {
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
+ }
+ },
+ "opn": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
+ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+ "requires": {
+ "is-wsl": "^1.1.0"
+ },
+ "dependencies": {
+ "is-wsl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+ }
+ }
+ },
+ "optimize-css-assets-webpack-plugin": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz",
+ "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==",
+ "requires": {
+ "cssnano": "^4.1.10",
+ "last-call-webpack-plugin": "^3.0.0"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "original": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+ "requires": {
+ "url-parse": "^1.4.3"
+ }
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
+ },
+ "p-each-series": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
+ "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA=="
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ },
+ "p-retry": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
+ "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+ "requires": {
+ "retry": "^0.12.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+ },
+ "pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+ },
+ "parallel-transform": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
+ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+ "requires": {
+ "cyclist": "^1.0.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.1.5"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "requires": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A=="
+ }
+ }
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "requires": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A=="
+ }
+ }
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "path-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ },
+ "pbkdf2": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+ "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ },
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+ },
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pirates": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
+ "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
+ "requires": {
+ "node-modules-regexp": "^1.0.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "requires": {
+ "find-up": "^3.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ }
+ }
+ },
+ "pkg-up": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
+ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+ "requires": {
+ "find-up": "^3.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ }
+ }
+ },
+ "pnp-webpack-plugin": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
+ "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==",
+ "requires": {
+ "ts-pnp": "^1.1.6"
+ }
+ },
+ "popper.js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
+ "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
+ },
+ "portfinder": {
+ "version": "1.0.28",
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+ "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+ "requires": {
+ "async": "^2.6.2",
+ "debug": "^3.1.1",
+ "mkdirp": "^0.5.5"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+ },
+ "postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-attribute-case-insensitive": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
+ "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^6.0.2"
+ }
+ },
+ "postcss-browser-comments": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz",
+ "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==",
+ "requires": {
+ "postcss": "^7"
+ }
+ },
+ "postcss-calc": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz",
+ "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
+ "requires": {
+ "postcss": "^7.0.27",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.0.2"
+ }
+ },
+ "postcss-color-functional-notation": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
+ "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ }
+ },
+ "postcss-color-gray": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
+ "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
+ "requires": {
+ "@csstools/convert-colors": "^1.4.0",
+ "postcss": "^7.0.5",
+ "postcss-values-parser": "^2.0.0"
+ }
+ },
+ "postcss-color-hex-alpha": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
+ "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
+ "requires": {
+ "postcss": "^7.0.14",
+ "postcss-values-parser": "^2.0.1"
+ }
+ },
+ "postcss-color-mod-function": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
+ "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
+ "requires": {
+ "@csstools/convert-colors": "^1.4.0",
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ }
+ },
+ "postcss-color-rebeccapurple": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
+ "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ }
+ },
+ "postcss-colormin": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+ "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+ "requires": {
+ "browserslist": "^4.0.0",
+ "color": "^3.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-convert-values": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+ "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+ "requires": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-custom-media": {
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
+ "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
+ "requires": {
+ "postcss": "^7.0.14"
+ }
+ },
+ "postcss-custom-properties": {
+ "version": "8.0.11",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
+ "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
+ "requires": {
+ "postcss": "^7.0.17",
+ "postcss-values-parser": "^2.0.1"
+ }
+ },
+ "postcss-custom-selectors": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
+ "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^5.0.0-rc.3"
+ },
+ "dependencies": {
+ "cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
+ },
+ "postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "requires": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "postcss-dir-pseudo-class": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
+ "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^5.0.0-rc.3"
+ },
+ "dependencies": {
+ "cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
+ },
+ "postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "requires": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "postcss-discard-comments": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+ "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-discard-duplicates": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+ "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-discard-empty": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-discard-overridden": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-double-position-gradients": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
+ "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
+ "requires": {
+ "postcss": "^7.0.5",
+ "postcss-values-parser": "^2.0.0"
+ }
+ },
+ "postcss-env-function": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
+ "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ }
+ },
+ "postcss-flexbugs-fixes": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz",
+ "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==",
+ "requires": {
+ "postcss": "^7.0.26"
+ }
+ },
+ "postcss-focus-visible": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
+ "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-focus-within": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
+ "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-font-variant": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz",
+ "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-gap-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
+ "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-image-set-function": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
+ "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ }
+ },
+ "postcss-initial": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz",
+ "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==",
+ "requires": {
+ "lodash.template": "^4.5.0",
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-lab-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
+ "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
+ "requires": {
+ "@csstools/convert-colors": "^1.4.0",
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ }
+ },
+ "postcss-load-config": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz",
+ "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==",
+ "requires": {
+ "cosmiconfig": "^5.0.0",
+ "import-cwd": "^2.0.0"
+ },
+ "dependencies": {
+ "cosmiconfig": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "requires": {
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.13.1",
+ "parse-json": "^4.0.0"
+ }
+ },
+ "import-fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+ "requires": {
+ "caller-path": "^2.0.0",
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
+ }
+ }
+ },
+ "postcss-loader": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
+ "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
+ "requires": {
+ "loader-utils": "^1.1.0",
+ "postcss": "^7.0.0",
+ "postcss-load-config": "^2.0.0",
+ "schema-utils": "^1.0.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ }
+ }
+ },
+ "postcss-logical": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
+ "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-media-minmax": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
+ "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-merge-longhand": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+ "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+ "requires": {
+ "css-color-names": "0.0.4",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0",
+ "stylehacks": "^4.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-merge-rules": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+ "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+ "requires": {
+ "browserslist": "^4.0.0",
+ "caniuse-api": "^3.0.0",
+ "cssnano-util-same-parent": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-selector-parser": "^3.0.0",
+ "vendors": "^1.0.0"
+ },
+ "dependencies": {
+ "postcss-selector-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "requires": {
+ "dot-prop": "^5.2.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "postcss-minify-font-values": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+ "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+ "requires": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-minify-gradients": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+ "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+ "requires": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "is-color-stop": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-minify-params": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+ "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+ "requires": {
+ "alphanum-sort": "^1.0.0",
+ "browserslist": "^4.0.0",
+ "cssnano-util-get-arguments": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0",
+ "uniqs": "^2.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-minify-selectors": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+ "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+ "requires": {
+ "alphanum-sort": "^1.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-selector-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-selector-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "requires": {
+ "dot-prop": "^5.2.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
+ "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
+ "requires": {
+ "postcss": "^7.0.5"
+ }
+ },
+ "postcss-modules-local-by-default": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
+ "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
+ "requires": {
+ "icss-utils": "^4.1.1",
+ "postcss": "^7.0.32",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
+ "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
+ "requires": {
+ "postcss": "^7.0.6",
+ "postcss-selector-parser": "^6.0.0"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
+ "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
+ "requires": {
+ "icss-utils": "^4.0.0",
+ "postcss": "^7.0.6"
+ }
+ },
+ "postcss-nesting": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
+ "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-normalize": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz",
+ "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==",
+ "requires": {
+ "@csstools/normalize.css": "^10.1.0",
+ "browserslist": "^4.6.2",
+ "postcss": "^7.0.17",
+ "postcss-browser-comments": "^3.0.0",
+ "sanitize.css": "^10.0.0"
+ }
+ },
+ "postcss-normalize-charset": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-normalize-display-values": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+ "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+ "requires": {
+ "cssnano-util-get-match": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-normalize-positions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+ "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+ "requires": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-normalize-repeat-style": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+ "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+ "requires": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "cssnano-util-get-match": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-normalize-string": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+ "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+ "requires": {
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-normalize-timing-functions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+ "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+ "requires": {
+ "cssnano-util-get-match": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-normalize-unicode": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+ "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+ "requires": {
+ "browserslist": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-normalize-url": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+ "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+ "requires": {
+ "is-absolute-url": "^2.0.0",
+ "normalize-url": "^3.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "normalize-url": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
+ },
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-normalize-whitespace": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+ "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+ "requires": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-ordered-values": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+ "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+ "requires": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-overflow-shorthand": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
+ "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-page-break": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
+ "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-place": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
+ "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ }
+ },
+ "postcss-preset-env": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz",
+ "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==",
+ "requires": {
+ "autoprefixer": "^9.6.1",
+ "browserslist": "^4.6.4",
+ "caniuse-lite": "^1.0.30000981",
+ "css-blank-pseudo": "^0.1.4",
+ "css-has-pseudo": "^0.10.0",
+ "css-prefers-color-scheme": "^3.1.1",
+ "cssdb": "^4.4.0",
+ "postcss": "^7.0.17",
+ "postcss-attribute-case-insensitive": "^4.0.1",
+ "postcss-color-functional-notation": "^2.0.1",
+ "postcss-color-gray": "^5.0.0",
+ "postcss-color-hex-alpha": "^5.0.3",
+ "postcss-color-mod-function": "^3.0.3",
+ "postcss-color-rebeccapurple": "^4.0.1",
+ "postcss-custom-media": "^7.0.8",
+ "postcss-custom-properties": "^8.0.11",
+ "postcss-custom-selectors": "^5.1.2",
+ "postcss-dir-pseudo-class": "^5.0.0",
+ "postcss-double-position-gradients": "^1.0.0",
+ "postcss-env-function": "^2.0.2",
+ "postcss-focus-visible": "^4.0.0",
+ "postcss-focus-within": "^3.0.0",
+ "postcss-font-variant": "^4.0.0",
+ "postcss-gap-properties": "^2.0.0",
+ "postcss-image-set-function": "^3.0.1",
+ "postcss-initial": "^3.0.0",
+ "postcss-lab-function": "^2.0.1",
+ "postcss-logical": "^3.0.0",
+ "postcss-media-minmax": "^4.0.0",
+ "postcss-nesting": "^7.0.0",
+ "postcss-overflow-shorthand": "^2.0.0",
+ "postcss-page-break": "^2.0.0",
+ "postcss-place": "^4.0.1",
+ "postcss-pseudo-class-any-link": "^6.0.0",
+ "postcss-replace-overflow-wrap": "^3.0.0",
+ "postcss-selector-matches": "^4.0.0",
+ "postcss-selector-not": "^4.0.0"
+ }
+ },
+ "postcss-pseudo-class-any-link": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
+ "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^5.0.0-rc.3"
+ },
+ "dependencies": {
+ "cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
+ },
+ "postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "requires": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "postcss-reduce-initial": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+ "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+ "requires": {
+ "browserslist": "^4.0.0",
+ "caniuse-api": "^3.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-reduce-transforms": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+ "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+ "requires": {
+ "cssnano-util-get-match": "^4.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-replace-overflow-wrap": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
+ "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-safe-parser": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz",
+ "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==",
+ "requires": {
+ "postcss": "^8.1.0"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.2.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz",
+ "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==",
+ "requires": {
+ "colorette": "^1.2.2",
+ "nanoid": "^3.1.20",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "postcss-selector-matches": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
+ "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-selector-not": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz",
+ "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "postcss": "^7.0.2"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+ "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+ "requires": {
+ "cssesc": "^3.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-svgo": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
+ "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+ "requires": {
+ "is-svg": "^3.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0",
+ "svgo": "^1.0.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+ }
+ }
+ },
+ "postcss-unique-selectors": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+ "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+ "requires": {
+ "alphanum-sort": "^1.0.0",
+ "postcss": "^7.0.0",
+ "uniqs": "^2.0.0"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+ },
+ "postcss-values-parser": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
+ "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
+ "requires": {
+ "flatten": "^1.0.2",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+ },
+ "pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="
+ },
+ "pretty-error": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz",
+ "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==",
+ "requires": {
+ "lodash": "^4.17.20",
+ "renderkid": "^2.0.4"
+ }
+ },
+ "pretty-format": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
+ "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ }
+ }
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+ },
+ "promise": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
+ "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
+ "requires": {
+ "asap": "~2.0.6"
+ }
+ },
+ "promise-inflight": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
+ },
+ "prompts": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz",
+ "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==",
+ "requires": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ }
+ },
+ "prop-types": {
+ "version": "15.7.2",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
+ "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+ "requires": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.8.1"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+ "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+ },
+ "psl": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+ },
+ "public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "requires": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+ }
+ }
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+ "requires": {
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
+ },
+ "dependencies": {
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ }
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ },
+ "query-string": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+ "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+ "requires": {
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ }
+ },
+ "querystring": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
+ "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg=="
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+ },
+ "querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+ },
+ "raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "requires": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "requires": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ },
+ "raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ }
+ }
+ },
+ "react": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
+ "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "react-app-polyfill": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz",
+ "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==",
+ "requires": {
+ "core-js": "^3.6.5",
+ "object-assign": "^4.1.1",
+ "promise": "^8.1.0",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.7",
+ "whatwg-fetch": "^3.4.1"
+ }
+ },
+ "react-cookie": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-3.0.4.tgz",
+ "integrity": "sha512-WNf1LifcjRQfg/QEDYQkey78XNJ46/k+lhoKrTK1Iv1jiqInl5jmjRBnEqDJ32HhgeL0iJAsJrEC+o+LkJ/O9Q==",
+ "requires": {
+ "@types/hoist-non-react-statics": "^3.0.1",
+ "hoist-non-react-statics": "^3.0.0",
+ "universal-cookie": "^3.0.4"
+ }
+ },
+ "react-dev-utils": {
+ "version": "11.0.4",
+ "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz",
+ "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==",
+ "requires": {
+ "@babel/code-frame": "7.10.4",
+ "address": "1.1.2",
+ "browserslist": "4.14.2",
+ "chalk": "2.4.2",
+ "cross-spawn": "7.0.3",
+ "detect-port-alt": "1.1.6",
+ "escape-string-regexp": "2.0.0",
+ "filesize": "6.1.0",
+ "find-up": "4.1.0",
+ "fork-ts-checker-webpack-plugin": "4.1.6",
+ "global-modules": "2.0.0",
+ "globby": "11.0.1",
+ "gzip-size": "5.1.1",
+ "immer": "8.0.1",
+ "is-root": "2.1.0",
+ "loader-utils": "2.0.0",
+ "open": "^7.0.2",
+ "pkg-up": "3.1.0",
+ "prompts": "2.4.0",
+ "react-error-overlay": "^6.0.9",
+ "recursive-readdir": "2.2.2",
+ "shell-quote": "1.7.2",
+ "strip-ansi": "6.0.0",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "browserslist": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz",
+ "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==",
+ "requires": {
+ "caniuse-lite": "^1.0.30001125",
+ "electron-to-chromium": "^1.3.564",
+ "escalade": "^3.0.2",
+ "node-releases": "^1.1.61"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
+ },
+ "globby": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+ "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
+ "slash": "^3.0.0"
+ }
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "react-dom": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
+ "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "scheduler": "^0.20.2"
+ }
+ },
+ "react-error-overlay": {
+ "version": "6.0.9",
+ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz",
+ "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew=="
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "react-lifecycles-compat": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
+ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
+ },
+ "react-popper": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-0.10.4.tgz",
+ "integrity": "sha1-rypBXqIike3VBGeNev2opu4ylao=",
+ "requires": {
+ "popper.js": "^1.14.1",
+ "prop-types": "^15.6.1"
+ }
+ },
+ "react-refresh": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz",
+ "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg=="
+ },
+ "react-router": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz",
+ "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==",
+ "requires": {
+ "history": "^4.7.2",
+ "hoist-non-react-statics": "^2.5.0",
+ "invariant": "^2.2.4",
+ "loose-envify": "^1.3.1",
+ "path-to-regexp": "^1.7.0",
+ "prop-types": "^15.6.1",
+ "warning": "^4.0.1"
+ },
+ "dependencies": {
+ "hoist-non-react-statics": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
+ "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "path-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ }
+ }
+ },
+ "react-router-dom": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz",
+ "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==",
+ "requires": {
+ "history": "^4.7.2",
+ "invariant": "^2.2.4",
+ "loose-envify": "^1.3.1",
+ "prop-types": "^15.6.1",
+ "react-router": "^4.3.1",
+ "warning": "^4.0.1"
+ }
+ },
+ "react-scripts": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz",
+ "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==",
+ "requires": {
+ "@babel/core": "7.12.3",
+ "@pmmmwh/react-refresh-webpack-plugin": "0.4.3",
+ "@svgr/webpack": "5.5.0",
+ "@typescript-eslint/eslint-plugin": "^4.5.0",
+ "@typescript-eslint/parser": "^4.5.0",
+ "babel-eslint": "^10.1.0",
+ "babel-jest": "^26.6.0",
+ "babel-loader": "8.1.0",
+ "babel-plugin-named-asset-import": "^0.3.7",
+ "babel-preset-react-app": "^10.0.0",
+ "bfj": "^7.0.2",
+ "camelcase": "^6.1.0",
+ "case-sensitive-paths-webpack-plugin": "2.3.0",
+ "css-loader": "4.3.0",
+ "dotenv": "8.2.0",
+ "dotenv-expand": "5.1.0",
+ "eslint": "^7.11.0",
+ "eslint-config-react-app": "^6.0.0",
+ "eslint-plugin-flowtype": "^5.2.0",
+ "eslint-plugin-import": "^2.22.1",
+ "eslint-plugin-jest": "^24.1.0",
+ "eslint-plugin-jsx-a11y": "^6.3.1",
+ "eslint-plugin-react": "^7.21.5",
+ "eslint-plugin-react-hooks": "^4.2.0",
+ "eslint-plugin-testing-library": "^3.9.2",
+ "eslint-webpack-plugin": "^2.5.2",
+ "file-loader": "6.1.1",
+ "fs-extra": "^9.0.1",
+ "fsevents": "^2.1.3",
+ "html-webpack-plugin": "4.5.0",
+ "identity-obj-proxy": "3.0.0",
+ "jest": "26.6.0",
+ "jest-circus": "26.6.0",
+ "jest-resolve": "26.6.0",
+ "jest-watch-typeahead": "0.6.1",
+ "mini-css-extract-plugin": "0.11.3",
+ "optimize-css-assets-webpack-plugin": "5.0.4",
+ "pnp-webpack-plugin": "1.6.4",
+ "postcss-flexbugs-fixes": "4.2.1",
+ "postcss-loader": "3.0.0",
+ "postcss-normalize": "8.0.1",
+ "postcss-preset-env": "6.7.0",
+ "postcss-safe-parser": "5.0.2",
+ "prompts": "2.4.0",
+ "react-app-polyfill": "^2.0.0",
+ "react-dev-utils": "^11.0.3",
+ "react-refresh": "^0.8.3",
+ "resolve": "1.18.1",
+ "resolve-url-loader": "^3.1.2",
+ "sass-loader": "^10.0.5",
+ "semver": "7.3.2",
+ "style-loader": "1.3.0",
+ "terser-webpack-plugin": "4.2.3",
+ "ts-pnp": "1.2.0",
+ "url-loader": "4.1.1",
+ "webpack": "4.44.2",
+ "webpack-dev-server": "3.11.1",
+ "webpack-manifest-plugin": "2.2.0",
+ "workbox-webpack-plugin": "5.1.4"
+ }
+ },
+ "react-transition-group": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
+ "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
+ "requires": {
+ "dom-helpers": "^3.4.0",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2",
+ "react-lifecycles-compat": "^3.0.4"
+ }
+ },
+ "reactstrap": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-6.5.0.tgz",
+ "integrity": "sha512-dWb3fB/wBAiQloteKlf+j9Nl2VLe6BMZgTEt6hpeTt0t9TwtkeU+2v2NBYONZaF4FZATfMiIKozhWpc2HmLW1g==",
+ "requires": {
+ "classnames": "^2.2.3",
+ "lodash.isfunction": "^3.0.9",
+ "lodash.isobject": "^3.0.2",
+ "lodash.tonumber": "^4.0.3",
+ "prop-types": "^15.5.8",
+ "react-lifecycles-compat": "^3.0.4",
+ "react-popper": "^0.10.4",
+ "react-transition-group": "^2.3.1"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "requires": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ },
+ "dependencies": {
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "requires": {
+ "pify": "^2.0.0"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "optional": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "recursive-readdir": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
+ "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "requires": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ }
+ },
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "regenerate-unicode-properties": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+ "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+ "requires": {
+ "regenerate": "^1.4.0"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.7",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+ "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
+ },
+ "regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "requires": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "regex-parser": {
+ "version": "2.2.11",
+ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
+ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q=="
+ },
+ "regexp.prototype.flags": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+ "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
+ },
+ "regexpu-core": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
+ "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+ "requires": {
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^8.2.0",
+ "regjsgen": "^0.5.1",
+ "regjsparser": "^0.6.4",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.2.0"
+ }
+ },
+ "regjsgen": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
+ },
+ "regjsparser": {
+ "version": "0.6.9",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz",
+ "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==",
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+ }
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+ },
+ "renderkid": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz",
+ "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==",
+ "requires": {
+ "css-select": "^2.0.2",
+ "dom-converter": "^0.2",
+ "htmlparser2": "^3.10.1",
+ "lodash": "^4.17.20",
+ "strip-ansi": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ }
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ }
+ }
+ },
+ "request-promise-core": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+ "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
+ "requires": {
+ "lodash": "^4.17.19"
+ }
+ },
+ "request-promise-native": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+ "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
+ "requires": {
+ "request-promise-core": "1.1.4",
+ "stealthy-require": "^1.1.1",
+ "tough-cookie": "^2.3.3"
+ },
+ "dependencies": {
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ }
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ },
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+ },
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
+ },
+ "resolve": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
+ "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
+ "requires": {
+ "is-core-module": "^2.0.0",
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "requires": {
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+ }
+ }
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+ },
+ "resolve-pathname": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
+ "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ },
+ "resolve-url-loader": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz",
+ "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==",
+ "requires": {
+ "adjust-sourcemap-loader": "3.0.0",
+ "camelcase": "5.3.1",
+ "compose-function": "3.0.3",
+ "convert-source-map": "1.7.0",
+ "es6-iterator": "2.0.3",
+ "loader-utils": "1.2.3",
+ "postcss": "7.0.21",
+ "rework": "1.0.1",
+ "rework-visit": "1.0.0",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ },
+ "emojis-list": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+ "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^2.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "postcss": {
+ "version": "7.0.21",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz",
+ "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==",
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ },
+ "retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+ },
+ "rework": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz",
+ "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=",
+ "requires": {
+ "convert-source-map": "^0.3.3",
+ "css": "^2.0.0"
+ },
+ "dependencies": {
+ "convert-source-map": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz",
+ "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA="
+ }
+ }
+ },
+ "rework-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz",
+ "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo="
+ },
+ "rgb-regex": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
+ "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE="
+ },
+ "rgba-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
+ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM="
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "requires": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "rollup": {
+ "version": "1.32.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz",
+ "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==",
+ "requires": {
+ "@types/estree": "*",
+ "@types/node": "*",
+ "acorn": "^7.1.0"
+ }
+ },
+ "rollup-plugin-babel": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz",
+ "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "rollup-pluginutils": "^2.8.1"
+ }
+ },
+ "rollup-plugin-terser": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz",
+ "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==",
+ "requires": {
+ "@babel/code-frame": "^7.5.5",
+ "jest-worker": "^24.9.0",
+ "rollup-pluginutils": "^2.8.2",
+ "serialize-javascript": "^4.0.0",
+ "terser": "^4.6.2"
+ },
+ "dependencies": {
+ "jest-worker": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
+ "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
+ "requires": {
+ "merge-stream": "^2.0.0",
+ "supports-color": "^6.1.0"
+ }
+ },
+ "serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "rollup-pluginutils": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
+ "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
+ "requires": {
+ "estree-walker": "^0.6.1"
+ },
+ "dependencies": {
+ "estree-walker": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="
+ }
+ }
+ },
+ "rsvp": {
+ "version": "4.8.5",
+ "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
+ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA=="
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "run-queue": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+ "requires": {
+ "aproba": "^1.1.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "sane": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
+ "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
+ "requires": {
+ "@cnakazawa/watch": "^1.0.3",
+ "anymatch": "^2.0.0",
+ "capture-exit": "^2.0.0",
+ "exec-sh": "^0.3.2",
+ "execa": "^1.0.0",
+ "fb-watchman": "^2.0.0",
+ "micromatch": "^3.1.4",
+ "minimist": "^1.1.1",
+ "walker": "~1.0.5"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ }
+ }
+ },
+ "sanitize.css": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz",
+ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg=="
+ },
+ "sass-loader": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz",
+ "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==",
+ "requires": {
+ "klona": "^2.0.4",
+ "loader-utils": "^2.0.0",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.0.0",
+ "semver": "^7.3.2"
+ },
+ "dependencies": {
+ "schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "requires": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ }
+ }
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
+ "saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "requires": {
+ "xmlchars": "^2.2.0"
+ }
+ },
+ "scheduler": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
+ "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "requires": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
+ },
+ "selfsigned": {
+ "version": "1.10.8",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz",
+ "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==",
+ "requires": {
+ "node-forge": "^0.10.0"
+ }
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ }
+ }
+ },
+ "serialize-javascript": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+ "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+ "requires": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ },
+ "set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ },
+ "shell-quote": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
+ "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
+ },
+ "shellwords": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+ "optional": true
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+ },
+ "simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+ "requires": {
+ "is-arrayish": "^0.3.1"
+ },
+ "dependencies": {
+ "is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ }
+ }
+ },
+ "sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ },
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ }
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "requires": {
+ "kind-of": "^3.2.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "sockjs": {
+ "version": "0.3.21",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz",
+ "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==",
+ "requires": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^3.4.0",
+ "websocket-driver": "^0.7.4"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ }
+ }
+ },
+ "sockjs-client": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz",
+ "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==",
+ "requires": {
+ "debug": "^3.2.6",
+ "eventsource": "^1.0.7",
+ "faye-websocket": "^0.11.3",
+ "inherits": "^2.0.4",
+ "json3": "^3.3.3",
+ "url-parse": "^1.5.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "sort-keys": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+ "requires": {
+ "is-plain-obj": "^1.0.0"
+ }
+ },
+ "source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ },
+ "source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "requires": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="
+ },
+ "sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+ },
+ "spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
+ "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ=="
+ },
+ "spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "requires": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ }
+ },
+ "spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "requires": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "ssri": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+ "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+ "requires": {
+ "minipass": "^3.1.1"
+ }
+ },
+ "stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
+ },
+ "stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==",
+ "requires": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
+ }
+ }
+ },
+ "stackframe": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz",
+ "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA=="
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ },
+ "stealthy-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
+ },
+ "stream-browserify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+ "requires": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "stream-each": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "stream-http": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+ "requires": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "to-arraybuffer": "^1.0.0",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
+ },
+ "strict-uri-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
+ },
+ "string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "requires": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "string-natural-compare": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
+ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw=="
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "string.prototype.matchall": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz",
+ "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.2",
+ "has-symbols": "^1.0.1",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.3.1",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+ "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+ "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ }
+ }
+ },
+ "stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "requires": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "dependencies": {
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+ },
+ "strip-comments": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz",
+ "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==",
+ "requires": {
+ "babel-extract-comments": "^1.0.0",
+ "babel-plugin-transform-object-rest-spread": "^6.26.0"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+ },
+ "strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "requires": {
+ "min-indent": "^1.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+ },
+ "style-loader": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz",
+ "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==",
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^2.7.0"
+ }
+ },
+ "stylehacks": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
+ "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+ "requires": {
+ "browserslist": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-selector-parser": "^3.0.0"
+ },
+ "dependencies": {
+ "postcss-selector-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "requires": {
+ "dot-prop": "^5.2.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ }
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "supports-hyperlinks": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz",
+ "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==",
+ "requires": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
+ },
+ "svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "requires": {
+ "chalk": "^2.4.1",
+ "coa": "^2.0.2",
+ "css-select": "^2.0.0",
+ "css-select-base-adapter": "^0.1.1",
+ "css-tree": "1.0.0-alpha.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.0.0"
+ }
+ },
+ "symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+ },
+ "table": {
+ "version": "6.0.7",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
+ "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
+ "requires": {
+ "ajv": "^7.0.2",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "7.2.4",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.4.tgz",
+ "integrity": "sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ }
+ }
+ },
+ "tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
+ },
+ "tar": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
+ "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
+ "requires": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^3.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "dependencies": {
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+ }
+ }
+ },
+ "temp-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz",
+ "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0="
+ },
+ "tempy": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz",
+ "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==",
+ "requires": {
+ "temp-dir": "^1.0.0",
+ "type-fest": "^0.3.1",
+ "unique-string": "^1.0.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
+ "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ=="
+ }
+ }
+ },
+ "terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "requires": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ }
+ },
+ "terser": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+ "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+ "requires": {
+ "commander": "^2.20.0",
+ "source-map": "~0.6.1",
+ "source-map-support": "~0.5.12"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "terser-webpack-plugin": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz",
+ "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==",
+ "requires": {
+ "cacache": "^15.0.5",
+ "find-cache-dir": "^3.3.1",
+ "jest-worker": "^26.5.0",
+ "p-limit": "^3.0.2",
+ "schema-utils": "^3.0.0",
+ "serialize-javascript": "^5.0.1",
+ "source-map": "^0.6.1",
+ "terser": "^5.3.4",
+ "webpack-sources": "^1.4.3"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "find-cache-dir": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+ "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ }
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
+ "schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "requires": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "terser": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz",
+ "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==",
+ "requires": {
+ "commander": "^2.20.0",
+ "source-map": "~0.7.2",
+ "source-map-support": "~0.5.19"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+ }
+ }
+ }
+ }
+ },
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+ },
+ "throat": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ }
+ }
+ },
+ "thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
+ },
+ "timers-browserify": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+ "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+ "requires": {
+ "setimmediate": "^1.0.4"
+ }
+ },
+ "timsort": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
+ },
+ "tiny-invariant": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz",
+ "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw=="
+ },
+ "tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
+ "tmpl": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE="
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+ },
+ "tough-cookie": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
+ "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
+ "requires": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.1.2"
+ },
+ "dependencies": {
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ }
+ }
+ },
+ "tr46": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
+ "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
+ "tryer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA=="
+ },
+ "ts-pnp": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz",
+ "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw=="
+ },
+ "tsconfig-paths": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
+ "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
+ "requires": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.1",
+ "minimist": "^1.2.0",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ }
+ }
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "tty-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+ },
+ "type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ },
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "unbox-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+ "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has-bigints": "^1.0.1",
+ "has-symbols": "^1.0.2",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
+ },
+ "unicode-match-property-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
+ "unicode-property-aliases-ecmascript": "^1.0.4"
+ }
+ },
+ "unicode-match-property-value-ecmascript": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+ "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ=="
+ },
+ "unicode-property-aliases-ecmascript": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg=="
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ }
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
+ },
+ "uniqs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
+ },
+ "unique-filename": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+ "requires": {
+ "unique-slug": "^2.0.0"
+ }
+ },
+ "unique-slug": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+ "requires": {
+ "imurmurhash": "^0.1.4"
+ }
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "requires": {
+ "crypto-random-string": "^1.0.0"
+ }
+ },
+ "universal-cookie": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-3.1.0.tgz",
+ "integrity": "sha512-sP6WuFgqIUro7ikgI2ndrsw9Ro+YvVBe5O9cQfWnjTicpLaSMUEUUDjQF8m8utzWF2ONl7tRkcZd7v4n6NnzjQ==",
+ "requires": {
+ "@types/cookie": "^0.3.1",
+ "@types/object-assign": "^4.0.30",
+ "cookie": "^0.3.1",
+ "object-assign": "^4.1.0"
+ },
+ "dependencies": {
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
+ }
+ }
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ },
+ "unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ }
+ }
+ },
+ "upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+ }
+ }
+ },
+ "url-loader": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+ "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "mime-types": "^2.1.27",
+ "schema-utils": "^3.0.0"
+ },
+ "dependencies": {
+ "schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "requires": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ }
+ }
+ },
+ "url-parse": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
+ "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
+ "requires": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+ },
+ "util": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+ "requires": {
+ "inherits": "2.0.3"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "util.promisify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.2",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.0"
+ }
+ },
+ "utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "optional": true
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="
+ },
+ "v8-to-istanbul": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz",
+ "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==",
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+ }
+ }
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "value-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz",
+ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ },
+ "vendors": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
+ "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w=="
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
+ },
+ "w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "requires": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "w3c-xmlserializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "requires": {
+ "xml-name-validator": "^3.0.0"
+ }
+ },
+ "walker": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+ "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+ "requires": {
+ "makeerror": "1.0.x"
+ }
+ },
+ "warning": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "watchpack": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
+ "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==",
+ "requires": {
+ "chokidar": "^3.4.1",
+ "graceful-fs": "^4.1.2",
+ "neo-async": "^2.5.0",
+ "watchpack-chokidar2": "^2.0.1"
+ }
+ },
+ "watchpack-chokidar2": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+ "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
+ "optional": true,
+ "requires": {
+ "chokidar": "^2.1.8"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "optional": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ },
+ "dependencies": {
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "optional": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "optional": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "optional": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "optional": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "fsevents": "^1.2.7",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "optional": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fsevents": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+ "optional": true
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "optional": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "optional": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "optional": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "optional": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "optional": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "optional": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "optional": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "optional": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ }
+ }
+ },
+ "wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "requires": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "web-vitals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.1.tgz",
+ "integrity": "sha512-jYOaqu01Ny1NvMwJ3dBJDUOJ2PGWknZWH4AUnvFOscvbdHMERIKT2TlgiAey5rVyfOePG7so2JcXXZdSnBvioQ=="
+ },
+ "webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
+ },
+ "webpack": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz",
+ "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==",
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/wasm-edit": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "acorn": "^6.4.1",
+ "ajv": "^6.10.2",
+ "ajv-keywords": "^3.4.1",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^4.3.0",
+ "eslint-scope": "^4.0.3",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^2.4.0",
+ "loader-utils": "^1.2.3",
+ "memory-fs": "^0.4.1",
+ "micromatch": "^3.1.10",
+ "mkdirp": "^0.5.3",
+ "neo-async": "^2.6.1",
+ "node-libs-browser": "^2.2.1",
+ "schema-utils": "^1.0.0",
+ "tapable": "^1.1.3",
+ "terser-webpack-plugin": "^1.4.3",
+ "watchpack": "^1.7.4",
+ "webpack-sources": "^1.4.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ=="
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "cacache": {
+ "version": "12.0.4",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+ "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+ "requires": {
+ "bluebird": "^3.5.5",
+ "chownr": "^1.1.1",
+ "figgy-pudding": "^3.5.1",
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.1.15",
+ "infer-owner": "^1.0.3",
+ "lru-cache": "^5.1.1",
+ "mississippi": "^3.0.0",
+ "mkdirp": "^0.5.1",
+ "move-concurrently": "^1.0.1",
+ "promise-inflight": "^1.0.1",
+ "rimraf": "^2.6.3",
+ "ssri": "^6.0.1",
+ "unique-filename": "^1.1.1",
+ "y18n": "^4.0.0"
+ }
+ },
+ "chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ },
+ "eslint-scope": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+ "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-wsl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ },
+ "serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "ssri": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+ "requires": {
+ "figgy-pudding": "^3.5.1"
+ }
+ },
+ "terser-webpack-plugin": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+ "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
+ "requires": {
+ "cacache": "^12.0.2",
+ "find-cache-dir": "^2.1.0",
+ "is-wsl": "^1.1.0",
+ "schema-utils": "^1.0.0",
+ "serialize-javascript": "^4.0.0",
+ "source-map": "^0.6.1",
+ "terser": "^4.1.2",
+ "webpack-sources": "^1.4.0",
+ "worker-farm": "^1.7.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ }
+ }
+ },
+ "webpack-dev-middleware": {
+ "version": "3.7.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz",
+ "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==",
+ "requires": {
+ "memory-fs": "^0.4.1",
+ "mime": "^2.4.4",
+ "mkdirp": "^0.5.1",
+ "range-parser": "^1.2.1",
+ "webpack-log": "^2.0.0"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
+ "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg=="
+ }
+ }
+ },
+ "webpack-dev-server": {
+ "version": "3.11.1",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz",
+ "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==",
+ "requires": {
+ "ansi-html": "0.0.7",
+ "bonjour": "^3.5.0",
+ "chokidar": "^2.1.8",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^1.6.0",
+ "debug": "^4.1.1",
+ "del": "^4.1.1",
+ "express": "^4.17.1",
+ "html-entities": "^1.3.1",
+ "http-proxy-middleware": "0.19.1",
+ "import-local": "^2.0.0",
+ "internal-ip": "^4.3.0",
+ "ip": "^1.1.5",
+ "is-absolute-url": "^3.0.3",
+ "killable": "^1.0.1",
+ "loglevel": "^1.6.8",
+ "opn": "^5.5.0",
+ "p-retry": "^3.0.1",
+ "portfinder": "^1.0.26",
+ "schema-utils": "^1.0.0",
+ "selfsigned": "^1.10.8",
+ "semver": "^6.3.0",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.21",
+ "sockjs-client": "^1.5.0",
+ "spdy": "^4.0.2",
+ "strip-ansi": "^3.0.1",
+ "supports-color": "^6.1.0",
+ "url": "^0.11.0",
+ "webpack-dev-middleware": "^3.7.2",
+ "webpack-log": "^2.0.0",
+ "ws": "^6.2.1",
+ "yargs": "^13.3.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ },
+ "dependencies": {
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ },
+ "chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "fsevents": "^1.2.7",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ }
+ },
+ "cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "requires": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "fsevents": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+ "optional": true
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "import-local": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+ "requires": {
+ "pkg-dir": "^3.0.0",
+ "resolve-cwd": "^2.0.0"
+ }
+ },
+ "is-absolute-url": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+ "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q=="
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "resolve-cwd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+ "requires": {
+ "resolve-from": "^3.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
+ },
+ "schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "requires": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "ws": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+ "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+ "requires": {
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "requires": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
+ "webpack-log": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
+ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+ "requires": {
+ "ansi-colors": "^3.0.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "ansi-colors": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
+ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA=="
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ }
+ }
+ },
+ "webpack-manifest-plugin": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz",
+ "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==",
+ "requires": {
+ "fs-extra": "^7.0.0",
+ "lodash": ">=3.5 <5",
+ "object.entries": "^1.1.0",
+ "tapable": "^1.0.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ }
+ }
+ },
+ "webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "requires": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "requires": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ }
+ },
+ "websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
+ },
+ "whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "requires": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "whatwg-fetch": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz",
+ "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA=="
+ },
+ "whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
+ },
+ "whatwg-url": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz",
+ "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==",
+ "requires": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.0.2",
+ "webidl-conversions": "^6.1.0"
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+ },
+ "workbox-background-sync": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz",
+ "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==",
+ "requires": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "workbox-broadcast-update": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz",
+ "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==",
+ "requires": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "workbox-build": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz",
+ "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==",
+ "requires": {
+ "@babel/core": "^7.8.4",
+ "@babel/preset-env": "^7.8.4",
+ "@babel/runtime": "^7.8.4",
+ "@hapi/joi": "^15.1.0",
+ "@rollup/plugin-node-resolve": "^7.1.1",
+ "@rollup/plugin-replace": "^2.3.1",
+ "@surma/rollup-plugin-off-main-thread": "^1.1.1",
+ "common-tags": "^1.8.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "fs-extra": "^8.1.0",
+ "glob": "^7.1.6",
+ "lodash.template": "^4.5.0",
+ "pretty-bytes": "^5.3.0",
+ "rollup": "^1.31.1",
+ "rollup-plugin-babel": "^4.3.3",
+ "rollup-plugin-terser": "^5.3.1",
+ "source-map": "^0.7.3",
+ "source-map-url": "^0.4.0",
+ "stringify-object": "^3.3.0",
+ "strip-comments": "^1.0.2",
+ "tempy": "^0.3.0",
+ "upath": "^1.2.0",
+ "workbox-background-sync": "^5.1.4",
+ "workbox-broadcast-update": "^5.1.4",
+ "workbox-cacheable-response": "^5.1.4",
+ "workbox-core": "^5.1.4",
+ "workbox-expiration": "^5.1.4",
+ "workbox-google-analytics": "^5.1.4",
+ "workbox-navigation-preload": "^5.1.4",
+ "workbox-precaching": "^5.1.4",
+ "workbox-range-requests": "^5.1.4",
+ "workbox-routing": "^5.1.4",
+ "workbox-strategies": "^5.1.4",
+ "workbox-streams": "^5.1.4",
+ "workbox-sw": "^5.1.4",
+ "workbox-window": "^5.1.4"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ }
+ }
+ },
+ "workbox-cacheable-response": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz",
+ "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==",
+ "requires": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "workbox-core": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz",
+ "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg=="
+ },
+ "workbox-expiration": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz",
+ "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==",
+ "requires": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "workbox-google-analytics": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz",
+ "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==",
+ "requires": {
+ "workbox-background-sync": "^5.1.4",
+ "workbox-core": "^5.1.4",
+ "workbox-routing": "^5.1.4",
+ "workbox-strategies": "^5.1.4"
+ }
+ },
+ "workbox-navigation-preload": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz",
+ "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==",
+ "requires": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "workbox-precaching": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz",
+ "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==",
+ "requires": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "workbox-range-requests": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz",
+ "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==",
+ "requires": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "workbox-routing": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz",
+ "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==",
+ "requires": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "workbox-strategies": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz",
+ "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==",
+ "requires": {
+ "workbox-core": "^5.1.4",
+ "workbox-routing": "^5.1.4"
+ }
+ },
+ "workbox-streams": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz",
+ "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==",
+ "requires": {
+ "workbox-core": "^5.1.4",
+ "workbox-routing": "^5.1.4"
+ }
+ },
+ "workbox-sw": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz",
+ "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA=="
+ },
+ "workbox-webpack-plugin": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz",
+ "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "fast-json-stable-stringify": "^2.0.0",
+ "source-map-url": "^0.4.0",
+ "upath": "^1.1.2",
+ "webpack-sources": "^1.3.0",
+ "workbox-build": "^5.1.4"
+ }
+ },
+ "workbox-window": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz",
+ "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==",
+ "requires": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "worker-farm": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
+ "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+ "requires": {
+ "errno": "~0.1.7"
+ }
+ },
+ "worker-rpc": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz",
+ "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==",
+ "requires": {
+ "microevent.ts": "~0.1.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "ws": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
+ "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw=="
+ },
+ "xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
+ },
+ "xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "y18n": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
+ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ=="
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+ },
+ "yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ }
+ }
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
+ }
+ }
+}
diff --git a/spring-boot-modules/spring-boot-react/frontend/package.json b/spring-boot-modules/spring-boot-react/frontend/package.json
new file mode 100644
index 0000000000..26568a8804
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "frontend",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "@testing-library/jest-dom": "^5.11.10",
+ "@testing-library/react": "^11.2.5",
+ "@testing-library/user-event": "^12.8.3",
+ "bootstrap": "^4.1.3",
+ "react": "^17.0.2",
+ "react-cookie": "^3.0.4",
+ "react-dom": "^17.0.2",
+ "react-router-dom": "^4.3.1",
+ "react-scripts": "4.0.3",
+ "reactstrap": "^6.5.0",
+ "web-vitals": "^1.1.1"
+ },
+ "scripts": {
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject"
+ },
+ "proxy": "http://localhost:8080",
+ "eslintConfig": {
+ "extends": [
+ "react-app",
+ "react-app/jest"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ }
+}
diff --git a/spring-boot-modules/spring-boot-react/frontend/public/favicon.ico b/spring-boot-modules/spring-boot-react/frontend/public/favicon.ico
new file mode 100644
index 0000000000..a11777cc47
Binary files /dev/null and b/spring-boot-modules/spring-boot-react/frontend/public/favicon.ico differ
diff --git a/spring-boot-modules/spring-boot-react/frontend/public/index.html b/spring-boot-modules/spring-boot-react/frontend/public/index.html
new file mode 100644
index 0000000000..aa069f27cb
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/public/index.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ React App
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/spring-boot-modules/spring-boot-react/frontend/public/logo192.png b/spring-boot-modules/spring-boot-react/frontend/public/logo192.png
new file mode 100644
index 0000000000..fc44b0a379
Binary files /dev/null and b/spring-boot-modules/spring-boot-react/frontend/public/logo192.png differ
diff --git a/spring-boot-modules/spring-boot-react/frontend/public/logo512.png b/spring-boot-modules/spring-boot-react/frontend/public/logo512.png
new file mode 100644
index 0000000000..a4e47a6545
Binary files /dev/null and b/spring-boot-modules/spring-boot-react/frontend/public/logo512.png differ
diff --git a/spring-boot-modules/spring-boot-react/frontend/public/manifest.json b/spring-boot-modules/spring-boot-react/frontend/public/manifest.json
new file mode 100644
index 0000000000..080d6c77ac
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/public/manifest.json
@@ -0,0 +1,25 @@
+{
+ "short_name": "React App",
+ "name": "Create React App Sample",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "logo192.png",
+ "type": "image/png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "logo512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
diff --git a/spring-boot-modules/spring-boot-react/frontend/public/robots.txt b/spring-boot-modules/spring-boot-react/frontend/public/robots.txt
new file mode 100644
index 0000000000..e9e57dc4d4
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/App.css b/spring-boot-modules/spring-boot-react/frontend/src/App.css
new file mode 100644
index 0000000000..9324b7cba2
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/App.css
@@ -0,0 +1,42 @@
+.App {
+ text-align: center;
+}
+
+.App-logo {
+ height: 40vmin;
+ pointer-events: none;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ .App-logo {
+ animation: App-logo-spin infinite 20s linear;
+ }
+}
+
+.App-header {
+ background-color: #282c34;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ font-size: calc(10px + 2vmin);
+ color: white;
+}
+
+.App-link {
+ color: #61dafb;
+}
+
+@keyframes App-logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+.container, .container-fluid {
+ margin-top: 20px;
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/App.js b/spring-boot-modules/spring-boot-react/frontend/src/App.js
new file mode 100644
index 0000000000..7347bb2124
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/App.js
@@ -0,0 +1,22 @@
+import React, { Component } from 'react';
+import './App.css';
+import Home from './Home';
+import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
+import ClientList from './ClientList';
+import ClientEdit from "./ClientEdit";
+
+class App extends Component {
+ render() {
+ return (
+
+
+
+
+
+
+
+ )
+ }
+}
+
+export default App;
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/App.test.js b/spring-boot-modules/spring-boot-react/frontend/src/App.test.js
new file mode 100644
index 0000000000..ccf118f439
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/App.test.js
@@ -0,0 +1,8 @@
+import { render, screen } from '@testing-library/react';
+import App from './App';
+
+test('renders learn react link', () => {
+ render( );
+ const linkElement = screen.getByText(/Clients/i);
+ expect(linkElement).toBeInTheDocument();
+});
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/AppNavbar.js b/spring-boot-modules/spring-boot-react/frontend/src/AppNavbar.js
new file mode 100644
index 0000000000..11a0833614
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/AppNavbar.js
@@ -0,0 +1,23 @@
+import React, {Component} from 'react';
+import {Navbar, NavbarBrand} from 'reactstrap';
+import {Link} from 'react-router-dom';
+
+export default class AppNavbar extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {isOpen: false};
+ this.toggle = this.toggle.bind(this);
+ }
+
+ toggle() {
+ this.setState({
+ isOpen: !this.state.isOpen
+ });
+ }
+
+ render() {
+ return
+ Home
+ ;
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/ClientEdit.js b/spring-boot-modules/spring-boot-react/frontend/src/ClientEdit.js
new file mode 100644
index 0000000000..6eafd203ce
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/ClientEdit.js
@@ -0,0 +1,82 @@
+import React, { Component } from 'react';
+import { Link, withRouter } from 'react-router-dom';
+import { Button, Container, Form, FormGroup, Input, Label } from 'reactstrap';
+import AppNavbar from './AppNavbar';
+
+class ClientEdit extends Component {
+
+ emptyItem = {
+ name: '',
+ email: ''
+ };
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ item: this.emptyItem
+ };
+ this.handleChange = this.handleChange.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
+ }
+
+ async componentDidMount() {
+ if (this.props.match.params.id !== 'new') {
+ const client = await (await fetch(`/clients/${this.props.match.params.id}`)).json();
+ this.setState({item: client});
+ }
+ }
+
+ handleChange(event) {
+ const target = event.target;
+ const value = target.value;
+ const name = target.name;
+ let item = {...this.state.item};
+ item[name] = value;
+ this.setState({item});
+ }
+
+async handleSubmit(event) {
+ event.preventDefault();
+ const {item} = this.state;
+
+ await fetch('/clients' + (item.id ? '/' + item.id : ''), {
+ method: (item.id) ? 'PUT' : 'POST',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(item),
+ });
+ this.props.history.push('/clients');
+}
+
+ render() {
+ const {item} = this.state;
+ const title = {item.id ? 'Edit Client' : 'Add Client'} ;
+
+ return
+ }
+}
+
+export default withRouter(ClientEdit);
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/ClientList.js b/spring-boot-modules/spring-boot-react/frontend/src/ClientList.js
new file mode 100644
index 0000000000..a2bfce6330
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/ClientList.js
@@ -0,0 +1,75 @@
+import React, { Component } from 'react';
+import { Button, ButtonGroup, Container, Table } from 'reactstrap';
+import AppNavbar from './AppNavbar';
+import { Link } from 'react-router-dom';
+
+class ClientList extends Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {clients: []};
+ this.remove = this.remove.bind(this);
+ }
+
+ componentDidMount() {
+ fetch('/clients')
+ .then(response => response.json())
+ .then(data => this.setState({clients: data}));
+ }
+
+ async remove(id) {
+ await fetch(`/clients/${id}`, {
+ method: 'DELETE',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ }
+ }).then(() => {
+ let updatedClients = [...this.state.clients].filter(i => i.id !== id);
+ this.setState({clients: updatedClients});
+ });
+ }
+
+ render() {
+ const {clients} = this.state;
+
+ const clientList = clients.map(client => {
+ return
+ {client.name}
+ {client.email}
+
+
+ Edit
+ this.remove(client.id)}>Delete
+
+
+
+ });
+
+ return (
+
+
+
+
+ Add Client
+
+ Clients
+
+
+
+ Name
+ Email
+ Actions
+
+
+
+ {clientList}
+
+
+
+
+ );
+ }
+}
+
+export default ClientList;
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/Home.js b/spring-boot-modules/spring-boot-react/frontend/src/Home.js
new file mode 100644
index 0000000000..fa844db7e7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/Home.js
@@ -0,0 +1,20 @@
+import React, { Component } from 'react';
+import './App.css';
+import AppNavbar from './AppNavbar';
+import { Link } from 'react-router-dom';
+import { Button, Container } from 'reactstrap';
+
+class Home extends Component {
+ render() {
+ return (
+
+ );
+ }
+}
+
+export default Home;
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/index.css b/spring-boot-modules/spring-boot-react/frontend/src/index.css
new file mode 100644
index 0000000000..ec2585e8c0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/index.css
@@ -0,0 +1,13 @@
+body {
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
+ sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+code {
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
+ monospace;
+}
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/index.js b/spring-boot-modules/spring-boot-react/frontend/src/index.js
new file mode 100644
index 0000000000..5fd18a7daa
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/index.js
@@ -0,0 +1,18 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import './index.css';
+import App from './App';
+import reportWebVitals from './reportWebVitals';
+import 'bootstrap/dist/css/bootstrap.min.css';
+
+ReactDOM.render(
+
+
+ ,
+ document.getElementById('root')
+);
+
+// If you want to start measuring performance in your app, pass a function
+// to log results (for example: reportWebVitals(console.log))
+// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
+reportWebVitals();
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/logo.svg b/spring-boot-modules/spring-boot-react/frontend/src/logo.svg
new file mode 100644
index 0000000000..9dfc1c058c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/reportWebVitals.js b/spring-boot-modules/spring-boot-react/frontend/src/reportWebVitals.js
new file mode 100644
index 0000000000..5253d3ad9e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/reportWebVitals.js
@@ -0,0 +1,13 @@
+const reportWebVitals = onPerfEntry => {
+ if (onPerfEntry && onPerfEntry instanceof Function) {
+ import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
+ getCLS(onPerfEntry);
+ getFID(onPerfEntry);
+ getFCP(onPerfEntry);
+ getLCP(onPerfEntry);
+ getTTFB(onPerfEntry);
+ });
+ }
+};
+
+export default reportWebVitals;
diff --git a/spring-boot-modules/spring-boot-react/frontend/src/setupTests.js b/spring-boot-modules/spring-boot-react/frontend/src/setupTests.js
new file mode 100644
index 0000000000..8f2609b7b3
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/frontend/src/setupTests.js
@@ -0,0 +1,5 @@
+// jest-dom adds custom jest matchers for asserting on DOM nodes.
+// allows you to do things like:
+// expect(element).toHaveTextContent(/react/i)
+// learn more: https://github.com/testing-library/jest-dom
+import '@testing-library/jest-dom';
diff --git a/spring-boot-modules/spring-boot-react/pom.xml b/spring-boot-modules/spring-boot-react/pom.xml
new file mode 100644
index 0000000000..f1e10ae12d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/pom.xml
@@ -0,0 +1,132 @@
+
+
+ 4.0.0
+ spring-boot-react
+
+
+ spring-boot-modules
+ com.baeldung.spring-boot-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 2.4.4
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+ 2.4.4
+
+
+ com.h2database
+ h2
+ 1.4.200
+ runtime
+
+
+ com.github.javafaker
+ javafaker
+ 1.0.2
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 2.4.4
+ test
+
+
+
+
+
+
+ maven-resources-plugin
+ 3.1.0
+
+
+ copy-resources
+ process-classes
+
+ copy-resources
+
+
+ ${basedir}/target/classes/static
+
+
+ frontend/build
+
+
+
+
+
+
+
+ com.github.eirslett
+ frontend-maven-plugin
+ ${frontend-maven-plugin.version}
+
+ frontend
+
+
+
+ install node
+
+ install-node-and-yarn
+
+
+ ${node.version}
+ ${yarn.version}
+
+
+
+ yarn install
+
+ yarn
+
+ generate-resources
+
+
+ yarn test
+
+ yarn
+
+ test
+
+ test
+
+ true
+
+
+
+
+ yarn build
+
+ yarn
+
+ compile
+
+ build
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+ 11
+ 11
+ 1.6
+ v10.14.2
+ v1.12.1
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/BoostrapInitialData.java b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/BoostrapInitialData.java
new file mode 100644
index 0000000000..2b644e75c8
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/BoostrapInitialData.java
@@ -0,0 +1,27 @@
+package com.baeldung.springbootreact;
+
+import com.baeldung.springbootreact.domain.Client;
+import com.baeldung.springbootreact.repository.ClientRepository;
+import com.github.javafaker.Faker;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.Locale;
+
+@Component
+public class BoostrapInitialData implements CommandLineRunner {
+
+ private final ClientRepository clientRepository;
+ private final Faker faker = new Faker(Locale.getDefault());
+
+ public BoostrapInitialData(ClientRepository clientRepository) {
+ this.clientRepository = clientRepository;
+ }
+
+ @Override
+ public void run(String... args) {
+ for (int i = 0; i < 10; i++) {
+ clientRepository.save(new Client(faker.name().fullName(), faker.internet().emailAddress()));
+ }
+ }
+}
diff --git a/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/SpringBootReactApplication.java b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/SpringBootReactApplication.java
new file mode 100644
index 0000000000..10db8b26dd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/SpringBootReactApplication.java
@@ -0,0 +1,11 @@
+package com.baeldung.springbootreact;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootReactApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootReactApplication.class, args);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/controller/ClientsController.java b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/controller/ClientsController.java
new file mode 100644
index 0000000000..f8f451a8f0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/controller/ClientsController.java
@@ -0,0 +1,54 @@
+package com.baeldung.springbootreact.controller;
+
+import com.baeldung.springbootreact.domain.Client;
+import com.baeldung.springbootreact.repository.ClientRepository;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/clients")
+public class ClientsController {
+
+ private final ClientRepository clientRepository;
+
+ public ClientsController(ClientRepository clientRepository) {
+ this.clientRepository = clientRepository;
+ }
+
+ @GetMapping
+ public List getClients() {
+ return clientRepository.findAll();
+ }
+
+ @GetMapping("/{id}")
+ public Client getClient(@PathVariable Long id) {
+ return clientRepository.findById(id).orElseThrow(RuntimeException::new);
+ }
+
+ @PostMapping
+ public ResponseEntity createClient(@RequestBody Client client) throws URISyntaxException {
+ Client savedClient = clientRepository.save(client);
+ return ResponseEntity.created(new URI("/clients/" + savedClient.getId())).body(savedClient);
+ }
+
+ @PutMapping("/{id}")
+ public ResponseEntity updateClient(@PathVariable Long id, @RequestBody Client client) {
+ Client currentClient = clientRepository.findById(id).orElseThrow(RuntimeException::new);
+ currentClient.setName(client.getName());
+ currentClient.setEmail(client.getEmail());
+ currentClient = clientRepository.save(client);
+
+ return ResponseEntity.ok(currentClient);
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity deleteClient(@PathVariable Long id) {
+ clientRepository.deleteById(id);
+ return ResponseEntity.ok().build();
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/domain/Client.java b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/domain/Client.java
new file mode 100644
index 0000000000..46e7c29fd5
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/domain/Client.java
@@ -0,0 +1,56 @@
+package com.baeldung.springbootreact.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "client")
+public class Client {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private String name;
+ private String email;
+
+ public Client() {
+ }
+
+ public Client(String name, String email) {
+ this.name = name;
+ this.email = email;
+ }
+
+ public Client(Long id, String name, String email) {
+ this.id = id;
+ this.name = name;
+ this.email = email;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/repository/ClientRepository.java b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/repository/ClientRepository.java
new file mode 100644
index 0000000000..13f4a02174
--- /dev/null
+++ b/spring-boot-modules/spring-boot-react/src/main/java/com/baeldung/springbootreact/repository/ClientRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.springbootreact.repository;
+
+import com.baeldung.springbootreact.domain.Client;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface ClientRepository extends JpaRepository {
+}
diff --git a/spring-boot-modules/spring-boot-runtime-2/README.md b/spring-boot-modules/spring-boot-runtime-2/README.md
index f997f2473d..9f0d814d8d 100644
--- a/spring-boot-modules/spring-boot-runtime-2/README.md
+++ b/spring-boot-modules/spring-boot-runtime-2/README.md
@@ -3,4 +3,4 @@
This module contains articles about administering a Spring Boot runtime
### Relevant Articles:
- -
+ - [Configure the Heap Size When Starting a Spring Boot Application](https://www.baeldung.com/spring-boot-heap-size)
diff --git a/spring-boot-modules/spring-boot-runtime-2/pom.xml b/spring-boot-modules/spring-boot-runtime-2/pom.xml
index 8f6351165a..2c97f63746 100644
--- a/spring-boot-modules/spring-boot-runtime-2/pom.xml
+++ b/spring-boot-modules/spring-boot-runtime-2/pom.xml
@@ -1,7 +1,12 @@
-
4.0.0
+ spring-boot-runtime-2
+ jar
+ spring-boot-runtime-2
+ Demo project for Spring Boot
com.baeldung.spring-boot-modules
@@ -10,19 +15,11 @@
../
- spring-boot-runtime-2
- jar
-
- spring-boot-runtime-2
- Demo project for Spring Boot
-
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-test
@@ -63,4 +60,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-runtime/README.md b/spring-boot-modules/spring-boot-runtime/README.md
index 271093421c..a36a17fa8e 100644
--- a/spring-boot-modules/spring-boot-runtime/README.md
+++ b/spring-boot-modules/spring-boot-runtime/README.md
@@ -6,7 +6,6 @@ This module contains articles about administering a Spring Boot runtime
- [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown)
- [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app)
- [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http)
- - [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging)
- [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs)
- [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring)
- [CORS with Spring](https://www.baeldung.com/spring-cors)
diff --git a/spring-boot-modules/spring-boot-runtime/pom.xml b/spring-boot-modules/spring-boot-runtime/pom.xml
index ce6fa7ea93..92b1458cf6 100644
--- a/spring-boot-modules/spring-boot-runtime/pom.xml
+++ b/spring-boot-modules/spring-boot-runtime/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ spring-boot-runtime
+ jar
+ spring-boot-runtime
+ Demo project for Spring Boot Runtime
com.baeldung.spring-boot-modules
@@ -10,173 +15,89 @@
../
- spring-boot-runtime
- pom
-
- spring-boot-runtime
- Demo project for Spring Boot
-
-
- disabling-console-jul
- disabling-console-log4j2
- disabling-console-logback
-
-
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-validation
-
org.springframework.boot
spring-boot-starter-thymeleaf
provided
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
org.springframework.boot
spring-boot-starter-data-jpa
-
org.springframework.boot
spring-boot-starter-mail
-
org.springframework.boot
spring-boot-starter-actuator
-
org.springframework.boot
spring-boot-starter-security
- de.codecentric
- spring-boot-admin-starter-client
- ${spring-boot-admin-starter-client.version}
+ org.springframework.cloud
+ spring-cloud-starter
+ ${springcloud.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
org.springframework.security
spring-security-test
-
com.h2database
h2
runtime
-
javax.persistence
javax.persistence-api
${jpa.version}
-
com.google.guava
guava
${guava.version}
-
org.subethamail
subethasmtp
${subethasmtp.version}
test
-
-
- org.springframework.cloud
- spring-cloud-context
- ${springcloud.version}
-
-
org.apache.httpcomponents
httpclient
${httpclient.version}
-
-
- ${project.artifactId}
-
-
- src/main/resources
- true
-
- **/conf.properties
-
-
-
-
-
-
-
- autoconfiguration
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*LiveTest.java
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
- **/AutoconfigurationTest.java
-
-
-
-
-
-
- json
-
-
-
-
-
-
-
-
2.2
18.0
3.1.7
- 2.0.2.RELEASE
+ 3.0.2
4.5.8
- 2.1.6
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java
index f51bb52990..0f19c6dc48 100644
--- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java
+++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/CustomWebAppInitializer.java
@@ -2,6 +2,8 @@ package com.baeldung.web.log.config;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/TaxiFareMVCConfig.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/TaxiFareMVCConfig.java
index fb0c1d1d48..fda8a845e9 100644
--- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/TaxiFareMVCConfig.java
+++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/web/log/config/TaxiFareMVCConfig.java
@@ -14,6 +14,6 @@ public class TaxiFareMVCConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(taxiFareRequestInterceptor).addPathPatterns("/**/taxifare/**/");
+ registry.addInterceptor(taxiFareRequestInterceptor).addPathPatterns("/taxifare/*/");
}
}
diff --git a/spring-boot-modules/spring-boot-security/pom.xml b/spring-boot-modules/spring-boot-security/pom.xml
index 33b7cbfd74..11e5a38eeb 100644
--- a/spring-boot-modules/spring-boot-security/pom.xml
+++ b/spring-boot-modules/spring-boot-security/pom.xml
@@ -1,7 +1,12 @@
-
+
4.0.0
+ spring-boot-security
+ jar
+ spring-boot-security
+ Spring Boot Security Auto-Configuration
com.baeldung.spring-boot-modules
@@ -10,12 +15,6 @@
../
- spring-boot-security
- jar
-
- spring-boot-security
- Spring Boot Security Auto-Configuration
-
org.springframework.boot
@@ -40,13 +39,11 @@
org.springframework.boot
spring-boot-starter-web
-
org.springframework.security
spring-security-taglibs
-
org.apache.tomcat.embed
@@ -57,7 +54,6 @@
javax.servlet
jstl
-
org.springframework.boot
spring-boot-starter-test
@@ -71,7 +67,6 @@
org.springframework.boot
spring-boot-autoconfigure
-
@@ -90,4 +85,4 @@
2.2.2.RELEASE
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml
index 259383a1d2..892fbfe4ca 100644
--- a/spring-boot-modules/spring-boot-springdoc/pom.xml
+++ b/spring-boot-modules/spring-boot-springdoc/pom.xml
@@ -1,9 +1,13 @@
-
4.0.0
+ spring-boot-springdoc
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-springdoc
+ Project for Springdoc integration
com.baeldung.spring-boot-modules
@@ -12,13 +16,6 @@
../
- spring-boot-springdoc
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-springdoc
- Project for Springdoc integration
-
org.springframework.boot
@@ -36,19 +33,16 @@
com.h2database
h2
-
org.springframework.boot
spring-boot-starter-test
test
-
-
+
org.hibernate
hibernate-core
${hibernate.version}
-
org.springdoc
@@ -59,10 +53,9 @@
org.springdoc
springdoc-openapi-data-rest
${springdoc.version}
-
-
-
-
+
+
+
org.springframework.restdocs
spring-restdocs-mockmvc
test
@@ -71,8 +64,7 @@
org.springframework.restdocs
spring-restdocs-restassured
test
-
-
+
org.springdoc
@@ -119,8 +111,8 @@
-
-
+
+
kotlin-maven-plugin
org.jetbrains.kotlin
${kotlin.version}
@@ -162,21 +154,12 @@
application.properties
data.sql
- schema.sql
+ schema.sql
-
- 1.8
- 5.2.10.Final
- 1.5.2
- 1.5.6
- 1.4.0
- ${project.build.directory}/generated-snippets
-
-
integration
@@ -224,4 +207,12 @@
+
+ 5.2.10.Final
+ 1.5.2
+ 1.5.6
+ 1.4.0
+ ${project.build.directory}/generated-snippets
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-swagger-jwt/pom.xml b/spring-boot-modules/spring-boot-swagger-jwt/pom.xml
index d71d7342ce..c296b06388 100644
--- a/spring-boot-modules/spring-boot-swagger-jwt/pom.xml
+++ b/spring-boot-modules/spring-boot-swagger-jwt/pom.xml
@@ -3,6 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-swagger-jwt
+ 0.1.0-SNAPSHOT
+ spring-boot-swagger-jwt
+ jar
+ Module For Spring Boot Swagger UI
com.baeldung.spring-boot-modules
@@ -10,13 +15,7 @@
1.0.0-SNAPSHOT
../
-
- spring-boot-swagger-jwt
- 0.1.0-SNAPSHOT
- spring-boot-swagger-jwt
- jar
-
- Module For Spring Boot Swagger UI
+
org.springframework.boot
@@ -25,7 +24,7 @@
io.springfox
springfox-boot-starter
- 3.0.0
+ ${springfox.version}
@@ -38,4 +37,8 @@
-
+
+ 3.0.0
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-swagger/pom.xml b/spring-boot-modules/spring-boot-swagger/pom.xml
index 4e0180460d..a9d8a943e4 100644
--- a/spring-boot-modules/spring-boot-swagger/pom.xml
+++ b/spring-boot-modules/spring-boot-swagger/pom.xml
@@ -3,6 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-swagger
+ 0.1.0-SNAPSHOT
+ spring-boot-swagger
+ jar
+ Module For Spring Boot Swagger
com.baeldung.spring-boot-modules
@@ -10,13 +15,7 @@
1.0.0-SNAPSHOT
../
-
- spring-boot-swagger
- 0.1.0-SNAPSHOT
- spring-boot-swagger
- jar
-
- Module For Spring Boot Swagger
+
org.springframework.boot
@@ -25,7 +24,7 @@
io.springfox
springfox-boot-starter
- 3.0.0
+ ${springfox.version}
@@ -38,4 +37,8 @@
-
+
+ 3.0.0
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/README.md b/spring-boot-modules/spring-boot-testing/README.md
index 1b7ad661c6..058c78c9bb 100644
--- a/spring-boot-modules/spring-boot-testing/README.md
+++ b/spring-boot-modules/spring-boot-testing/README.md
@@ -15,3 +15,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Testing Spring Boot @ConfigurationProperties](https://www.baeldung.com/spring-boot-testing-configurationproperties)
- [Prevent ApplicationRunner or CommandLineRunner Beans From Executing During Junit Testing](https://www.baeldung.com/spring-junit-prevent-runner-beans-testing-execution)
- [Testing in Spring Boot](https://www.baeldung.com/spring-boot-testing)
+- [Fixing the NoSuchMethodError JUnit Error](https://www.baeldung.com/junit-nosuchmethoderror)
diff --git a/spring-boot-modules/spring-boot-testing/pom.xml b/spring-boot-modules/spring-boot-testing/pom.xml
index 50a1ace2fa..1860818b7b 100644
--- a/spring-boot-modules/spring-boot-testing/pom.xml
+++ b/spring-boot-modules/spring-boot-testing/pom.xml
@@ -1,8 +1,12 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot-testing
+ war
+ spring-boot-testing
+ This is simple boot application for demonstrating testing features.
com.baeldung.spring-boot-modules
@@ -11,12 +15,6 @@
../
- spring-boot-testing
- war
-
- spring-boot-testing
- This is simple boot application for demonstrating testing features.
-
org.springframework.boot
@@ -62,7 +60,6 @@
-
it.ozimov
@@ -77,20 +74,17 @@
${spock.version}
test
-
org.spockframework
spock-spring
${spock.version}
test
-
io.rest-assured
rest-assured
test
-
@@ -101,14 +95,11 @@
true
-
-
org.apache.maven.plugins
maven-war-plugin
-
pl.project13.maven
git-commit-id-plugin
@@ -134,7 +125,6 @@
${project.build.outputDirectory}/git.properties
-
org.codehaus.gmavenplus
gmavenplus-plugin
@@ -159,4 +149,4 @@
0.7.2
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-vue/pom.xml b/spring-boot-modules/spring-boot-vue/pom.xml
index 9973246115..3d3d51797c 100644
--- a/spring-boot-modules/spring-boot-vue/pom.xml
+++ b/spring-boot-modules/spring-boot-vue/pom.xml
@@ -1,7 +1,13 @@
-
+
4.0.0
+ spring-boot-vue
+ 0.0.1-SNAPSHOT
+ jar
+ spring-boot-vue
+ Demo project for Spring Boot Vue project
com.baeldung.spring-boot-modules
@@ -10,25 +16,16 @@
../
- spring-boot-vue
- 0.0.1-SNAPSHOT
- jar
-
- spring-boot-vue
- Demo project for Spring Boot Vue project
-
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-test
test
-
org.springframework.boot
@@ -45,4 +42,4 @@
-
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-xml/pom.xml b/spring-boot-modules/spring-boot-xml/pom.xml
index e1ddd8f437..b3fd343e4f 100644
--- a/spring-boot-modules/spring-boot-xml/pom.xml
+++ b/spring-boot-modules/spring-boot-xml/pom.xml
@@ -1,7 +1,10 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ spring-boot-xml
+
parent-boot-2
com.baeldung
@@ -9,10 +12,6 @@
../../parent-boot-2
- 4.0.0
-
- spring-boot-xml
-
org.springframework.boot
diff --git a/spring-boot-modules/spring-boot/pom.xml b/spring-boot-modules/spring-boot/pom.xml
index 9023ae92f3..8df16a1f9c 100644
--- a/spring-boot-modules/spring-boot/pom.xml
+++ b/spring-boot-modules/spring-boot/pom.xml
@@ -3,6 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-boot
+ 0.0.1-SNAPSHOT
+ war
+ spring-boot
+ This is simple boot application for Spring boot actuator test
com.baeldung.spring-boot-modules
@@ -11,13 +16,6 @@
../
- spring-boot
- 0.0.1-SNAPSHOT
- war
-
- spring-boot
- This is simple boot application for Spring boot actuator test
-
org.springframework.boot
@@ -47,12 +45,10 @@
org.springframework.boot
spring-boot-starter-actuator
-
org.springframework.boot
spring-boot-starter-tomcat
-
org.springframework.boot
spring-boot-starter-test
@@ -69,17 +65,14 @@
-
io.dropwizard.metrics
metrics-core
-
com.h2database
h2
-
org.springframework.boot
spring-boot-starter
@@ -89,25 +82,21 @@
json-path
test
-
com.google.guava
guava
${guava.version}
-
org.apache.tomcat
tomcat-servlet-api
${tomee-servlet-api.version}
provided
-
org.apache.activemq
artemis-server
-
com.rometools
rome
@@ -123,14 +112,11 @@
true
-
-
org.apache.maven.plugins
maven-war-plugin
-
org.apache.maven.plugins
maven-resources-plugin
@@ -142,7 +128,6 @@
-
@@ -191,4 +176,4 @@
@
-
+
\ No newline at end of file
diff --git a/spring-boot-rest-2/README.md b/spring-boot-rest-2/README.md
new file mode 100644
index 0000000000..f09159198c
--- /dev/null
+++ b/spring-boot-rest-2/README.md
@@ -0,0 +1,3 @@
+### Relevant Article:
+
+- [Get All Endpoints in Spring Boot](https://www.baeldung.com/spring-boot-get-all-endpoints)
diff --git a/spring-boot-rest-2/pom.xml b/spring-boot-rest-2/pom.xml
new file mode 100644
index 0000000000..d74c393f27
--- /dev/null
+++ b/spring-boot-rest-2/pom.xml
@@ -0,0 +1,44 @@
+
+
+ 4.0.0
+ com.baeldung.web
+ spring-boot-rest-2
+ spring-boot-rest-2
+ war
+ Spring Boot Rest Module
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ io.springfox
+ springfox-boot-starter
+ 3.0.0
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/SpringBootRestApplication.java b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/SpringBootRestApplication.java
new file mode 100644
index 0000000000..510e208f9e
--- /dev/null
+++ b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/SpringBootRestApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.endpoint;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootRestApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootRestApplication.class, args);
+ }
+}
diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/controller/HelloController.java b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/controller/HelloController.java
new file mode 100644
index 0000000000..732b298981
--- /dev/null
+++ b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/controller/HelloController.java
@@ -0,0 +1,15 @@
+package com.baeldung.endpoint.controller;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HelloController {
+
+ @GetMapping("/hello")
+ public ResponseEntity hello() {
+ return ResponseEntity.ok("hello baeldung");
+ }
+
+}
diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/AnnotationDrivenEndpointsListener.java b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/AnnotationDrivenEndpointsListener.java
new file mode 100644
index 0000000000..c57f6b5ecd
--- /dev/null
+++ b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/AnnotationDrivenEndpointsListener.java
@@ -0,0 +1,27 @@
+package com.baeldung.endpoint.listener;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
+
+import java.util.Map;
+
+@Configuration
+public class AnnotationDrivenEndpointsListener {
+ private final Logger LOGGER = LoggerFactory.getLogger("AnnotationDrivenEndpointsListener.class");
+
+ @EventListener
+ public void handleContextRefresh(ContextRefreshedEvent event) {
+ ApplicationContext applicationContext = event.getApplicationContext();
+ RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext
+ .getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
+ Map map = requestMappingHandlerMapping.getHandlerMethods();
+ map.forEach((key, value) -> LOGGER.info("{} {}", key, value));
+ }
+}
diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/EndpointsListener.java b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/EndpointsListener.java
new file mode 100644
index 0000000000..ae00fc3927
--- /dev/null
+++ b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/listener/EndpointsListener.java
@@ -0,0 +1,27 @@
+package com.baeldung.endpoint.listener;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
+
+import java.util.Map;
+
+@Configuration
+public class EndpointsListener implements ApplicationListener {
+ private final Logger LOGGER = LoggerFactory.getLogger("EndpointsListener.class");
+
+ @Override
+ public void onApplicationEvent(ContextRefreshedEvent event) {
+ ApplicationContext applicationContext = event.getApplicationContext();
+ RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext
+ .getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
+ Map map = requestMappingHandlerMapping.getHandlerMethods();
+ map.forEach((key, value) -> LOGGER.info("{} {}", key, value));
+ }
+}
diff --git a/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java
new file mode 100644
index 0000000000..bd258122cd
--- /dev/null
+++ b/spring-boot-rest-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java
@@ -0,0 +1,21 @@
+package com.baeldung.endpoint.swagger;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+public class SpringFoxConfig {
+
+ @Bean
+ public Docket api() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .select()
+ .apis(RequestHandlerSelectors.any())
+ .paths(PathSelectors.any())
+ .build();
+ }
+}
diff --git a/spring-boot-rest-2/src/main/resources/application.properties b/spring-boot-rest-2/src/main/resources/application.properties
new file mode 100644
index 0000000000..5046c9660f
--- /dev/null
+++ b/spring-boot-rest-2/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+
+management.endpoints.web.exposure.include=mappings
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/config/MyCustomErrorAttributes.java b/spring-boot-rest/src/main/java/com/baeldung/web/config/MyCustomErrorAttributes.java
index 1948d5552f..5e776c0e29 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/web/config/MyCustomErrorAttributes.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/config/MyCustomErrorAttributes.java
@@ -2,6 +2,7 @@ package com.baeldung.web.config;
import java.util.Map;
+import org.springframework.boot.web.error.ErrorAttributeOptions;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest;
@@ -10,8 +11,8 @@ import org.springframework.web.context.request.WebRequest;
public class MyCustomErrorAttributes extends DefaultErrorAttributes {
@Override
- public Map getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
- Map errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);
+ public Map getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
+ Map errorAttributes = super.getErrorAttributes(webRequest, options);
errorAttributes.put("locale", webRequest.getLocale()
.toString());
errorAttributes.remove("error");
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/config/MyErrorController.java b/spring-boot-rest/src/main/java/com/baeldung/web/config/MyErrorController.java
index cf3f9c4dbd..05150716f6 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/web/config/MyErrorController.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/config/MyErrorController.java
@@ -4,7 +4,7 @@ import java.util.Map;
import javax.servlet.http.HttpServletRequest;
-import org.springframework.boot.autoconfigure.web.ErrorProperties;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.http.HttpStatus;
@@ -16,13 +16,13 @@ import org.springframework.web.bind.annotation.RequestMapping;
@Component
public class MyErrorController extends BasicErrorController {
- public MyErrorController(ErrorAttributes errorAttributes) {
- super(errorAttributes, new ErrorProperties());
+ public MyErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties) {
+ super(errorAttributes, serverProperties.getError());
}
@RequestMapping(produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity> xmlError(HttpServletRequest request) {
- Map body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.APPLICATION_XML));
+ Map body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.APPLICATION_XML));
body.put("xmlkey", "the XML response is different!");
HttpStatus status = getStatus(request);
return new ResponseEntity<>(body, status);
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java b/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java
index 2b7dc1eee1..79d3b972ff 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java
@@ -50,7 +50,7 @@ public class CustomerController {
}
Link link = linkTo(methodOn(CustomerController.class).getOrdersForCustomer(customerId)).withSelfRel();
- CollectionModel result = new CollectionModel<>(orders, link);
+ CollectionModel result = CollectionModel.of(orders, link);
return result;
}
@@ -72,7 +72,7 @@ public class CustomerController {
}
Link link = linkTo(CustomerController.class).withSelfRel();
- CollectionModel result = new CollectionModel<>(allCustomers, link);
+ CollectionModel result = CollectionModel.of(allCustomers, link);
return result;
}
diff --git a/spring-boot-rest/src/main/resources/application.properties b/spring-boot-rest/src/main/resources/application.properties
index 176deb4f49..1e985feed9 100644
--- a/spring-boot-rest/src/main/resources/application.properties
+++ b/spring-boot-rest/src/main/resources/application.properties
@@ -3,3 +3,4 @@ server.servlet.context-path=/spring-boot-rest
### Spring Boot default error handling configurations
#server.error.whitelabel.enabled=false
#server.error.include-stacktrace=always
+server.error.include-message=always
diff --git a/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java b/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java
index a277d5a685..bb84b88bd9 100644
--- a/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java
+++ b/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java
@@ -33,7 +33,7 @@ public class ExamplePostControllerRequestIntegrationTest {
@Before
public void preTest() {
- MockitoAnnotations.initMocks(this);
+ MockitoAnnotations.openMocks(this);
mockMvc = MockMvcBuilders
.standaloneSetup(exampleController)
.build();
diff --git a/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java b/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java
index f8c70b0f4a..efc3310812 100644
--- a/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java
+++ b/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java
@@ -34,7 +34,7 @@ public class ExamplePostControllerResponseIntegrationTest {
@Before
public void preTest() {
- MockitoAnnotations.initMocks(this);
+ MockitoAnnotations.openMocks(this);
mockMvc = MockMvcBuilders
.standaloneSetup(exampleController)
.build();
diff --git a/spring-boot-rest/src/test/java/com/baeldung/web/StudentControllerIntegrationTest.java b/spring-boot-rest/src/test/java/com/baeldung/web/StudentControllerIntegrationTest.java
index 54ac69ebeb..d2d9181797 100644
--- a/spring-boot-rest/src/test/java/com/baeldung/web/StudentControllerIntegrationTest.java
+++ b/spring-boot-rest/src/test/java/com/baeldung/web/StudentControllerIntegrationTest.java
@@ -8,12 +8,10 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.web.server.MediaTypeNotSupportedStatusException;
import com.baeldung.web.controller.students.Student;
import com.fasterxml.jackson.databind.ObjectMapper;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
diff --git a/spring-caching-2/README.md b/spring-caching-2/README.md
new file mode 100644
index 0000000000..1375b5e8e4
--- /dev/null
+++ b/spring-caching-2/README.md
@@ -0,0 +1,3 @@
+### Relevant articles:
+
+- [Spring Boot Cache with Redis](https://www.baeldung.com/spring-boot-redis-cache)
diff --git a/spring-caching-2/pom.xml b/spring-caching-2/pom.xml
new file mode 100644
index 0000000000..6bb828e8bf
--- /dev/null
+++ b/spring-caching-2/pom.xml
@@ -0,0 +1,66 @@
+
+
+ 4.0.0
+ spring-caching-2
+ 0.1-SNAPSHOT
+ spring-caching-2
+ war
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+ 0.7.3
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.data
+ spring-data-commons
+
+
+ com.h2database
+ h2
+ runtime
+
+
+ org.projectlombok
+ lombok
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ it.ozimov
+ embedded-redis
+ ${embedded.redis.version}
+
+
+ org.slf4j
+ slf4j-simple
+
+
+ test
+
+
+
diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/CacheConfig.java b/spring-caching-2/src/main/java/com/baeldung/caching/redis/CacheConfig.java
new file mode 100644
index 0000000000..89bdc2779d
--- /dev/null
+++ b/spring-caching-2/src/main/java/com/baeldung/caching/redis/CacheConfig.java
@@ -0,0 +1,33 @@
+package com.baeldung.caching.redis;
+
+import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+
+import java.time.Duration;
+
+import static org.springframework.data.redis.serializer.RedisSerializationContext.SerializationPair;
+
+@Configuration
+public class CacheConfig {
+
+ @Bean
+ public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
+ return (builder) -> builder
+ .withCacheConfiguration("itemCache",
+ RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)))
+ .withCacheConfiguration("customerCache",
+ RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)));
+ }
+
+ @Bean
+ public RedisCacheConfiguration cacheConfiguration() {
+ return RedisCacheConfiguration.defaultCacheConfig()
+ .entryTtl(Duration.ofMinutes(60))
+ .disableCachingNullValues()
+ .serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
+ }
+
+}
diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/Item.java b/spring-caching-2/src/main/java/com/baeldung/caching/redis/Item.java
new file mode 100644
index 0000000000..d6115a4833
--- /dev/null
+++ b/spring-caching-2/src/main/java/com/baeldung/caching/redis/Item.java
@@ -0,0 +1,21 @@
+package com.baeldung.caching.redis;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+public class Item implements Serializable {
+
+ @Id
+ String id;
+
+ String description;
+}
diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemController.java b/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemController.java
new file mode 100644
index 0000000000..63122c5938
--- /dev/null
+++ b/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemController.java
@@ -0,0 +1,19 @@
+package com.baeldung.caching.redis;
+
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@AllArgsConstructor
+public class ItemController {
+
+ private final ItemService itemService;
+
+ @GetMapping("/item/{id}")
+ public Item getItemById(@PathVariable String id) {
+ return itemService.getItemForId(id);
+ }
+
+}
diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemRepository.java b/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemRepository.java
new file mode 100644
index 0000000000..d6222de621
--- /dev/null
+++ b/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemRepository.java
@@ -0,0 +1,6 @@
+package com.baeldung.caching.redis;
+
+import org.springframework.data.repository.CrudRepository;
+
+public interface ItemRepository extends CrudRepository- {
+}
diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemService.java b/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemService.java
new file mode 100644
index 0000000000..6a59c7d74e
--- /dev/null
+++ b/spring-caching-2/src/main/java/com/baeldung/caching/redis/ItemService.java
@@ -0,0 +1,19 @@
+package com.baeldung.caching.redis;
+
+import lombok.AllArgsConstructor;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class ItemService {
+
+ private final ItemRepository itemRepository;
+
+ @Cacheable(value = "itemCache")
+ public Item getItemForId(String id) {
+ return itemRepository.findById(id)
+ .orElseThrow(RuntimeException::new);
+ }
+
+}
diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/redis/RedisCacheApplication.java b/spring-caching-2/src/main/java/com/baeldung/caching/redis/RedisCacheApplication.java
new file mode 100644
index 0000000000..3b337def01
--- /dev/null
+++ b/spring-caching-2/src/main/java/com/baeldung/caching/redis/RedisCacheApplication.java
@@ -0,0 +1,14 @@
+package com.baeldung.caching.redis;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+
+@SpringBootApplication
+@EnableCaching
+public class RedisCacheApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(RedisCacheApplication.class, args);
+ }
+}
diff --git a/spring-caching-2/src/main/resources/application.properties b/spring-caching-2/src/main/resources/application.properties
new file mode 100644
index 0000000000..080185b620
--- /dev/null
+++ b/spring-caching-2/src/main/resources/application.properties
@@ -0,0 +1,12 @@
+spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
+spring.datasource.driverClassName=org.h2.Driver
+spring.datasource.username=sa
+spring.datasource.password=
+
+# Enabling H2 Console
+spring.h2.console.enabled=true
+spring.h2.console.path=/h2
+
+# Connection details
+#spring.redis.host=localhost
+#spring.redis.port=6379
diff --git a/spring-caching-2/src/main/resources/data.sql b/spring-caching-2/src/main/resources/data.sql
new file mode 100644
index 0000000000..74e359b877
--- /dev/null
+++ b/spring-caching-2/src/main/resources/data.sql
@@ -0,0 +1 @@
+INSERT INTO ITEM VALUES('abc','ITEM1');
\ No newline at end of file
diff --git a/spring-caching-2/src/test/java/com/baeldung/caching/redis/ItemServiceCachingIntegrationTest.java b/spring-caching-2/src/test/java/com/baeldung/caching/redis/ItemServiceCachingIntegrationTest.java
new file mode 100644
index 0000000000..71a9729efd
--- /dev/null
+++ b/spring-caching-2/src/test/java/com/baeldung/caching/redis/ItemServiceCachingIntegrationTest.java
@@ -0,0 +1,84 @@
+package com.baeldung.caching.redis;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
+import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import redis.embedded.RedisServer;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.util.Optional;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+@Import({ CacheConfig.class, ItemService.class })
+@ExtendWith(SpringExtension.class)
+@ImportAutoConfiguration(classes = { CacheAutoConfiguration.class, RedisAutoConfiguration.class })
+@EnableCaching
+class ItemServiceCachingIntegrationTest {
+
+ private static final String AN_ID = "id-1";
+ private static final String A_DESCRIPTION = "an item";
+
+ @MockBean
+ private ItemRepository mockItemRepository;
+
+ @Autowired
+ private ItemService itemService;
+
+ @Autowired
+ private CacheManager cacheManager;
+
+ @Test
+ void givenRedisCaching_whenFindItemById_thenItemReturnedFromCache() {
+ Item anItem = new Item(AN_ID, A_DESCRIPTION);
+ given(mockItemRepository.findById(AN_ID))
+ .willReturn(Optional.of(anItem));
+
+ Item itemCacheMiss = itemService.getItemForId(AN_ID);
+ Item itemCacheHit = itemService.getItemForId(AN_ID);
+
+ assertThat(itemCacheMiss).isEqualTo(anItem);
+ assertThat(itemCacheHit).isEqualTo(anItem);
+
+ verify(mockItemRepository, times(1)).findById(AN_ID);
+ assertThat(itemFromCache()).isEqualTo(anItem);
+ }
+
+ private Object itemFromCache() {
+ return cacheManager.getCache("itemCache").get(AN_ID).get();
+ }
+
+ @TestConfiguration
+ static class EmbeddedRedisConfiguration {
+
+ private final RedisServer redisServer;
+
+ public EmbeddedRedisConfiguration() {
+ this.redisServer = new RedisServer();
+ }
+
+ @PostConstruct
+ public void startRedis() {
+ redisServer.start();
+ }
+
+ @PreDestroy
+ public void stopRedis() {
+ this.redisServer.stop();
+ }
+ }
+
+}
diff --git a/spring-caching-2/src/test/resources/logback-test.xml b/spring-caching-2/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..215403c6a5
--- /dev/null
+++ b/spring-caching-2/src/test/resources/logback-test.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/spring-caching/pom.xml b/spring-caching/pom.xml
index f58be35a76..c620072604 100644
--- a/spring-caching/pom.xml
+++ b/spring-caching/pom.xml
@@ -71,15 +71,9 @@
org.springframework.boot
spring-boot-starter-data-jpa
-
- net.bytebuddy
- byte-buddy
- 1.10.11
-
org.springframework.data
spring-data-commons
- 2.3.0.RELEASE
diff --git a/spring-cloud-bus/pom.xml b/spring-cloud-bus/pom.xml
index 15eed8dcf0..82d0bccd0b 100644
--- a/spring-cloud-bus/pom.xml
+++ b/spring-cloud-bus/pom.xml
@@ -34,8 +34,7 @@
- Hoxton.SR4
- 2.3.3.RELEASE
+ 2020.0.0
diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml
index c0e452afaf..ac717e85da 100644
--- a/spring-cloud/pom.xml
+++ b/spring-cloud/pom.xml
@@ -44,6 +44,7 @@
spring-cloud-circuit-breaker
spring-cloud-eureka-self-preservation
+ spring-cloud-sentinel
@@ -77,7 +78,7 @@
- Hoxton.SR4
+ 2020.0.1
2.2.3.RELEASE
2.2.3.RELEASE
1.4.7.RELEASE
diff --git a/spring-cloud/spring-cloud-bootstrap/order-service/pom.xml b/spring-cloud/spring-cloud-bootstrap/order-service/pom.xml
index a32bd5a2d3..2ebc673ef4 100644
--- a/spring-cloud/spring-cloud-bootstrap/order-service/pom.xml
+++ b/spring-cloud/spring-cloud-bootstrap/order-service/pom.xml
@@ -112,7 +112,6 @@
- 1.8
2.6
0.0.2
1.8
diff --git a/spring-cloud/spring-cloud-config/docker/Dockerfile b/spring-cloud/spring-cloud-config/docker/Dockerfile
deleted file mode 100644
index bdb37abf80..0000000000
--- a/spring-cloud/spring-cloud-config/docker/Dockerfile
+++ /dev/null
@@ -1,4 +0,0 @@
-FROM alpine:edge
-MAINTAINER baeldung.com
-RUN apk add --no-cache openjdk8
-COPY files/UnlimitedJCEPolicyJDK8/* /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/
diff --git a/spring-cloud/spring-cloud-config/docker/Dockerfile.client b/spring-cloud/spring-cloud-config/docker/Dockerfile.client
deleted file mode 100644
index 5fbc0b98c0..0000000000
--- a/spring-cloud/spring-cloud-config/docker/Dockerfile.client
+++ /dev/null
@@ -1,6 +0,0 @@
-FROM alpine-java:base
-MAINTAINER baeldung.com
-RUN apk --no-cache add netcat-openbsd
-COPY files/config-client.jar /opt/spring-cloud/lib/
-COPY files/config-client-entrypoint.sh /opt/spring-cloud/bin/
-RUN chmod 755 /opt/spring-cloud/bin/config-client-entrypoint.sh
diff --git a/spring-cloud/spring-cloud-config/docker/Dockerfile.server b/spring-cloud/spring-cloud-config/docker/Dockerfile.server
deleted file mode 100644
index 4f7bd751e8..0000000000
--- a/spring-cloud/spring-cloud-config/docker/Dockerfile.server
+++ /dev/null
@@ -1,9 +0,0 @@
-FROM alpine-java:base
-MAINTAINER baeldung.com
-COPY files/config-server.jar /opt/spring-cloud/lib/
-ENV SPRING_APPLICATION_JSON='{"spring": {"cloud": {"config": {"server": \
- {"git": {"uri": "/var/lib/spring-cloud/config-repo", "clone-on-start": true}}}}}}'
-ENTRYPOINT ["/usr/bin/java"]
-CMD ["-jar", "/opt/spring-cloud/lib/config-server.jar"]
-VOLUME /var/lib/spring-cloud/config-repo
-EXPOSE 8888
diff --git a/spring-cloud/spring-cloud-config/docker/config-client-entrypoint.sh b/spring-cloud/spring-cloud-config/docker/config-client-entrypoint.sh
deleted file mode 100644
index 12352119fa..0000000000
--- a/spring-cloud/spring-cloud-config/docker/config-client-entrypoint.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-while ! nc -z config-server 8888 ; do
- echo "Waiting for upcoming Config Server"
- sleep 2
-done
-
-java -jar /opt/spring-cloud/lib/config-client.jar
diff --git a/spring-cloud/spring-cloud-config/docker/docker-compose.scale.yml b/spring-cloud/spring-cloud-config/docker/docker-compose.scale.yml
deleted file mode 100644
index f74153bea3..0000000000
--- a/spring-cloud/spring-cloud-config/docker/docker-compose.scale.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-version: '2'
-services:
- config-server:
- build:
- context: .
- dockerfile: Dockerfile.server
- image: config-server:latest
- expose:
- - 8888
- networks:
- - spring-cloud-network
- volumes:
- - spring-cloud-config-repo:/var/lib/spring-cloud/config-repo
- logging:
- driver: json-file
- config-client:
- build:
- context: .
- dockerfile: Dockerfile.client
- image: config-client:latest
- entrypoint: /opt/spring-cloud/bin/config-client-entrypoint.sh
- environment:
- SPRING_APPLICATION_JSON: '{"spring": {"cloud": {"config": {"uri": "http://config-server:8888"}}}}'
- expose:
- - 8080
- ports:
- - 8080
- networks:
- - spring-cloud-network
- links:
- - config-server:config-server
- depends_on:
- - config-server
- logging:
- driver: json-file
-networks:
- spring-cloud-network:
- driver: bridge
-volumes:
- spring-cloud-config-repo:
- external: true
diff --git a/spring-cloud/spring-cloud-config/docker/docker-compose.yml b/spring-cloud/spring-cloud-config/docker/docker-compose.yml
deleted file mode 100644
index 74c71b651c..0000000000
--- a/spring-cloud/spring-cloud-config/docker/docker-compose.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-version: '2'
-services:
- config-server:
- container_name: config-server
- build:
- context: .
- dockerfile: Dockerfile.server
- image: config-server:latest
- expose:
- - 8888
- networks:
- - spring-cloud-network
- volumes:
- - spring-cloud-config-repo:/var/lib/spring-cloud/config-repo
- logging:
- driver: json-file
- config-client:
- container_name: config-client
- build:
- context: .
- dockerfile: Dockerfile.client
- image: config-client:latest
- entrypoint: /opt/spring-cloud/bin/config-client-entrypoint.sh
- environment:
- SPRING_APPLICATION_JSON: '{"spring": {"cloud": {"config": {"uri": "http://config-server:8888"}}}}'
- expose:
- - 8080
- ports:
- - 8080:8080
- networks:
- - spring-cloud-network
- links:
- - config-server:config-server
- depends_on:
- - config-server
- logging:
- driver: json-file
-networks:
- spring-cloud-network:
- driver: bridge
-volumes:
- spring-cloud-config-repo:
- external: true
diff --git a/spring-cloud/spring-cloud-connectors-heroku/pom.xml b/spring-cloud/spring-cloud-connectors-heroku/pom.xml
index e71e1350a2..d318aa3c64 100644
--- a/spring-cloud/spring-cloud-connectors-heroku/pom.xml
+++ b/spring-cloud/spring-cloud-connectors-heroku/pom.xml
@@ -35,11 +35,6 @@
org.postgresql
postgresql
-
- net.bytebuddy
- byte-buddy-dep
- ${bytebuddy.version}
-
com.h2database
h2
@@ -63,8 +58,6 @@
2.2.6.RELEASE
Hoxton.SR4
42.2.10
- 1.10.10
-
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-docker/README.md b/spring-cloud/spring-cloud-docker/README.md
new file mode 100644
index 0000000000..018d4ab1eb
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/README.md
@@ -0,0 +1,3 @@
+## Relevant Articles:
+
+- [Dockerizing a Spring Boot Application](https://www.baeldung.com/dockerizing-spring-boot-application)
diff --git a/spring-cloud/spring-cloud-docker/docker-compose-scale.yml b/spring-cloud/spring-cloud-docker/docker-compose-scale.yml
new file mode 100644
index 0000000000..9035a16d7e
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-compose-scale.yml
@@ -0,0 +1,23 @@
+version: '2'
+services:
+ message-server:
+ build:
+ context: docker-message-server
+ dockerfile: Dockerfile
+ image: message-server:latest
+ ports:
+ - 18800-18888:8888
+ networks:
+ - spring-cloud-network
+ product-server:
+ build:
+ context: docker-product-server
+ dockerfile: Dockerfile
+ image: product-server:latest
+ ports:
+ - 19900-19999:9999
+ networks:
+ - spring-cloud-network
+networks:
+ spring-cloud-network:
+ driver: bridge
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-docker/docker-compose.yml b/spring-cloud/spring-cloud-docker/docker-compose.yml
new file mode 100644
index 0000000000..d485f93631
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-compose.yml
@@ -0,0 +1,25 @@
+version: '2'
+services:
+ message-server:
+ container_name: message-server
+ build:
+ context: docker-message-server
+ dockerfile: Dockerfile
+ image: message-server:latest
+ ports:
+ - 18888:8888
+ networks:
+ - spring-cloud-network
+ product-server:
+ container_name: product-server
+ build:
+ context: docker-product-server
+ dockerfile: Dockerfile
+ image: product-server:latest
+ ports:
+ - 19999:9999
+ networks:
+ - spring-cloud-network
+networks:
+ spring-cloud-network:
+ driver: bridge
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-docker/docker-message-server/Dockerfile b/spring-cloud/spring-cloud-docker/docker-message-server/Dockerfile
new file mode 100644
index 0000000000..73f55c8923
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-message-server/Dockerfile
@@ -0,0 +1,4 @@
+FROM openjdk:8-jdk-alpine
+MAINTAINER baeldung.com
+COPY target/docker-message-server-1.0.0.jar message-server.jar
+ENTRYPOINT ["java","-jar","/message-server.jar"]
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-docker/docker-message-server/pom.xml b/spring-cloud/spring-cloud-docker/docker-message-server/pom.xml
new file mode 100644
index 0000000000..fafd291c00
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-message-server/pom.xml
@@ -0,0 +1,55 @@
+
+
+
+ 4.0.0
+ docker-message-server
+ docker-message-server
+ 1.0.0
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-docker
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+ org.hamcrest
+ hamcrest-core
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
diff --git a/spring-cloud/spring-cloud-docker/docker-message-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerMessageController.java b/spring-cloud/spring-cloud-docker/docker-message-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerMessageController.java
new file mode 100644
index 0000000000..71d630da8f
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-message-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerMessageController.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.cloud.config.docker;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class DockerMessageController {
+ @GetMapping("/messages")
+ public String getMessage() {
+ return "Hello from Docker!";
+ }
+}
diff --git a/spring-cloud/spring-cloud-docker/docker-message-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerServer.java b/spring-cloud/spring-cloud-docker/docker-message-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerServer.java
new file mode 100644
index 0000000000..38bd4d9541
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-message-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerServer.java
@@ -0,0 +1,11 @@
+package com.baeldung.spring.cloud.config.docker;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DockerServer {
+ public static void main(String[] args) {
+ SpringApplication.run(DockerServer.class, args);
+ }
+}
diff --git a/spring-cloud/spring-cloud-docker/docker-message-server/src/main/resources/application.properties b/spring-cloud/spring-cloud-docker/docker-message-server/src/main/resources/application.properties
new file mode 100644
index 0000000000..c4e658f9e2
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-message-server/src/main/resources/application.properties
@@ -0,0 +1 @@
+server.port=8888
diff --git a/spring-cloud/spring-cloud-docker/docker-product-server/Dockerfile b/spring-cloud/spring-cloud-docker/docker-product-server/Dockerfile
new file mode 100644
index 0000000000..80117e4ae1
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-product-server/Dockerfile
@@ -0,0 +1,4 @@
+FROM openjdk:8-jdk-alpine
+MAINTAINER baeldung.com
+COPY target/docker-product-server-1.0.0.jar product-server.jar
+ENTRYPOINT ["java","-jar","/product-server.jar"]
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-docker/docker-product-server/pom.xml b/spring-cloud/spring-cloud-docker/docker-product-server/pom.xml
new file mode 100644
index 0000000000..a5bd6c50ea
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-product-server/pom.xml
@@ -0,0 +1,55 @@
+
+
+
+ 4.0.0
+ docker-product-server
+ docker-product-server
+ 1.0.0
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-docker
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+ org.hamcrest
+ hamcrest-core
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
diff --git a/spring-cloud/spring-cloud-docker/docker-product-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerProductController.java b/spring-cloud/spring-cloud-docker/docker-product-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerProductController.java
new file mode 100644
index 0000000000..15781f763b
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-product-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerProductController.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.cloud.config.docker;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class DockerProductController {
+ @GetMapping("/products")
+ public String getMessage() {
+ return "A brand new product";
+ }
+}
diff --git a/spring-cloud/spring-cloud-docker/docker-product-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerServer.java b/spring-cloud/spring-cloud-docker/docker-product-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerServer.java
new file mode 100644
index 0000000000..38bd4d9541
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-product-server/src/main/java/com/baeldung/spring/cloud/config/docker/DockerServer.java
@@ -0,0 +1,11 @@
+package com.baeldung.spring.cloud.config.docker;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DockerServer {
+ public static void main(String[] args) {
+ SpringApplication.run(DockerServer.class, args);
+ }
+}
diff --git a/spring-cloud/spring-cloud-docker/docker-product-server/src/main/resources/application.properties b/spring-cloud/spring-cloud-docker/docker-product-server/src/main/resources/application.properties
new file mode 100644
index 0000000000..2c5fdc3545
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/docker-product-server/src/main/resources/application.properties
@@ -0,0 +1 @@
+server.port=9999
diff --git a/spring-cloud/spring-cloud-docker/pom.xml b/spring-cloud/spring-cloud-docker/pom.xml
new file mode 100644
index 0000000000..a9d978c9d4
--- /dev/null
+++ b/spring-cloud/spring-cloud-docker/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ 4.0.0
+ spring-cloud-docker
+ spring-cloud-docker
+ 1.0.0-SNAPSHOT
+ pom
+
+
+ com.baeldung.spring.cloud
+ spring-cloud
+ 1.0.0-SNAPSHOT
+
+
+
+ 8
+ 8
+
+
+
+ docker-message-server
+ docker-product-server
+
+
+
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/consumer/SpringContextTest.java b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/consumer/SpringContextTest.java
index d5f8180f20..ea8dd48e57 100644
--- a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/consumer/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/consumer/SpringContextTest.java
@@ -1,12 +1,9 @@
package com.baeldung.spring.cloud.hystrix.rest.consumer;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
-@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RestConsumerFeignApplication.class)
@WebAppConfiguration
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml b/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml
index 44e5bf2501..e96dc478a4 100644
--- a/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml
+++ b/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml
@@ -11,7 +11,7 @@
com.baeldung.spring.cloud
spring-cloud-hystrix
1.0.0-SNAPSHOT
- ..
+ ../
diff --git a/spring-cloud/spring-cloud-hystrix/rest-consumer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/consumer/SpringContextTest.java b/spring-cloud/spring-cloud-hystrix/rest-consumer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/consumer/SpringContextTest.java
index d3260a4517..d64f181c4f 100644
--- a/spring-cloud/spring-cloud-hystrix/rest-consumer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/consumer/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-hystrix/rest-consumer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/consumer/SpringContextTest.java
@@ -1,12 +1,9 @@
package com.baeldung.spring.cloud.hystrix.rest.consumer;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
-@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RestConsumerApplication.class)
@WebAppConfiguration
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-hystrix/rest-producer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/producer/SpringContextTest.java b/spring-cloud/spring-cloud-hystrix/rest-producer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/producer/SpringContextTest.java
index bd871fc1da..3a4185d125 100644
--- a/spring-cloud/spring-cloud-hystrix/rest-producer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/producer/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-hystrix/rest-producer/src/test/java/com/baeldung/spring/cloud/hystrix/rest/producer/SpringContextTest.java
@@ -1,11 +1,8 @@
package com.baeldung.spring.cloud.hystrix.rest.producer;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml
index 07de78a92e..8e543db326 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml
@@ -15,13 +15,6 @@
-
- org.springframework.cloud
- spring-cloud-dependencies
- ${spring-cloud-dependencies.version}
- pom
- import
-
org.springframework.cloud
spring-cloud-kubernetes-dependencies
@@ -57,6 +50,7 @@
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
+ 2.2.7.RELEASE
org.springframework.cloud
@@ -65,6 +59,7 @@
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
+ 2.2.7.RELEASE
@@ -89,8 +84,7 @@
- Hoxton.SR1
- 1.0.0.RELEASE
+ 1.1.8.RELEASE
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/com/baeldung/SpringContextTest.java
index 8539e2af45..e2596492ed 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,13 +1,10 @@
package com.baeldung;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.spring.cloud.kubernetes.client.Application;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml
index 5459b77682..5ab017043c 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml
@@ -14,13 +14,6 @@
-
- org.springframework.cloud
- spring-cloud-dependencies
- ${spring-cloud-dependencies.version}
- pom
- import
-
ch.qos.logback
logback-classic
@@ -70,7 +63,6 @@
- Finchley.SR2
1.2.3
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextTest.java
index 6e7f99fb0d..c8748e3213 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextTest.java
@@ -1,12 +1,9 @@
package com.baeldung.spring.cloud.kubernetes.travelagency;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/com/baeldung/SpringContextTest.java
index 837c24264c..004a82f38c 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,13 +1,10 @@
package com.baeldung;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.spring.cloud.kubernetes.backend.KubernetesBackendApplication;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = KubernetesBackendApplication.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/com/baeldung/SpringContextTest.java
index 1bf977a606..c28bc1394a 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,13 +1,10 @@
package com.baeldung;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.spring.cloud.kubernetes.frontend.KubernetesFrontendApplication;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = KubernetesFrontendApplication.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml
index f0d34d2231..16e718a3be 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml
@@ -41,9 +41,4 @@
-
- UTF-8
- UTF-8
-
-
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/test/java/com/baeldung/SpringContextTest.java
index 7c605567d8..2cf2e053cf 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,12 +1,9 @@
package com.baeldung;
import com.baeldung.liveness.Application;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml
index 8bfd4d305d..0ee40b6504 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml
@@ -41,9 +41,4 @@
-
- UTF-8
- UTF-8
-
-
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/test/java/com/baeldung/SpringContextTest.java
index 59802d220a..136c7aad7f 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,12 +1,9 @@
package com.baeldung;
import com.baeldung.readiness.Application;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-kubernetes/pom.xml b/spring-cloud/spring-cloud-kubernetes/pom.xml
index 44c429d8f5..7e494b61d9 100644
--- a/spring-cloud/spring-cloud-kubernetes/pom.xml
+++ b/spring-cloud/spring-cloud-kubernetes/pom.xml
@@ -15,6 +15,18 @@
../../parent-boot-2
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud-dependencies.version}
+ pom
+ import
+
+
+
+
kubernetes-minikube/demo-frontend
kubernetes-minikube/demo-backend
@@ -25,6 +37,6 @@
- 2.3.3.RELEASE
+ 2020.0.1
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-openfeign/README.md b/spring-cloud/spring-cloud-openfeign/README.md
index 735903db72..bcfd769d0c 100644
--- a/spring-cloud/spring-cloud-openfeign/README.md
+++ b/spring-cloud/spring-cloud-openfeign/README.md
@@ -2,3 +2,4 @@
- [Introduction to Spring Cloud OpenFeign](https://www.baeldung.com/spring-cloud-openfeign)
- [Differences Between Netflix Feign and OpenFeign](https://www.baeldung.com/netflix-feign-vs-openfeign)
+- [File Upload With Open Feign](https://www.baeldung.com/java-feign-file-upload)
diff --git a/spring-cloud/spring-cloud-openfeign/pom.xml b/spring-cloud/spring-cloud-openfeign/pom.xml
index c1f3f2dc30..bdde46fe96 100644
--- a/spring-cloud/spring-cloud-openfeign/pom.xml
+++ b/spring-cloud/spring-cloud-openfeign/pom.xml
@@ -37,12 +37,24 @@
io.github.openfeign
feign-okhttp
-
+
org.springframework.boot
spring-boot-starter-web
+
+
+ io.github.openfeign.form
+ feign-form
+ 3.8.0
+
+
+ io.github.openfeign.form
+ feign-form-spring
+ 3.8.0
+
+
org.springframework.boot
spring-boot-starter-test
diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java
new file mode 100644
index 0000000000..943134213a
--- /dev/null
+++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java
@@ -0,0 +1,22 @@
+package com.baeldung.cloud.openfeign.fileupload.config;
+
+import org.springframework.beans.factory.ObjectFactory;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.cloud.openfeign.support.SpringEncoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.client.RestTemplate;
+
+import feign.codec.Encoder;
+import feign.form.spring.SpringFormEncoder;
+
+public class FeignSupportConfig {
+ @Bean
+ public Encoder multipartFormEncoder() {
+ return new SpringFormEncoder(new SpringEncoder(new ObjectFactory() {
+ @Override
+ public HttpMessageConverters getObject() {
+ return new HttpMessageConverters(new RestTemplate().getMessageConverters());
+ }
+ }));
+ }
+}
diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java
new file mode 100644
index 0000000000..ebdf7ff6c8
--- /dev/null
+++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java
@@ -0,0 +1,28 @@
+package com.baeldung.cloud.openfeign.fileupload.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baeldung.cloud.openfeign.fileupload.service.UploadService;
+
+@RestController
+public class FileController {
+
+ @Autowired
+ private UploadService service;
+
+ @PostMapping(value = "/upload")
+ public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) {
+ return service.uploadFile(file);
+ }
+
+ @PostMapping(value = "/upload-mannual-client")
+ public boolean handleFileUploadWithManualClient(
+ @RequestPart(value = "file") MultipartFile file) {
+ return service.uploadFileWithManualClient(file);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java
new file mode 100644
index 0000000000..63d17130e9
--- /dev/null
+++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java
@@ -0,0 +1,15 @@
+package com.baeldung.cloud.openfeign.fileupload.service;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baeldung.cloud.openfeign.fileupload.config.FeignSupportConfig;
+
+@FeignClient(name = "file", url = "http://localhost:8081", configuration = FeignSupportConfig.class)
+public interface UploadClient {
+ @PostMapping(value = "/upload-file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ String fileUpload(@RequestPart(value = "file") MultipartFile file);
+}
diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java
new file mode 100644
index 0000000000..26e658a7f0
--- /dev/null
+++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadResource.java
@@ -0,0 +1,16 @@
+package com.baeldung.cloud.openfeign.fileupload.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import feign.Headers;
+import feign.Param;
+import feign.RequestLine;
+import feign.Response;
+
+public interface UploadResource {
+
+ @RequestLine("POST /upload-file")
+ @Headers("Content-Type: multipart/form-data")
+ Response uploadFile(@Param("file") MultipartFile file);
+
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java
new file mode 100644
index 0000000000..7dd7f5a89c
--- /dev/null
+++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java
@@ -0,0 +1,29 @@
+package com.baeldung.cloud.openfeign.fileupload.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import feign.Feign;
+import feign.Response;
+import feign.form.spring.SpringFormEncoder;
+
+@Service
+public class UploadService {
+ private static final String HTTP_FILE_UPLOAD_URL = "http://localhost:8081";
+
+ @Autowired
+ private UploadClient client;
+
+ public boolean uploadFileWithManualClient(MultipartFile file) {
+ UploadResource fileUploadResource = Feign.builder().encoder(new SpringFormEncoder())
+ .target(UploadResource.class, HTTP_FILE_UPLOAD_URL);
+ Response response = fileUploadResource.uploadFile(file);
+ return response.status() == 200;
+ }
+
+ public String uploadFile(MultipartFile file) {
+ return client.fileUpload(file);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-openfeign/src/main/resources/fileupload.txt b/spring-cloud/spring-cloud-openfeign/src/main/resources/fileupload.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java b/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java
new file mode 100644
index 0000000000..f558e07491
--- /dev/null
+++ b/spring-cloud/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/OpenFeignFileUploadLiveTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.cloud.openfeign;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baeldung.cloud.openfeign.fileupload.service.UploadService;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class OpenFeignFileUploadLiveTest {
+
+ @Autowired
+ private UploadService uploadService;
+
+ private static String FILE_NAME = "fileupload.txt";
+
+ @Test
+ public void whenFeignBuilder_thenFileUploadSuccess() throws IOException {
+ ClassLoader classloader = Thread.currentThread().getContextClassLoader();
+ File file = new File(classloader.getResource(FILE_NAME).getFile());
+ Assert.assertTrue(file.exists());
+ FileInputStream input = new FileInputStream(file);
+ MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain",
+ IOUtils.toByteArray(input));
+ Assert.assertTrue(uploadService.uploadFileWithManualClient(multipartFile));
+ }
+
+ @Test
+ public void whenAnnotatedFeignClient_thenFileUploadSuccess() throws IOException {
+ ClassLoader classloader = Thread.currentThread().getContextClassLoader();
+ File file = new File(classloader.getResource(FILE_NAME).getFile());
+ Assert.assertTrue(file.exists());
+ FileInputStream input = new FileInputStream(file);
+ MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain",
+ IOUtils.toByteArray(input));
+ String uploadFile = uploadService.uploadFile(multipartFile);
+ Assert.assertNotNull(uploadFile);
+ }
+}
diff --git a/spring-cloud/spring-cloud-ribbon-client/pom.xml b/spring-cloud/spring-cloud-ribbon-client/pom.xml
index 7bc7b51d51..2c9820d179 100644
--- a/spring-cloud/spring-cloud-ribbon-client/pom.xml
+++ b/spring-cloud/spring-cloud-ribbon-client/pom.xml
@@ -37,6 +37,7 @@
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
+ 2.2.7.RELEASE
org.springframework.boot
@@ -45,8 +46,7 @@
- Hoxton.SR4
- 2.3.3.RELEASE
+ 2020.0.1
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/SpringContextTest.java
index 949718e627..c62eb648c9 100644
--- a/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,13 +1,10 @@
package com.baeldung;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.spring.cloud.ribbon.client.ServerLocationApp;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = ServerLocationApp.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-security/auth-client/pom.xml b/spring-cloud/spring-cloud-security/auth-client/pom.xml
index 2852638c1a..c7606719f9 100644
--- a/spring-cloud/spring-cloud-security/auth-client/pom.xml
+++ b/spring-cloud/spring-cloud-security/auth-client/pom.xml
@@ -13,30 +13,15 @@
1.0.0-SNAPSHOT
-
-
-
- org.springframework.cloud
- spring-cloud-dependencies
- ${spring-cloud.version}
- pom
- import
-
-
-
-
org.springframework.boot
spring-boot-starter-web
-
- org.springframework.cloud
- spring-cloud-starter-oauth2
-
org.springframework.cloud
spring-cloud-starter-netflix-zuul
+ ${spring-cloud-starter-netflix-zuul.version}
org.springframework.boot
@@ -92,7 +77,7 @@
2.2.0
- Greenwich.SR1
+ 2.2.7.RELEASE
3.4.1
4.3.1
diff --git a/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/SpringContextTest.java
index 33e5530667..caf7c15f90 100644
--- a/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,13 +1,8 @@
package com.baeldung;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-import com.baeldung.CloudSite;
-
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = CloudSite.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/example/springoath2/Springoath2ApplicationIntegrationTest.java b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/example/springoath2/Springoath2ApplicationIntegrationTest.java
index 1c5198125e..de38ce82a8 100644
--- a/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/example/springoath2/Springoath2ApplicationIntegrationTest.java
+++ b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/example/springoath2/Springoath2ApplicationIntegrationTest.java
@@ -1,13 +1,10 @@
package com.baeldung.example.springoath2;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
import com.baeldung.CloudSite;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = CloudSite.class)
public class Springoath2ApplicationIntegrationTest {
diff --git a/spring-cloud/spring-cloud-security/auth-resource/pom.xml b/spring-cloud/spring-cloud-security/auth-resource/pom.xml
index 0a642250e7..d3f9eaf795 100644
--- a/spring-cloud/spring-cloud-security/auth-resource/pom.xml
+++ b/spring-cloud/spring-cloud-security/auth-resource/pom.xml
@@ -13,18 +13,6 @@
1.0.0-SNAPSHOT
-
-
-
- org.springframework.cloud
- spring-cloud-dependencies
- ${spring-cloud.version}
- pom
- import
-
-
-
-
org.springframework.boot
@@ -56,7 +44,6 @@
- Greenwich.SR1
1.0.10.RELEASE
diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/SpringContextTest.java
index cce93f2c3e..bf96f65993 100644
--- a/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,13 +1,8 @@
package com.baeldung;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-import com.baeldung.Application;
-
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/service/personservice/PersonserviceApplicationIntegrationTest.java b/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/service/personservice/PersonserviceApplicationIntegrationTest.java
index 3caa06ba4d..aa277e1419 100644
--- a/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/service/personservice/PersonserviceApplicationIntegrationTest.java
+++ b/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/service/personservice/PersonserviceApplicationIntegrationTest.java
@@ -1,11 +1,8 @@
package com.baeldung.service.personservice;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonserviceApplicationIntegrationTest {
diff --git a/spring-cloud/spring-cloud-security/auth-server/pom.xml b/spring-cloud/spring-cloud-security/auth-server/pom.xml
index f6d0861552..59ddedf1b2 100644
--- a/spring-cloud/spring-cloud-security/auth-server/pom.xml
+++ b/spring-cloud/spring-cloud-security/auth-server/pom.xml
@@ -31,14 +31,9 @@
spring-boot-starter-thymeleaf
- org.springframework.cloud
- spring-cloud-starter-oauth2
- ${spring-cloud-starter-oauth2.version}
+ org.springframework.security.oauth.boot
+ spring-security-oauth2-autoconfigure
-
- 2.1.2.RELEASE
-
-
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-security/auth-server/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-security/auth-server/src/test/java/com/baeldung/SpringContextTest.java
index d61a9c279f..ddda8fd625 100644
--- a/spring-cloud/spring-cloud-security/auth-server/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-security/auth-server/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,13 +1,8 @@
package com.baeldung;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-import com.baeldung.AuthServer;
-
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = AuthServer.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-security/pom.xml b/spring-cloud/spring-cloud-security/pom.xml
index f861b892c0..53b95380ed 100644
--- a/spring-cloud/spring-cloud-security/pom.xml
+++ b/spring-cloud/spring-cloud-security/pom.xml
@@ -14,6 +14,18 @@
../../parent-boot-2
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud-dependencies.version}
+ pom
+ import
+
+
+
+
auth-client
auth-resource
@@ -21,6 +33,7 @@
- 2.3.3.RELEASE
+ 2020.0.1
+
diff --git a/spring-cloud/spring-cloud-sentinel/README.md b/spring-cloud/spring-cloud-sentinel/README.md
new file mode 100644
index 0000000000..6b12fea608
--- /dev/null
+++ b/spring-cloud/spring-cloud-sentinel/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to Alibaba Sentinel](https://www.baeldung.com/java-sentinel-intro)
diff --git a/spring-cloud/spring-cloud-sentinel/pom.xml b/spring-cloud/spring-cloud-sentinel/pom.xml
new file mode 100644
index 0000000000..612cbcbfbe
--- /dev/null
+++ b/spring-cloud/spring-cloud-sentinel/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+ spring-cloud-sentinel
+ spring-cloud-sentinel
+ http://maven.apache.org
+ pom
+
+ com.baeldung.spring.cloud
+ spring-cloud
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.alibaba.csp
+ sentinel-core
+ 1.8.0
+
+
+ com.alibaba.csp
+ sentinel-annotation-aspectj
+ 1.8.0
+
+
+ com.alibaba.csp
+ sentinel-transport-simple-http
+ 1.8.0
+
+
+
+
+ UTF-8
+
+
diff --git a/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/SentinelApplication.java b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/SentinelApplication.java
new file mode 100644
index 0000000000..4d921844df
--- /dev/null
+++ b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/SentinelApplication.java
@@ -0,0 +1,11 @@
+package com.baeldung.spring.cloud.sentinel;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SentinelApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SentinelApplication.class, args);
+ }
+}
diff --git a/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/config/SentinelAspectConfiguration.java b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/config/SentinelAspectConfiguration.java
new file mode 100644
index 0000000000..4dfacef999
--- /dev/null
+++ b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/config/SentinelAspectConfiguration.java
@@ -0,0 +1,65 @@
+package com.baeldung.spring.cloud.sentinel.config;
+
+import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;
+import com.alibaba.csp.sentinel.slots.block.RuleConstant;
+import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
+import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
+import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
+import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
+import com.alibaba.csp.sentinel.slots.system.SystemRule;
+import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+public class SentinelAspectConfiguration {
+
+ public static final String RESOURCE_NAME = "greeting";
+
+ @Bean
+ public SentinelResourceAspect sentinelResourceAspect() {
+ return new SentinelResourceAspect();
+ }
+
+ @PostConstruct
+ public void init() {
+ initFlowRules();
+ initDegradeRules();
+ initSystemProtectionRules();
+ }
+
+ private void initFlowRules() {
+ List flowRules = new ArrayList<>();
+ FlowRule flowRule = new FlowRule();
+ // Defined resource
+ flowRule.setResource(RESOURCE_NAME);
+ flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
+ // number of requests that QPS can pass in a second
+ flowRule.setCount(1);
+ flowRules.add(flowRule);
+ FlowRuleManager.loadRules(flowRules);
+ }
+
+ private void initDegradeRules() {
+ List rules = new ArrayList();
+ DegradeRule rule = new DegradeRule();
+ rule.setResource(RESOURCE_NAME);
+ rule.setCount(10);
+ rule.setTimeWindow(10);
+ rules.add(rule);
+ DegradeRuleManager.loadRules(rules);
+ }
+
+ private void initSystemProtectionRules() {
+ List rules = new ArrayList<>();
+ SystemRule rule = new SystemRule();
+ rule.setHighestSystemLoad(10);
+ rules.add(rule);
+ SystemRuleManager.loadRules(rules);
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/controller/GreetingController.java b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/controller/GreetingController.java
new file mode 100644
index 0000000000..fa3852466d
--- /dev/null
+++ b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/controller/GreetingController.java
@@ -0,0 +1,20 @@
+package com.baeldung.spring.cloud.sentinel.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.spring.cloud.sentinel.service.GreetingService;
+
+@RestController
+public class GreetingController {
+
+ @Autowired
+ private GreetingService greetingService;
+
+ @GetMapping("/hello")
+ public String getGreeting() {
+ return greetingService.getGreeting();
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/service/GreetingService.java b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/service/GreetingService.java
new file mode 100644
index 0000000000..e60d679b92
--- /dev/null
+++ b/spring-cloud/spring-cloud-sentinel/src/main/java/com/baeldung/spring/cloud/sentinel/service/GreetingService.java
@@ -0,0 +1,19 @@
+package com.baeldung.spring.cloud.sentinel.service;
+
+import com.alibaba.csp.sentinel.annotation.SentinelResource;
+import org.springframework.stereotype.Service;
+
+@Service
+public class GreetingService {
+
+ @SentinelResource(value = "greeting", fallback = "getGreetingFallback")
+ public String getGreeting() {
+ return "Hello World!";
+ }
+
+ public String getGreetingFallback(Throwable e) {
+ e.printStackTrace();
+ return "Bye world!";
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml
index 52230dd1c1..32a31c3042 100644
--- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml
@@ -101,7 +101,6 @@
- 1.8
Greenwich.SR1
4.0.0
1.8.2
diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml
index 4e6b8b8b6c..fd10322efb 100644
--- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml
+++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml
@@ -45,13 +45,6 @@
org.springframework.cloud
spring-cloud-task-batch
-
-
- net.bytebuddy
- byte-buddy-dep
- ${bytebuddy.version}
-
-
com.h2database
h2
@@ -70,7 +63,6 @@
com.baeldung.TaskDemo
- 1.10.10
diff --git a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml
index 871218e78c..24e783ff30 100644
--- a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml
+++ b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml
@@ -37,12 +37,10 @@
org.springframework
spring-web
- ${springframework.version}
org.springframework.cloud
spring-cloud-starter-zookeeper-discovery
- ${spring-cloud-starter-zookeeper-discovery.version}
commons-logging
diff --git a/spring-cloud/spring-cloud-zookeeper/Greeting/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-zookeeper/Greeting/src/test/java/com/baeldung/SpringContextTest.java
index f7325e425f..d08c772468 100644
--- a/spring-cloud/spring-cloud-zookeeper/Greeting/src/test/java/com/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-zookeeper/Greeting/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,12 +1,9 @@
package com.baeldung;
import com.baeldung.spring.cloud.greeting.GreetingApplication;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = GreetingApplication.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml b/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml
index 3a263e4ded..777b857403 100644
--- a/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml
+++ b/spring-cloud/spring-cloud-zookeeper/HelloWorld/pom.xml
@@ -33,12 +33,10 @@
org.springframework
spring-web
- ${springframework.version}
org.springframework.cloud
spring-cloud-starter-zookeeper-discovery
- ${spring-cloud-starter-zookeeper-discovery.version}
commons-logging
diff --git a/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/test/java/com/baeldung/spring/cloud/helloworld/SpringContextTest.java b/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/test/java/com/baeldung/spring/cloud/helloworld/SpringContextTest.java
index df7335dfa6..04b5b6c1a4 100644
--- a/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/test/java/com/baeldung/spring/cloud/helloworld/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-zookeeper/HelloWorld/src/test/java/com/baeldung/spring/cloud/helloworld/SpringContextTest.java
@@ -1,12 +1,9 @@
package com.baeldung.spring.cloud.helloworld;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-@RunWith(SpringRunner.class)
@SpringBootTest(classes = HelloWorldApplication.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-zookeeper/pom.xml b/spring-cloud/spring-cloud-zookeeper/pom.xml
index e3241da02c..31bf043ac0 100644
--- a/spring-cloud/spring-cloud-zookeeper/pom.xml
+++ b/spring-cloud/spring-cloud-zookeeper/pom.xml
@@ -19,8 +19,6 @@
5.2.7.RELEASE
- 1.0.3.RELEASE
- 2.3.3.RELEASE
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml
index c7b35ef934..c6658d70a2 100644
--- a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml
+++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml
@@ -22,7 +22,6 @@
- UTF-8
3.7.0
1.4.2.RELEASE
1.10
diff --git a/spring-cloud/spring-cloud-zuul-fallback/pom.xml b/spring-cloud/spring-cloud-zuul-fallback/pom.xml
index cb762eb099..42925a6ab9 100644
--- a/spring-cloud/spring-cloud-zuul-fallback/pom.xml
+++ b/spring-cloud/spring-cloud-zuul-fallback/pom.xml
@@ -21,7 +21,6 @@
- 1.8
Finchley.SR2
3.1.1
diff --git a/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml b/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml
index d2914b48bf..e66110fb23 100644
--- a/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml
+++ b/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
weather-service
- Weather Service
+ weather-service
Weather Service for Zuul Fallback Test
diff --git a/spring-cloud/spring-cloud-zuul/pom.xml b/spring-cloud/spring-cloud-zuul/pom.xml
index 6035ba7e59..13834848fe 100644
--- a/spring-cloud/spring-cloud-zuul/pom.xml
+++ b/spring-cloud/spring-cloud-zuul/pom.xml
@@ -38,6 +38,11 @@
pom
import
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-zuul
+ ${spring-cloud-netflix-zuul.version}
+
@@ -46,10 +51,6 @@
org.springframework.boot
spring-boot-starter-web
-
- org.springframework.cloud
- spring-cloud-starter-netflix-zuul
-
com.h2database
h2
@@ -79,8 +80,8 @@
- Hoxton.SR4
- 2.3.3.RELEASE
+ 2020.0.0
+ 2.2.2.RELEASE
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml
index b42d32b6b3..bb735a71ed 100644
--- a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml
@@ -19,6 +19,10 @@
spring-cloud-zuul-ratelimit
${rate.limit.version}
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-zuul
+
org.springframework.boot
spring-boot-starter-data-jpa
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml
index 7978d9c77b..b7e1702558 100644
--- a/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml
@@ -13,6 +13,10 @@
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-zuul
+
org.springframework.boot
spring-boot-starter-thymeleaf
diff --git a/spring-core-2/src/main/resources/application.properties b/spring-core-2/src/main/resources/application.properties
index cbfe3f2df2..d482330b83 100644
--- a/spring-core-2/src/main/resources/application.properties
+++ b/spring-core-2/src/main/resources/application.properties
@@ -1 +1,28 @@
-spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
+spring.profiles.active=@spring.profiles.active@
+
+my.prop=used-always-in-all-profiles
+
+#---
+spring.config.activate.on-profile=dev
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.url=jdbc:mysql://localhost:3306/db
+spring.datasource.username=root
+spring.datasource.password=root
+
+#---
+spring.config.activate.on-profile=production
+spring.datasource.driver-class-name=org.h2.Driver
+spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
+spring.datasource.username=sa
+spring.datasource.password=sa
+
+#---
+spring.profiles.group.production=proddb,prodquartz
+
+#---
+spring.config.activate.on-profile=proddb
+db=url_to_production_db
+
+#---
+spring.config.activate.on-profile=prodquartz
+quartz=url_to_quartz_scheduler
\ No newline at end of file
diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml
index 205259e8e4..618800529c 100644
--- a/spring-core-3/pom.xml
+++ b/spring-core-3/pom.xml
@@ -69,18 +69,7 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven.surefire.version}
-
-
-
-
- 2.22.1
1.3.2
2.2.2.RELEASE
diff --git a/spring-core-4/pom.xml b/spring-core-4/pom.xml
index df0b90fef2..d2e948c475 100644
--- a/spring-core-4/pom.xml
+++ b/spring-core-4/pom.xml
@@ -87,18 +87,7 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven.surefire.version}
-
-
-
-
- 2.22.1
1.3.2
2.2.2.RELEASE
28.2-jre
diff --git a/spring-core-5/README.md b/spring-core-5/README.md
index 81669e46a7..4315535e69 100644
--- a/spring-core-5/README.md
+++ b/spring-core-5/README.md
@@ -4,4 +4,7 @@ This module contains articles about core Spring functionality
## Relevant Articles:
-- More articles: [[<-- prev]](/spring-core-4)
\ No newline at end of file
+- [Spring @Component Annotation](https://www.baeldung.com/spring-component-annotation)
+- [Solving Spring’s “not eligible for auto-proxying” Warning](https://www.baeldung.com/spring-not-eligible-for-auto-proxying)
+- [Spring Bean Names](https://www.baeldung.com/spring-bean-names)
+- More articles: [[<-- prev]](/spring-core-4)
diff --git a/spring-core-5/pom.xml b/spring-core-5/pom.xml
index 743002c137..05ee1c5f5d 100644
--- a/spring-core-5/pom.xml
+++ b/spring-core-5/pom.xml
@@ -25,22 +25,16 @@
${spring-boot-starter.version}
test
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven.surefire.version}
-
-
-
-
5.3.3
2.4.2
- 2.22.1
diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/DataCache.java b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/DataCache.java
new file mode 100644
index 0000000000..bc92d0a1d9
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/DataCache.java
@@ -0,0 +1,12 @@
+package com.baeldung.component.autoproxying;
+
+import lombok.Getter;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Component
+public class DataCache {
+ @RandomInt(min = 2, max = 10)
+ private int group;
+ private String name;
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/EligibleForAutoProxyRandomIntProcessor.java b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/EligibleForAutoProxyRandomIntProcessor.java
new file mode 100644
index 0000000000..1fa9aa376f
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/EligibleForAutoProxyRandomIntProcessor.java
@@ -0,0 +1,33 @@
+package com.baeldung.component.autoproxying;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.util.ReflectionUtils;
+
+import java.lang.reflect.Field;
+
+public class EligibleForAutoProxyRandomIntProcessor implements BeanPostProcessor {
+ private final RandomIntGenerator randomIntGenerator;
+
+ @Lazy
+ public EligibleForAutoProxyRandomIntProcessor(RandomIntGenerator randomIntGenerator) {
+ this.randomIntGenerator = randomIntGenerator;
+ }
+
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ Field[] fields = bean.getClass().getDeclaredFields();
+ for (Field field : fields) {
+ RandomInt injectRandomInt = field.getAnnotation(RandomInt.class);
+ if (injectRandomInt != null) {
+ int min = injectRandomInt.min();
+ int max = injectRandomInt.max();
+ int randomValue = randomIntGenerator.generate(min, max);
+ field.setAccessible(true);
+ ReflectionUtils.setField(field, bean, randomValue);
+ }
+ }
+ return bean;
+ }
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyRandomIntProcessor.java b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyRandomIntProcessor.java
new file mode 100644
index 0000000000..d02780011c
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyRandomIntProcessor.java
@@ -0,0 +1,31 @@
+package com.baeldung.component.autoproxying;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.util.ReflectionUtils;
+
+import java.lang.reflect.Field;
+
+public class NotEligibleForAutoProxyRandomIntProcessor implements BeanPostProcessor {
+ private final RandomIntGenerator randomIntGenerator;
+
+ public NotEligibleForAutoProxyRandomIntProcessor(RandomIntGenerator randomIntGenerator) {
+ this.randomIntGenerator = randomIntGenerator;
+ }
+
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ Field[] fields = bean.getClass().getDeclaredFields();
+ for (Field field : fields) {
+ RandomInt injectRandomInt = field.getAnnotation(RandomInt.class);
+ if (injectRandomInt != null) {
+ int min = injectRandomInt.min();
+ int max = injectRandomInt.max();
+ int randomValue = randomIntGenerator.generate(min, max);
+ field.setAccessible(true);
+ ReflectionUtils.setField(field, bean, randomValue);
+ }
+ }
+ return bean;
+ }
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomInt.java b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomInt.java
new file mode 100644
index 0000000000..c7881af4af
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomInt.java
@@ -0,0 +1,11 @@
+package com.baeldung.component.autoproxying;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RandomInt {
+ int min();
+
+ int max();
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomIntGenerator.java b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomIntGenerator.java
new file mode 100644
index 0000000000..d0d44c3333
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/component/autoproxying/RandomIntGenerator.java
@@ -0,0 +1,21 @@
+package com.baeldung.component.autoproxying;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Random;
+
+@Slf4j
+@Component
+public class RandomIntGenerator {
+ private final Random random = new Random();
+ private final DataCache dataCache;
+
+ public RandomIntGenerator(DataCache dataCache) {
+ this.dataCache = dataCache;
+ }
+
+ public int generate(int min, int max) {
+ return random.nextInt(max - min) + min;
+ }
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/Animal.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/Animal.java
new file mode 100644
index 0000000000..d29b4139c9
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/Animal.java
@@ -0,0 +1,5 @@
+package com.baeldung.springbean.naming.component;
+
+public interface Animal {
+ String name();
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/Cat.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/Cat.java
new file mode 100644
index 0000000000..8c70078822
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/Cat.java
@@ -0,0 +1,14 @@
+package com.baeldung.springbean.naming.component;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+@Component
+@Qualifier("cat")
+public class Cat implements Animal {
+
+ @Override
+ public String name() {
+ return "Cat";
+ }
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/CustomComponent.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/CustomComponent.java
new file mode 100644
index 0000000000..71ebfea1a2
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/CustomComponent.java
@@ -0,0 +1,7 @@
+package com.baeldung.springbean.naming.component;
+
+import org.springframework.stereotype.Component;
+
+@Component("myBean")
+public class CustomComponent {
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/Dog.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/Dog.java
new file mode 100644
index 0000000000..a6d6015ab3
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/component/Dog.java
@@ -0,0 +1,13 @@
+package com.baeldung.springbean.naming.component;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+@Component
+@Qualifier("dog")
+public class Dog implements Animal {
+ @Override
+ public String name() {
+ return "Dog";
+ }
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/configuration/AuditConfiguration.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/configuration/AuditConfiguration.java
new file mode 100644
index 0000000000..a29dc6ada1
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/configuration/AuditConfiguration.java
@@ -0,0 +1,14 @@
+package com.baeldung.springbean.naming.configuration;
+
+import com.baeldung.springbean.naming.service.AuditService;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class AuditConfiguration {
+
+ @Bean
+ public AuditService audit() {
+ return new AuditService();
+ }
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/configuration/MyConfiguration.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/configuration/MyConfiguration.java
new file mode 100644
index 0000000000..f1a18bac95
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/configuration/MyConfiguration.java
@@ -0,0 +1,19 @@
+package com.baeldung.springbean.naming.configuration;
+
+import com.baeldung.springbean.naming.component.CustomComponent;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration("configuration")
+public class MyConfiguration {
+
+ @Bean("qualifierComponent")
+ public CustomComponent component() {
+ return new CustomComponent();
+ }
+
+ @Bean("beanComponent")
+ public CustomComponent myComponent() {
+ return new CustomComponent();
+ }
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/controller/MessagingController.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/controller/MessagingController.java
new file mode 100644
index 0000000000..89d32aba80
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/controller/MessagingController.java
@@ -0,0 +1,12 @@
+package com.baeldung.springbean.naming.controller;
+
+import com.baeldung.springbean.naming.service.MessagingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class MessagingController {
+
+ @Autowired
+ private MessagingService service;
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/AuditService.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/AuditService.java
new file mode 100644
index 0000000000..07811c8104
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/AuditService.java
@@ -0,0 +1,4 @@
+package com.baeldung.springbean.naming.service;
+
+public class AuditService {
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/LoggingService.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/LoggingService.java
new file mode 100644
index 0000000000..3be4e9a028
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/LoggingService.java
@@ -0,0 +1,7 @@
+package com.baeldung.springbean.naming.service;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoggingService {
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/MessagingService.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/MessagingService.java
new file mode 100644
index 0000000000..2494712dd3
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/MessagingService.java
@@ -0,0 +1,4 @@
+package com.baeldung.springbean.naming.service;
+
+public interface MessagingService {
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/MessagingServiceImpl.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/MessagingServiceImpl.java
new file mode 100644
index 0000000000..2b7cb84742
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/MessagingServiceImpl.java
@@ -0,0 +1,14 @@
+package com.baeldung.springbean.naming.service;
+
+import com.baeldung.springbean.naming.component.CustomComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
+@Service
+public class MessagingServiceImpl implements MessagingService {
+
+ @Autowired
+ @Qualifier("qualifierComponent")
+ private CustomComponent customComponent;
+}
diff --git a/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/PetShow.java b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/PetShow.java
new file mode 100644
index 0000000000..dc74bef4d0
--- /dev/null
+++ b/spring-core-5/src/main/java/com/baeldung/springbean/naming/service/PetShow.java
@@ -0,0 +1,26 @@
+package com.baeldung.springbean.naming.service;
+
+import com.baeldung.springbean.naming.component.Animal;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
+@Service
+public class PetShow {
+
+ @Autowired
+ @Qualifier("dog")
+ private Animal dog;
+
+ @Autowired
+ @Qualifier("cat")
+ private Animal cat;
+
+ public Animal getDog() {
+ return dog;
+ }
+
+ public Animal getCat() {
+ return cat;
+ }
+}
diff --git a/spring-core-5/src/test/java/com/baeldung/component/autoproxying/EligibleForAutoProxyingIntegrationTest.java b/spring-core-5/src/test/java/com/baeldung/component/autoproxying/EligibleForAutoProxyingIntegrationTest.java
new file mode 100644
index 0000000000..c7943e355b
--- /dev/null
+++ b/spring-core-5/src/test/java/com/baeldung/component/autoproxying/EligibleForAutoProxyingIntegrationTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.component.autoproxying;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = {EligibleForAutoProxyRandomIntProcessor.class, DataCache.class, RandomIntGenerator.class})
+public class EligibleForAutoProxyingIntegrationTest {
+ private static MemoryLogAppender memoryAppender;
+
+ private EligibleForAutoProxyRandomIntProcessor randomIntProcessor;
+
+ @Autowired
+ private DataCache dataCache;
+
+ @BeforeClass
+ public static void setup() {
+ memoryAppender = new MemoryLogAppender();
+ memoryAppender.setContext((LoggerContext) LoggerFactory.getILoggerFactory());
+
+ Logger logger = (Logger) LoggerFactory.getLogger("org.springframework.context");
+ logger.setLevel(Level.INFO);
+ logger.addAppender(memoryAppender);
+ memoryAppender.start();
+ }
+
+ @Test
+ public void givenAutowireInBeanPostProcessor_whenSpringContextInitialize_thenNotEligibleLogShouldShowAndGroupFieldPopulated() {
+ List notEligibleEvents = memoryAppender.search("Bean 'randomIntGenerator' of type [com.baeldung.component.autoproxying.RandomIntGenerator] " +
+ "is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)");
+
+ assertEquals(0, notEligibleEvents.size());
+ assertNotEquals(0, dataCache.getGroup());
+ }
+}
diff --git a/spring-core-5/src/test/java/com/baeldung/component/autoproxying/MemoryLogAppender.java b/spring-core-5/src/test/java/com/baeldung/component/autoproxying/MemoryLogAppender.java
new file mode 100644
index 0000000000..fad35a7c2b
--- /dev/null
+++ b/spring-core-5/src/test/java/com/baeldung/component/autoproxying/MemoryLogAppender.java
@@ -0,0 +1,48 @@
+package com.baeldung.component.autoproxying;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class MemoryLogAppender extends ListAppender {
+ public void reset() {
+ this.list.clear();
+ }
+
+ public boolean contains(String string, Level level) {
+ return this.list.stream()
+ .anyMatch(event -> event.getMessage().toString().contains(string)
+ && event.getLevel().equals(level));
+ }
+
+ public int countEventsForLogger(String loggerName) {
+ return (int) this.list.stream()
+ .filter(event -> event.getLoggerName().contains(loggerName))
+ .count();
+ }
+
+ public List search(String string) {
+ return this.list.stream()
+ .filter(event -> event.getMessage().toString().contains(string))
+ .collect(Collectors.toList());
+ }
+
+ public List search(String string, Level level) {
+ return this.list.stream()
+ .filter(event -> event.getMessage().toString().contains(string)
+ && event.getLevel().equals(level))
+ .collect(Collectors.toList());
+ }
+
+ public int getSize() {
+ return this.list.size();
+ }
+
+ public List getLoggedEvents() {
+ return Collections.unmodifiableList(this.list);
+ }
+}
diff --git a/spring-core-5/src/test/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyingIntegrationTest.java b/spring-core-5/src/test/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyingIntegrationTest.java
new file mode 100644
index 0000000000..f49f1ce602
--- /dev/null
+++ b/spring-core-5/src/test/java/com/baeldung/component/autoproxying/NotEligibleForAutoProxyingIntegrationTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.component.autoproxying;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = {NotEligibleForAutoProxyRandomIntProcessor.class, DataCache.class, RandomIntGenerator.class})
+public class NotEligibleForAutoProxyingIntegrationTest {
+ private static MemoryLogAppender memoryAppender;
+
+ private NotEligibleForAutoProxyRandomIntProcessor proxyRandomIntProcessor;
+
+ @Autowired
+ private DataCache dataCache;
+
+ @BeforeClass
+ public static void setup() {
+ memoryAppender = new MemoryLogAppender();
+ memoryAppender.setContext((LoggerContext) LoggerFactory.getILoggerFactory());
+
+ Logger logger = (Logger) LoggerFactory.getLogger("org.springframework.context");
+ logger.setLevel(Level.INFO);
+ logger.addAppender(memoryAppender);
+ memoryAppender.start();
+ }
+
+ @Test
+ public void givenAutowireInBeanPostProcessor_whenSpringContextInitialize_thenNotEligibleLogShouldShowAndGroupFieldNotPopulated() {
+ List notEligibleEvents = memoryAppender.search("Bean 'randomIntGenerator' of type [com.baeldung.component.autoproxying.RandomIntGenerator] " +
+ "is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)");
+
+ assertEquals(1, notEligibleEvents.size());
+ assertEquals(0, dataCache.getGroup());
+ }
+}
diff --git a/spring-core-5/src/test/java/com/baeldung/springbean/naming/SpringBeanNamingUnitTest.java b/spring-core-5/src/test/java/com/baeldung/springbean/naming/SpringBeanNamingUnitTest.java
new file mode 100644
index 0000000000..cccfe22e34
--- /dev/null
+++ b/spring-core-5/src/test/java/com/baeldung/springbean/naming/SpringBeanNamingUnitTest.java
@@ -0,0 +1,65 @@
+package com.baeldung.springbean.naming;
+
+import com.baeldung.springbean.naming.component.Cat;
+import com.baeldung.springbean.naming.component.Dog;
+import com.baeldung.springbean.naming.service.PetShow;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+@ExtendWith(SpringExtension.class)
+public class SpringBeanNamingUnitTest {
+
+ private AnnotationConfigApplicationContext context;
+
+ @BeforeEach
+ void setUp() {
+ context = new AnnotationConfigApplicationContext();
+ context.scan("com.baeldung.springbean.naming");
+ context.refresh();
+ }
+
+ // To name a bean spring gets the class name and converts the first letter to lowercase.
+ // Default naming strategy of the spring bean which is using class level annotation
+
+ @Test
+ void givenLoggingServiceBeanIsCreated_whenThereIsNoValueProvided_thenBeanNameShouldBeDefaultName() {
+ assertNotNull(context.getBean("loggingService"));
+ }
+
+ // In this case, to name a bean spring gets the class name and converts the first letter to lowercase.
+ @Test
+ void givenAuditServiceBeanIsCreatedWithMethodLevelAnnotation_whenThereIsNoValueProvided_thenBeanNameShouldBeTheNameOfMethod() {
+ assertNotNull(context.getBean("audit"));
+ }
+
+ // spring will create the bean of type CustomComponent with the name "myBean".
+ // As we're explicitly giving the name to the bean, spring will use this name to refer to it.
+ @Test
+ void givenCustomComponentBeanIsCreate_whenThereIsCustomNameGivenToBean_thenBeanShouldBeIdentifiedByThatName() {
+ assertNotNull(context.getBean("myBean"));
+ }
+
+ @Test
+ void givenCustomComponentBeanIsCreated_whenCustomNameIsGivenOnMethodLevelAnnotation_thenBeanShouldBeIdentifiedByThatName() {
+ assertNotNull(context.getBean("beanComponent"));
+ assertNotNull(context.getBean("configuration"));
+ assertNotNull(context.getBean("qualifierComponent"));
+ }
+
+ @Test
+ void givenMultipleImplementationsOfAnimal_whenFieldIsInjectedWithQualifiedName_thenTheSpecificBeanShouldGetInjected() {
+ PetShow petShow = (PetShow) context.getBean("petShow");
+
+ assertNotNull(context.getBean("cat"));
+ assertNotNull(context.getBean("dog"));
+
+ assertThat(petShow.getCat().getClass()).isEqualTo(Cat.class);
+ assertThat(petShow.getDog().getClass()).isEqualTo(Dog.class);
+ }
+}
diff --git a/spring-data-rest/pom.xml b/spring-data-rest/pom.xml
index dd96182264..bfbd66a280 100644
--- a/spring-data-rest/pom.xml
+++ b/spring-data-rest/pom.xml
@@ -35,7 +35,7 @@
org.springframework.data
- spring-data-rest-hal-browser
+ spring-data-rest-hal-explorer
org.springframework.boot
@@ -99,7 +99,6 @@
com.baeldung.books.SpringDataRestApplication
1.0
- 2.3.3.RELEASE
\ No newline at end of file
diff --git a/spring-data-rest/src/main/java/com/baeldung/halbrowser/config/RestConfig.java b/spring-data-rest/src/main/java/com/baeldung/halbrowser/config/RestConfig.java
index 73f7e0f26a..a322bf0027 100644
--- a/spring-data-rest/src/main/java/com/baeldung/halbrowser/config/RestConfig.java
+++ b/spring-data-rest/src/main/java/com/baeldung/halbrowser/config/RestConfig.java
@@ -4,11 +4,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener;
-import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;
+import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer;
import org.springframework.validation.Validator;
@Configuration
-public class RestConfig extends RepositoryRestConfigurerAdapter {
+public class RestConfig implements RepositoryRestConfigurer {
//access to global validator
@Autowired
diff --git a/spring-ejb/ejb-beans/pom.xml b/spring-ejb/ejb-beans/pom.xml
index d7f875acd0..8f2bf31ee4 100644
--- a/spring-ejb/ejb-beans/pom.xml
+++ b/spring-ejb/ejb-beans/pom.xml
@@ -184,7 +184,6 @@
5.10.2
5.13.1
2.21.0
- 1.8.5
2.8
8.2.1.Final
diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml
index 11b2803095..f46445a39f 100644
--- a/spring-integration/pom.xml
+++ b/spring-integration/pom.xml
@@ -108,7 +108,6 @@
org.codehaus.mojo
exec-maven-plugin
- ${exec-maven-plugin.version}
com.baeldung.samples.FileCopyConfig
@@ -122,7 +121,6 @@
1.4.7
1.1.1
2.10
- 1.5.0
1.4.197
diff --git a/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/DynamicSchedulingConfig.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/DynamicSchedulingConfig.java
new file mode 100644
index 0000000000..b29f9ab0ce
--- /dev/null
+++ b/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/DynamicSchedulingConfig.java
@@ -0,0 +1,45 @@
+package com.baeldung.scheduling.dynamic;
+
+import java.time.Instant;
+import java.util.Date;
+import java.util.Optional;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+@Configuration
+@ComponentScan("com.baeldung.scheduling.dynamic")
+@EnableScheduling
+public class DynamicSchedulingConfig implements SchedulingConfigurer {
+
+ @Autowired
+ private TickService tickService;
+
+ @Bean
+ public Executor taskExecutor() {
+ return Executors.newSingleThreadScheduledExecutor();
+ }
+
+ @Override
+ public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+ taskRegistrar.setScheduler(taskExecutor());
+ taskRegistrar.addTriggerTask(
+ () -> tickService.tick(),
+ context -> {
+ Optional lastCompletionTime =
+ Optional.ofNullable(context.lastCompletionTime());
+ Instant nextExecutionTime =
+ lastCompletionTime.orElseGet(Date::new).toInstant()
+ .plusMillis(tickService.getDelay());
+ return Date.from(nextExecutionTime);
+ }
+ );
+ }
+
+}
diff --git a/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/TickService.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/TickService.java
new file mode 100644
index 0000000000..5da56f33a9
--- /dev/null
+++ b/spring-scheduling/src/main/java/com/baeldung/scheduling/dynamic/TickService.java
@@ -0,0 +1,22 @@
+package com.baeldung.scheduling.dynamic;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class TickService {
+
+ private long delay = 0;
+
+ public long getDelay() {
+ this.delay += 1000;
+ System.out.println("delaying " + this.delay + " milliseconds...");
+ return this.delay;
+ }
+
+ public void tick() {
+ final long now = System.currentTimeMillis() / 1000;
+ System.out
+ .println("schedule tasks with dynamic delay - " + now);
+ }
+
+}
diff --git a/spring-scheduling/src/test/java/com/baeldung/scheduling/DynamicSchedulingIntegrationTest.java b/spring-scheduling/src/test/java/com/baeldung/scheduling/DynamicSchedulingIntegrationTest.java
new file mode 100644
index 0000000000..2ff9cfaefa
--- /dev/null
+++ b/spring-scheduling/src/test/java/com/baeldung/scheduling/DynamicSchedulingIntegrationTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.scheduling;
+
+import com.baeldung.scheduling.dynamic.DynamicSchedulingConfig;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = {
+ DynamicSchedulingConfig.class}, loader = AnnotationConfigContextLoader.class)
+public class DynamicSchedulingIntegrationTest {
+
+ @Test
+ public void testTickServiceTick() throws InterruptedException {
+ Thread.sleep(6000);
+ }
+}
diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml
index 99dea4bc67..bb2702fc9d 100644
--- a/spring-security-modules/pom.xml
+++ b/spring-security-modules/pom.xml
@@ -14,32 +14,34 @@
- spring-ldap
spring-5-security
spring-5-security-cognito
spring-5-security-oauth
+ spring-ldap
spring-security-acl
spring-security-auth0
- spring-security-web-angular/server
spring-security-config
spring-security-core
- spring-security-web-mvc
- spring-security-web-boot-1
- spring-security-web-boot-2
- spring-security-web-mvc-custom
- spring-security-web-digest-auth
spring-security-ldap
- spring-security-web-login
- spring-security-web-persisted-remember-me
- spring-security-web-sockets
spring-security-legacy-oidc
+ spring-security-oauth2-sso
spring-security-oidc
spring-security-okta
+ spring-security-saml
+ spring-security-web-angular/server
+ spring-security-web-boot-1
+ spring-security-web-boot-2
+ spring-security-web-boot-3
+ spring-security-web-digest-auth
+ spring-security-web-login
+ spring-security-web-mvc-custom
+ spring-security-web-mvc
+ spring-security-web-persisted-remember-me
spring-security-web-react
- spring-security-web-rest
spring-security-web-rest-basic-auth
spring-security-web-rest-custom
- spring-security-oauth2-sso
+ spring-security-web-rest
+ spring-security-web-sockets
spring-security-web-thymeleaf
spring-security-web-x509
spring-session
diff --git a/spring-security-modules/spring-5-security/README.md b/spring-security-modules/spring-5-security/README.md
index 1917d347fb..bad99c22d4 100644
--- a/spring-security-modules/spring-5-security/README.md
+++ b/spring-security-modules/spring-5-security/README.md
@@ -11,3 +11,4 @@ This module contains articles about Spring Security 5
- [Guide to the AuthenticationManagerResolver in Spring Security](https://www.baeldung.com/spring-security-authenticationmanagerresolver)
- [Manual Logout With Spring Security](https://www.baeldung.com/spring-security-manual-logout)
- [How to Disable Spring Security Logout Redirects](https://www.baeldung.com/spring-security-disable-logout-redirects)
+- [Prevent Cross-Site Scripting (XSS) in a Spring Application](https://www.baeldung.com/spring-prevent-xss)
diff --git a/spring-security-modules/spring-5-security/pom.xml b/spring-security-modules/spring-5-security/pom.xml
index f50b5ff7a9..d009115c92 100644
--- a/spring-security-modules/spring-5-security/pom.xml
+++ b/spring-security-modules/spring-5-security/pom.xml
@@ -49,7 +49,7 @@
org.owasp.esapi
esapi
- 2.2.2.0
+ ${esapi.version}
org.jsoup
diff --git a/spring-security-modules/spring-5-security/src/test/java/com/baeldung/xss/PersonControllerUnitTest.java b/spring-security-modules/spring-5-security/src/test/java/com/baeldung/xss/PersonControllerIntegrationTest.java
similarity index 98%
rename from spring-security-modules/spring-5-security/src/test/java/com/baeldung/xss/PersonControllerUnitTest.java
rename to spring-security-modules/spring-5-security/src/test/java/com/baeldung/xss/PersonControllerIntegrationTest.java
index 4e278ebf16..5afa3bc1dd 100644
--- a/spring-security-modules/spring-5-security/src/test/java/com/baeldung/xss/PersonControllerUnitTest.java
+++ b/spring-security-modules/spring-5-security/src/test/java/com/baeldung/xss/PersonControllerIntegrationTest.java
@@ -14,7 +14,7 @@ import java.io.IOException;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-class PersonControllerUnitTest {
+class PersonControllerIntegrationTest {
@LocalServerPort
int randomServerPort;
diff --git a/spring-security-modules/spring-security-saml/README.md b/spring-security-modules/spring-security-saml/README.md
new file mode 100644
index 0000000000..271b29632e
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [A Guide to SAML with Spring Security](https://www.baeldung.com/spring-security-saml)
diff --git a/spring-security-modules/spring-security-saml/pom.xml b/spring-security-modules/spring-security-saml/pom.xml
new file mode 100644
index 0000000000..561582045a
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/pom.xml
@@ -0,0 +1,73 @@
+
+
+ 4.0.0
+ spring-security-saml
+ 1.0-SNAPSHOT
+ spring-security-saml
+ war
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+ Shibboleth
+ Shibboleth
+ https://build.shibboleth.net/nexus/content/repositories/releases/
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.springframework.security.extensions
+ spring-security-saml2-core
+ ${saml2-core.spring.version}
+
+
+
+
+ spring-security-saml
+
+
+ src/main/resources
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+
+ 1.0.10.RELEASE
+
+
diff --git a/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/Application.java b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/Application.java
new file mode 100644
index 0000000000..39eaa46424
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/Application.java
@@ -0,0 +1,11 @@
+package com.baeldung.saml;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+ public static void main(String... args) {
+ SpringApplication.run(Application.class, args);
+ }
+}
diff --git a/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/authentication/CustomSAMLAuthenticationProvider.java b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/authentication/CustomSAMLAuthenticationProvider.java
new file mode 100644
index 0000000000..b35a72763d
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/authentication/CustomSAMLAuthenticationProvider.java
@@ -0,0 +1,28 @@
+package com.baeldung.saml.authentication;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.providers.ExpiringUsernameAuthenticationToken;
+import org.springframework.security.saml.SAMLAuthenticationProvider;
+import org.springframework.security.saml.SAMLCredential;
+
+public class CustomSAMLAuthenticationProvider extends SAMLAuthenticationProvider {
+
+ @Override
+ public Collection extends GrantedAuthority> getEntitlements(SAMLCredential credential, Object userDetail) {
+
+ if(userDetail instanceof ExpiringUsernameAuthenticationToken) {
+ List authorities = new ArrayList();
+ authorities.addAll(((ExpiringUsernameAuthenticationToken) userDetail).getAuthorities());
+ return authorities;
+
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+}
diff --git a/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/SamlSecurityConfig.java b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/SamlSecurityConfig.java
new file mode 100644
index 0000000000..378db478cf
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/SamlSecurityConfig.java
@@ -0,0 +1,226 @@
+package com.baeldung.saml.config;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider;
+import org.opensaml.saml2.metadata.provider.MetadataProvider;
+import org.opensaml.saml2.metadata.provider.MetadataProviderException;
+import org.opensaml.util.resource.ResourceException;
+import org.opensaml.xml.parse.StaticBasicParserPool;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.DefaultResourceLoader;
+import org.springframework.core.io.Resource;
+import org.springframework.security.saml.*;
+import org.springframework.security.saml.context.SAMLContextProviderImpl;
+import org.springframework.security.saml.key.JKSKeyManager;
+import org.springframework.security.saml.key.KeyManager;
+import org.springframework.security.saml.log.SAMLDefaultLogger;
+import org.springframework.security.saml.metadata.CachingMetadataManager;
+import org.springframework.security.saml.metadata.ExtendedMetadata;
+import org.springframework.security.saml.metadata.ExtendedMetadataDelegate;
+import org.springframework.security.saml.processor.*;
+import org.springframework.security.saml.util.VelocityFactory;
+import org.springframework.security.saml.websso.*;
+import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.security.web.authentication.logout.LogoutHandler;
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
+import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;
+
+import com.baeldung.saml.authentication.CustomSAMLAuthenticationProvider;
+
+@Configuration
+public class SamlSecurityConfig {
+
+ @Value("${saml.keystore.location}")
+ private String samlKeystoreLocation;
+
+ @Value("${saml.keystore.password}")
+ private String samlKeystorePassword;
+
+ @Value("${saml.keystore.alias}")
+ private String samlKeystoreAlias;
+
+ @Value("${saml.idp}")
+ private String defaultIdp;
+
+ @Bean(initMethod = "initialize")
+ public StaticBasicParserPool parserPool() {
+ return new StaticBasicParserPool();
+ }
+
+ @Bean
+ public SAMLAuthenticationProvider samlAuthenticationProvider() {
+ return new CustomSAMLAuthenticationProvider();
+ }
+
+ @Bean
+ public SAMLContextProviderImpl contextProvider() {
+ return new SAMLContextProviderImpl();
+ }
+
+ @Bean
+ public static SAMLBootstrap samlBootstrap() {
+ return new SAMLBootstrap();
+ }
+
+ @Bean
+ public SAMLDefaultLogger samlLogger() {
+ return new SAMLDefaultLogger();
+ }
+
+ @Bean
+ public WebSSOProfileConsumer webSSOprofileConsumer() {
+ return new WebSSOProfileConsumerImpl();
+ }
+
+ @Bean
+ @Qualifier("hokWebSSOprofileConsumer")
+ public WebSSOProfileConsumerHoKImpl hokWebSSOProfileConsumer() {
+ return new WebSSOProfileConsumerHoKImpl();
+ }
+
+ @Bean
+ public WebSSOProfile webSSOprofile() {
+ return new WebSSOProfileImpl();
+ }
+
+ @Bean
+ public WebSSOProfileConsumerHoKImpl hokWebSSOProfile() {
+ return new WebSSOProfileConsumerHoKImpl();
+ }
+
+ @Bean
+ public WebSSOProfileECPImpl ecpProfile() {
+ return new WebSSOProfileECPImpl();
+ }
+
+ @Bean
+ public SingleLogoutProfile logoutProfile() {
+ return new SingleLogoutProfileImpl();
+ }
+
+ @Bean
+ public KeyManager keyManager() {
+ DefaultResourceLoader loader = new DefaultResourceLoader();
+ Resource storeFile = loader.getResource(samlKeystoreLocation);
+ Map passwords = new HashMap<>();
+ passwords.put(samlKeystoreAlias, samlKeystorePassword);
+ return new JKSKeyManager(storeFile, samlKeystorePassword, passwords, samlKeystoreAlias);
+ }
+
+ @Bean
+ public WebSSOProfileOptions defaultWebSSOProfileOptions() {
+ WebSSOProfileOptions webSSOProfileOptions = new WebSSOProfileOptions();
+ webSSOProfileOptions.setIncludeScoping(false);
+ return webSSOProfileOptions;
+ }
+
+ @Bean
+ public SAMLEntryPoint samlEntryPoint() {
+ SAMLEntryPoint samlEntryPoint = new SAMLEntryPoint();
+ samlEntryPoint.setDefaultProfileOptions(defaultWebSSOProfileOptions());
+ return samlEntryPoint;
+ }
+
+ @Bean
+ public ExtendedMetadata extendedMetadata() {
+ ExtendedMetadata extendedMetadata = new ExtendedMetadata();
+ extendedMetadata.setIdpDiscoveryEnabled(false);
+ extendedMetadata.setSignMetadata(false);
+ return extendedMetadata;
+ }
+
+ @Bean
+ @Qualifier("okta")
+ public ExtendedMetadataDelegate oktaExtendedMetadataProvider() throws MetadataProviderException {
+ File metadata = null;
+ try {
+ metadata = new File("./src/main/resources/saml/metadata/sso.xml");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ FilesystemMetadataProvider provider = new FilesystemMetadataProvider(metadata);
+ provider.setParserPool(parserPool());
+ return new ExtendedMetadataDelegate(provider, extendedMetadata());
+ }
+
+ @Bean
+ @Qualifier("metadata")
+ public CachingMetadataManager metadata() throws MetadataProviderException, ResourceException {
+ List providers = new ArrayList<>();
+ providers.add(oktaExtendedMetadataProvider());
+ CachingMetadataManager metadataManager = new CachingMetadataManager(providers);
+ metadataManager.setDefaultIDP(defaultIdp);
+ return metadataManager;
+ }
+
+ @Bean
+ @Qualifier("saml")
+ public SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler() {
+ SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler = new SavedRequestAwareAuthenticationSuccessHandler();
+ successRedirectHandler.setDefaultTargetUrl("/home");
+ return successRedirectHandler;
+ }
+
+ @Bean
+ @Qualifier("saml")
+ public SimpleUrlAuthenticationFailureHandler authenticationFailureHandler() {
+ SimpleUrlAuthenticationFailureHandler failureHandler = new SimpleUrlAuthenticationFailureHandler();
+ failureHandler.setUseForward(true);
+ failureHandler.setDefaultFailureUrl("/error");
+ return failureHandler;
+ }
+
+ @Bean
+ public SimpleUrlLogoutSuccessHandler successLogoutHandler() {
+ SimpleUrlLogoutSuccessHandler successLogoutHandler = new SimpleUrlLogoutSuccessHandler();
+ successLogoutHandler.setDefaultTargetUrl("/");
+ return successLogoutHandler;
+ }
+
+ @Bean
+ public SecurityContextLogoutHandler logoutHandler() {
+ SecurityContextLogoutHandler logoutHandler = new SecurityContextLogoutHandler();
+ logoutHandler.setInvalidateHttpSession(true);
+ logoutHandler.setClearAuthentication(true);
+ return logoutHandler;
+ }
+
+ @Bean
+ public SAMLLogoutProcessingFilter samlLogoutProcessingFilter() {
+ return new SAMLLogoutProcessingFilter(successLogoutHandler(), logoutHandler());
+ }
+
+ @Bean
+ public SAMLLogoutFilter samlLogoutFilter() {
+ return new SAMLLogoutFilter(successLogoutHandler(),
+ new LogoutHandler[] { logoutHandler() },
+ new LogoutHandler[] { logoutHandler() });
+ }
+
+ @Bean
+ public HTTPPostBinding httpPostBinding() {
+ return new HTTPPostBinding(parserPool(), VelocityFactory.getEngine());
+ }
+
+ @Bean
+ public HTTPRedirectDeflateBinding httpRedirectDeflateBinding() {
+ return new HTTPRedirectDeflateBinding(parserPool());
+ }
+
+ @Bean
+ public SAMLProcessorImpl processor() {
+ ArrayList bindings = new ArrayList<>();
+ bindings.add(httpRedirectDeflateBinding());
+ bindings.add(httpPostBinding());
+ return new SAMLProcessorImpl(bindings);
+ }
+}
diff --git a/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/WebSecurityConfig.java b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/WebSecurityConfig.java
new file mode 100644
index 0000000000..297c391823
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/config/WebSecurityConfig.java
@@ -0,0 +1,152 @@
+package com.baeldung.saml.config;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.saml.*;
+import org.springframework.security.saml.key.KeyManager;
+import org.springframework.security.saml.metadata.*;
+import org.springframework.security.web.DefaultSecurityFilterChain;
+import org.springframework.security.web.FilterChainProxy;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.access.channel.ChannelProcessingFilter;
+import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
+import org.springframework.security.web.csrf.CsrfFilter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(securedEnabled = true)
+public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Value("${saml.sp}")
+ private String samlAudience;
+
+ @Autowired
+ @Qualifier("saml")
+ private SavedRequestAwareAuthenticationSuccessHandler samlAuthSuccessHandler;
+
+ @Autowired
+ @Qualifier("saml")
+ private SimpleUrlAuthenticationFailureHandler samlAuthFailureHandler;
+
+ @Autowired
+ private SAMLEntryPoint samlEntryPoint;
+
+ @Autowired
+ private SAMLLogoutFilter samlLogoutFilter;
+
+ @Autowired
+ private SAMLLogoutProcessingFilter samlLogoutProcessingFilter;
+
+ @Bean
+ public SAMLDiscovery samlDiscovery() {
+ SAMLDiscovery idpDiscovery = new SAMLDiscovery();
+ return idpDiscovery;
+ }
+
+ @Autowired
+ private SAMLAuthenticationProvider samlAuthenticationProvider;
+
+ @Autowired
+ private ExtendedMetadata extendedMetadata;
+
+ @Autowired
+ private KeyManager keyManager;
+
+ public MetadataGenerator metadataGenerator() {
+ MetadataGenerator metadataGenerator = new MetadataGenerator();
+ metadataGenerator.setEntityId(samlAudience);
+ metadataGenerator.setExtendedMetadata(extendedMetadata);
+ metadataGenerator.setIncludeDiscoveryExtension(false);
+ metadataGenerator.setKeyManager(keyManager);
+ return metadataGenerator;
+ }
+
+ @Bean
+ public SAMLProcessingFilter samlWebSSOProcessingFilter() throws Exception {
+ SAMLProcessingFilter samlWebSSOProcessingFilter = new SAMLProcessingFilter();
+ samlWebSSOProcessingFilter.setAuthenticationManager(authenticationManager());
+ samlWebSSOProcessingFilter.setAuthenticationSuccessHandler(samlAuthSuccessHandler);
+ samlWebSSOProcessingFilter.setAuthenticationFailureHandler(samlAuthFailureHandler);
+ return samlWebSSOProcessingFilter;
+ }
+
+ @Bean
+ public FilterChainProxy samlFilter() throws Exception {
+ List chains = new ArrayList<>();
+ chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SSO/**"),
+ samlWebSSOProcessingFilter()));
+ chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/discovery/**"),
+ samlDiscovery()));
+ chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/login/**"),
+ samlEntryPoint));
+ chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/logout/**"),
+ samlLogoutFilter));
+ chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SingleLogout/**"),
+ samlLogoutProcessingFilter));
+ return new FilterChainProxy(chains);
+ }
+
+ @Bean
+ @Override
+ public AuthenticationManager authenticationManagerBean() throws Exception {
+ return super.authenticationManagerBean();
+ }
+
+ @Bean
+ public MetadataGeneratorFilter metadataGeneratorFilter() {
+ return new MetadataGeneratorFilter(metadataGenerator());
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http
+ .csrf()
+ .disable();
+
+ http
+ .httpBasic()
+ .authenticationEntryPoint(samlEntryPoint);
+
+ http
+ .addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class)
+ .addFilterAfter(samlFilter(), BasicAuthenticationFilter.class)
+ .addFilterBefore(samlFilter(), CsrfFilter.class);
+
+ http
+ .authorizeRequests()
+ .antMatchers("/").permitAll()
+ .anyRequest().authenticated();
+
+ http
+ .logout()
+ .addLogoutHandler((request, response, authentication) -> {
+ try {
+ response.sendRedirect("/saml/logout");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+ auth.authenticationProvider(samlAuthenticationProvider);
+ }
+
+}
diff --git a/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/controller/HomeController.java b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/controller/HomeController.java
new file mode 100644
index 0000000000..e77933b8f3
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/java/com/baeldung/saml/controller/HomeController.java
@@ -0,0 +1,35 @@
+package com.baeldung.saml.controller;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+public class HomeController {
+
+ @RequestMapping("/")
+ public String index() {
+ return "index";
+ }
+
+ @GetMapping(value = "/auth")
+ public String handleSamlAuth() {
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ if (auth != null) {
+ return "redirect:/home";
+ } else {
+ return "/";
+ }
+ }
+
+ @RequestMapping("/home")
+ public String home(Model model) {
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ model.addAttribute("username", authentication.getPrincipal());
+ return "home";
+ }
+
+}
diff --git a/spring-security-modules/spring-security-saml/src/main/resources/application.properties b/spring-security-modules/spring-security-saml/src/main/resources/application.properties
new file mode 100644
index 0000000000..f9d6a5df3c
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/resources/application.properties
@@ -0,0 +1,6 @@
+saml.keystore.location=classpath:/saml/samlKeystore.jks
+saml.keystore.password=
+saml.keystore.alias=
+
+saml.idp=
+saml.sp=http://localhost:8080/saml/metadata
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-saml/src/main/resources/saml/metadata/sso.xml b/spring-security-modules/spring-security-saml/src/main/resources/saml/metadata/sso.xml
new file mode 100644
index 0000000000..2d3258de12
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/resources/saml/metadata/sso.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+ MIIDpDCCAoygAwIBAgIGAXGiSQ7ZMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJVUzETMBEG
+ A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU
+ MBIGA1UECwwLU1NPUHJvdmlkZXIxEzARBgNVBAMMCmRldi05MjY2NjYxHDAaBgkqhkiG9w0BCQEW
+ DWluZm9Ab2t0YS5jb20wHhcNMjAwNDIyMTQyNjA5WhcNMzAwNDIyMTQyNzA5WjCBkjELMAkGA1UE
+ BhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDVNhbiBGcmFuY2lzY28xDTALBgNV
+ BAoMBE9rdGExFDASBgNVBAsMC1NTT1Byb3ZpZGVyMRMwEQYDVQQDDApkZXYtOTI2NjY2MRwwGgYJ
+ KoZIhvcNAQkBFg1pbmZvQG9rdGEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+ g1rQYYqeVx2gl/UUnLJzp5hrm06VOILJB9hIUmNqXgWV3UjzDq/zX0KW8MENjsO7+S8a+LLnYRkb
+ N5egH9FSt8AHtB1pmfXDtpUQmWe9yJbNxbCISoc6XzCmaRw3HRv9pK5SciIutciz9lvFaHMWAWtP
+ MmQSKdhMet52tuf6sTy4ODeXjyMnD9q5QOKww1SJ678wjHbGRRhNvCxvTSAH33sa4oNCf2RvP9hp
+ NiJRcYW9yLZXmZArPQOuAx5PIXfHhK2e4ac39YO4fgO7gwU5TZ+vL7o6iEmd9tk44PrND0ZV5yzZ
+ +Y33Hiun3fIiZu/nZZGUjm4k4exl8JJpwrVTHQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBcfHcL
+ 2DjTjZGoANF4dPpGXTYdVnL/XzGiLS+3LR/HDrEz/EqsHouF40RnzdZ7Ax7RReKBYCUUqHpSE+LU
+ ductz2ANguzyseGEn72I4Ym4ytQWnFyTXeW+xI9CoCLGfOUhT1hlKjsu/qNM8qwKFPWkzQp7mDN8
+ S9MGhsnbiyeD/lceAEKw16Os73/sX2j7F+43WVCYRDCRB8pRIPfcqYLXUIUSstQlwEvCF7HyeO4+
+ jxKHA1tp9Cpmj7/VD9TE3fyvrbVmfjTbKjF7/0wYQNfbHDDko0ratDMAizG5/d3i9wk9KbGCHSxT
+ ph5nl1pdjKgAYPK0iNDnGCZbGKzXOrqV
+
+
+
+
+ urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
+
+ urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-saml/src/main/resources/saml/samlKeystore.jks b/spring-security-modules/spring-security-saml/src/main/resources/saml/samlKeystore.jks
new file mode 100644
index 0000000000..7f3a5850d9
Binary files /dev/null and b/spring-security-modules/spring-security-saml/src/main/resources/saml/samlKeystore.jks differ
diff --git a/spring-security-modules/spring-security-saml/src/main/resources/templates/error.html b/spring-security-modules/spring-security-saml/src/main/resources/templates/error.html
new file mode 100644
index 0000000000..7223ee43fd
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/resources/templates/error.html
@@ -0,0 +1,13 @@
+
+
+
+ Something went wrong
+
+
+
+ An error occurred
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-saml/src/main/resources/templates/home.html b/spring-security-modules/spring-security-saml/src/main/resources/templates/home.html
new file mode 100644
index 0000000000..c66e92c1f0
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/resources/templates/home.html
@@ -0,0 +1,13 @@
+
+
+
+Baeldung Spring Security SAML: Home
+
+
+ Welcome! You are successfully logged in!
+ You are logged as null .
+
+ Logout
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-saml/src/main/resources/templates/index.html b/spring-security-modules/spring-security-saml/src/main/resources/templates/index.html
new file mode 100644
index 0000000000..7999c2fded
--- /dev/null
+++ b/spring-security-modules/spring-security-saml/src/main/resources/templates/index.html
@@ -0,0 +1,10 @@
+
+
+
+Baeldung Spring Security SAML
+
+
+ Welcome to Baeldung Spring Security SAML
+ Login
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-angular/server/pom.xml b/spring-security-modules/spring-security-web-angular/server/pom.xml
index 19d980062c..07d5d44e8d 100644
--- a/spring-security-modules/spring-security-web-angular/server/pom.xml
+++ b/spring-security-modules/spring-security-web-angular/server/pom.xml
@@ -62,9 +62,4 @@
-
- UTF-8
- UTF-8
-
-
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/SpringSecurityConfig.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/SpringSecurityConfig.java
index 88814038a8..3d4182f423 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/SpringSecurityConfig.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/SpringSecurityConfig.java
@@ -28,12 +28,15 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private WebApplicationContext applicationContext;
- private CustomUserDetailsService userDetailsService;
+
@Autowired
private AuthenticationSuccessHandlerImpl successHandler;
+
@Autowired
private DataSource dataSource;
+ private CustomUserDetailsService userDetailsService;
+
@PostConstruct
public void completeSetup() {
userDetailsService = applicationContext.getBean(CustomUserDetailsService.class);
@@ -50,7 +53,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
}
@Override
- public void configure(WebSecurity web) throws Exception {
+ public void configure(WebSecurity web) {
web.ignoring()
.antMatchers("/resources/**");
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/models/AppUser.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/models/AppUser.java
index 2efd24e879..34bf775c1c 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/models/AppUser.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/models/AppUser.java
@@ -18,13 +18,17 @@ public class AppUser {
private long id;
private String name;
+
@Column(unique = true)
private String username;
+
private String password;
+
private boolean enabled = true;
+
private Date lastLogin;
- private AppUser() {
+ public AppUser() {
}
public AppUser(String name, String email, String password) {
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/models/Tweet.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/models/Tweet.java
index d8496f89be..2f593d5784 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/models/Tweet.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/models/Tweet.java
@@ -15,15 +15,27 @@ import javax.persistence.Table;
@Entity
@Table(name = "Tweet")
public class Tweet {
+
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
+
private String tweet;
+
private String owner;
+
@ElementCollection(targetClass = String.class, fetch = FetchType.EAGER)
@CollectionTable(name = "Tweet_Likes")
private Set likes = new HashSet<>();
+ public Tweet() {
+ }
+
+ public Tweet(String tweet, String owner) {
+ this.tweet = tweet;
+ this.owner = owner;
+ }
+
public long getId() {
return id;
}
@@ -32,14 +44,6 @@ public class Tweet {
this.id = id;
}
- private Tweet() {
- }
-
- public Tweet(String tweet, String owner) {
- this.tweet = tweet;
- this.owner = owner;
- }
-
public String getTweet() {
return tweet;
}
@@ -63,5 +67,4 @@ public class Tweet {
public void setLikes(Set likes) {
this.likes = likes;
}
-
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/repositories/TweetRepository.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/repositories/TweetRepository.java
index 4e4b16a151..685a1a8ab9 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/repositories/TweetRepository.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/repositories/TweetRepository.java
@@ -9,6 +9,6 @@ import com.baeldung.relationships.models.Tweet;
public interface TweetRepository extends PagingAndSortingRepository {
- @Query("select twt from Tweet twt JOIN twt.likes as lk where lk = ?#{ principal?.username } or twt.owner = ?#{ principal?.username }")
+ @Query("SELECT twt FROM Tweet twt JOIN twt.likes AS lk WHERE lk = ?#{ principal?.username } OR twt.owner = ?#{ principal?.username }")
Page getMyTweetsAndTheOnesILiked(Pageable pageable);
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/repositories/UserRepository.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/repositories/UserRepository.java
index 883ea332f8..c93acecd78 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/repositories/UserRepository.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/repositories/UserRepository.java
@@ -12,6 +12,7 @@ import org.springframework.transaction.annotation.Transactional;
import com.baeldung.relationships.models.AppUser;
public interface UserRepository extends CrudRepository {
+
AppUser findByUsername(String username);
List findByName(String name);
@@ -19,5 +20,5 @@ public interface UserRepository extends CrudRepository {
@Query("UPDATE AppUser u SET u.lastLogin=:lastLogin WHERE u.username = ?#{ principal?.username }")
@Modifying
@Transactional
- public void updateLastLogin(@Param("lastLogin") Date lastLogin);
+ void updateLastLogin(@Param("lastLogin") Date lastLogin);
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/AppUserPrincipal.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/AppUserPrincipal.java
index 1ae7d95e41..129e44fb0f 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/AppUserPrincipal.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/AppUserPrincipal.java
@@ -2,7 +2,6 @@ package com.baeldung.relationships.security;
import java.util.Collection;
import java.util.Collections;
-import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -14,14 +13,10 @@ public class AppUserPrincipal implements UserDetails {
private final AppUser user;
- //
-
public AppUserPrincipal(AppUser user) {
this.user = user;
}
- //
-
@Override
public String getUsername() {
return user.getUsername();
@@ -34,8 +29,7 @@ public class AppUserPrincipal implements UserDetails {
@Override
public Collection extends GrantedAuthority> getAuthorities() {
- final List authorities = Collections.singletonList(new SimpleGrantedAuthority("User"));
- return authorities;
+ return Collections.singletonList(new SimpleGrantedAuthority("User"));
}
@Override
@@ -58,10 +52,7 @@ public class AppUserPrincipal implements UserDetails {
return true;
}
- //
-
public AppUser getAppUser() {
return user;
}
-
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/AuthenticationSuccessHandlerImpl.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/AuthenticationSuccessHandlerImpl.java
index 1b85294467..3636a20c2d 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/AuthenticationSuccessHandlerImpl.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/AuthenticationSuccessHandlerImpl.java
@@ -1,9 +1,7 @@
package com.baeldung.relationships.security;
-import java.io.IOException;
import java.util.Date;
-import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -21,7 +19,7 @@ public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHa
private UserRepository userRepository;
@Override
- public void onAuthenticationSuccess(HttpServletRequest arg0, HttpServletResponse arg1, Authentication arg2) throws IOException, ServletException {
+ public void onAuthenticationSuccess(HttpServletRequest arg0, HttpServletResponse arg1, Authentication arg2) {
userRepository.updateLastLogin(new Date());
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/CustomUserDetailsService.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/CustomUserDetailsService.java
index 10c266bb74..f8a0f00d90 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/CustomUserDetailsService.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/security/CustomUserDetailsService.java
@@ -17,11 +17,8 @@ public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private WebApplicationContext applicationContext;
- private UserRepository userRepository;
- public CustomUserDetailsService() {
- super();
- }
+ private UserRepository userRepository;
@PostConstruct
public void completeSetup() {
@@ -36,5 +33,4 @@ public class CustomUserDetailsService implements UserDetailsService {
}
return new AppUserPrincipal(appUser);
}
-
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/util/DummyContentUtil.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/util/DummyContentUtil.java
index b8e5192b48..5c71728c6f 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/util/DummyContentUtil.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/relationships/util/DummyContentUtil.java
@@ -15,7 +15,7 @@ import com.baeldung.relationships.models.Tweet;
public class DummyContentUtil {
- public static final List generateDummyUsers() {
+ public static List generateDummyUsers() {
List appUsers = new ArrayList<>();
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
appUsers.add(new AppUser("Lionel Messi", "lionel@messi.com", passwordEncoder.encode("li1234")));
@@ -31,7 +31,7 @@ public class DummyContentUtil {
return appUsers;
}
- public static final List generateDummyTweets(List users) {
+ public static List generateDummyTweets(List users) {
List tweets = new ArrayList<>();
Random random = new Random();
IntStream.range(0, 9)
@@ -59,5 +59,4 @@ public class DummyContentUtil {
grantedAuthorities.add(grantedAuthority);
return grantedAuthorities;
}
-
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/Application.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/Application.java
index e7ace1f962..b4aa242ddc 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/Application.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/Application.java
@@ -3,11 +3,9 @@ package com.baeldung.roles.custom;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication
-@ComponentScan("com.baeldung.roles.custom")
@PropertySource("classpath:application-defaults.properties")
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/config/MvcConfig.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/config/MvcConfig.java
index c99d1e38a5..9ecd5c3abd 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/config/MvcConfig.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/config/MvcConfig.java
@@ -13,11 +13,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
- public MvcConfig() {
- super();
- }
-
- //
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/SetupData.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/SetupData.java
index ab57e7436c..25bf51507a 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/SetupData.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/SetupData.java
@@ -17,6 +17,7 @@ import org.springframework.stereotype.Component;
@Component
public class SetupData {
+
@Autowired
private UserRepository userRepository;
@@ -39,18 +40,18 @@ public class SetupData {
private void initUsers() {
final Privilege privilege1 = privilegeRepository.findByName("FOO_READ_PRIVILEGE");
final Privilege privilege2 = privilegeRepository.findByName("FOO_WRITE_PRIVILEGE");
- //
+
final User user1 = new User();
user1.setUsername("john");
user1.setPassword(encoder.encode("123"));
- user1.setPrivileges(new HashSet(Arrays.asList(privilege1)));
+ user1.setPrivileges(new HashSet<>(Arrays.asList(privilege1)));
user1.setOrganization(organizationRepository.findByName("FirstOrg"));
userRepository.save(user1);
- //
+
final User user2 = new User();
user2.setUsername("tom");
user2.setPassword(encoder.encode("111"));
- user2.setPrivileges(new HashSet(Arrays.asList(privilege1, privilege2)));
+ user2.setPrivileges(new HashSet<>(Arrays.asList(privilege1, privilege2)));
user2.setOrganization(organizationRepository.findByName("SecondOrg"));
userRepository.save(user2);
}
@@ -58,7 +59,7 @@ public class SetupData {
private void initOrganizations() {
final Organization org1 = new Organization("FirstOrg");
organizationRepository.save(org1);
- //
+
final Organization org2 = new Organization("SecondOrg");
organizationRepository.save(org2);
}
@@ -66,7 +67,7 @@ public class SetupData {
private void initPrivileges() {
final Privilege privilege1 = new Privilege("FOO_READ_PRIVILEGE");
privilegeRepository.save(privilege1);
- //
+
final Privilege privilege2 = new Privilege("FOO_WRITE_PRIVILEGE");
privilegeRepository.save(privilege2);
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/OrganizationRepository.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/OrganizationRepository.java
index 2f585f3527..e5c99af331 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/OrganizationRepository.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/OrganizationRepository.java
@@ -5,6 +5,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
public interface OrganizationRepository extends JpaRepository {
- public Organization findByName(String name);
-
+ Organization findByName(String name);
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/PrivilegeRepository.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/PrivilegeRepository.java
index c83e0f505e..43b8c317c5 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/PrivilegeRepository.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/PrivilegeRepository.java
@@ -5,6 +5,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
public interface PrivilegeRepository extends JpaRepository {
- public Privilege findByName(String name);
-
+ Privilege findByName(String name);
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/UserRepository.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/UserRepository.java
index 884a998219..d6744f4d51 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/UserRepository.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/dao/UserRepository.java
@@ -10,5 +10,4 @@ public interface UserRepository extends JpaRepository {
@Transactional
void removeUserByUsername(String username);
-
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Foo.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Foo.java
index 3dbf48f7ce..eab7696b47 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Foo.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Foo.java
@@ -8,6 +8,7 @@ import javax.persistence.Id;
@Entity
public class Foo {
+
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@@ -15,19 +16,13 @@ public class Foo {
@Column(nullable = false)
private String name;
- //
-
public Foo() {
- super();
}
public Foo(String name) {
- super();
this.name = name;
}
- //
-
public Long getId() {
return id;
}
@@ -44,8 +39,6 @@ public class Foo {
this.name = name;
}
- //
-
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Organization.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Organization.java
index 0d0220b6b2..f9dc992b8c 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Organization.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Organization.java
@@ -16,19 +16,13 @@ public class Organization {
@Column(nullable = false, unique = true)
private String name;
- //
-
public Organization() {
- super();
}
public Organization(String name) {
- super();
this.name = name;
}
- //
-
public Long getId() {
return id;
}
@@ -45,8 +39,6 @@ public class Organization {
this.name = name;
}
- //
-
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Privilege.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Privilege.java
index 60e0506641..7757ec1bf6 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Privilege.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/Privilege.java
@@ -16,19 +16,13 @@ public class Privilege {
@Column(nullable = false, unique = true)
private String name;
- //
-
public Privilege() {
- super();
}
public Privilege(String name) {
- super();
this.name = name;
}
- //
-
public Long getId() {
return id;
}
@@ -45,8 +39,6 @@ public class Privilege {
this.name = name;
}
- //
-
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/User.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/User.java
index 219f40a3df..45ae8c64ca 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/User.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/persistence/model/User.java
@@ -35,13 +35,6 @@ public class User {
@JoinColumn(name = "organization_id", referencedColumnName = "id")
private Organization organization;
- //
-
- public User() {
- super();
- }
-
- //
public Long getId() {
return id;
}
@@ -82,8 +75,6 @@ public class User {
this.organization = organization;
}
- //
-
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionRoot.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionRoot.java
index dd9f6a5786..47a4472a93 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionRoot.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomMethodSecurityExpressionRoot.java
@@ -14,14 +14,11 @@ public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot i
super(authentication);
}
- //
public boolean isMember(Long OrganizationId) {
final User user = ((MyUserPrincipal) this.getPrincipal()).getUser();
return user.getOrganization().getId().longValue() == OrganizationId.longValue();
}
- //
-
@Override
public Object getFilterObject() {
return this.filterObject;
@@ -46,5 +43,4 @@ public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot i
public void setReturnObject(Object obj) {
this.returnObject = obj;
}
-
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomPermissionEvaluator.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomPermissionEvaluator.java
index d69e405b28..2e81859203 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomPermissionEvaluator.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/CustomPermissionEvaluator.java
@@ -27,11 +27,8 @@ public class CustomPermissionEvaluator implements PermissionEvaluator {
private boolean hasPrivilege(Authentication auth, String targetType, String permission) {
for (final GrantedAuthority grantedAuth : auth.getAuthorities()) {
- System.out.println("here " + grantedAuth);
- if (grantedAuth.getAuthority().startsWith(targetType)) {
- if (grantedAuth.getAuthority().contains(permission)) {
- return true;
- }
+ if (grantedAuth.getAuthority().startsWith(targetType) && grantedAuth.getAuthority().contains(permission)) {
+ return true;
}
}
return false;
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MySecurityExpressionRoot.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MySecurityExpressionRoot.java
index 8448ad9075..f3a3cbeb46 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MySecurityExpressionRoot.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MySecurityExpressionRoot.java
@@ -15,6 +15,7 @@ import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
public class MySecurityExpressionRoot implements MethodSecurityExpressionOperations {
+
protected final Authentication authentication;
private AuthenticationTrustResolver trustResolver;
private RoleHierarchy roleHierarchy;
@@ -30,8 +31,6 @@ public class MySecurityExpressionRoot implements MethodSecurityExpressionOperati
public final String delete = "delete";
public final String admin = "administration";
- //
-
private Object filterObject;
private Object returnObject;
@@ -47,14 +46,11 @@ public class MySecurityExpressionRoot implements MethodSecurityExpressionOperati
throw new RuntimeException("method hasAuthority() not allowed");
}
- //
public boolean isMember(Long OrganizationId) {
final User user = ((MyUserPrincipal) this.getPrincipal()).getUser();
return user.getOrganization().getId().longValue() == OrganizationId.longValue();
}
- //
-
@Override
public final boolean hasAnyAuthority(String... authorities) {
return hasAnyAuthorityName(null, authorities);
@@ -136,7 +132,6 @@ public class MySecurityExpressionRoot implements MethodSecurityExpressionOperati
private Set getAuthoritySet() {
if (roles == null) {
- roles = new HashSet();
Collection extends GrantedAuthority> userAuthorities = authentication.getAuthorities();
if (roleHierarchy != null) {
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserDetailsService.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserDetailsService.java
index c6514d6c05..dc845e05e1 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserDetailsService.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserDetailsService.java
@@ -14,12 +14,6 @@ public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
- public MyUserDetailsService() {
- super();
- }
-
- // API
-
@Override
public UserDetails loadUserByUsername(final String username) {
final User user = userRepository.findByUsername(username);
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserPrincipal.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserPrincipal.java
index 41741c64f4..afe92fb066 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserPrincipal.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/security/MyUserPrincipal.java
@@ -16,14 +16,10 @@ public class MyUserPrincipal implements UserDetails {
private final User user;
- //
-
public MyUserPrincipal(User user) {
this.user = user;
}
- //
-
@Override
public String getUsername() {
return user.getUsername();
@@ -36,7 +32,7 @@ public class MyUserPrincipal implements UserDetails {
@Override
public Collection extends GrantedAuthority> getAuthorities() {
- final List authorities = new ArrayList();
+ final List authorities = new ArrayList<>();
for (final Privilege privilege : user.getPrivileges()) {
authorities.add(new SimpleGrantedAuthority(privilege.getName()));
}
@@ -63,10 +59,7 @@ public class MyUserPrincipal implements UserDetails {
return true;
}
- //
-
public User getUser() {
return user;
}
-
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/web/MainController.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/web/MainController.java
index beb12f7749..1908289f96 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/web/MainController.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/custom/web/MainController.java
@@ -39,8 +39,6 @@ public class MainController {
return foo;
}
- //
-
@PreAuthorize("hasAuthority('FOO_READ_PRIVILEGE')")
@GetMapping("/foos")
@ResponseBody
@@ -48,8 +46,6 @@ public class MainController {
return new Foo(name);
}
- //
-
@PreAuthorize("isMember(#id)")
@GetMapping("/organizations/{id}")
@ResponseBody
@@ -64,5 +60,4 @@ public class MainController {
public MyUserPrincipal retrieveUserDetails(@AuthenticationPrincipal MyUserPrincipal principal) {
return principal;
}
-
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/IpApplication.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/IpApplication.java
index b9a86fee3e..ca1d21505b 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/IpApplication.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/IpApplication.java
@@ -3,11 +3,9 @@ package com.baeldung.roles.ip;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication
-@ComponentScan("com.baeldung.ip")
@PropertySource("classpath:application-defaults.properties")
public class IpApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/config/CustomIpAuthenticationProvider.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/config/CustomIpAuthenticationProvider.java
index adcadb65e8..637af2301f 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/config/CustomIpAuthenticationProvider.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/config/CustomIpAuthenticationProvider.java
@@ -1,10 +1,5 @@
package com.baeldung.roles.ip.config;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -15,13 +10,17 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import org.springframework.stereotype.Component;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
@Component
public class CustomIpAuthenticationProvider implements AuthenticationProvider {
-
- Set whitelist = new HashSet();
+
+ Set whitelist = new HashSet<>();
public CustomIpAuthenticationProvider() {
- super();
whitelist.add("11.11.11.11");
whitelist.add("127.0.0.1");
}
@@ -30,18 +29,17 @@ public class CustomIpAuthenticationProvider implements AuthenticationProvider {
public Authentication authenticate(Authentication auth) throws AuthenticationException {
WebAuthenticationDetails details = (WebAuthenticationDetails) auth.getDetails();
String userIp = details.getRemoteAddress();
- if(! whitelist.contains(userIp)){
+ if (!whitelist.contains(userIp)) {
throw new BadCredentialsException("Invalid IP Address");
}
final String name = auth.getName();
final String password = auth.getCredentials().toString();
-
+
if (name.equals("john") && password.equals("123")) {
- List authorities =new ArrayList();
- authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
- return new UsernamePasswordAuthenticationToken(name, password, authorities);
- }
- else{
+ List authorities = new ArrayList<>();
+ authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
+ return new UsernamePasswordAuthenticationToken(name, password, authorities);
+ } else {
throw new BadCredentialsException("Invalid username or password");
}
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityConfig.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityConfig.java
index 46ba62afb3..71c7bcccc6 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityConfig.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/config/SecurityConfig.java
@@ -8,7 +8,7 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
-@EnableWebSecurity//(debug = true)
+@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@@ -22,7 +22,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
- // @formatter:off
http.authorizeRequests()
.antMatchers("/login").permitAll()
// .antMatchers("/foos/**").hasIpAddress("11.11.11.11")
@@ -30,7 +29,5 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.anyRequest().authenticated()
.and().formLogin().permitAll()
.and().csrf().disable();
- // @formatter:on
}
-
}
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/web/MainController.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/web/MainController.java
index 438b668c5f..6fa165433a 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/web/MainController.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/ip/web/MainController.java
@@ -11,9 +11,8 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.web.FilterChainProxy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@@ -23,7 +22,7 @@ public class MainController {
@Qualifier("springSecurityFilterChain")
private Filter springSecurityFilterChain;
- @RequestMapping(method = RequestMethod.GET, value = "/filters")
+ @GetMapping("/filters")
@ResponseBody
public void getFilters() {
FilterChainProxy filterChainProxy = (FilterChainProxy) springSecurityFilterChain;
@@ -32,11 +31,10 @@ public class MainController {
.flatMap(chain -> chain.getFilters().stream())
.forEach(filter -> System.out.println(filter.getClass()));
}
-
- @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}")
+
+ @GetMapping("/foos/{id}")
@ResponseBody
public Foo findById(@PathVariable final long id, HttpServletRequest request) {
return new Foo("Sample");
}
-
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/CustomAuthenticationProvider.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/CustomAuthenticationProvider.java
index 5168e64b4a..78bb18354b 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/CustomAuthenticationProvider.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/CustomAuthenticationProvider.java
@@ -12,11 +12,11 @@ import org.springframework.security.core.userdetails.UserDetailsService;
public class CustomAuthenticationProvider extends DaoAuthenticationProvider {
private final UserRepository userRepository;
+
@SuppressWarnings("unused")
private UserDetailsService userDetailsService;
public CustomAuthenticationProvider(UserRepository userRepository, UserDetailsService userDetailsService){
- super();
this.setUserDetailsService(userDetailsService);
this.userRepository = userRepository;
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyLogoutSuccessHandler.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyLogoutSuccessHandler.java
index 23104e5292..0ee4707d1b 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyLogoutSuccessHandler.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyLogoutSuccessHandler.java
@@ -2,7 +2,6 @@ package com.baeldung.roles.rolesauthorities;
import java.io.IOException;
-import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@@ -15,7 +14,7 @@ import org.springframework.stereotype.Component;
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
@Override
- public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
+ public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {
final HttpSession session = request.getSession();
if (session != null) {
session.removeAttribute("user");
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyUserDetailsService.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyUserDetailsService.java
index 18230ba794..72fae18c09 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyUserDetailsService.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/MyUserDetailsService.java
@@ -24,12 +24,6 @@ public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
- public MyUserDetailsService() {
- super();
- }
-
- // API
-
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
@@ -38,17 +32,20 @@ public class MyUserDetailsService implements UserDetailsService {
if (user == null) {
throw new UsernameNotFoundException("No user found with username: " + email);
}
- org.springframework.security.core.userdetails.User userDetails = new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), user.isEnabled(), true, true, true, getAuthorities(user.getRoles()));
- return userDetails;
+ return new org.springframework.security.core.userdetails.User(user.getEmail(),
+ user.getPassword(),
+ user.isEnabled(),
+ true,
+ true,
+ true,
+ getAuthorities(user.getRoles()));
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
- // UTIL
-
- private final Collection extends GrantedAuthority> getAuthorities(Collection roles) {
- List authorities = new ArrayList();
+ private Collection extends GrantedAuthority> getAuthorities(Collection roles) {
+ List authorities = new ArrayList<>();
for (Role role: roles) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
authorities.addAll(role.getPrivileges()
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/RolesAuthoritiesApplication.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/RolesAuthoritiesApplication.java
index d3e54b4303..72d655c051 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/RolesAuthoritiesApplication.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/RolesAuthoritiesApplication.java
@@ -8,7 +8,7 @@ import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
-@ComponentScan("com.baeldung.rolesauthorities")
+@ComponentScan("com.baeldung.roles.rolesauthorities")
public class RolesAuthoritiesApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
System.setProperty("spring.profiles.default", "rolesauthorities");
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/MvcConfig.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/MvcConfig.java
index 61394b6178..3dd60704f0 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/MvcConfig.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/MvcConfig.java
@@ -13,11 +13,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
- public MvcConfig() {
- super();
- }
-
- //
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/SecurityConfig.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/SecurityConfig.java
index cb8476fcc7..9b7ccfd25b 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/SecurityConfig.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/config/SecurityConfig.java
@@ -31,10 +31,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private LogoutSuccessHandler myLogoutSuccessHandler;
- public SecurityConfig() {
- super();
- }
-
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authProvider());
@@ -50,7 +46,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
- // @formatter:off
http
.csrf().disable()
.authorizeRequests()
@@ -69,11 +64,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.logoutSuccessUrl("/logout.html?logSucc=true")
.deleteCookies("JSESSIONID")
.permitAll();
- // @formatter:on
}
- // beans
-
@Bean
public DaoAuthenticationProvider authProvider() {
final CustomAuthenticationProvider authProvider
@@ -86,5 +78,4 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder(11);
}
-
}
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Privilege.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Privilege.java
index 507beaffa8..1e444faf2d 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Privilege.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Privilege.java
@@ -21,16 +21,12 @@ public class Privilege {
private Collection roles;
public Privilege() {
- super();
}
public Privilege(String name) {
- super();
this.name = name;
}
- //
-
public Long getId() {
return id;
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Role.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Role.java
index a284d92090..031c9f0828 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Role.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/Role.java
@@ -27,16 +27,12 @@ public class Role {
private String name;
public Role() {
- super();
}
public Role(String name) {
- super();
this.name = name;
}
- //
-
public Long getId() {
return id;
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/User.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/User.java
index ebf0c9b310..cb90947ed6 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/User.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/model/User.java
@@ -35,14 +35,11 @@ public class User {
private boolean isUsing2FA;
- //
-
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
private Collection roles;
public User() {
- super();
this.enabled = false;
}
@@ -143,5 +140,4 @@ public class User {
.append(firstName).append(", lastName=").append(lastName).append(", email=").append(email).append(", password=").append(password).append(", enabled=").append(enabled).append(", roles=").append(roles).append("]");
return builder.toString();
}
-
}
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/SetupDataLoader.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/SetupDataLoader.java
index 140fc56e53..bf3245a391 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/SetupDataLoader.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/rolesauthorities/persistence/SetupDataLoader.java
@@ -74,7 +74,7 @@ public class SetupDataLoader implements ApplicationListener privileges) {
+ public Role createRoleIfNotFound(String name, Collection privileges) {
Role role = roleRepository.findByName(name);
if (role == null) {
role = new Role(name);
@@ -93,5 +93,4 @@ public class SetupDataLoader implements ApplicationListener "ROLE_USER".equals(r) && LocalDateTime.now().getMinute() % 2 != 0).findAny().map(s -> ACCESS_DENIED).orElseGet(() -> ACCESS_ABSTAIN);
+ return authentication.getAuthorities()
+ .stream()
+ .map(GrantedAuthority::getAuthority)
+ .filter(r -> "ROLE_USER".equals(r) && LocalDateTime.now().getMinute() % 2 != 0)
+ .findAny()
+ .map(s -> ACCESS_DENIED)
+ .orElse(ACCESS_ABSTAIN);
}
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java
index 402065129f..4133d5fdb8 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/VoterMvcConfig.java
@@ -4,10 +4,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-/**
- * Created by ambrusadrianz on 30/09/2016.
- */
-
@Configuration
public class VoterMvcConfig implements WebMvcConfigurer {
@Override
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java
index 1a6d1b8235..5141e1af7c 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/WebSecurityConfig.java
@@ -22,28 +22,46 @@ import java.util.List;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
- // @formatter: off
- auth.inMemoryAuthentication().withUser("user").password(passwordEncoder().encode("pass")).roles("USER").and().withUser("admin").password(passwordEncoder().encode("pass")).roles("ADMIN");
- // @formatter: on
+ auth
+ .inMemoryAuthentication()
+ .withUser("user")
+ .password(passwordEncoder().encode("pass"))
+ .roles("USER")
+ .and()
+ .withUser("admin")
+ .password(passwordEncoder().encode("pass"))
+ .roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
- // @formatter: off
http
- // needed so our login could work
- .csrf().disable().authorizeRequests().anyRequest().authenticated().accessDecisionManager(accessDecisionManager()).and().formLogin().permitAll().and().logout().permitAll()
- .deleteCookies("JSESSIONID").logoutSuccessUrl("/login");
- // @formatter: on
+ .csrf()
+ .disable()
+ .authorizeRequests()
+ .anyRequest()
+ .authenticated()
+ .accessDecisionManager(accessDecisionManager())
+ .and()
+ .formLogin()
+ .permitAll()
+ .and()
+ .logout()
+ .permitAll()
+ .deleteCookies("JSESSIONID").logoutSuccessUrl("/login");
}
@Bean
public AccessDecisionManager accessDecisionManager() {
- // @formatter: off
- List> decisionVoters = Arrays.asList(new WebExpressionVoter(), new RoleVoter(), new AuthenticatedVoter(), new MinuteBasedVoter());
- // @formatter: on
+ List> decisionVoters = Arrays.asList(
+ new WebExpressionVoter(),
+ new RoleVoter(),
+ new AuthenticatedVoter(),
+ new MinuteBasedVoter());
+
return new UnanimousBased(decisionVoters);
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/XmlSecurityConfig.java b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/XmlSecurityConfig.java
index 0ef2ef51c7..17a63142ea 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/XmlSecurityConfig.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/main/java/com/baeldung/roles/voter/XmlSecurityConfig.java
@@ -1,12 +1,6 @@
package com.baeldung.roles.voter;
-/**
- * Created by ambrusadrianz on 09/10/2016.
- */
// @Configuration
// @ImportResource({ "classpath:spring-security-custom-voter.xml" })
public class XmlSecurityConfig {
- public XmlSecurityConfig() {
- super();
- }
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java
index 54120650d9..10c32de5d7 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java
@@ -36,12 +36,15 @@ import static org.springframework.util.Assert.isTrue;
@ContextConfiguration
@DirtiesContext
public class SpringDataWithSecurityIntegrationTest {
- AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
- @Autowired
- private ServletContext servletContext;
+
private static UserRepository userRepository;
private static TweetRepository tweetRepository;
+ @Autowired
+ private ServletContext servletContext;
+
+ AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
+
@Before
public void testInit() {
ctx.register(AppConfig.class);
diff --git a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java
index 5a040b8dea..56f87e8aee 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/ApplicationLiveTest.java
@@ -13,7 +13,7 @@ import io.restassured.specification.RequestSpecification;
import org.junit.Test;
import org.springframework.http.MediaType;
-// In order to execute these tests, com.baeldung.custom.Application needs to be running.
+// In order to execute these tests, com.baeldung.roles.custom.Application needs to be running.
public class ApplicationLiveTest {
@Test
@@ -36,8 +36,6 @@ public class ApplicationLiveTest {
assertTrue(response.asString().contains("id"));
}
- //
-
@Test
public void givenUserMemberInOrganization_whenGetOrganization_thenOK() {
final Response response = givenAuth("john", "123").get("http://localhost:8082/organizations/1");
@@ -51,8 +49,6 @@ public class ApplicationLiveTest {
assertEquals(403, response.getStatusCode());
}
- //
-
@Test
public void givenDisabledSecurityExpression_whenGetFooByName_thenError() {
final Response response = givenAuth("john", "123").get("http://localhost:8082/foos?name=sample");
@@ -60,7 +56,6 @@ public class ApplicationLiveTest {
assertTrue(response.asString().contains("method hasAuthority() not allowed"));
}
- //
private RequestSpecification givenAuth(String username, String password) {
return RestAssured.given().log().uri().auth().form(username, password, new FormAuthConfig("/login","username","password"));
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/CustomUserDetailsServiceIntegrationTest.java b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/CustomUserDetailsServiceIntegrationTest.java
index df7645150f..23ec605a36 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/CustomUserDetailsServiceIntegrationTest.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/CustomUserDetailsServiceIntegrationTest.java
@@ -82,8 +82,7 @@ public class CustomUserDetailsServiceIntegrationTest {
private static String asJsonString(final Object obj) throws Exception {
final ObjectMapper mapper = new ObjectMapper();
- final String jsonContent = mapper.writeValueAsString(obj);
- return jsonContent;
+ return mapper.writeValueAsString(obj);
}
}
diff --git a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/IpLiveTest.java b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/IpLiveTest.java
index 2d0e2e5402..a57f9e675f 100644
--- a/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/IpLiveTest.java
+++ b/spring-security-modules/spring-security-web-boot-1/src/test/java/com/baeldung/roles/web/IpLiveTest.java
@@ -8,7 +8,7 @@ import io.restassured.response.Response;
import org.junit.Test;
-// In order to execute these tests, com.baeldung.ip.IpApplication needs to be running.
+// In order to execute these tests, com.baeldung.roles.ip.IpApplication needs to be running.
public class IpLiveTest {
@Test
diff --git a/spring-security-modules/spring-security-web-boot-3/README.md b/spring-security-modules/spring-security-web-boot-3/README.md
new file mode 100644
index 0000000000..aeba397f40
--- /dev/null
+++ b/spring-security-modules/spring-security-web-boot-3/README.md
@@ -0,0 +1,11 @@
+## Spring Boot Security MVC
+
+This module contains articles about Spring Security with Spring MVC in Boot applications
+
+### The Course
+The "REST With Spring" Classes: http://github.learnspringsecurity.com
+
+### Relevant Articles:
+
+- [TLS Setup in Spring](https://www.baeldung.com/spring-tls-setup)
+- More articles: [[<-- prev]](/spring-security-modules/spring-security-web-boot-2)
diff --git a/spring-security-modules/spring-security-web-boot-3/pom.xml b/spring-security-modules/spring-security-web-boot-3/pom.xml
new file mode 100644
index 0000000000..a6e2b48d75
--- /dev/null
+++ b/spring-security-modules/spring-security-web-boot-3/pom.xml
@@ -0,0 +1,30 @@
+
+
+ 4.0.0
+ spring-security-web-boot-3
+ 0.0.1-SNAPSHOT
+ spring-security-web-boot-3
+ jar
+ Spring Security MVC Boot - 3
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/HomeController.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/HomeController.java
new file mode 100644
index 0000000000..c72821cc9b
--- /dev/null
+++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/HomeController.java
@@ -0,0 +1,16 @@
+package com.baeldung.tls;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class HomeController {
+
+ @GetMapping("/baeldung")
+ public ResponseEntity welcome() {
+ return new ResponseEntity<>("tls/baeldung", HttpStatus.OK);
+ }
+
+}
diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/SecurityConfig.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/SecurityConfig.java
new file mode 100644
index 0000000000..63b59b8cc8
--- /dev/null
+++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/SecurityConfig.java
@@ -0,0 +1,16 @@
+package com.baeldung.tls;
+
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@EnableWebSecurity
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.authorizeRequests()
+ .antMatchers("/**")
+ .permitAll();
+ }
+}
diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/TLSEnabledApplication.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/TLSEnabledApplication.java
new file mode 100644
index 0000000000..62ba77d769
--- /dev/null
+++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/TLSEnabledApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.tls;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.PropertySource;
+
+@SpringBootApplication
+public class TLSEnabledApplication {
+
+ public static void main(String... args) {
+ SpringApplication application = new SpringApplication(TLSEnabledApplication.class);
+ application.setAdditionalProfiles("tls");
+ application.run(args);
+ }
+}
diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/resources/application-tls.properties b/spring-security-modules/spring-security-web-boot-3/src/main/resources/application-tls.properties
new file mode 100644
index 0000000000..002d702eab
--- /dev/null
+++ b/spring-security-modules/spring-security-web-boot-3/src/main/resources/application-tls.properties
@@ -0,0 +1,23 @@
+
+server.port=8443
+
+# enable/disable https
+server.ssl.enabled=true
+# keystore format
+server.ssl.key-store-type=PKCS12
+# keystore location
+server.ssl.key-store=classpath:keystore/keystore.p12
+# keystore password
+server.ssl.key-store-password=changeit
+server.ssl.key-alias=baeldung
+# SSL protocol to use
+server.ssl.protocol=TLS
+# Enabled SSL protocols
+server.ssl.enabled-protocols=TLSv1.2
+
+#server.ssl.client-auth=need
+
+#trust store location
+#server.ssl.trust-store=classpath:keystore/truststore.p12
+#trust store password
+#server.ssl.trust-store-password=changeit
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/resources/keystore/baeldung.cer b/spring-security-modules/spring-security-web-boot-3/src/main/resources/keystore/baeldung.cer
new file mode 100644
index 0000000000..1a6bb4d49b
--- /dev/null
+++ b/spring-security-modules/spring-security-web-boot-3/src/main/resources/keystore/baeldung.cer
@@ -0,0 +1,28 @@
+-----BEGIN CERTIFICATE-----
+MIIExzCCAq+gAwIBAgIEbh/WszANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDEwls
+b2NhbGhvc3QwHhcNMjEwMzIxMDgzMzU3WhcNMzEwMzE5MDgzMzU3WjAUMRIwEAYD
+VQQDEwlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCD
+QWvAEewDE+vFFqYPgXFJ94bMgPZT6qdb17DkWWbL2jV5QENbSYTLAPNQ1TGUgKhj
+t1LCHpooLwWIo6xvhK/qZYjh3YonSIe8Eo0fBCDoZpLO+Vp0us22NBgLOYH8hvAm
+zEvPXdSZo5Qkeaqjwd6kB/z083y8OL+Civ0ARXoLsn7CFslKfZp2o/aebH6i/T+3
+hWVqasIIMtfNUrxE/pnOnV8aSAt24jcm/VxbtheqIzmcOPlCXSP1RAmFez6tJsNu
+2dbUhaeOf95RCaM6a43soEvLvooGa/uqBPsRojg5WEFGf7Tc7pzB+BtALwRmHAqr
+hiYjVv329QGZ+g8dADBvvqvGpGysy+X0LxixvIP14KdCqG8uMYmw5cBTJHc23AHV
+iP+JsfDtdu+bzZeOZmhSsv4M3DZ1QPHEX+zCnotE+SeycqEr+3SaJELyjCB1twFT
+pCRCQGWFKYCRwhjQ1vGY7qhD6ZDn30a96xAlPS+T35pA01rNgORJi8j9sf3oiwEe
+oPQOecgFHdua5drHJ78j7MUz/Gvj02GnwKnBKbMYDGeBKJWm0ir4MxoU7HPaDwLj
+jofXgIz+CMXkp+9arVu5IsZwL2MKNZ4fiM+VWZg9R73CAVpKvs6dTlQXe++DCaOr
+XGiQeCPPpIC74vqWhAHuzPncGJndHlmXYGLhi0sk0wIDAQABoyEwHzAdBgNVHQ4E
+FgQUhW4a3uWREJoTxodyD5u7i7mCaacwDQYJKoZIhvcNAQELBQADggIBAD/Qfkot
+qklQr4r7eoHtyFCGozfZvsPwEediZORkycU/fCZozdVh95ebt2/N/jw7RlNhv+t+
+HahMoiXbLX2RUrqM/2X5U7BbxIpy3XjhcEYTJudqFfCxDQfxD1bFrWHygQzAanOb
+sPHkcEt3tu2suV2YsJpHry/1BMo83WAoTgw/3dFtJ7oEoi/LaI03v9Qlp0+hLfA5
+zwyuuRqFn24FRvdWHX5GqAweF+WUdmmlkiJiKu2RtQsPoN7ITvZQs9t4l0zZ8w2v
+QV0YdhWYLkS3g53oyOP8T5YlCFGuUOyo433hRyrzaxj3aFDkMbNrX9REB9v8Iz7X
+aFsmLDJsfT5Spovz68HCIMDW1Sl1WqVkNN2V3Rwt72bn7DEbKZzGW9RC5eXEW1Zw
+46XeYOVdEjzl/l623moWC5ZTlwPF1qRDaoZXT/1d1eAJE8ZBHm1YjwgDD5aFvylG
+0OT1qWD5gx3nOmAbBk1e3r8ESMo9k29/4hycUUUgtFuWtBwBaY/O/4YoLx59wbpL
+rFR/zjKIdYFj0AM2ABTgrG7v5pEhjLTnzjc+mZV7hJCBvB+bbC5vvfDg0K7lQUpJ
+ruIPvqKfJyuTwkKmoTF5jmG04jwUDtA5iGUB3U3QiQ8zcbTiVRptXLEQDYw/bzDk
+0fd4xTbok1ygI7wJ/KRyMvFXdbTKSvVu/tnM
+-----END CERTIFICATE-----
diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/resources/keystore/keystore.p12 b/spring-security-modules/spring-security-web-boot-3/src/main/resources/keystore/keystore.p12
new file mode 100644
index 0000000000..6f0d9c508c
Binary files /dev/null and b/spring-security-modules/spring-security-web-boot-3/src/main/resources/keystore/keystore.p12 differ
diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml
index 37ee84da25..ca96dcff35 100644
--- a/spring-web-modules/pom.xml
+++ b/spring-web-modules/pom.xml
@@ -41,6 +41,7 @@
spring-thymeleaf
spring-thymeleaf-2
spring-thymeleaf-3
+ spring-boot-jsp
diff --git a/spring-web-modules/spring-boot-jsp/README.md b/spring-web-modules/spring-boot-jsp/README.md
new file mode 100644
index 0000000000..535f86531d
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Spring Boot With JavaServer Pages (JSP)](https://www.baeldung.com/spring-boot-jsp)
diff --git a/spring-web-modules/spring-boot-jsp/pom.xml b/spring-web-modules/spring-boot-jsp/pom.xml
new file mode 100644
index 0000000000..d646b6058a
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/pom.xml
@@ -0,0 +1,91 @@
+
+
+ 4.0.0
+ spring-boot-jsp
+ 0.0.1-SNAPSHOT
+ spring-boot-jsp
+ war
+
+
+ com.baeldung
+ spring-web-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+ javax.servlet
+ jstl
+ ${jstl.version}
+
+
+ org.apache.tomcat.embed
+ tomcat-embed-jasper
+
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ spring-boot-jsp
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+ com.baeldung.boot.jsp.SpringBootJspApplication
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+
+ 1.2
+ 5.7.1
+ 2.4.4
+
+
+
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspApplication.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspApplication.java
new file mode 100644
index 0000000000..c77554f9f6
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspApplication.java
@@ -0,0 +1,19 @@
+package com.baeldung.boot.jsp;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+@SpringBootApplication(scanBasePackages = "com.baeldung.boot.jsp")
+public class SpringBootJspApplication extends SpringBootServletInitializer {
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
+ return builder.sources(SpringBootJspApplication.class);
+ }
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootJspApplication.class);
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspConfiguration.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspConfiguration.java
new file mode 100644
index 0000000000..7fdae2c2a6
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/SpringBootJspConfiguration.java
@@ -0,0 +1,29 @@
+package com.baeldung.boot.jsp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.baeldung.boot.jsp.repository.BookRepository;
+import com.baeldung.boot.jsp.repository.impl.InMemoryBookRepository;
+import com.baeldung.boot.jsp.repository.model.BookData;
+
+@Configuration
+public class SpringBootJspConfiguration {
+
+ @Bean
+ public BookRepository provideBookRepository() {
+ return new InMemoryBookRepository(initialBookData());
+ }
+
+ private static Map initialBookData() {
+ Map initData = new HashMap<>();
+ initData.put("ISBN-1", new BookData("ISBN-1", "Book 1", "Book 1 Author"));
+ initData.put("ISBN-2", new BookData("ISBN-2", "Book 2", "Book 2 Author"));
+ initData.put("ISBN-3", new BookData("ISBN-3", "Book 3", "Book 3 Author"));
+ return initData;
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/BookController.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/BookController.java
new file mode 100644
index 0000000000..c104a9cad3
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/controller/BookController.java
@@ -0,0 +1,45 @@
+package com.baeldung.boot.jsp.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.springframework.web.servlet.view.RedirectView;
+
+import com.baeldung.boot.jsp.dto.Book;
+import com.baeldung.boot.jsp.service.BookService;
+
+@Controller
+@RequestMapping("/book")
+public class BookController {
+
+ private final BookService bookService;
+
+ public BookController(BookService bookService) {
+ this.bookService = bookService;
+ }
+
+ @GetMapping("/viewBooks")
+ public String viewBooks(Model model) {
+ model.addAttribute("books", bookService.getBooks());
+ return "view-books";
+ }
+
+ @GetMapping("/addBook")
+ public String addBookView(Model model) {
+ model.addAttribute("book", new Book());
+ return "add-book";
+ }
+
+ @PostMapping("/addBook")
+ public RedirectView addBook(@ModelAttribute("book") Book book, RedirectAttributes redirectAttributes) {
+ final RedirectView redirectView = new RedirectView("/book/addBook", true);
+ Book savedBook = bookService.addBook(book);
+ redirectAttributes.addFlashAttribute("savedBook", savedBook);
+ redirectAttributes.addFlashAttribute("addBookSuccess", true);
+ return redirectView;
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/dto/Book.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/dto/Book.java
new file mode 100644
index 0000000000..f4cd6b0b3b
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/dto/Book.java
@@ -0,0 +1,14 @@
+package com.baeldung.boot.jsp.dto;
+
+import lombok.*;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+public class Book {
+ private String isbn;
+ private String name;
+ private String author;
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/DuplicateBookException.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/DuplicateBookException.java
new file mode 100644
index 0000000000..bd52a591e3
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/DuplicateBookException.java
@@ -0,0 +1,13 @@
+package com.baeldung.boot.jsp.exception;
+
+import com.baeldung.boot.jsp.dto.Book;
+import lombok.Getter;
+
+@Getter
+public class DuplicateBookException extends RuntimeException {
+ private final Book book;
+
+ public DuplicateBookException(Book book) {
+ this.book = book;
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/LibraryControllerAdvice.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/LibraryControllerAdvice.java
new file mode 100644
index 0000000000..8217fea2e3
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/exception/LibraryControllerAdvice.java
@@ -0,0 +1,19 @@
+package com.baeldung.boot.jsp.exception;
+
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.servlet.ModelAndView;
+
+@ControllerAdvice
+public class LibraryControllerAdvice {
+
+ @ExceptionHandler(value = DuplicateBookException.class)
+ public ModelAndView duplicateBookException(DuplicateBookException e) {
+ final ModelAndView modelAndView = new ModelAndView();
+ modelAndView.addObject("ref", e.getBook().getIsbn());
+ modelAndView.addObject("object", e.getBook());
+ modelAndView.addObject("message", "Cannot add an already existing book");
+ modelAndView.setViewName("error-book");
+ return modelAndView;
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/BookRepository.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/BookRepository.java
new file mode 100644
index 0000000000..f10cecfa81
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/BookRepository.java
@@ -0,0 +1,14 @@
+package com.baeldung.boot.jsp.repository;
+
+import java.util.Collection;
+import java.util.Optional;
+
+import com.baeldung.boot.jsp.repository.model.BookData;
+
+public interface BookRepository {
+ Collection findAll();
+
+ Optional findById(String isbn);
+
+ BookData add(BookData book);
+}
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepository.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepository.java
new file mode 100644
index 0000000000..8fae303158
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepository.java
@@ -0,0 +1,36 @@
+package com.baeldung.boot.jsp.repository.impl;
+
+import java.util.*;
+
+import com.baeldung.boot.jsp.repository.BookRepository;
+import com.baeldung.boot.jsp.repository.model.BookData;
+
+public class InMemoryBookRepository implements BookRepository {
+
+ private final Map storedBooks;
+
+ public InMemoryBookRepository(Map storedBooks) {
+ this.storedBooks = new HashMap<>();
+ this.storedBooks.putAll(storedBooks);
+ }
+
+ @Override
+ public Collection findAll() {
+ if (storedBooks.isEmpty()) {
+ return Collections.emptyList();
+ }
+
+ return storedBooks.values();
+ }
+
+ @Override
+ public Optional findById(String isbn) {
+ return Optional.ofNullable(storedBooks.get(isbn));
+ }
+
+ @Override
+ public BookData add(BookData book) {
+ storedBooks.put(book.getIsbn(), book);
+ return book;
+ }
+}
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/model/BookData.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/model/BookData.java
new file mode 100644
index 0000000000..7c722a92e5
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/repository/model/BookData.java
@@ -0,0 +1,16 @@
+package com.baeldung.boot.jsp.repository.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class BookData {
+ private String isbn;
+ private String name;
+ private String author;
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/BookService.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/BookService.java
new file mode 100644
index 0000000000..7c2c401ef2
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/BookService.java
@@ -0,0 +1,11 @@
+package com.baeldung.boot.jsp.service;
+
+import java.util.Collection;
+
+import com.baeldung.boot.jsp.dto.Book;
+
+public interface BookService {
+ Collection getBooks();
+
+ Book addBook(Book book);
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/impl/BookServiceImpl.java b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/impl/BookServiceImpl.java
new file mode 100644
index 0000000000..519ee19205
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/java/com/baeldung/boot/jsp/service/impl/BookServiceImpl.java
@@ -0,0 +1,50 @@
+package com.baeldung.boot.jsp.service.impl;
+
+import java.util.Collection;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import com.baeldung.boot.jsp.exception.DuplicateBookException;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.boot.jsp.dto.Book;
+import com.baeldung.boot.jsp.repository.BookRepository;
+import com.baeldung.boot.jsp.repository.model.BookData;
+import com.baeldung.boot.jsp.service.BookService;
+
+@Service
+public class BookServiceImpl implements BookService {
+
+ private final BookRepository bookRepository;
+
+ public BookServiceImpl(BookRepository bookRepository) {
+ this.bookRepository = bookRepository;
+ }
+
+ @Override
+ public Collection getBooks() {
+ return bookRepository.findAll()
+ .stream()
+ .map(BookServiceImpl::convertBookData)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public Book addBook(Book book) {
+ final Optional existingBook = bookRepository.findById(book.getIsbn());
+ if (existingBook.isPresent()) {
+ throw new DuplicateBookException(book);
+ }
+
+ final BookData savedBook = bookRepository.add(convertBook(book));
+ return convertBookData(savedBook);
+ }
+
+ private static Book convertBookData(BookData bookData) {
+ return new Book(bookData.getIsbn(), bookData.getName(), bookData.getAuthor());
+ }
+
+ private static BookData convertBook(Book book) {
+ return new BookData(book.getIsbn(), book.getName(), book.getAuthor());
+ }
+}
diff --git a/spring-web-modules/spring-boot-jsp/src/main/resources/application.properties b/spring-web-modules/spring-boot-jsp/src/main/resources/application.properties
new file mode 100644
index 0000000000..56638f8c1a
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/resources/application.properties
@@ -0,0 +1,4 @@
+server.servlet.context-path=/spring-boot-jsp
+
+spring.mvc.view.prefix: /WEB-INF/jsp/
+spring.mvc.view.suffix: .jsp
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/resources/static/css/common.css b/spring-web-modules/spring-boot-jsp/src/main/resources/static/css/common.css
new file mode 100644
index 0000000000..a32d81c6a2
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/resources/static/css/common.css
@@ -0,0 +1,10 @@
+table {
+ font-family: arial, sans-serif;
+ border-collapse: collapse;
+}
+
+td, th {
+ border: 1px solid #dddddd;
+ text-align: left;
+ padding: 8px;
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/resources/static/error/4xx.html b/spring-web-modules/spring-boot-jsp/src/main/resources/static/error/4xx.html
new file mode 100644
index 0000000000..c27bd8bb7a
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/resources/static/error/4xx.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Error
+
+
+Opps! 4xx Error Occurred.
+
+
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/add-book.jsp b/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/add-book.jsp
new file mode 100644
index 0000000000..8195743da8
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/add-book.jsp
@@ -0,0 +1,21 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ Add Book
+
+
+
+ Successfully added Book with ISBN: ${savedBook.isbn}
+
+
+
+
+ ISBN:
+ Book Name:
+ Author Name:
+
+
+
+
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/error-book.jsp b/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/error-book.jsp
new file mode 100644
index 0000000000..6db90ca5c7
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/error-book.jsp
@@ -0,0 +1,18 @@
+<%--
+ Created by IntelliJ IDEA.
+ User: jason
+ Date: 3/13/21
+ Time: 10:39 PM
+ To change this template use File | Settings | File Templates.
+--%>
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+
+
+ Error
+
+
+ Reference: ${ref}
+ Error Message: ${message}
+ Object: ${object}
+
+
diff --git a/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/view-books.jsp b/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/view-books.jsp
new file mode 100644
index 0000000000..4a8e00a69b
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/main/webapp/WEB-INF/jsp/view-books.jsp
@@ -0,0 +1,28 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+
+
+ View Books
+ " rel="stylesheet" type="text/css">
+
+
+
+
+
+ ISBN
+ Name
+ Author
+
+
+
+
+
+ ${book.isbn}
+ ${book.name}
+ ${book.author}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerIntegrationTest.java b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerIntegrationTest.java
new file mode 100644
index 0000000000..1847cbf545
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerIntegrationTest.java
@@ -0,0 +1,93 @@
+package com.baeldung.boot.jsp.controller;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasProperty;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
+
+import java.util.Collections;
+import java.util.Optional;
+
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.ResultActions;
+import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+import com.baeldung.boot.jsp.repository.BookRepository;
+import com.baeldung.boot.jsp.repository.impl.InMemoryBookRepository;
+import com.baeldung.boot.jsp.repository.model.BookData;
+
+@ExtendWith(SpringExtension.class)
+@WebAppConfiguration
+@ContextConfiguration
+@AutoConfigureMockMvc
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class BookControllerIntegrationTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Autowired
+ private BookRepository bookRepository;
+
+ @Test
+ @Order(1)
+ public void whenAddBook_thenBookSaved() throws Exception {
+ MockHttpServletRequestBuilder addBookRequest = MockMvcRequestBuilders.post("/book/addBook")
+ .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+ .param("isbn", "isbn1")
+ .param("name", "name1")
+ .param("author", "author1");
+ mockMvc.perform(addBookRequest)
+ .andReturn();
+
+ Optional storedBookOpt = bookRepository.findById("isbn1");
+ assertTrue(storedBookOpt.isPresent());
+ assertEquals("name1", storedBookOpt.get()
+ .getName());
+ assertEquals("author1", storedBookOpt.get()
+ .getAuthor());
+ }
+
+ @Test
+ @Order(2)
+ public void givenAlreadyExistingBook_whenAddBook_thenShowErrorPage() throws Exception {
+ MockHttpServletRequestBuilder addBookRequest = MockMvcRequestBuilders.post("/book/addBook")
+ .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+ .param("isbn", "isbn1")
+ .param("name", "name1")
+ .param("author", "author1");
+ ResultActions addBookResult = mockMvc.perform(addBookRequest);
+
+ addBookResult.andExpect(view().name("error-book"))
+ .andExpect(model().attribute("ref", "isbn1"))
+ .andExpect(model().attribute("object", hasProperty("isbn", equalTo("isbn1"))))
+ .andExpect(model().attribute("message", "Cannot add an already existing book"));
+ }
+
+ @Configuration
+ @ComponentScan("com.baeldung.boot.jsp")
+ static class ContextConfiguration {
+
+ @Bean
+ public BookRepository provideBookRepository() {
+ return new InMemoryBookRepository(Collections.emptyMap());
+ }
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerUnitTest.java b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerUnitTest.java
new file mode 100644
index 0000000000..af1d3d4956
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/controller/BookControllerUnitTest.java
@@ -0,0 +1,76 @@
+package com.baeldung.boot.jsp.controller;
+
+import static org.hamcrest.Matchers.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+import org.mockito.AdditionalAnswers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.ResultActions;
+import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+import com.baeldung.boot.jsp.dto.Book;
+import com.baeldung.boot.jsp.service.BookService;
+
+@WebMvcTest(BookController.class)
+class BookControllerUnitTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockBean
+ private BookService bookService;
+
+ @Test
+ public void whenViewBooks_thenReturnBooksView() throws Exception {
+ when(bookService.getBooks()).thenReturn(existingBooks());
+ ResultActions viewBooksResult = mockMvc.perform(get("/book/viewBooks"));
+
+ viewBooksResult.andExpect(view().name("view-books"))
+ .andExpect(model().attribute("books", hasSize(3)));
+ }
+
+ @Test
+ public void whenAddBookView_thenReturnAddBooksView() throws Exception {
+ ResultActions addBookViewResult = mockMvc.perform(get("/book/addBook"));
+
+ addBookViewResult.andExpect(view().name("add-book"))
+ .andExpect(model().attribute("book", isA(Book.class)));
+ }
+
+ @Test
+ public void whenAddBookPost_thenRedirectToAddBookView() throws Exception {
+ when(bookService.addBook(any(Book.class))).thenAnswer(AdditionalAnswers.returnsFirstArg());
+ MockHttpServletRequestBuilder addBookRequest = MockMvcRequestBuilders.post("/book/addBook")
+ .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+ .param("isbn", "isbn1")
+ .param("name", "name1")
+ .param("author", "author1");
+ ResultActions addBookResult = mockMvc.perform(addBookRequest);
+
+ addBookResult.andExpect(status().is3xxRedirection())
+ .andExpect(redirectedUrl("/book/addBook"))
+ .andExpect(flash().attribute("savedBook", hasProperty("isbn", equalTo("isbn1"))))
+ .andExpect(flash().attribute("addBookSuccess", true));
+ }
+
+ private static Collection existingBooks() {
+ List books = new ArrayList<>();
+ books.add(new Book("isbn1", "name1", "author1"));
+ books.add(new Book("isbn2", "name2", "author2"));
+ books.add(new Book("isbn3", "name3", "author3"));
+ return books;
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepositoryUnitTest.java b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepositoryUnitTest.java
new file mode 100644
index 0000000000..83f0c19e26
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/repository/impl/InMemoryBookRepositoryUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.boot.jsp.repository.impl;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.*;
+
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.boot.jsp.repository.BookRepository;
+import com.baeldung.boot.jsp.repository.model.BookData;
+
+public class InMemoryBookRepositoryUnitTest {
+
+ @Test
+ public void givenEmtpyData_whenFindAll_thenReturnEmptyCollection() {
+ BookRepository bookRepository = new InMemoryBookRepository(Collections.emptyMap());
+ Collection storedBooks = bookRepository.findAll();
+
+ assertEquals(0, storedBooks.size());
+ }
+
+ @Test
+ public void givenInitialData_whenFindAll_thenReturnInitialData() {
+ BookRepository bookRepository = new InMemoryBookRepository(initialBookData());
+ Collection storedBooks = bookRepository.findAll();
+
+ assertEquals(3, storedBooks.size());
+ }
+
+ @Test
+ public void givenInitialData_whenFindUnavailableIsbn_thenReturnEmpty() {
+ BookRepository bookRepository = new InMemoryBookRepository(initialBookData());
+ Optional storedBookOpt = bookRepository.findById("isbn4");
+
+ assertFalse(storedBookOpt.isPresent());
+ }
+
+ @Test
+ public void givenInitialData_whenFindAvailableIsbn_thenReturnItem() {
+ BookRepository bookRepository = new InMemoryBookRepository(initialBookData());
+ Optional storedBookOpt = bookRepository.findById("isbn1");
+
+ assertTrue(storedBookOpt.isPresent());
+ }
+
+ @Test
+ public void givenAddedIsbn_whenFindAvailableIsbn_thenReturnItem() {
+ BookRepository bookRepository = new InMemoryBookRepository(Collections.emptyMap());
+ bookRepository.add(new BookData("isbn4", "name4", "author4"));
+ Optional storedBookOpt = bookRepository.findById("isbn4");
+
+ assertTrue(storedBookOpt.isPresent());
+ }
+
+ private static Map initialBookData() {
+ Map initData = new HashMap<>();
+ initData.put("isbn1", new BookData("isbn1", "name1", "author1"));
+ initData.put("isbn2", new BookData("isbn2", "name2", "author2"));
+ initData.put("isbn3", new BookData("isbn3", "name3", "author3"));
+ return initData;
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/BookServiceIntegrationTest.java b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/BookServiceIntegrationTest.java
new file mode 100644
index 0000000000..4223f3f970
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/BookServiceIntegrationTest.java
@@ -0,0 +1,84 @@
+package com.baeldung.boot.jsp.service;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import com.baeldung.boot.jsp.dto.Book;
+import com.baeldung.boot.jsp.exception.DuplicateBookException;
+import com.baeldung.boot.jsp.repository.BookRepository;
+import com.baeldung.boot.jsp.repository.impl.InMemoryBookRepository;
+import com.baeldung.boot.jsp.repository.model.BookData;
+
+@ExtendWith(SpringExtension.class)
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
+public class BookServiceIntegrationTest {
+
+ @Autowired
+ private BookService bookService;
+
+ @Test
+ @Order(1)
+ public void givenNoAddedBooks_whenGetAllBooks_thenReturnInitialBooks() {
+ Collection storedBooks = bookService.getBooks();
+
+ assertEquals(3, storedBooks.size());
+ assertThat(storedBooks, hasItem(hasProperty("isbn", equalTo("ISBN-TEST-1"))));
+ assertThat(storedBooks, hasItem(hasProperty("isbn", equalTo("ISBN-TEST-2"))));
+ assertThat(storedBooks, hasItem(hasProperty("isbn", equalTo("ISBN-TEST-3"))));
+ }
+
+ @Test
+ @Order(2)
+ public void givenBookNotAlreadyExists_whenAddBook_thenReturnSuccessfully() {
+ Book bookToBeAdded = new Book("ISBN-ADD-TEST-4", "Added Book 4", "Added Book 4 Author");
+ Book storedBook = bookService.addBook(bookToBeAdded);
+
+ assertEquals(bookToBeAdded.getIsbn(), storedBook.getIsbn());
+ }
+
+ @Test
+ @Order(3)
+ public void givenBookAlreadyExists_whenAddBook_thenDuplicateBookException() {
+ Book bookToBeAdded = new Book("ISBN-ADD-TEST-4", "Updated Book 4", "Updated Book 4 Author");
+
+ assertThrows(DuplicateBookException.class, () -> bookService.addBook(bookToBeAdded));
+ }
+
+ @Configuration
+ @ComponentScan("com.baeldung.boot.jsp")
+ static class ContextConfiguration {
+
+ @Bean
+ public BookRepository provideBookRepository() {
+ return new InMemoryBookRepository(initialBookData());
+ }
+
+ private static Map initialBookData() {
+ Map initData = new HashMap<>();
+ initData.put("ISBN-TEST-1", new BookData("ISBN-TEST-1", "Book 1", "Book 1 Author"));
+ initData.put("ISBN-TEST-2", new BookData("ISBN-TEST-2", "Book 2", "Book 2 Author"));
+ initData.put("ISBN-TEST-3", new BookData("ISBN-TEST-3", "Book 3", "Book 3 Author"));
+ return initData;
+ }
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/impl/BookServiceImplUnitTest.java b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/impl/BookServiceImplUnitTest.java
new file mode 100644
index 0000000000..defbf71fd9
--- /dev/null
+++ b/spring-web-modules/spring-boot-jsp/src/test/java/com/baeldung/boot/jsp/service/impl/BookServiceImplUnitTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.boot.jsp.service.impl;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.AdditionalAnswers;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import com.baeldung.boot.jsp.dto.Book;
+import com.baeldung.boot.jsp.exception.DuplicateBookException;
+import com.baeldung.boot.jsp.repository.BookRepository;
+import com.baeldung.boot.jsp.repository.model.BookData;
+import com.baeldung.boot.jsp.service.BookService;
+
+@ExtendWith(MockitoExtension.class)
+public class BookServiceImplUnitTest {
+
+ @Mock
+ private BookRepository bookRepository;
+
+ @Test
+ public void whenGetBooks_thenAllBooksReturned() {
+ when(bookRepository.findAll()).thenReturn(existingBooks());
+ BookService bookService = new BookServiceImpl(bookRepository);
+
+ Collection storedBooks = bookService.getBooks();
+ assertEquals(3, storedBooks.size());
+ assertThat(storedBooks, hasItem(hasProperty("isbn", equalTo("isbn1"))));
+ assertThat(storedBooks, hasItem(hasProperty("isbn", equalTo("isbn2"))));
+ assertThat(storedBooks, hasItem(hasProperty("isbn", equalTo("isbn3"))));
+ }
+
+ @Test
+ public void whenAddBook_thenAddSuccessful() {
+ when(bookRepository.findById(anyString())).thenReturn(Optional.empty());
+ when(bookRepository.add(any(BookData.class))).thenAnswer(AdditionalAnswers.returnsFirstArg());
+ BookService bookService = new BookServiceImpl(bookRepository);
+ Book book = bookService.addBook(new Book("isbn1", "name1", "author1"));
+
+ assertEquals("isbn1", book.getIsbn());
+ assertEquals("name1", book.getName());
+ assertEquals("author1", book.getAuthor());
+ }
+
+ @Test
+ public void givenBookAlreadyExist_whenAddBook_thenDuplicateBookException() {
+ BookData existingBook = new BookData("isbn1", "name1", "author1");
+ when(bookRepository.findById("isbn1")).thenReturn(Optional.of(existingBook));
+ BookService bookService = new BookServiceImpl(bookRepository);
+ Book bookToBeAdded = new Book("isbn1", "name1", "author1");
+
+ assertThrows(DuplicateBookException.class, () -> bookService.addBook(bookToBeAdded));
+ }
+
+ private static Collection existingBooks() {
+ List books = new ArrayList<>();
+ books.add(new BookData("isbn1", "name1", "author1"));
+ books.add(new BookData("isbn2", "name2", "author2"));
+ books.add(new BookData("isbn3", "name3", "author3"));
+ return books;
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-mvc-basics-2/pom.xml b/spring-web-modules/spring-mvc-basics-2/pom.xml
index 0b4515994b..adc42d8db8 100644
--- a/spring-web-modules/spring-mvc-basics-2/pom.xml
+++ b/spring-web-modules/spring-mvc-basics-2/pom.xml
@@ -131,14 +131,6 @@
json
${json.version}
-
- org.apache.maven.surefire
- surefire-logger-api
- ${maven-surefire-plugin.version}
-
- test
- true
-
@@ -163,7 +155,6 @@
1.8
1.8
- 2.21.0
2.3.2-b02
4.0.0
6.0.10.Final
diff --git a/spring-web-modules/spring-mvc-basics/src/main/resources/application.properties b/spring-web-modules/spring-mvc-basics/src/main/resources/application.properties
index cf26fbfb60..b8a9be0b40 100644
--- a/spring-web-modules/spring-mvc-basics/src/main/resources/application.properties
+++ b/spring-web-modules/spring-mvc-basics/src/main/resources/application.properties
@@ -5,6 +5,3 @@ spring.mvc.pathmatch.use-suffix-pattern=true
#spring.mvc.contentnegotiation.favor-path-extension=true
#spring.mvc.contentnegotiation.favor-parameter=true
#spring.mvc.contentnegotiation.parameter-name=mediaType
-
-# https://github.com/spring-projects/spring-boot/issues/24207
-spring.main.allow-bean-definition-overriding=true
diff --git a/spring-web-modules/spring-mvc-java-2/README.md b/spring-web-modules/spring-mvc-java-2/README.md
index 41ff7bdf7c..74d8cca312 100644
--- a/spring-web-modules/spring-mvc-java-2/README.md
+++ b/spring-web-modules/spring-mvc-java-2/README.md
@@ -6,4 +6,4 @@
- [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables)
- [Converting a Spring MultipartFile to a File](https://www.baeldung.com/spring-multipartfile-to-file)
- [Testing a Spring Multipart POST Request](https://www.baeldung.com/spring-multipart-post-request-test)
-- [Spring @Pathvariable Annotation](https://www.baeldung.com/spring-pathvariable)
+- [Spring @PathVariable Annotation](https://www.baeldung.com/spring-pathvariable)
diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java b/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java
index 3d34a46791..7b9da5707d 100644
--- a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java
+++ b/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java
@@ -1,17 +1,13 @@
package com.baeldung.web.controller;
-import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-
-import javax.servlet.ServletContext;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import com.baeldung.spring.web.config.WebConfig;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockServletContext;
import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
@@ -20,31 +16,34 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
-import com.baeldung.spring.web.config.WebConfig;
+import javax.servlet.ServletContext;
-@RunWith(SpringJUnit4ClassRunner.class)
+import static org.junit.jupiter.api.Assertions.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration(classes = {WebConfig.class})
@WebAppConfiguration
-@ContextConfiguration(classes = { WebConfig.class, WebConfig.class })
public class GreetControllerIntegrationTest {
@Autowired
- private WebApplicationContext wac;
+ private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
private static final String CONTENT_TYPE = "application/json";
- @Before
- public void setup() throws Exception {
- this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
+ @BeforeEach
+ public void setup() {
+ this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();
}
@Test
public void givenWac_whenServletContext_thenItProvidesGreetController() {
- final ServletContext servletContext = wac.getServletContext();
- Assert.assertNotNull(servletContext);
- Assert.assertTrue(servletContext instanceof MockServletContext);
- Assert.assertNotNull(wac.getBean("greetController"));
+ final ServletContext servletContext = webApplicationContext.getServletContext();
+ assertNotNull(servletContext);
+ assertTrue(servletContext instanceof MockServletContext);
+ assertNotNull(webApplicationContext.getBean("greetController"));
}
@Test
@@ -54,8 +53,12 @@ public class GreetControllerIntegrationTest {
@Test
public void givenGreetURI_whenMockMVC_thenVerifyResponse() throws Exception {
- final MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.get("/greet")).andDo(print()).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World!!!")).andReturn();
- Assert.assertEquals(CONTENT_TYPE, mvcResult.getResponse().getContentType());
+ final MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.get("/greet"))
+ .andDo(print())
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.jsonPath("$.message").value("Hello World!!!"))
+ .andReturn();
+ assertEquals(CONTENT_TYPE, mvcResult.getResponse().getContentType());
}
@Test
diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerRealIntegrationTest.java b/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerRealIntegrationTest.java
index 05c6313e76..825520526e 100644
--- a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerRealIntegrationTest.java
+++ b/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerRealIntegrationTest.java
@@ -1,18 +1,15 @@
package com.baeldung.web.controller;
import io.restassured.RestAssured;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.junit4.SpringRunner;
import static io.restassured.RestAssured.given;
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
-@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
@TestPropertySource(properties = {"spring.main.allow-bean-definition-overriding=true", "server.servlet.context-path=/"})
public class GreetControllerRealIntegrationTest {
@@ -20,7 +17,7 @@ public class GreetControllerRealIntegrationTest {
@LocalServerPort
private int port;
- @Before
+ @BeforeEach
public void setUp() {
RestAssured.port = port;
}
@@ -28,7 +25,7 @@ public class GreetControllerRealIntegrationTest {
@Test
public void givenGreetURI_whenSendingReq_thenVerifyResponse() {
given().get("/greet")
- .then()
- .statusCode(200);
+ .then()
+ .statusCode(200);
}
}
diff --git a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerUnitTest.java b/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerUnitTest.java
index eacd256438..ecc55e8da2 100644
--- a/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerUnitTest.java
+++ b/spring-web-modules/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerUnitTest.java
@@ -1,25 +1,22 @@
package com.baeldung.web.controller;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
-
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
public class GreetControllerUnitTest {
private MockMvc mockMvc;
private static final String CONTENT_TYPE = "application/json";
- @Before
- public void setup() {
+ @BeforeEach
+ void setUp() {
this.mockMvc = MockMvcBuilders.standaloneSetup(new GreetController()).build();
}
@@ -50,12 +47,12 @@ public class GreetControllerUnitTest {
@Test
public void givenGreetURIWithPost_whenMockMVC_thenVerifyResponse() throws Exception {
- this.mockMvc.perform(MockMvcRequestBuilders.post("/greetWithPost")).andDo(print()).andExpect(status().isOk()).andExpect(content().contentType(CONTENT_TYPE)).andExpect(jsonPath("$.message").value("Hello World!!!"));
+ this.mockMvc.perform(post("/greetWithPost")).andDo(print()).andExpect(status().isOk()).andExpect(content().contentType(CONTENT_TYPE)).andExpect(jsonPath("$.message").value("Hello World!!!"));
}
@Test
public void givenGreetURIWithPostAndFormData_whenMockMVC_thenVerifyResponse() throws Exception {
- this.mockMvc.perform(MockMvcRequestBuilders.post("/greetWithPostAndFormData").param("id", "1").param("name", "John Doe")).andDo(print()).andExpect(status().isOk()).andExpect(content().contentType(CONTENT_TYPE))
+ this.mockMvc.perform(post("/greetWithPostAndFormData").param("id", "1").param("name", "John Doe")).andDo(print()).andExpect(status().isOk()).andExpect(content().contentType(CONTENT_TYPE))
.andExpect(jsonPath("$.message").value("Hello World John Doe!!!")).andExpect(jsonPath("$.id").value(1));
}
}
diff --git a/spring-web-modules/spring-mvc-views/pom.xml b/spring-web-modules/spring-mvc-views/pom.xml
index 2c3be5a33e..649814263c 100644
--- a/spring-web-modules/spring-mvc-views/pom.xml
+++ b/spring-web-modules/spring-mvc-views/pom.xml
@@ -11,7 +11,7 @@
com.baeldung
parent-spring-5
0.0.1-SNAPSHOT
- parent-spring-5/pom.xml
+ ../../parent-spring-5
@@ -111,7 +111,6 @@
- 1.8
2.3.3
4.0.1
5.2.1.RELEASE
diff --git a/spring-web-modules/spring-rest-http-2/README.md b/spring-web-modules/spring-rest-http-2/README.md
index b5358f888f..74e55c7c40 100644
--- a/spring-web-modules/spring-rest-http-2/README.md
+++ b/spring-web-modules/spring-rest-http-2/README.md
@@ -9,3 +9,4 @@ The "REST With Spring 2" Classes: http://bit.ly/restwithspring
- [How to Turn Off Swagger-ui in Production](https://www.baeldung.com/swagger-ui-turn-off-in-production)
- [Setting a Request Timeout for a Spring REST API](https://www.baeldung.com/spring-rest-timeout)
+- [Long Polling in Spring MVC](https://www.baeldung.com/spring-mvc-long-polling)
diff --git a/spring-web-modules/spring-rest-http-2/pom.xml b/spring-web-modules/spring-rest-http-2/pom.xml
index 6aa8be365c..a349ac1116 100644
--- a/spring-web-modules/spring-rest-http-2/pom.xml
+++ b/spring-web-modules/spring-rest-http-2/pom.xml
@@ -19,6 +19,10 @@
org.springframework.boot
spring-boot-starter-web
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
io.springfox
springfox-swagger2
@@ -29,10 +33,24 @@
springfox-swagger-ui
${swagger2.version}
+
+ com.h2database
+ h2
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ io.github.resilience4j
+ resilience4j-timelimiter
+ ${resilience4j.version}
+
2.9.2
+ 1.6.1
diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/longpolling/client/LongPollingBakeryClient.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/longpolling/client/LongPollingBakeryClient.java
new file mode 100644
index 0000000000..be6a3ac54d
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/longpolling/client/LongPollingBakeryClient.java
@@ -0,0 +1,42 @@
+package com.baeldung.longpolling.client;
+
+import io.netty.handler.timeout.ReadTimeoutException;
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.ResourceAccessException;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import java.time.Duration;
+
+@Component
+public class LongPollingBakeryClient {
+
+ public String callBakeWithRestTemplate(RestTemplateBuilder restTemplateBuilder) {
+ RestTemplate restTemplate = restTemplateBuilder
+ .setConnectTimeout(Duration.ofSeconds(10))
+ .setReadTimeout(Duration.ofSeconds(10))
+ .build();
+
+ try {
+ return restTemplate.getForObject("/api/bake/cookie?bakeTime=1000", String.class);
+ } catch (ResourceAccessException e) {
+ throw e;
+ }
+ }
+
+ public String callBakeWithWebClient() {
+ WebClient webClient = WebClient.create();
+
+ try {
+ return webClient.get()
+ .uri("/api/bake/cookie?bakeTime=1000")
+ .retrieve()
+ .bodyToFlux(String.class)
+ .timeout(Duration.ofSeconds(10))
+ .blockFirst();
+ } catch (ReadTimeoutException e) {
+ throw e;
+ }
+ }
+}
diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/longpolling/controller/BakeryController.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/longpolling/controller/BakeryController.java
new file mode 100644
index 0000000000..51dfb6bbf2
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/longpolling/controller/BakeryController.java
@@ -0,0 +1,49 @@
+package com.baeldung.longpolling.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.async.DeferredResult;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import static java.lang.String.format;
+
+/**
+ * Long polling controller example.
+ */
+@RestController
+@RequestMapping("/api")
+public class BakeryController {
+ private final static Logger LOG = LoggerFactory.getLogger(BakeryController.class);
+ private final static Long LONG_POLLING_TIMEOUT = 5000L;
+
+ private ExecutorService bakers;
+
+ public BakeryController() {
+ bakers = Executors.newFixedThreadPool(5);
+ }
+
+ @GetMapping("/bake/{bakedGood}")
+ public DeferredResult publisher(@PathVariable String bakedGood, @RequestParam Integer bakeTime) {
+
+ DeferredResult output = new DeferredResult<>(LONG_POLLING_TIMEOUT);
+
+ bakers.execute(() -> {
+ try {
+ Thread.sleep(bakeTime);
+ output.setResult(format("Bake for %s complete and order dispatched. Enjoy!", bakedGood));
+ } catch (Exception e) {
+ output.setErrorResult("Something went wrong with your order!");
+ }
+ });
+
+ output.onTimeout(() -> output.setErrorResult("the bakery is not responding in allowed time"));
+ return output;
+ }
+}
diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/RequestTimeoutRestController.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/RequestTimeoutRestController.java
new file mode 100644
index 0000000000..d425737bab
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/RequestTimeoutRestController.java
@@ -0,0 +1,61 @@
+package com.baeldung.requesttimeout;
+
+import com.baeldung.requesttimeout.domain.Book;
+import com.baeldung.requesttimeout.domain.BookRepository;
+import io.github.resilience4j.timelimiter.TimeLimiter;
+import io.github.resilience4j.timelimiter.TimeLimiterConfig;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import java.time.Duration;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletableFuture;
+
+@RestController
+public class RequestTimeoutRestController {
+
+ private final BookRepository bookRepository;
+ private final WebClient webClient;
+
+ public RequestTimeoutRestController(BookRepository bookRepository, WebClient webClient) {
+ this.bookRepository = bookRepository;
+ this.webClient = webClient;
+ }
+
+ @GetMapping("/author/transactional")
+ @Transactional(timeout = 1)
+ public String getWithTransactionTimeout(@RequestParam String title) {
+ return getAuthor(title);
+ }
+
+ private final TimeLimiter ourTimeLimiter = TimeLimiter.of(TimeLimiterConfig.custom().timeoutDuration(Duration.ofMillis(500)).build());
+ @GetMapping("/author/resilience4j")
+ public Callable getWithResilience4jTimeLimiter(@RequestParam String title) {
+ return TimeLimiter.decorateFutureSupplier(ourTimeLimiter, () -> CompletableFuture.supplyAsync(() -> getAuthor(title)));
+ }
+
+ @GetMapping("/author/mvc-request-timeout")
+ public Callable getWithMvcRequestTimeout(@RequestParam String title) {
+ return () -> getAuthor(title);
+ }
+
+ @GetMapping("/author/webclient")
+ public String getWithWebClient(@RequestParam String title) {
+ return webClient.get()
+ .uri(uriBuilder -> uriBuilder
+ .path("/author/transactional")
+ .queryParam("title", title)
+ .build())
+ .retrieve()
+ .bodyToMono(String.class)
+ .block();
+ }
+
+ private String getAuthor(String title) {
+ bookRepository.wasteTime();
+ return bookRepository.findById(title).map(Book::getAuthor).orElse("No book found for this title.");
+ }
+}
diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/configuration/WebClientConfiguration.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/configuration/WebClientConfiguration.java
new file mode 100644
index 0000000000..52b3573411
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/configuration/WebClientConfiguration.java
@@ -0,0 +1,21 @@
+package com.baeldung.requesttimeout.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.reactive.ReactorClientHttpConnector;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.netty.http.client.HttpClient;
+
+import java.time.Duration;
+
+@Configuration
+public class WebClientConfiguration {
+
+ @Bean
+ public WebClient webClient() {
+ return WebClient.builder()
+ .baseUrl("http://localhost:8080")
+ .clientConnector(new ReactorClientHttpConnector(HttpClient.create().responseTimeout(Duration.ofMillis(250))))
+ .build();
+ }
+}
diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/domain/Book.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/domain/Book.java
new file mode 100644
index 0000000000..846bfb2cec
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/domain/Book.java
@@ -0,0 +1,28 @@
+package com.baeldung.requesttimeout.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class Book {
+
+ @Id
+ private String title;
+ private String author;
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+}
diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/domain/BookRepository.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/domain/BookRepository.java
new file mode 100644
index 0000000000..8ecab0f1d2
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/requesttimeout/domain/BookRepository.java
@@ -0,0 +1,14 @@
+package com.baeldung.requesttimeout.domain;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface BookRepository extends JpaRepository {
+
+ default int wasteTime() {
+ int i = Integer.MIN_VALUE;
+ while(i < Integer.MAX_VALUE) {
+ i++;
+ }
+ return i;
+ }
+}
diff --git a/spring-web-modules/spring-rest-http-2/src/main/resources/application.properties b/spring-web-modules/spring-rest-http-2/src/main/resources/application.properties
new file mode 100644
index 0000000000..ff4af943ec
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/main/resources/application.properties
@@ -0,0 +1 @@
+spring.mvc.async.request-timeout=750
\ No newline at end of file
diff --git a/spring-web-modules/spring-rest-http-2/src/test/com/baeldung/longpolling/integration/BakeryControllerIntegrationTest.java b/spring-web-modules/spring-rest-http-2/src/test/com/baeldung/longpolling/integration/BakeryControllerIntegrationTest.java
new file mode 100644
index 0000000000..abc40d72ca
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/test/com/baeldung/longpolling/integration/BakeryControllerIntegrationTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.longpolling.integration;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.mock.web.MockAsyncContext;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+import java.io.IOException;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.request;
+
+@AutoConfigureMockMvc
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class BakeryControllerIntegrationTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Test
+ public void givenDeferredResultTimesOut_ThenErrorResponseIsRecieved() throws Exception {
+ MvcResult asyncListener = mockMvc
+ .perform(MockMvcRequestBuilders.get("/api/bake/cookie?bakeTime=6000"))
+ .andExpect(request().asyncStarted())
+ .andReturn();
+
+ enableTimeout(asyncListener);
+
+ String response = mockMvc
+ .perform(asyncDispatch(asyncListener))
+ .andReturn()
+ .getResponse()
+ .getContentAsString();
+
+ assertThat(response)
+ .isEqualTo("the bakery is not responding in allowed time");
+ }
+
+ @Test
+ public void givenDeferredResultSuccessful_ThenSuccessResponseIsRecieved() throws Exception {
+ MvcResult asyncListener = mockMvc
+ .perform(MockMvcRequestBuilders.get("/api/bake/cookie?bakeTime=1000"))
+ .andExpect(request().asyncStarted())
+ .andReturn();
+
+ String response = mockMvc
+ .perform(asyncDispatch(asyncListener))
+ .andReturn()
+ .getResponse()
+ .getContentAsString();
+
+ assertThat(response)
+ .isEqualTo("Bake for cookie complete and order dispatched. Enjoy!");
+ }
+
+ private static void enableTimeout(MvcResult asyncListener) throws IOException {
+ ((MockAsyncContext) asyncListener
+ .getRequest()
+ .getAsyncContext())
+ .getListeners()
+ .get(0)
+ .onTimeout(null);
+ }
+}
diff --git a/spring-web-modules/spring-rest-http-2/src/test/com/baeldung/requesttimeout/RequestTimeoutUnitTest.java b/spring-web-modules/spring-rest-http-2/src/test/com/baeldung/requesttimeout/RequestTimeoutUnitTest.java
new file mode 100644
index 0000000000..da7d40d53c
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/test/com/baeldung/requesttimeout/RequestTimeoutUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.requesttimeout;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.reactive.function.client.WebClient;
+import org.springframework.web.reactive.function.client.WebClientRequestException;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class RequestTimeoutTests {
+
+ private static final WebClient WEB_CLIENT = WebClient.builder().baseUrl("http://localhost:8080").build();
+
+ @Test(expected = WebClientRequestException.class)
+ public void givenTransactionTimeout_whenTimeExpires_thenReceiveException() {
+ getAuthor("transactional");
+ }
+
+ @Test(expected = WebClientRequestException.class)
+ public void givenResilience4jTimeLimiter_whenTimeExpires_thenReceiveException() {
+ getAuthor("resilience4j");
+ }
+
+ @Test(expected = WebClientRequestException.class)
+ public void givenMvcRequestTimeout_whenTimeExpires_thenReceiveException() {
+ getAuthor("mvc-request-timeout");
+ }
+
+ @Test(expected = WebClientRequestException.class)
+ public void givenWebClientTimeout_whenTimeExpires_thenReceiveException() {
+ getAuthor("webclient");
+ }
+
+ private void getAuthor(String authorPath) {
+ WEB_CLIENT.get()
+ .uri(uriBuilder -> uriBuilder
+ .path("/author/" + authorPath)
+ .queryParam("title", "title")
+ .build())
+ .retrieve()
+ .bodyToMono(String.class)
+ .block();
+ }
+}
diff --git a/spring-web-modules/spring-rest-http-2/src/test/resources/application.properties b/spring-web-modules/spring-rest-http-2/src/test/resources/application.properties
new file mode 100644
index 0000000000..ff4af943ec
--- /dev/null
+++ b/spring-web-modules/spring-rest-http-2/src/test/resources/application.properties
@@ -0,0 +1 @@
+spring.mvc.async.request-timeout=750
\ No newline at end of file
diff --git a/spring-web-modules/spring-rest-http/pom.xml b/spring-web-modules/spring-rest-http/pom.xml
index 422bcd32f7..94d1be7814 100644
--- a/spring-web-modules/spring-rest-http/pom.xml
+++ b/spring-web-modules/spring-rest-http/pom.xml
@@ -24,6 +24,10 @@
org.springframework.boot
spring-boot-starter-validation
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
org.springframework
spring-oxm
diff --git a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectController.java b/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectController.java
index 321f3be3ef..1d77a07bea 100644
--- a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectController.java
+++ b/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectController.java
@@ -64,5 +64,11 @@ public class RedirectController {
public ModelAndView redirectedPostToPost() {
return new ModelAndView("redirection");
}
-
+
+ @RequestMapping(value="/forwardWithParams", method = RequestMethod.GET)
+ public ModelAndView forwardWithParams(HttpServletRequest request) {
+ request.setAttribute("param1", "one");
+ request.setAttribute("param2", "two");
+ return new ModelAndView("forward:/forwardedWithParams");
+ }
}
\ No newline at end of file
diff --git a/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectParamController.java b/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectParamController.java
new file mode 100644
index 0000000000..abe268b435
--- /dev/null
+++ b/spring-web-modules/spring-resttemplate-2/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectParamController.java
@@ -0,0 +1,25 @@
+package com.baeldung.sampleapp.web.controller.redirect;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.springframework.web.servlet.view.RedirectView;
+
+@Controller
+@RequestMapping("/")
+public class RedirectParamController {
+
+ @RequestMapping(value = "/forwardedWithParams", method = RequestMethod.GET)
+ public RedirectView forwardedWithParams(final RedirectAttributes redirectAttributes, HttpServletRequest request) {
+
+ redirectAttributes.addAttribute("param1", request.getAttribute("param1"));
+ redirectAttributes.addAttribute("param2", request.getAttribute("param2"));
+
+ redirectAttributes.addAttribute("attribute", "forwardedWithParams");
+ return new RedirectView("redirectedUrl");
+
+ }
+}
\ No newline at end of file
diff --git a/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/largefile/LargeFileDownloadIntegrationTest.java b/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/largefile/LargeFileDownloadIntegrationTest.java
index d8fc58319f..687203d21a 100644
--- a/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/largefile/LargeFileDownloadIntegrationTest.java
+++ b/spring-web-modules/spring-resttemplate-3/src/test/java/com/baeldung/largefile/LargeFileDownloadIntegrationTest.java
@@ -14,7 +14,7 @@ import org.springframework.web.client.RestTemplate;
public class LargeFileDownloadIntegrationTest {
- static String FILE_URL = "http://ovh.net/files/1Mio.dat";
+ static String FILE_URL = "https://s3.amazonaws.com/baeldung.com/Do+JSON+with+Jackson+by+Baeldung.pdf";
RestTemplate restTemplate;
diff --git a/spring-web-modules/spring-thymeleaf-3/README.md b/spring-web-modules/spring-thymeleaf-3/README.md
index 048b48d39f..76c54d3885 100644
--- a/spring-web-modules/spring-thymeleaf-3/README.md
+++ b/spring-web-modules/spring-thymeleaf-3/README.md
@@ -10,3 +10,4 @@ This module contains articles about Spring with Thymeleaf
- [Conditional CSS Classes in Thymeleaf](https://www.baeldung.com/spring-mvc-thymeleaf-conditional-css-classes)
- [Using Hidden Inputs with Spring and Thymeleaf](https://www.baeldung.com/spring-thymeleaf-hidden-inputs)
- [Thymeleaf Variables](https://www.baeldung.com/thymeleaf-variables)
+- [Displaying Error Messages with Thymeleaf in Spring](https://www.baeldung.com/spring-thymeleaf-error-messages)
diff --git a/spring-web-modules/spring-thymeleaf-3/pom.xml b/spring-web-modules/spring-thymeleaf-3/pom.xml
index 6dd1267e8a..6a46dca117 100644
--- a/spring-web-modules/spring-thymeleaf-3/pom.xml
+++ b/spring-web-modules/spring-thymeleaf-3/pom.xml
@@ -26,7 +26,15 @@
org.springframework.boot
spring-boot-starter-thymeleaf
-
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.h2database
+ h2
+ runtime
+
org.springframework.boot
spring-boot-starter-test
diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/User.java b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/User.java
new file mode 100644
index 0000000000..a6923287af
--- /dev/null
+++ b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/User.java
@@ -0,0 +1,82 @@
+package com.baeldung.thymeleaf.errors;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+@Entity
+public class User {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ @NotEmpty(message = "User's name cannot be empty.")
+ @Size(min = 5, max = 250)
+ private String fullName;
+
+ @NotEmpty(message = "User's email cannot be empty.")
+ @Size(min = 7, max = 320)
+ private String email;
+
+ @NotNull(message = "User's age cannot be null.")
+ @Min(value = 18)
+ private Integer age;
+
+ private String country;
+
+ private String phoneNumber;
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(String fullName) {
+ this.fullName = fullName;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+}
diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserController.java b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserController.java
new file mode 100644
index 0000000000..92e67dc6a8
--- /dev/null
+++ b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserController.java
@@ -0,0 +1,46 @@
+package com.baeldung.thymeleaf.errors;
+
+import javax.validation.Valid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+
+@Controller
+public class UserController {
+
+ @Autowired
+ private UserRepository repository;
+
+ @Autowired
+ private UserValidationService validationService;
+
+ @GetMapping("/add")
+ public String showAddUserForm(User user) {
+ return "errors/addUser";
+ }
+
+ @PostMapping("/add")
+ public String addUser(@Valid User user, BindingResult result, Model model) {
+
+ String err = validationService.validateUser(user);
+
+ if (!err.isEmpty()) {
+ ObjectError error = new ObjectError("globalError", err);
+ result.addError(error);
+ }
+
+ if (result.hasErrors()) {
+ return "errors/addUser";
+ }
+
+ repository.save(user);
+ model.addAttribute("users", repository.findAll());
+ return "errors/home";
+ }
+
+}
diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserRepository.java b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserRepository.java
new file mode 100644
index 0000000000..5e0e322728
--- /dev/null
+++ b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.thymeleaf.errors;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserRepository extends JpaRepository {
+}
diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserValidationService.java b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserValidationService.java
new file mode 100644
index 0000000000..a2de4e2ed4
--- /dev/null
+++ b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserValidationService.java
@@ -0,0 +1,22 @@
+package com.baeldung.thymeleaf.errors;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserValidationService {
+
+ public String validateUser(User user) {
+
+ String message = "";
+
+ if (user.getCountry() != null && user.getPhoneNumber() != null) {
+ if (user.getCountry()
+ .equalsIgnoreCase("India")
+ && !user.getPhoneNumber()
+ .startsWith("91")) {
+ message = "Phone number is invalid for " + user.getCountry();
+ }
+ }
+ return message;
+ }
+}
diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/resources/application.properties b/spring-web-modules/spring-thymeleaf-3/src/main/resources/application.properties
new file mode 100644
index 0000000000..75770808da
--- /dev/null
+++ b/spring-web-modules/spring-thymeleaf-3/src/main/resources/application.properties
@@ -0,0 +1,6 @@
+spring.datasource.url=jdbc:h2:mem:testdb
+spring.datasource.driverClassName=org.h2.Driver
+spring.datasource.username=sa
+spring.datasource.password=password
+spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
+spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/addUser.html b/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/addUser.html
new file mode 100644
index 0000000000..4e37dc45ce
--- /dev/null
+++ b/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/addUser.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+Displaying Error Messages with Thymeleaf
+
+
+
+
+
Add a Record
+
+
This is outside the form:
+
Errors on a single field:
+
+
All errors:
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/home.html b/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/home.html
new file mode 100644
index 0000000000..4f63be5dc6
--- /dev/null
+++ b/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/home.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+Displaying Error Messages with Thymeleaf
+
+
+
+
+
Users
+
+
+ ID
+ Full name
+ Email
+ Age
+ Country
+ Phone Number
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/testing-modules/README.md b/testing-modules/README.md
deleted file mode 100644
index c6098d1210..0000000000
--- a/testing-modules/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## Testing Modules
-
-This is an aggregator module containing multiple modules focused on testing libraries.
diff --git a/testing-modules/cucumber/README.md b/testing-modules/cucumber/README.md
new file mode 100644
index 0000000000..f9adf759c7
--- /dev/null
+++ b/testing-modules/cucumber/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Using Cucumber Tags with JUnit 5](https://www.baeldung.com/junit-cucumber-tags)
diff --git a/testing-modules/cucumber/pom.xml b/testing-modules/cucumber/pom.xml
new file mode 100644
index 0000000000..af1935aa17
--- /dev/null
+++ b/testing-modules/cucumber/pom.xml
@@ -0,0 +1,139 @@
+
+
+
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+ 4.0.0
+ cucumber
+ 1.0-SNAPSHOT
+ cucumber
+
+
+ 14
+ 14
+ 6.10.3
+ 5.4.0
+ 2.22.2
+ 3.141.59
+ 4.3.1
+ 0.40
+ 3.0.0
+ 4.5.3
+ 2.2.5.RELEASE
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.webjars
+ webjars-locator
+ ${webjars-locator.version}
+
+
+ org.webjars.npm
+ jquery-slim
+ ${jquery.version}
+
+
+ org.webjars
+ bootstrap
+ ${bootstrap.version}
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ io.cucumber
+ cucumber-java
+ ${cucumber.version}
+
+
+ io.cucumber
+ cucumber-junit-platform-engine
+ ${cucumber.version}
+
+
+ io.cucumber
+ cucumber-spring
+ ${cucumber.version}
+
+
+ org.seleniumhq.selenium
+ selenium-java
+ ${selenium.version}
+
+
+ org.seleniumhq.selenium
+ selenium-support
+ ${selenium.version}
+
+
+ io.github.bonigarcia
+ webdrivermanager
+ ${webdrivermanager.version}
+ test
+
+
+ io.rest-assured
+ spring-mock-mvc
+ ${rest-assured.version}
+ test
+
+
+ io.rest-assured
+ json-schema-validator
+ ${rest-assured.version}
+ test
+
+
+ org.springframework.cloud
+ spring-cloud-contract-wiremock
+ ${spring-cloud-contract-wiremock.version}
+ test
+
+
+
+
+
+ acceptance
+
+ false
+
+
+
+
+ maven-failsafe-plugin
+ ${maven-failsafe-plugin.version}
+
+
+
+ integration-test
+ verify
+
+
+
+
+
+
+
+
+
diff --git a/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/Application.java b/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/Application.java
new file mode 100644
index 0000000000..0bd9e924a0
--- /dev/null
+++ b/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung.cucumber.tags;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/controller/HealthController.java b/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/controller/HealthController.java
new file mode 100644
index 0000000000..b5d7751d2b
--- /dev/null
+++ b/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/controller/HealthController.java
@@ -0,0 +1,17 @@
+package com.baeldung.cucumber.tags.controller;
+
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HealthController {
+
+ @RequestMapping(value="/status", produces= MediaType.APPLICATION_JSON_VALUE)
+ public HttpStatus statusCheck() {
+ return ResponseEntity.ok().build().getStatusCode();
+ }
+}
diff --git a/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/controller/UiController.java b/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/controller/UiController.java
new file mode 100644
index 0000000000..eab32c644b
--- /dev/null
+++ b/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/controller/UiController.java
@@ -0,0 +1,36 @@
+package com.baeldung.cucumber.tags.controller;
+
+import com.baeldung.cucumber.tags.service.RandomNumberGeneratorService;
+import lombok.Data;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+
+
+@Controller
+public class UiController {
+
+ @GetMapping("/random-number-generator")
+ public String showForm(Model model) {
+ RandomNumberQuery randomNumberQuery = new RandomNumberQuery();
+ model.addAttribute("randomNumberQuery", randomNumberQuery);
+
+ return "random-number-generator";
+ }
+
+ @PostMapping(value = "/random-number-generator")
+ public String generateRandomNumber(@ModelAttribute("randomNumberQuery") final RandomNumberQuery randomNumberQuery) {
+ RandomNumberGeneratorService service = new RandomNumberGeneratorService();
+ randomNumberQuery.randomNumber = service.generateRandomNumber(randomNumberQuery.min, randomNumberQuery.max);
+ return "random-number-generator";
+}
+
+ @Data
+ private static class RandomNumberQuery {
+ Integer min = null;
+ Integer max = null;
+ Integer randomNumber = null;
+ }
+}
diff --git a/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/service/RandomNumberGeneratorService.java b/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/service/RandomNumberGeneratorService.java
new file mode 100644
index 0000000000..6c3399f64c
--- /dev/null
+++ b/testing-modules/cucumber/src/main/java/com/baeldung/cucumber/tags/service/RandomNumberGeneratorService.java
@@ -0,0 +1,10 @@
+package com.baeldung.cucumber.tags.service;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+public class RandomNumberGeneratorService {
+
+ public int generateRandomNumber(int min, int max) {
+ return ThreadLocalRandom.current().nextInt(min, max + 1);
+ }
+}
\ No newline at end of file
diff --git a/testing-modules/cucumber/src/main/resources/templates/random-number-generator.html b/testing-modules/cucumber/src/main/resources/templates/random-number-generator.html
new file mode 100644
index 0000000000..1d612e3856
--- /dev/null
+++ b/testing-modules/cucumber/src/main/resources/templates/random-number-generator.html
@@ -0,0 +1,53 @@
+
+
+
+
+
+ Random Number Generator
+
+
+
+
+
+
+
Random Number Generator
+
+
+
+
+
+
+
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/AcceptanceTestRunnerIT.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/AcceptanceTestRunnerIT.java
new file mode 100644
index 0000000000..fd712488d5
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/AcceptanceTestRunnerIT.java
@@ -0,0 +1,9 @@
+package com.baeldung.cucumber.tags.acceptance;
+
+
+import io.cucumber.junit.platform.engine.Cucumber;
+
+@Cucumber()
+public class AcceptanceTestRunnerIT {
+
+}
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/api/steps/HealthSteps.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/api/steps/HealthSteps.java
new file mode 100644
index 0000000000..d809619a01
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/api/steps/HealthSteps.java
@@ -0,0 +1,37 @@
+package com.baeldung.cucumber.tags.acceptance.api.steps;
+
+
+import com.baeldung.cucumber.tags.acceptance.commonutil.ScenarioContextApi;
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+import org.hamcrest.Matchers;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class HealthSteps {
+
+ @Autowired
+ private ScenarioContextApi context;
+
+
+ @When("^I make a GET call on ([^\"]*)$")
+ public void iMakeAGETCallOn(String path) {
+ context.invokeHttpGet(path);
+ }
+
+ @When("^I make a POST call on ([^\"]*)$")
+ public void iMakeAPOSTCallOn(String path) {
+ context.invokeHttpPost(path, context.postBody);
+ }
+
+ @Then("^I should receive (\\d+) response status code$")
+ public void iShouldReceiveStatusCodeResponse(int code) {
+ context.response.then().statusCode(code);
+ }
+
+ @Then("^should receive a non-empty body$")
+ public void shouldReceiveANonEmptyBody() {
+ context.response.then().body(Matchers.notNullValue());
+ }
+
+
+}
\ No newline at end of file
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/CucumberEnvironment.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/CucumberEnvironment.java
new file mode 100644
index 0000000000..8ed9e02226
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/CucumberEnvironment.java
@@ -0,0 +1,44 @@
+package com.baeldung.cucumber.tags.acceptance.commonutil;
+
+import org.openqa.selenium.InvalidArgumentException;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Optional;
+
+public final class CucumberEnvironment {
+
+ private static final String SELENIUM_GRID_URL_ENV_VAR = "SELENIUM_GRID_URL";
+ private static final String SERVICE_HOSTNAME = "SERVICE_HOSTNAME";
+ private static final String LOCALHOST = "localhost";
+
+ private CucumberEnvironment() {
+ }
+
+ /**
+ * Gets the network host where the service is running. When running while developing, this is going to be
+ * localhost because webdriver and the test runner are going to be on the same machine. On gitlab-ci /
+ * docker-compose though, they are going to be on separate hosts so webdriver needs to hit the
+ * machine where the test runner is starting the service, not localhost.
+ */
+ public static String getServiceHost() {
+ final Optional serviceHostname = Optional.ofNullable(System.getenv(SERVICE_HOSTNAME));
+ return serviceHostname.orElse(LOCALHOST);
+ }
+
+ /**
+ * Gets the url where the selenium grid instance is. This is used for gitlab-ci / docker-compose setups.
+ */
+ public static Optional getSeleniumGridUrl() {
+ final Optional seleniumGridUrlString = Optional.ofNullable(System.getenv(SELENIUM_GRID_URL_ENV_VAR));
+ return seleniumGridUrlString.map(CucumberEnvironment::parseSeleniumGridUrl);
+ }
+
+ private static URL parseSeleniumGridUrl(String seleniumGridUrlString) {
+ try {
+ return new URL(seleniumGridUrlString);
+ } catch (MalformedURLException e) {
+ throw new InvalidArgumentException(SELENIUM_GRID_URL_ENV_VAR + "env var is not a valid URL");
+ }
+ }
+}
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioContextApi.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioContextApi.java
new file mode 100644
index 0000000000..f35dcb04d5
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioContextApi.java
@@ -0,0 +1,57 @@
+package com.baeldung.cucumber.tags.acceptance.commonutil;
+
+import io.restassured.http.ContentType;
+import io.restassured.module.mockmvc.response.MockMvcResponse;
+import io.restassured.module.mockmvc.specification.MockMvcRequestSpecification;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static io.restassured.module.mockmvc.RestAssuredMockMvc.given;
+
+@Component
+@Scope(scopeName = "cucumber-glue")
+public class ScenarioContextApi {
+
+ @LocalServerPort
+ int port;
+
+ private ScenarioReport report;
+ public MockMvcRequestSpecification request;
+ public MockMvcResponse response;
+ public Map postBody = new HashMap<>();
+ public Map queryParams = new HashMap<>();
+
+ public ScenarioContextApi() {
+ reset();
+ }
+
+ private void reset() {
+ report = new ScenarioReport();
+ request = null;
+ response = null;
+ postBody.clear();
+ queryParams.clear();
+ }
+
+ public void invokeHttpGet(String path, Object... pathParams) {
+ request = given().log().all();
+ response = request.when().get(path, pathParams);
+ response.then().log().all();
+ }
+
+ public void invokeHttpPost(String path, Map data) {
+ request = given().log().all().body(data).queryParams(queryParams).contentType(ContentType.JSON);
+ response = request.post(path);
+ response.then().log().all();
+ }
+
+
+ public ScenarioReport getReport() {
+ return report;
+ }
+
+}
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioContextUI.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioContextUI.java
new file mode 100644
index 0000000000..66aabece11
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioContextUI.java
@@ -0,0 +1,77 @@
+package com.baeldung.cucumber.tags.acceptance.commonutil;
+
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.remote.DesiredCapabilities;
+import org.openqa.selenium.remote.RemoteWebDriver;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.net.URL;
+
+import static io.github.bonigarcia.wdm.WebDriverManager.getInstance;
+import static io.github.bonigarcia.wdm.config.DriverManagerType.CHROME;
+
+@Component
+@Scope(scopeName = "cucumber-glue")
+public class ScenarioContextUI {
+
+ protected static final String RANDOM_NUMBER_URL = "/random-number-generator";
+
+ @LocalServerPort
+ int port;
+ private WebDriver driver;
+ private ScenarioReport report;
+
+ public ScenarioContextUI() {
+ reset();
+ }
+
+ private void reset() {
+ report = new ScenarioReport();
+ driver = null;
+ }
+
+ private static WebDriver getRemoteWebDriver(URL url) {
+ return new RemoteWebDriver(url, DesiredCapabilities.chrome());
+ }
+
+ private static WebDriver getLocalChromeDriver() {
+ getInstance(CHROME).setup();
+ return new ChromeDriver();
+ }
+
+ public ScenarioReport getReport() {
+ return report;
+ }
+
+ public String getRandomNumberUrl() {
+ return "http://" + getServiceBaseUrl() + RANDOM_NUMBER_URL;
+ }
+
+ private String getServiceBaseUrl() {
+ return CucumberEnvironment.getServiceHost() + ":" + Integer.toString(port);
+ }
+
+ /**
+ * If we are running inside docker (mostly for gitlab ci purposes), we expect a selenium grid setup.
+ * If that environment variable isn't set, we assume we're in "dev mode" and ChromeDriverManager will
+ * provide the local instance of chromedriver (no need to have chromedriver installed).
+ */
+ public WebDriver getWebDriver() {
+ if (driver == null) {
+ return getFreshWebdriver();
+ } else {
+ return driver;
+ }
+ }
+
+ private WebDriver getFreshWebdriver() {
+ driver = CucumberEnvironment.getSeleniumGridUrl()
+ .map(ScenarioContextUI::getRemoteWebDriver)
+ .orElseGet(ScenarioContextUI::getLocalChromeDriver);
+ return driver;
+ }
+
+}
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioHooks.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioHooks.java
new file mode 100644
index 0000000000..397ea7eef8
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioHooks.java
@@ -0,0 +1,58 @@
+package com.baeldung.cucumber.tags.acceptance.commonutil;
+
+
+import io.cucumber.java.After;
+import io.cucumber.java.Before;
+import io.cucumber.java.Scenario;
+import io.cucumber.spring.CucumberContextConfiguration;
+import io.restassured.config.LogConfig;
+import io.restassured.module.mockmvc.RestAssuredMockMvc;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.web.servlet.MockMvc;
+
+import java.io.IOException;
+
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles(profiles = {"acceptance-test"})
+@AutoConfigureMockMvc
+@CucumberContextConfiguration
+public class ScenarioHooks {
+
+ @Autowired
+ private ScenarioContextUI uiContext;
+
+ @Autowired
+ private ScenarioContextApi apiContext;
+
+ @Autowired
+ private MockMvc mvc;
+
+ @Before("@ui")
+ public void setupForUI() {
+ uiContext.getWebDriver();
+ }
+
+ @After("@ui")
+ public void tearDownForUi(Scenario scenario) throws IOException {
+ uiContext.getReport().write(scenario);
+ uiContext.getReport().captureScreenShot(scenario, uiContext.getWebDriver());
+ uiContext.getWebDriver().quit();
+ }
+
+ @Before("@api")
+ public void setupForApi() {
+ RestAssuredMockMvc.mockMvc(mvc);
+ RestAssuredMockMvc.config = RestAssuredMockMvc.config()
+ .logConfig(new LogConfig(
+ apiContext.getReport().getRestLogPrintStream(),
+ true));
+ }
+
+ @After("@api")
+ public void tearDownForApi(Scenario scenario) throws IOException {
+ apiContext.getReport().write(scenario);
+ }
+}
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioReport.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioReport.java
new file mode 100644
index 0000000000..093a4bf5b1
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/commonutil/ScenarioReport.java
@@ -0,0 +1,44 @@
+package com.baeldung.cucumber.tags.acceptance.commonutil;
+
+
+import io.cucumber.java.Scenario;
+import org.openqa.selenium.OutputType;
+import org.openqa.selenium.TakesScreenshot;
+import org.openqa.selenium.WebDriver;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ScenarioReport {
+
+ private List messages = new ArrayList<>();
+ private ByteArrayOutputStream restLogOutputStream = new ByteArrayOutputStream();
+
+ public void addMessage(String message) {
+ messages.add(message);
+ }
+
+ public PrintStream getRestLogPrintStream() {
+ return new PrintStream(restLogOutputStream);
+ }
+
+ public void write(Scenario scenario) throws IOException {
+ for (String msg : messages) {
+ scenario.log(msg);
+ }
+ scenario.log(restLogOutputStream.toString());
+ restLogOutputStream.close();
+ }
+
+ public void captureScreenShot(Scenario scenario, WebDriver driver) {
+ try {
+ final byte[] screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
+ scenario.attach(screenshot, "image/png", "test");
+ } catch (Exception exception) {
+ scenario.log(exception.toString());
+ }
+ }
+}
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/ui/pages/Page.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/ui/pages/Page.java
new file mode 100644
index 0000000000..7d09573ce7
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/ui/pages/Page.java
@@ -0,0 +1,28 @@
+package com.baeldung.cucumber.tags.acceptance.ui.pages;
+
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.openqa.selenium.support.ui.ExpectedConditions.titleIs;
+
+public class Page {
+ private static final long DEFAULT_WAIT_SECONDS = 5;
+ private static Page currentPage;
+ final WebDriver driver;
+
+ Page(WebDriver driver, String title) {
+ currentPage = this;
+ this.driver = driver;
+ getWait().until(titleIs(title));
+ }
+
+ public static T getPage(Class pageClass) {
+ return pageClass.cast(checkNotNull(currentPage));
+ }
+
+ WebDriverWait getWait() {
+ return new WebDriverWait(driver, DEFAULT_WAIT_SECONDS);
+ }
+
+}
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/ui/pages/RandomNumberGeneratorPage.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/ui/pages/RandomNumberGeneratorPage.java
new file mode 100644
index 0000000000..be0d409a19
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/ui/pages/RandomNumberGeneratorPage.java
@@ -0,0 +1,41 @@
+package com.baeldung.cucumber.tags.acceptance.ui.pages;
+
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+
+public class RandomNumberGeneratorPage extends Page {
+
+ @FindBy(id = "min")
+ private WebElement minField;
+
+ @FindBy(id = "max")
+ private WebElement maxField;
+
+ @FindBy(id = "generate")
+ private WebElement generateButton;
+
+ @FindBy(id = "result")
+ private WebElement result;
+
+ public RandomNumberGeneratorPage(WebDriver driver) {
+ super(driver, "Random Number Generator");
+ }
+
+ public void enterMinField(String min) {
+ minField.sendKeys(min);
+ }
+
+ public void enterMaxField(String max) {
+ maxField.sendKeys(max);
+ }
+
+ public void pressGenerateButton() {
+ generateButton.click();
+ }
+
+ public String getResult() {
+ return result.getText();
+ }
+}
+
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/ui/steps/RandomNumberGeneratorSteps.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/ui/steps/RandomNumberGeneratorSteps.java
new file mode 100644
index 0000000000..0cefca97f3
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/acceptance/ui/steps/RandomNumberGeneratorSteps.java
@@ -0,0 +1,49 @@
+package com.baeldung.cucumber.tags.acceptance.ui.steps;
+
+import com.baeldung.cucumber.tags.acceptance.commonutil.ScenarioContextUI;
+import com.baeldung.cucumber.tags.acceptance.ui.pages.RandomNumberGeneratorPage;
+import io.cucumber.java.en.And;
+import io.cucumber.java.en.Given;
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+import org.openqa.selenium.support.PageFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import static com.baeldung.cucumber.tags.acceptance.ui.pages.Page.getPage;
+import static org.junit.Assert.assertTrue;
+
+public class RandomNumberGeneratorSteps {
+
+ @Autowired
+ private ScenarioContextUI context;
+
+ @Given("we are expecting a random number between min and max")
+ public void expectingRandomNumberBetweenMinAndMax() {
+ }
+
+ @And("I am on random-number-generator page")
+ public void iAmOnRandomNumberGeneratorPage() {
+ context.getWebDriver().get(context.getRandomNumberUrl());
+ PageFactory.initElements(context.getWebDriver(), RandomNumberGeneratorPage.class);
+ }
+
+ @When("^I enter min ([^\"]*)$")
+ public void whenIenterMin(String min) {
+ getPage(RandomNumberGeneratorPage.class).enterMinField(min);
+ }
+
+ @When("^I enter max ([^\"]*)$")
+ public void whenIenterMax(String max) {
+ getPage(RandomNumberGeneratorPage.class).enterMaxField(max);
+ }
+
+ @And("^I press Generate button")
+ public void pressScanButton() {
+ getPage(RandomNumberGeneratorPage.class).pressGenerateButton();
+ }
+
+ @Then("I should receive a random number between {int} and {int}")
+ public void iShouldReceiveARandomNumberBetweenAnd(int min, int max) {
+ assertTrue(Integer.parseInt(getPage(RandomNumberGeneratorPage.class).getResult()) >= min && Integer.parseInt(getPage(RandomNumberGeneratorPage.class).getResult()) <= max);
+ }
+}
diff --git a/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/service/RandomNumberGeneratorServiceUnitTest.java b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/service/RandomNumberGeneratorServiceUnitTest.java
new file mode 100644
index 0000000000..57c593f6be
--- /dev/null
+++ b/testing-modules/cucumber/src/test/java/com/baeldung/cucumber/tags/service/RandomNumberGeneratorServiceUnitTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.cucumber.tags.service;
+
+import org.junit.jupiter.api.Test;
+
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class RandomNumberGeneratorServiceUnitTest {
+
+ private final RandomNumberGeneratorService tested = new RandomNumberGeneratorService();
+
+ @Test
+ public void generateRandomNumberReturnsOK() {
+
+ int actual = tested.generateRandomNumber(1,5);
+ assertTrue(actual>=1 && actual<=5);
+ }
+}
\ No newline at end of file
diff --git a/testing-modules/cucumber/src/test/resources/com/baeldung/cucumber/tags/acceptance/api/health.feature b/testing-modules/cucumber/src/test/resources/com/baeldung/cucumber/tags/acceptance/api/health.feature
new file mode 100644
index 0000000000..b1d54fcd14
--- /dev/null
+++ b/testing-modules/cucumber/src/test/resources/com/baeldung/cucumber/tags/acceptance/api/health.feature
@@ -0,0 +1,7 @@
+@api
+Feature: Health check
+
+ Scenario: Should have a working health check
+ When I make a GET call on /status
+ Then I should receive 200 response status code
+ And should receive a non-empty body
\ No newline at end of file
diff --git a/testing-modules/cucumber/src/test/resources/com/baeldung/cucumber/tags/acceptance/ui/random-number.feature b/testing-modules/cucumber/src/test/resources/com/baeldung/cucumber/tags/acceptance/ui/random-number.feature
new file mode 100644
index 0000000000..07cced0580
--- /dev/null
+++ b/testing-modules/cucumber/src/test/resources/com/baeldung/cucumber/tags/acceptance/ui/random-number.feature
@@ -0,0 +1,10 @@
+@ui
+Feature: UI - Random Number Generator
+
+ Scenario: Successfully generate a random number
+ Given we are expecting a random number between min and max
+ And I am on random-number-generator page
+ When I enter min 1
+ And I enter max 10
+ And I press Generate button
+ Then I should receive a random number between 1 and 10
\ No newline at end of file
diff --git a/testing-modules/cucumber/src/test/resources/junit-platform.properties b/testing-modules/cucumber/src/test/resources/junit-platform.properties
new file mode 100644
index 0000000000..7b1808c0bf
--- /dev/null
+++ b/testing-modules/cucumber/src/test/resources/junit-platform.properties
@@ -0,0 +1 @@
+cucumber.plugin=pretty, json:target/cucumber/cucumber.json
\ No newline at end of file
diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml
index 4756223c3d..f53af9347f 100644
--- a/testing-modules/junit-5-advanced/pom.xml
+++ b/testing-modules/junit-5-advanced/pom.xml
@@ -35,18 +35,8 @@
-
-
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
-
-
5.4.2
- 2.21.0
5.4.2
diff --git a/testing-modules/junit-5-basics/pom.xml b/testing-modules/junit-5-basics/pom.xml
index b9c9635dc4..cdb0c367ce 100644
--- a/testing-modules/junit-5-basics/pom.xml
+++ b/testing-modules/junit-5-basics/pom.xml
@@ -152,7 +152,6 @@
1.2.0
5.4.2
5.0.6.RELEASE
- 2.21.0
diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml
index 831fa97e12..90898ebb3f 100644
--- a/testing-modules/junit-5/pom.xml
+++ b/testing-modules/junit-5/pom.xml
@@ -105,10 +105,6 @@
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
org.codehaus.mojo
exec-maven-plugin
@@ -140,7 +136,6 @@
2.8.2
2.0.0
2.22.0
- 1.6.0
5.0.1.RELEASE
3.0.0-M3
diff --git a/testing-modules/junit5-migration/pom.xml b/testing-modules/junit5-migration/pom.xml
index 3b2663d81d..bab7bc0406 100644
--- a/testing-modules/junit5-migration/pom.xml
+++ b/testing-modules/junit5-migration/pom.xml
@@ -18,12 +18,12 @@
org.junit.platform
junit-platform-engine
- ${junit.platform.version}
+ ${junit-platform.version}
org.junit.platform
junit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}
test
@@ -47,42 +47,13 @@
true
-
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- org.junit.platform
- junit-platform-surefire-provider
- ${junit.platform.version}
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- ${exec-maven-plugin.version}
-
-
-
- java
-
-
-
-
- com.baeldung.TestLauncher
-
-
-
5.2.0
- 1.2.0
+ 1.2.0
5.2.0
2.21.0
- 1.6.0
diff --git a/testing-modules/mockito-3/.gitignore b/testing-modules/mockito-3/.gitignore
new file mode 100644
index 0000000000..38fe5148c1
--- /dev/null
+++ b/testing-modules/mockito-3/.gitignore
@@ -0,0 +1,4 @@
+/target/
+/.settings/
+/.classpath
+/.project
\ No newline at end of file
diff --git a/testing-modules/mockito-3/README.md b/testing-modules/mockito-3/README.md
new file mode 100644
index 0000000000..c9766031a3
--- /dev/null
+++ b/testing-modules/mockito-3/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Mocking Static Methods With Mockito](https://www.baeldung.com/mockito-mock-static-methods)
diff --git a/testing-modules/mockito-3/pom.xml b/testing-modules/mockito-3/pom.xml
new file mode 100644
index 0000000000..8d506561ed
--- /dev/null
+++ b/testing-modules/mockito-3/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+ mockito-3
+ 0.0.1-SNAPSHOT
+ mockito-3
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+
+ org.mockito
+ mockito-inline
+ ${mockito.version}
+ test
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ 3.8.0
+ 3.8.0
+
+
+
diff --git a/testing-modules/mockito-3/src/main/java/com/baeldung/mockito/mockedstatic/StaticUtils.java b/testing-modules/mockito-3/src/main/java/com/baeldung/mockito/mockedstatic/StaticUtils.java
new file mode 100644
index 0000000000..2e2f5ead33
--- /dev/null
+++ b/testing-modules/mockito-3/src/main/java/com/baeldung/mockito/mockedstatic/StaticUtils.java
@@ -0,0 +1,22 @@
+package com.baeldung.mockito.mockedstatic;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class StaticUtils {
+
+ private StaticUtils() {
+ }
+
+ public static List range(int start, int end) {
+ return IntStream.range(start, end)
+ .boxed()
+ .collect(Collectors.toList());
+ }
+
+ public static String name() {
+ return "Baeldung";
+ }
+
+}
diff --git a/testing-modules/mockito-3/src/main/resources/logback.xml b/testing-modules/mockito-3/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/testing-modules/mockito-3/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/testing-modules/mockito-3/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java b/testing-modules/mockito-3/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java
new file mode 100644
index 0000000000..a212e6e3eb
--- /dev/null
+++ b/testing-modules/mockito-3/src/test/java/com/baeldung/mockito/mockedstatic/MockedStaticUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.mockito.mockedstatic;
+
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.Arrays;
+
+class MockedStaticUnitTest {
+
+ @Test
+ void givenStaticMethodWithNoArgs_whenMocked_thenReturnsMockSuccessfully() {
+ assertThat(StaticUtils.name()).isEqualTo("Baeldung");
+
+ try (MockedStatic utilities = Mockito.mockStatic(StaticUtils.class)) {
+ utilities.when(StaticUtils::name).thenReturn("Eugen");
+ assertThat(StaticUtils.name()).isEqualTo("Eugen");
+ }
+
+ assertThat(StaticUtils.name()).isEqualTo("Baeldung");
+ }
+
+ @Test
+ void givenStaticMethodWithArgs_whenMocked_thenReturnsMockSuccessfully() {
+ assertThat(StaticUtils.range(2, 6)).containsExactly(2, 3, 4, 5);
+
+ try (MockedStatic utilities = Mockito.mockStatic(StaticUtils.class)) {
+ utilities.when(() -> StaticUtils.range(2, 6))
+ .thenReturn(Arrays.asList(10, 11, 12));
+
+ assertThat(StaticUtils.range(2, 6)).containsExactly(10, 11, 12);
+ }
+
+ assertThat(StaticUtils.range(2, 6)).containsExactly(2, 3, 4, 5);
+ }
+
+}
diff --git a/testing-modules/parallel-tests-junit/math-test-functions/pom.xml b/testing-modules/parallel-tests-junit/math-test-functions/pom.xml
index fb12803333..fdd45e19d6 100644
--- a/testing-modules/parallel-tests-junit/math-test-functions/pom.xml
+++ b/testing-modules/parallel-tests-junit/math-test-functions/pom.xml
@@ -27,7 +27,7 @@
org.apache.maven.plugins
maven-surefire-plugin
- 2.22.0
+ ${maven-surefire-plugin.version}
all
10
@@ -45,4 +45,8 @@
+
+ 2.22.0
+
+
diff --git a/testing-modules/parallel-tests-junit/string-test-functions/pom.xml b/testing-modules/parallel-tests-junit/string-test-functions/pom.xml
index 313d82c23f..727a1f814a 100644
--- a/testing-modules/parallel-tests-junit/string-test-functions/pom.xml
+++ b/testing-modules/parallel-tests-junit/string-test-functions/pom.xml
@@ -27,7 +27,7 @@
org.apache.maven.plugins
maven-surefire-plugin
- 2.22.0
+ ${maven-surefire-plugin.version}
all
true
@@ -37,4 +37,8 @@
+
+ 2.22.0
+
+
diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml
index 0416423239..d2afd4ae70 100644
--- a/testing-modules/pom.xml
+++ b/testing-modules/pom.xml
@@ -15,35 +15,38 @@
assertion-libraries
+ cucumber
easy-random
+ easymock
gatling
groovy-spock
+ hamcrest
+ junit-4
+ junit-5-advanced
+ junit-5-basics
junit-5
junit5-annotations
junit5-migration
load-testing-comparison
- mockito
mockito-2
- hamcrest
+ mockito-3
+ mockito
mocks
mockserver
parallel-tests-junit
+ powermock
rest-assured
rest-testing
selenium-junit-testng
- spring-testing
spring-testing-2
+ spring-testing
test-containers
testing-assertions
+ testing-libraries-2
+ testing-libraries
testng
- junit-5-basics
- easymock
- junit-5-advanced
xmlunit-2
- junit-4
- testing-libraries
- testing-libraries-2
- powermock
+ zerocode
diff --git a/testing-modules/spring-testing-2/pom.xml b/testing-modules/spring-testing-2/pom.xml
index 4686a20202..40b556732a 100644
--- a/testing-modules/spring-testing-2/pom.xml
+++ b/testing-modules/spring-testing-2/pom.xml
@@ -73,6 +73,5 @@
1.12.2
- 2.21.0
\ No newline at end of file
diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml
index 9e0c986bb2..74d55d4c08 100644
--- a/testing-modules/spring-testing/pom.xml
+++ b/testing-modules/spring-testing/pom.xml
@@ -125,7 +125,7 @@
3.1.6
5.7.0
1.7.0
- 5.3.0
+ 5.3.4
4.0.1
2.1.1
diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java
index 9b692edd7b..9481c54b48 100644
--- a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java
+++ b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java
@@ -1,15 +1,14 @@
package com.baeldung.overrideproperties;
import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringRunner;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
-@RunWith(SpringRunner.class)
+@SpringBootTest
@ContextConfiguration(initializers = PropertyOverrideContextInitializer.class, classes = Application.class)
public class ContextPropertySourceResolverIntegrationTest {
diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java
index 815b628f0a..77b882d3a2 100644
--- a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java
+++ b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java
@@ -1,18 +1,17 @@
package com.baeldung.overrideproperties;
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
-@RunWith(SpringRunner.class)
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
@SpringBootTest
@ActiveProfiles("test")
@EnableWebMvc
diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java
index a8c4267c5c..994a8a4288 100644
--- a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java
+++ b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java
@@ -12,6 +12,6 @@ public class PropertyOverrideContextInitializer implements ApplicationContextIni
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(configurableApplicationContext, "example.firstProperty=" + PROPERTY_FIRST_VALUE);
- TestPropertySourceUtils.addPropertiesFilesToEnvironment(configurableApplicationContext, "context-override-application.properties");
+ TestPropertySourceUtils.addPropertiesFilesToEnvironment(configurableApplicationContext, "classpath:context-override-application.properties");
}
}
diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java
index d00aa51e6c..bb08d701d9 100644
--- a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java
+++ b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java
@@ -1,16 +1,16 @@
package com.baeldung.overrideproperties;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
-@RunWith(SpringRunner.class)
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
@SpringBootTest(properties = { "example.firstProperty=annotation" })
@EnableWebMvc
public class SpringBootPropertySourceResolverIntegrationTest {
@@ -23,8 +23,8 @@ public class SpringBootPropertySourceResolverIntegrationTest {
final String firstProperty = propertySourceResolver.getFirstProperty();
final String secondProperty = propertySourceResolver.getSecondProperty();
- Assert.assertEquals("annotation", firstProperty);
- Assert.assertEquals("file", secondProperty);
+ assertEquals("annotation", firstProperty);
+ assertEquals("file", secondProperty);
}
}
\ No newline at end of file
diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java
index dc15851277..673742124a 100644
--- a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java
+++ b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java
@@ -1,17 +1,16 @@
package com.baeldung.overrideproperties;
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
-@RunWith(SpringRunner.class)
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
@SpringBootTest
@EnableWebMvc
public class TestResourcePropertySourceResolverIntegrationTest {
diff --git a/testing-modules/test-containers/pom.xml b/testing-modules/test-containers/pom.xml
index e83d3aff32..2280a89b4a 100644
--- a/testing-modules/test-containers/pom.xml
+++ b/testing-modules/test-containers/pom.xml
@@ -79,34 +79,6 @@
true
-
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- org.junit.platform
- junit-platform-surefire-provider
- ${junit-platform-surefire-provider.version}
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- ${exec-maven-plugin.version}
-
-
-
- java
-
-
-
-
- com.baeldung.TestLauncher
-
-
-
@@ -117,7 +89,7 @@
42.2.6
3.141.59
2.22.2
- 1.3.2
+ 1.3.2
diff --git a/testing-modules/testing-assertions/pom.xml b/testing-modules/testing-assertions/pom.xml
index fa0f666c7f..8b8536462d 100644
--- a/testing-modules/testing-assertions/pom.xml
+++ b/testing-modules/testing-assertions/pom.xml
@@ -16,47 +16,43 @@
ch.qos.logback
logback-classic
- 1.2.3
+ ${logback.version}
org.junit.jupiter
junit-jupiter-engine
- 5.6.2
+ ${junit-jupiter.version}
test
org.junit.jupiter
junit-jupiter-api
- 5.6.2
+ ${junit-jupiter.version}
test
org.assertj
assertj-core
- 3.16.1
+ ${assertj-core.version}
test
org.hamcrest
hamcrest-all
- 1.3
+ ${hamcrest-all.version}
test
org.apache.commons
commons-collections4
- 4.4
+ ${commons-collections4.version}
test
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.1
-
-
-
+
+ 3.16.1
+ 4.4
+ 5.6.2
+
diff --git a/testing-modules/testing-libraries-2/pom.xml b/testing-modules/testing-libraries-2/pom.xml
index 42c84d0da9..7f96280cac 100644
--- a/testing-modules/testing-libraries-2/pom.xml
+++ b/testing-modules/testing-libraries-2/pom.xml
@@ -16,7 +16,7 @@
org.assertj
assertj-core
- 3.16.1
+ ${assertj-core.version}
test
@@ -86,5 +86,6 @@
1.0.0
1.1.0
5.6.2
+ 3.16.1
diff --git a/testing-modules/testing-libraries/pom.xml b/testing-modules/testing-libraries/pom.xml
index aa22a5253e..4edd13fa30 100644
--- a/testing-modules/testing-libraries/pom.xml
+++ b/testing-modules/testing-libraries/pom.xml
@@ -36,11 +36,10 @@
${cucumber.version}
test
-
org.springframework.boot
spring-boot-starter-web
- 2.2.0.RELEASE
+ ${spring-boot.version}
com.github.stefanbirkner
@@ -103,6 +102,7 @@
3.0.0
1.19.0
1.0.0
+ 2.4.3
diff --git a/testing-modules/zerocode/README.md b/testing-modules/zerocode/README.md
new file mode 100644
index 0000000000..a0a844c63d
--- /dev/null
+++ b/testing-modules/zerocode/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Introduction to ZeroCode](https://www.baeldung.com/zerocode-intro)
diff --git a/testing-modules/zerocode/pom.xml b/testing-modules/zerocode/pom.xml
new file mode 100644
index 0000000000..63f0dc9cbb
--- /dev/null
+++ b/testing-modules/zerocode/pom.xml
@@ -0,0 +1,104 @@
+
+
+ 4.0.0
+
+ testing-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+ zerocode
+ 1.0-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${spring.boot.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ ${spring.boot.version}
+ test
+
+
+
+
+ org.jsmart
+ zerocode-tdd
+ ${zerocode-tdd.version}
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ it
+
+
+
+
+ pre-integration-test
+
+ start
+
+
+ ${skip.it}
+
+
+
+ post-integration-test
+
+ stop
+
+
+ ${skip.it}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ ${maven-failsafe-plugin.version}
+
+ ${skip.it}
+
+
+
+ org.apache.maven.surefire
+ surefire-junit47
+ ${surefire-junit47.version}
+
+
+
+
+
+ integration-test
+ verify
+
+
+
+
+
+
+
+
+ 3.0.0-M5
+ 3.0.0-M5
+ 8
+ 8
+ 2.4.2
+ true
+ 1.3.27
+
+
+
diff --git a/testing-modules/zerocode/src/main/java/com/baeldung/zerocode/User.java b/testing-modules/zerocode/src/main/java/com/baeldung/zerocode/User.java
new file mode 100644
index 0000000000..3a2a853220
--- /dev/null
+++ b/testing-modules/zerocode/src/main/java/com/baeldung/zerocode/User.java
@@ -0,0 +1,31 @@
+package com.baeldung.zerocode;
+
+public class User {
+ private String id;
+ private String firstName;
+ private String lastName;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+}
diff --git a/testing-modules/zerocode/src/main/java/com/baeldung/zerocode/ZerocodeApplication.java b/testing-modules/zerocode/src/main/java/com/baeldung/zerocode/ZerocodeApplication.java
new file mode 100644
index 0000000000..3218e97400
--- /dev/null
+++ b/testing-modules/zerocode/src/main/java/com/baeldung/zerocode/ZerocodeApplication.java
@@ -0,0 +1,38 @@
+package com.baeldung.zerocode;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+@SpringBootApplication
+@RestController
+@RequestMapping("/api/users")
+public class ZerocodeApplication {
+ private List users = new ArrayList<>();
+
+ public static void main(String[] args) {
+ SpringApplication.run(ZerocodeApplication.class, args);
+ }
+
+ @PostMapping
+ public ResponseEntity create(@RequestBody User user) {
+ if (!StringUtils.hasText(user.getFirstName())) {
+ return new ResponseEntity("firstName can't be empty!", HttpStatus.BAD_REQUEST);
+ }
+ if (!StringUtils.hasText(user.getLastName())) {
+ return new ResponseEntity("lastName can't be empty!", HttpStatus.BAD_REQUEST);
+ }
+ user.setId(UUID.randomUUID()
+ .toString());
+ users.add(user);
+ return new ResponseEntity(user, HttpStatus.CREATED);
+ }
+
+}
diff --git a/testing-modules/zerocode/src/test/java/com/baeldung/zerocode/rest/UserEndpointIT.java b/testing-modules/zerocode/src/test/java/com/baeldung/zerocode/rest/UserEndpointIT.java
new file mode 100644
index 0000000000..cc461fd0fc
--- /dev/null
+++ b/testing-modules/zerocode/src/test/java/com/baeldung/zerocode/rest/UserEndpointIT.java
@@ -0,0 +1,18 @@
+package com.baeldung.zerocode.rest;
+
+import org.jsmart.zerocode.core.domain.Scenario;
+import org.jsmart.zerocode.core.domain.TargetEnv;
+import org.jsmart.zerocode.core.runner.ZeroCodeUnitRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(ZeroCodeUnitRunner.class)
+@TargetEnv("rest_api.properties")
+public class UserEndpointIT {
+
+ @Test
+ @Scenario("rest/user_create_test.json")
+ public void test_user_creation_endpoint() {
+ }
+
+}
diff --git a/testing-modules/zerocode/src/test/resources/rest/user_create_test.json b/testing-modules/zerocode/src/test/resources/rest/user_create_test.json
new file mode 100644
index 0000000000..0e8ee66196
--- /dev/null
+++ b/testing-modules/zerocode/src/test/resources/rest/user_create_test.json
@@ -0,0 +1,39 @@
+{
+ "scenarioName": "test user creation endpoint",
+ "steps": [
+ {
+ "name": "test_successful_creation",
+ "url": "/api/users",
+ "method": "POST",
+ "request": {
+ "body": {
+ "firstName": "John",
+ "lastName": "Doe"
+ }
+ },
+ "verify": {
+ "status": 201,
+ "body": {
+ "id": "$NOT.NULL",
+ "firstName": "John",
+ "lastName": "Doe"
+ }
+ }
+ },
+ {
+ "name": "test_firstname_validation",
+ "url": "/api/users",
+ "method": "POST",
+ "request": {
+ "body": {
+ "firstName": "",
+ "lastName": "Doe"
+ }
+ },
+ "assertions": {
+ "status": 400,
+ "rawBody": "firstName can't be empty!"
+ }
+ }
+ ]
+}
diff --git a/testing-modules/zerocode/src/test/resources/rest_api.properties b/testing-modules/zerocode/src/test/resources/rest_api.properties
new file mode 100644
index 0000000000..724042ade7
--- /dev/null
+++ b/testing-modules/zerocode/src/test/resources/rest_api.properties
@@ -0,0 +1,3 @@
+web.application.endpoint.host=http://localhost
+web.application.endpoint.port=8080
+web.application.endpoint.context=
\ No newline at end of file
diff --git a/webrtc/pom.xml b/webrtc/pom.xml
index f302ae97a2..191ff11dd6 100644
--- a/webrtc/pom.xml
+++ b/webrtc/pom.xml
@@ -31,8 +31,4 @@
-
- 1.8
-
-
diff --git a/wildfly/pom.xml b/wildfly/pom.xml
index 7b2a474c8d..6d823bb4c9 100644
--- a/wildfly/pom.xml
+++ b/wildfly/pom.xml
@@ -76,8 +76,4 @@
-
- 1.8
-
-
diff --git a/xml/pom.xml b/xml/pom.xml
index 837f918b46..d2fa5c0727 100644
--- a/xml/pom.xml
+++ b/xml/pom.xml
@@ -75,12 +75,12 @@
org.openjdk.jmh
jmh-core
- ${jmh.version}
+ ${jmh-core.version}
org.openjdk.jmh
jmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
@@ -322,8 +322,8 @@
org.apache.maven.plugins
maven-compiler-plugin
- ${java-version}
- ${java-version}
+ ${java.version}
+ ${java.version}
@@ -374,17 +374,14 @@
3.12.2
2.6.3
5.5.0
- 1.21
2.3.29
0.9.6
2.4
- 1.8
1.3.1
3.8.0
- 2.22.2
diff --git a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java
index 4908c10386..34a46fe469 100644
--- a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java
+++ b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java
@@ -28,11 +28,15 @@ public class SaxParserMain {
private static final String CONTENT = "content";
private Baeldung website;
- private String elementValue;
+ private StringBuilder elementValue;
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
- elementValue = new String(ch, start, length);
+ if (elementValue == null) {
+ elementValue = new StringBuilder();
+ } else {
+ elementValue.append(ch, start, length);
+ }
}
@Override
@@ -48,6 +52,13 @@ public class SaxParserMain {
break;
case ARTICLE:
website.getArticleList().add(new BaeldungArticle());
+ break;
+ case TITLE:
+ elementValue = new StringBuilder();
+ break;
+ case CONTENT:
+ elementValue = new StringBuilder();
+ break;
}
}
@@ -55,10 +66,10 @@ public class SaxParserMain {
public void endElement(String uri, String localName, String qName) throws SAXException {
switch (qName) {
case TITLE:
- latestArticle().setTitle(elementValue);
+ latestArticle().setTitle(elementValue.toString());
break;
case CONTENT:
- latestArticle().setContent(elementValue);
+ latestArticle().setContent(elementValue.toString());
break;
}
}