aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2022-12-10 14:32:17 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2022-12-12 16:31:04 +0100
commitd786792fcf32eb5d94c870a83020941b8693deb1 (patch)
treeea8b5a57468cb24f864859639bb537d46354823f
parentrefactor(frontend): split vite config (diff)
downloadrefinery-d786792fcf32eb5d94c870a83020941b8693deb1.tar.gz
refinery-d786792fcf32eb5d94c870a83020941b8693deb1.tar.zst
refinery-d786792fcf32eb5d94c870a83020941b8693deb1.zip
chore(web): upgrade to Jetty 12.0.0.alpha3
Also refactor virtual thread ExecutorService handling and integration tests.
-rw-r--r--gradle/libs.versions.toml2
-rw-r--r--subprojects/frontend/package.json6
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java17
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java52
-rw-r--r--subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java8
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java30
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java2
-rw-r--r--subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java14
-rw-r--r--yarn.lock107
9 files changed, 159 insertions, 79 deletions
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 0ee21b5e..1e4278d2 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,6 +1,6 @@
1[versions] 1[versions]
2eclipseCollections = "11.1.0" 2eclipseCollections = "11.1.0"
3jetty = "12.0.0.alpha2" 3jetty = "12.0.0.alpha3"
4jmh = "1.36" 4jmh = "1.36"
5junit = "5.9.1" 5junit = "5.9.1"
6mockito = "4.9.0" 6mockito = "4.9.0"
diff --git a/subprojects/frontend/package.json b/subprojects/frontend/package.json
index a826755d..2e6d35d5 100644
--- a/subprojects/frontend/package.json
+++ b/subprojects/frontend/package.json
@@ -29,7 +29,7 @@
29 "@codemirror/lint": "^6.1.0", 29 "@codemirror/lint": "^6.1.0",
30 "@codemirror/search": "^6.2.3", 30 "@codemirror/search": "^6.2.3",
31 "@codemirror/state": "^6.1.4", 31 "@codemirror/state": "^6.1.4",
32 "@codemirror/view": "^6.7.0", 32 "@codemirror/view": "^6.7.1",
33 "@emotion/react": "^11.10.5", 33 "@emotion/react": "^11.10.5",
34 "@emotion/styled": "^11.10.5", 34 "@emotion/styled": "^11.10.5",
35 "@fontsource/inter": "^4.5.14", 35 "@fontsource/inter": "^4.5.14",
@@ -54,7 +54,7 @@
54 "react": "^18.2.0", 54 "react": "^18.2.0",
55 "react-dom": "^18.2.0", 55 "react-dom": "^18.2.0",
56 "xstate": "^4.35.0", 56 "xstate": "^4.35.0",
57 "zod": "^3.19.1" 57 "zod": "^3.20.0"
58 }, 58 },
59 "devDependencies": { 59 "devDependencies": {
60 "@lezer/generator": "^1.1.3", 60 "@lezer/generator": "^1.1.3",
@@ -88,7 +88,7 @@
88 "prettier": "^2.8.1", 88 "prettier": "^2.8.1",
89 "typescript": "4.9.3", 89 "typescript": "4.9.3",
90 "vite": "^4.0.0", 90 "vite": "^4.0.0",
91 "vite-plugin-pwa": "^0.13.3", 91 "vite-plugin-pwa": "^0.14.0",
92 "workbox-window": "^6.5.4" 92 "workbox-window": "^6.5.4"
93 } 93 }
94} 94}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java
index 960eef71..f49f46ee 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/ServerLauncher.java
@@ -11,7 +11,6 @@ import org.eclipse.jetty.ee10.servlet.ServletHolder;
11import org.eclipse.jetty.ee10.servlet.SessionHandler; 11import org.eclipse.jetty.ee10.servlet.SessionHandler;
12import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; 12import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer;
13import org.eclipse.jetty.server.Server; 13import org.eclipse.jetty.server.Server;
14import org.eclipse.jetty.util.VirtualThreads;
15import org.eclipse.jetty.util.resource.Resource; 14import org.eclipse.jetty.util.resource.Resource;
16import org.eclipse.jetty.util.resource.ResourceFactory; 15import org.eclipse.jetty.util.resource.ResourceFactory;
17import org.slf4j.Logger; 16import org.slf4j.Logger;
@@ -44,13 +43,7 @@ public class ServerLauncher {
44 private final Server server; 43 private final Server server;
45 44
46 public ServerLauncher(InetSocketAddress bindAddress, String[] allowedOrigins, String webSocketUrl) { 45 public ServerLauncher(InetSocketAddress bindAddress, String[] allowedOrigins, String webSocketUrl) {
47 server = new Server(bindAddress); 46 server = VirtualThreadUtils.newServerWithVirtualThreadsThreadPool("jetty", bindAddress);
48 enableVirtualThreads(server);
49 if (server.getThreadPool() instanceof VirtualThreads.Configurable virtualThreadsConfigurable) {
50 // Change this to setVirtualThreadsExecutor once
51 // https://github.com/eclipse/jetty.project/commit/83154b4ffe4767ef44981598d6c26e6a5d32e57c gets released.
52 virtualThreadsConfigurable.setUseVirtualThreads(VirtualThreads.areSupported());
53 }
54 var handler = new ServletContextHandler(); 47 var handler = new ServletContextHandler();
55 addSessionHandler(handler); 48 addSessionHandler(handler);
56 addProblemServlet(handler, allowedOrigins); 49 addProblemServlet(handler, allowedOrigins);
@@ -150,14 +143,6 @@ public class ServerLauncher {
150 } 143 }
151 } 144 }
152 145
153 public static void enableVirtualThreads(Server server) {
154 if (server.getThreadPool() instanceof VirtualThreads.Configurable virtualThreadsConfigurable) {
155 // Change this to setVirtualThreadsExecutor once
156 // https://github.com/eclipse/jetty.project/commit/83154b4ffe4767ef44981598d6c26e6a5d32e57c gets released.
157 virtualThreadsConfigurable.setUseVirtualThreads(VirtualThreads.areSupported());
158 }
159 }
160
161 private static String getListenAddress() { 146 private static String getListenAddress() {
162 var listenAddress = System.getenv("LISTEN_ADDRESS"); 147 var listenAddress = System.getenv("LISTEN_ADDRESS");
163 if (listenAddress == null) { 148 if (listenAddress == null) {
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java
new file mode 100644
index 00000000..a055e755
--- /dev/null
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/VirtualThreadUtils.java
@@ -0,0 +1,52 @@
1package tools.refinery.language.web;
2
3import org.eclipse.jetty.server.Server;
4import org.eclipse.jetty.server.ServerConnector;
5import org.eclipse.jetty.util.thread.QueuedThreadPool;
6import org.eclipse.jetty.util.thread.ThreadPool;
7
8import java.net.InetSocketAddress;
9import java.time.Duration;
10import java.util.concurrent.ExecutorService;
11import java.util.concurrent.Executors;
12
13public final class VirtualThreadUtils {
14 private VirtualThreadUtils() {
15 throw new IllegalStateException("This is a static utility class and should not be instantiated directly");
16 }
17
18 public static ExecutorService newNamedVirtualThreadsExecutor(String name) {
19 // Based on
20 // https://github.com/eclipse/jetty.project/blob/83154b4ffe4767ef44981598d6c26e6a5d32e57c/jetty-server/src/main/config/etc/jetty-threadpool-virtual-preview.xml
21 return Executors.newThreadPerTaskExecutor(Thread.ofVirtual()
22 .allowSetThreadLocals(true)
23 .inheritInheritableThreadLocals(false)
24 .name(name + "-virtual-", 0)
25 .factory());
26 }
27
28 public static ThreadPool newThreadPoolWithVirtualThreadsExecutor(String name) {
29 // Based on
30 // https://github.com/eclipse/jetty.project/blob/83154b4ffe4767ef44981598d6c26e6a5d32e57c/jetty-server/src/main/config/etc/jetty-threadpool-virtual-preview.xml
31 int timeout = (int) Duration.ofMinutes(1).toMillis();
32 var threadPool = new QueuedThreadPool(200, 10, timeout, -1, null, null);
33 threadPool.setName(name);
34 threadPool.setDetailedDump(false);
35 threadPool.setVirtualThreadsExecutor(newNamedVirtualThreadsExecutor(name));
36 return threadPool;
37 }
38
39 public static Server newServerWithVirtualThreadsThreadPool(String name, InetSocketAddress listenAddress) {
40 var server = new Server(newThreadPoolWithVirtualThreadsExecutor(name));
41 var connector = new ServerConnector(server);
42 try {
43 connector.setHost(listenAddress.getHostName());
44 connector.setPort(listenAddress.getPort());
45 server.addConnector(connector);
46 } catch (Exception e) {
47 connector.close();
48 throw e;
49 }
50 return server;
51 }
52}
diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java
index ead98927..abbcbd53 100644
--- a/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java
+++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/xtext/VirtualThreadExecutorServiceProvider.java
@@ -1,9 +1,9 @@
1package tools.refinery.language.web.xtext; 1package tools.refinery.language.web.xtext;
2 2
3import org.eclipse.xtext.ide.ExecutorServiceProvider; 3import org.eclipse.xtext.ide.ExecutorServiceProvider;
4import tools.refinery.language.web.VirtualThreadUtils;
4 5
5import java.util.concurrent.ExecutorService; 6import java.util.concurrent.ExecutorService;
6import java.util.concurrent.Executors;
7 7
8public class VirtualThreadExecutorServiceProvider extends ExecutorServiceProvider { 8public class VirtualThreadExecutorServiceProvider extends ExecutorServiceProvider {
9 private static final String THREAD_POOL_NAME = "xtextWeb"; 9 private static final String THREAD_POOL_NAME = "xtextWeb";
@@ -11,10 +11,6 @@ public class VirtualThreadExecutorServiceProvider extends ExecutorServiceProvide
11 @Override 11 @Override
12 protected ExecutorService createInstance(String key) { 12 protected ExecutorService createInstance(String key) {
13 var name = key == null ? THREAD_POOL_NAME : THREAD_POOL_NAME + "-" + key; 13 var name = key == null ? THREAD_POOL_NAME : THREAD_POOL_NAME + "-" + key;
14 return Executors.newThreadPerTaskExecutor(Thread.ofVirtual() 14 return VirtualThreadUtils.newNamedVirtualThreadsExecutor(name);
15 .allowSetThreadLocals(true)
16 .inheritInheritableThreadLocals(false)
17 .name(name + "-", 0)
18 .factory());
19 } 15 }
20} 16}
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java
index 24fab4e3..ecbefc4f 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/ProblemWebSocketServletIntegrationTest.java
@@ -14,9 +14,7 @@ import org.eclipse.jetty.http.HttpStatus;
14import org.eclipse.jetty.server.Server; 14import org.eclipse.jetty.server.Server;
15import org.eclipse.xtext.testing.GlobalRegistries; 15import org.eclipse.xtext.testing.GlobalRegistries;
16import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento; 16import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento;
17import org.junit.jupiter.api.AfterEach; 17import org.junit.jupiter.api.*;
18import org.junit.jupiter.api.BeforeEach;
19import org.junit.jupiter.api.Test;
20import org.junit.jupiter.params.ParameterizedTest; 18import org.junit.jupiter.params.ParameterizedTest;
21import org.junit.jupiter.params.provider.ValueSource; 19import org.junit.jupiter.params.provider.ValueSource;
22import tools.refinery.language.web.tests.WebSocketIntegrationTestClient; 20import tools.refinery.language.web.tests.WebSocketIntegrationTestClient;
@@ -25,6 +23,7 @@ import tools.refinery.language.web.xtext.servlet.XtextWebSocketServlet;
25 23
26import java.io.IOException; 24import java.io.IOException;
27import java.net.InetSocketAddress; 25import java.net.InetSocketAddress;
26import java.net.ServerSocket;
28import java.net.URI; 27import java.net.URI;
29import java.util.concurrent.CompletableFuture; 28import java.util.concurrent.CompletableFuture;
30import java.util.concurrent.CompletionException; 29import java.util.concurrent.CompletionException;
@@ -34,18 +33,29 @@ import static org.hamcrest.Matchers.*;
34import static org.junit.jupiter.api.Assertions.assertThrows; 33import static org.junit.jupiter.api.Assertions.assertThrows;
35 34
36class ProblemWebSocketServletIntegrationTest { 35class ProblemWebSocketServletIntegrationTest {
37 private static final int SERVER_PORT = 28080; 36 private static final String HOSTNAME = "127.0.0.1";
38 37
39 private static final String SERVLET_URI = "/xtext-service"; 38 private static final String SERVLET_URI = "/xtext-service";
40 39
41 private GlobalStateMemento stateBeforeInjectorCreation; 40 private GlobalStateMemento stateBeforeInjectorCreation;
42 41
42 private TestInfo testInfo;
43
44 private int serverPort;
45
43 private Server server; 46 private Server server;
44 47
45 private WebSocketClient client; 48 private WebSocketClient client;
46 49
47 @BeforeEach 50 @BeforeEach
48 void beforeEach() throws Exception { 51 void beforeEach(TestInfo testInfo) throws Exception {
52 this.testInfo = testInfo;
53 // Find a free port for running the test. See e.g., https://stackoverflow.com/a/65937797
54 try (var serverSocket = new ServerSocket()) {
55 serverSocket.setReuseAddress(true);
56 serverSocket.bind(new InetSocketAddress(HOSTNAME, 0));
57 serverPort = serverSocket.getLocalPort();
58 }
49 stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState(); 59 stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
50 client = new WebSocketClient(); 60 client = new WebSocketClient();
51 client.start(); 61 client.start();
@@ -147,7 +157,7 @@ class ProblemWebSocketServletIntegrationTest {
147 } 157 }
148 } 158 }
149 159
150 @ParameterizedTest(name = "Origin: {0}") 160 @ParameterizedTest(name = "validOriginTest(\"{0}\")")
151 @ValueSource(strings = { "https://refinery.example", "https://refinery.example:443", "HTTPS://REFINERY.EXAMPLE" }) 161 @ValueSource(strings = { "https://refinery.example", "https://refinery.example:443", "HTTPS://REFINERY.EXAMPLE" })
152 void validOriginTest(String origin) { 162 void validOriginTest(String origin) {
153 startServer("https://refinery.example,https://refinery.example:443"); 163 startServer("https://refinery.example,https://refinery.example:443");
@@ -176,8 +186,9 @@ class ProblemWebSocketServletIntegrationTest {
176 } 186 }
177 187
178 private void startServer(String allowedOrigins) { 188 private void startServer(String allowedOrigins) {
179 server = new Server(new InetSocketAddress(SERVER_PORT)); 189 var testName = getClass().getSimpleName() + "-" + testInfo.getDisplayName();
180 ServerLauncher.enableVirtualThreads(server); 190 var listenAddress = new InetSocketAddress(HOSTNAME, serverPort);
191 server = VirtualThreadUtils.newServerWithVirtualThreadsThreadPool(testName, listenAddress);
181 var handler = new ServletContextHandler(); 192 var handler = new ServletContextHandler();
182 var holder = new ServletHolder(ProblemWebSocketServlet.class); 193 var holder = new ServletHolder(ProblemWebSocketServlet.class);
183 if (allowedOrigins != null) { 194 if (allowedOrigins != null) {
@@ -201,7 +212,8 @@ class ProblemWebSocketServletIntegrationTest {
201 upgradeRequest.setSubProtocols(subProtocols); 212 upgradeRequest.setSubProtocols(subProtocols);
202 CompletableFuture<Session> sessionFuture; 213 CompletableFuture<Session> sessionFuture;
203 try { 214 try {
204 sessionFuture = client.connect(webSocketClient, URI.create("ws://localhost:" + SERVER_PORT + SERVLET_URI), 215 sessionFuture = client.connect(webSocketClient,
216 URI.create("ws://%s:%d%s".formatted(HOSTNAME, serverPort, SERVLET_URI)),
205 upgradeRequest); 217 upgradeRequest);
206 } catch (IOException e) { 218 } catch (IOException e) {
207 throw new AssertionError("Unexpected exception while connection to websocket", e); 219 throw new AssertionError("Unexpected exception while connection to websocket", e);
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java
index 25343109..c634e8fc 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/AwaitTerminationExecutorServiceProvider.java
@@ -13,7 +13,7 @@ public class AwaitTerminationExecutorServiceProvider extends VirtualThreadExecut
13 13
14 @Override 14 @Override
15 protected ExecutorService createInstance(String key) { 15 protected ExecutorService createInstance(String key) {
16 var instance = new RestartableCachedThreadPool(); 16 var instance = new RestartableCachedThreadPool(() -> super.createInstance(key));
17 synchronized (servicesToShutDown) { 17 synchronized (servicesToShutDown) {
18 servicesToShutDown.add(instance); 18 servicesToShutDown.add(instance);
19 } 19 }
diff --git a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java
index a8655313..cf805eda 100644
--- a/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java
+++ b/subprojects/language-web/src/test/java/tools/refinery/language/web/tests/RestartableCachedThreadPool.java
@@ -1,5 +1,6 @@
1package tools.refinery.language.web.tests; 1package tools.refinery.language.web.tests;
2 2
3import com.google.inject.Provider;
3import org.jetbrains.annotations.NotNull; 4import org.jetbrains.annotations.NotNull;
4import org.slf4j.Logger; 5import org.slf4j.Logger;
5import org.slf4j.LoggerFactory; 6import org.slf4j.LoggerFactory;
@@ -13,14 +14,17 @@ public class RestartableCachedThreadPool implements ExecutorService {
13 14
14 private ExecutorService delegate; 15 private ExecutorService delegate;
15 16
16 public RestartableCachedThreadPool() { 17 private final Provider<ExecutorService> executorServiceProvider;
17 delegate = createExecutorService(); 18
19 public RestartableCachedThreadPool(Provider<ExecutorService> executorServiceProvider) {
20 this.executorServiceProvider = executorServiceProvider;
21 delegate = executorServiceProvider.get();
18 } 22 }
19 23
20 public void waitForAllTasksToFinish() { 24 public void waitForAllTasksToFinish() {
21 delegate.shutdown(); 25 delegate.shutdown();
22 waitForTermination(); 26 waitForTermination();
23 delegate = createExecutorService(); 27 delegate = executorServiceProvider.get();
24 } 28 }
25 29
26 public void waitForTermination() { 30 public void waitForTermination() {
@@ -35,10 +39,6 @@ public class RestartableCachedThreadPool implements ExecutorService {
35 } 39 }
36 } 40 }
37 41
38 protected ExecutorService createExecutorService() {
39 return Executors.newCachedThreadPool();
40 }
41
42 @Override 42 @Override
43 public boolean awaitTermination(long arg0, @NotNull TimeUnit arg1) throws InterruptedException { 43 public boolean awaitTermination(long arg0, @NotNull TimeUnit arg1) throws InterruptedException {
44 return delegate.awaitTermination(arg0, arg1); 44 return delegate.awaitTermination(arg0, arg1);
diff --git a/yarn.lock b/yarn.lock
index d56377b8..49c00e98 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1359,14 +1359,14 @@ __metadata:
1359 languageName: node 1359 languageName: node
1360 linkType: hard 1360 linkType: hard
1361 1361
1362"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.7.0": 1362"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.7.1":
1363 version: 6.7.0 1363 version: 6.7.1
1364 resolution: "@codemirror/view@npm:6.7.0" 1364 resolution: "@codemirror/view@npm:6.7.1"
1365 dependencies: 1365 dependencies:
1366 "@codemirror/state": ^6.1.4 1366 "@codemirror/state": ^6.1.4
1367 style-mod: ^4.0.0 1367 style-mod: ^4.0.0
1368 w3c-keyname: ^2.2.4 1368 w3c-keyname: ^2.2.4
1369 checksum: 9271ffee2889ed42137966424aa11d664fe2ebffec0254b22fbe5817db2c0f6da48b01bd5a8d532390b7678d26583c5329cc0c6f9fba964d7e28405f4f996554 1369 checksum: 75a5846d61e63027e9bf1dfd0b507932934cb7650b7959c1191e68b161eb1756e9773f964c4331970b51864aef8f7954bc5cc8fdb51b0f6533de6c20568833ed
1370 languageName: node 1370 languageName: node
1371 linkType: hard 1371 linkType: hard
1372 1372
@@ -2098,7 +2098,7 @@ __metadata:
2098 "@codemirror/lint": ^6.1.0 2098 "@codemirror/lint": ^6.1.0
2099 "@codemirror/search": ^6.2.3 2099 "@codemirror/search": ^6.2.3
2100 "@codemirror/state": ^6.1.4 2100 "@codemirror/state": ^6.1.4
2101 "@codemirror/view": ^6.7.0 2101 "@codemirror/view": ^6.7.1
2102 "@emotion/react": ^11.10.5 2102 "@emotion/react": ^11.10.5
2103 "@emotion/styled": ^11.10.5 2103 "@emotion/styled": ^11.10.5
2104 "@fontsource/inter": ^4.5.14 2104 "@fontsource/inter": ^4.5.14
@@ -2153,10 +2153,10 @@ __metadata:
2153 react-dom: ^18.2.0 2153 react-dom: ^18.2.0
2154 typescript: 4.9.3 2154 typescript: 4.9.3
2155 vite: ^4.0.0 2155 vite: ^4.0.0
2156 vite-plugin-pwa: ^0.13.3 2156 vite-plugin-pwa: ^0.14.0
2157 workbox-window: ^6.5.4 2157 workbox-window: ^6.5.4
2158 xstate: ^4.35.0 2158 xstate: ^4.35.0
2159 zod: ^3.19.1 2159 zod: ^3.20.0
2160 languageName: unknown 2160 languageName: unknown
2161 linkType: soft 2161 linkType: soft
2162 2162
@@ -2214,15 +2214,18 @@ __metadata:
2214 languageName: node 2214 languageName: node
2215 linkType: hard 2215 linkType: hard
2216 2216
2217"@rollup/plugin-replace@npm:^4.0.0": 2217"@rollup/plugin-replace@npm:^5.0.1":
2218 version: 4.0.0 2218 version: 5.0.1
2219 resolution: "@rollup/plugin-replace@npm:4.0.0" 2219 resolution: "@rollup/plugin-replace@npm:5.0.1"
2220 dependencies: 2220 dependencies:
2221 "@rollup/pluginutils": ^3.1.0 2221 "@rollup/pluginutils": ^5.0.1
2222 magic-string: ^0.25.7 2222 magic-string: ^0.26.4
2223 peerDependencies: 2223 peerDependencies:
2224 rollup: ^1.20.0 || ^2.0.0 2224 rollup: ^1.20.0||^2.0.0||^3.0.0
2225 checksum: b61701e612661a46da06ca88f390c3839b586708abc0329a476411b90aa8ac59fe94437ede4c3fe53fea268b3054ea9d7d4ee851d7bd0cb7a5f06906002067cb 2225 peerDependenciesMeta:
2226 rollup:
2227 optional: true
2228 checksum: d5f98a93dd24086ed1bf70e9299230d1fddae9b132280e2daaca855dba2307eccd5490553e2a03b701b7411593d2921d2d675e5d906b4754c57152f8c50adb07
2226 languageName: node 2229 languageName: node
2227 linkType: hard 2230 linkType: hard
2228 2231
@@ -2239,6 +2242,22 @@ __metadata:
2239 languageName: node 2242 languageName: node
2240 linkType: hard 2243 linkType: hard
2241 2244
2245"@rollup/pluginutils@npm:^5.0.1":
2246 version: 5.0.2
2247 resolution: "@rollup/pluginutils@npm:5.0.2"
2248 dependencies:
2249 "@types/estree": ^1.0.0
2250 estree-walker: ^2.0.2
2251 picomatch: ^2.3.1
2252 peerDependencies:
2253 rollup: ^1.20.0||^2.0.0||^3.0.0
2254 peerDependenciesMeta:
2255 rollup:
2256 optional: true
2257 checksum: edea15e543bebc7dcac3b0ac8bc7b8e8e6dbd46e2864dbe5dd28072de1fbd5b0e10d545a610c0edaa178e8a7ac432e2a2a52e547ece1308471412caba47db8ce
2258 languageName: node
2259 linkType: hard
2260
2242"@surma/rollup-plugin-off-main-thread@npm:^2.2.3": 2261"@surma/rollup-plugin-off-main-thread@npm:^2.2.3":
2243 version: 2.2.3 2262 version: 2.2.3
2244 resolution: "@surma/rollup-plugin-off-main-thread@npm:2.2.3" 2263 resolution: "@surma/rollup-plugin-off-main-thread@npm:2.2.3"
@@ -2393,7 +2412,7 @@ __metadata:
2393 languageName: node 2412 languageName: node
2394 linkType: hard 2413 linkType: hard
2395 2414
2396"@types/estree@npm:*": 2415"@types/estree@npm:*, @types/estree@npm:^1.0.0":
2397 version: 1.0.0 2416 version: 1.0.0
2398 resolution: "@types/estree@npm:1.0.0" 2417 resolution: "@types/estree@npm:1.0.0"
2399 checksum: 910d97fb7092c6738d30a7430ae4786a38542023c6302b95d46f49420b797f21619cdde11fa92b338366268795884111c2eb10356e4bd2c8ad5b92941e9e6443 2418 checksum: 910d97fb7092c6738d30a7430ae4786a38542023c6302b95d46f49420b797f21619cdde11fa92b338366268795884111c2eb10356e4bd2c8ad5b92941e9e6443
@@ -4133,6 +4152,13 @@ __metadata:
4133 languageName: node 4152 languageName: node
4134 linkType: hard 4153 linkType: hard
4135 4154
4155"estree-walker@npm:^2.0.2":
4156 version: 2.0.2
4157 resolution: "estree-walker@npm:2.0.2"
4158 checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc
4159 languageName: node
4160 linkType: hard
4161
4136"esutils@npm:^2.0.2": 4162"esutils@npm:^2.0.2":
4137 version: 2.0.3 4163 version: 2.0.3
4138 resolution: "esutils@npm:2.0.3" 4164 resolution: "esutils@npm:2.0.3"
@@ -4154,16 +4180,16 @@ __metadata:
4154 languageName: node 4180 languageName: node
4155 linkType: hard 4181 linkType: hard
4156 4182
4157"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9": 4183"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9":
4158 version: 3.2.11 4184 version: 3.2.12
4159 resolution: "fast-glob@npm:3.2.11" 4185 resolution: "fast-glob@npm:3.2.12"
4160 dependencies: 4186 dependencies:
4161 "@nodelib/fs.stat": ^2.0.2 4187 "@nodelib/fs.stat": ^2.0.2
4162 "@nodelib/fs.walk": ^1.2.3 4188 "@nodelib/fs.walk": ^1.2.3
4163 glob-parent: ^5.1.2 4189 glob-parent: ^5.1.2
4164 merge2: ^1.3.0 4190 merge2: ^1.3.0
4165 micromatch: ^4.0.4 4191 micromatch: ^4.0.4
4166 checksum: f473105324a7780a20c06de842e15ddbb41d3cb7e71d1e4fe6e8373204f22245d54f5ab9e2061e6a1c613047345954d29b022e0e76f5c28b1df9858179a0e6d7 4192 checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2
4167 languageName: node 4193 languageName: node
4168 linkType: hard 4194 linkType: hard
4169 4195
@@ -5227,6 +5253,15 @@ __metadata:
5227 languageName: node 5253 languageName: node
5228 linkType: hard 5254 linkType: hard
5229 5255
5256"magic-string@npm:^0.26.4":
5257 version: 0.26.7
5258 resolution: "magic-string@npm:0.26.7"
5259 dependencies:
5260 sourcemap-codec: ^1.4.8
5261 checksum: 89b0d60cbb32bbf3d1e23c46ea93db082d18a8230b972027aecb10a40bba51be519ecce0674f995571e3affe917b76b09f59d8dbc9a1b2c9c4102a2b6e8a2b01
5262 languageName: node
5263 linkType: hard
5264
5230"make-fetch-happen@npm:^9.1.0": 5265"make-fetch-happen@npm:^9.1.0":
5231 version: 9.1.0 5266 version: 9.1.0
5232 resolution: "make-fetch-happen@npm:9.1.0" 5267 resolution: "make-fetch-happen@npm:9.1.0"
@@ -6179,7 +6214,7 @@ __metadata:
6179 languageName: node 6214 languageName: node
6180 linkType: hard 6215 linkType: hard
6181 6216
6182"rollup@npm:^2.43.1, rollup@npm:^2.79.0": 6217"rollup@npm:^2.43.1":
6183 version: 2.79.1 6218 version: 2.79.1
6184 resolution: "rollup@npm:2.79.1" 6219 resolution: "rollup@npm:2.79.1"
6185 dependencies: 6220 dependencies:
@@ -6193,9 +6228,9 @@ __metadata:
6193 languageName: node 6228 languageName: node
6194 linkType: hard 6229 linkType: hard
6195 6230
6196"rollup@npm:^3.7.0": 6231"rollup@npm:^3.7.0, rollup@npm:^3.7.2":
6197 version: 3.7.0 6232 version: 3.7.3
6198 resolution: "rollup@npm:3.7.0" 6233 resolution: "rollup@npm:3.7.3"
6199 dependencies: 6234 dependencies:
6200 fsevents: ~2.3.2 6235 fsevents: ~2.3.2
6201 dependenciesMeta: 6236 dependenciesMeta:
@@ -6203,7 +6238,7 @@ __metadata:
6203 optional: true 6238 optional: true
6204 bin: 6239 bin:
6205 rollup: dist/bin/rollup 6240 rollup: dist/bin/rollup
6206 checksum: 9a407469cd25e1255fb5a5956eff53ff963c90ffba949ec81ea8104d1271e1ce377c28231078d96c2d14a8a9727a06d1d2421f3db4d11b74d46cbcc2a02c3768 6241 checksum: b7703e806693919f1600fc937bccb5c0f39af38e1c9351c34ce4272bcc6f8742ddfc0f1d138d3ad3478b8048c51787f04b2464abb14b1f8655dd2b6a7102c43e
6207 languageName: node 6242 languageName: node
6208 linkType: hard 6243 linkType: hard
6209 6244
@@ -6872,22 +6907,22 @@ __metadata:
6872 languageName: node 6907 languageName: node
6873 linkType: hard 6908 linkType: hard
6874 6909
6875"vite-plugin-pwa@npm:^0.13.3": 6910"vite-plugin-pwa@npm:^0.14.0":
6876 version: 0.13.3 6911 version: 0.14.0
6877 resolution: "vite-plugin-pwa@npm:0.13.3" 6912 resolution: "vite-plugin-pwa@npm:0.14.0"
6878 dependencies: 6913 dependencies:
6879 "@rollup/plugin-replace": ^4.0.0 6914 "@rollup/plugin-replace": ^5.0.1
6880 debug: ^4.3.4 6915 debug: ^4.3.4
6881 fast-glob: ^3.2.11 6916 fast-glob: ^3.2.12
6882 pretty-bytes: ^6.0.0 6917 pretty-bytes: ^6.0.0
6883 rollup: ^2.79.0 6918 rollup: ^3.7.2
6884 workbox-build: ^6.5.4 6919 workbox-build: ^6.5.4
6885 workbox-window: ^6.5.4 6920 workbox-window: ^6.5.4
6886 peerDependencies: 6921 peerDependencies:
6887 vite: ^3.1.0 6922 vite: ^3.1.0 || ^4.0.0
6888 workbox-build: ^6.5.4 6923 workbox-build: ^6.5.4
6889 workbox-window: ^6.5.4 6924 workbox-window: ^6.5.4
6890 checksum: be1e8699e2fb4fea98454d20c8df4bcbd828aecb2b714a1251405fde4dc9ac9c95520b33fdfc1a3d91d51f9d920501d93f57f4f0a2f1361ba38785c86e4756a4 6925 checksum: b6e2ba73b75bea5bff83418a3ffd484af8efd06556a5f5ccbb76426f00f84548b575d27d5b4c005c3cd44eab450c8e39417a7568073bfe4d92201a7e846f6bea
6891 languageName: node 6926 languageName: node
6892 linkType: hard 6927 linkType: hard
6893 6928
@@ -7219,9 +7254,9 @@ __metadata:
7219 languageName: node 7254 languageName: node
7220 linkType: hard 7255 linkType: hard
7221 7256
7222"zod@npm:^3.19.1": 7257"zod@npm:^3.20.0":
7223 version: 3.19.1 7258 version: 3.20.0
7224 resolution: "zod@npm:3.19.1" 7259 resolution: "zod@npm:3.20.0"
7225 checksum: 56e420ea5845912324a8fc61833714a2aec84954e418b52660d76502183c6e62fef9447cbfa64349640c5ce190cf2c24267e006bb80f066183e2f3fa9fe11864 7260 checksum: 34e5aa865b1093bf2630af2d88c4c02004e07b52a1140082c58c986adf41cdfc99be7094860c904b42eabfb1a15e05305a9eeb2a20745ba2beb5c01f40577ca5
7226 languageName: node 7261 languageName: node
7227 linkType: hard 7262 linkType: hard