diff options
author | Kristóf Marussy <kristof@marussy.com> | 2022-12-10 14:32:17 +0100 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2022-12-12 16:31:04 +0100 |
commit | d786792fcf32eb5d94c870a83020941b8693deb1 (patch) | |
tree | ea8b5a57468cb24f864859639bb537d46354823f | |
parent | refactor(frontend): split vite config (diff) | |
download | refinery-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.
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] |
2 | eclipseCollections = "11.1.0" | 2 | eclipseCollections = "11.1.0" |
3 | jetty = "12.0.0.alpha2" | 3 | jetty = "12.0.0.alpha3" |
4 | jmh = "1.36" | 4 | jmh = "1.36" |
5 | junit = "5.9.1" | 5 | junit = "5.9.1" |
6 | mockito = "4.9.0" | 6 | mockito = "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; | |||
11 | import org.eclipse.jetty.ee10.servlet.SessionHandler; | 11 | import org.eclipse.jetty.ee10.servlet.SessionHandler; |
12 | import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; | 12 | import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; |
13 | import org.eclipse.jetty.server.Server; | 13 | import org.eclipse.jetty.server.Server; |
14 | import org.eclipse.jetty.util.VirtualThreads; | ||
15 | import org.eclipse.jetty.util.resource.Resource; | 14 | import org.eclipse.jetty.util.resource.Resource; |
16 | import org.eclipse.jetty.util.resource.ResourceFactory; | 15 | import org.eclipse.jetty.util.resource.ResourceFactory; |
17 | import org.slf4j.Logger; | 16 | import 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 @@ | |||
1 | package tools.refinery.language.web; | ||
2 | |||
3 | import org.eclipse.jetty.server.Server; | ||
4 | import org.eclipse.jetty.server.ServerConnector; | ||
5 | import org.eclipse.jetty.util.thread.QueuedThreadPool; | ||
6 | import org.eclipse.jetty.util.thread.ThreadPool; | ||
7 | |||
8 | import java.net.InetSocketAddress; | ||
9 | import java.time.Duration; | ||
10 | import java.util.concurrent.ExecutorService; | ||
11 | import java.util.concurrent.Executors; | ||
12 | |||
13 | public 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 @@ | |||
1 | package tools.refinery.language.web.xtext; | 1 | package tools.refinery.language.web.xtext; |
2 | 2 | ||
3 | import org.eclipse.xtext.ide.ExecutorServiceProvider; | 3 | import org.eclipse.xtext.ide.ExecutorServiceProvider; |
4 | import tools.refinery.language.web.VirtualThreadUtils; | ||
4 | 5 | ||
5 | import java.util.concurrent.ExecutorService; | 6 | import java.util.concurrent.ExecutorService; |
6 | import java.util.concurrent.Executors; | ||
7 | 7 | ||
8 | public class VirtualThreadExecutorServiceProvider extends ExecutorServiceProvider { | 8 | public 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; | |||
14 | import org.eclipse.jetty.server.Server; | 14 | import org.eclipse.jetty.server.Server; |
15 | import org.eclipse.xtext.testing.GlobalRegistries; | 15 | import org.eclipse.xtext.testing.GlobalRegistries; |
16 | import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento; | 16 | import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento; |
17 | import org.junit.jupiter.api.AfterEach; | 17 | import org.junit.jupiter.api.*; |
18 | import org.junit.jupiter.api.BeforeEach; | ||
19 | import org.junit.jupiter.api.Test; | ||
20 | import org.junit.jupiter.params.ParameterizedTest; | 18 | import org.junit.jupiter.params.ParameterizedTest; |
21 | import org.junit.jupiter.params.provider.ValueSource; | 19 | import org.junit.jupiter.params.provider.ValueSource; |
22 | import tools.refinery.language.web.tests.WebSocketIntegrationTestClient; | 20 | import tools.refinery.language.web.tests.WebSocketIntegrationTestClient; |
@@ -25,6 +23,7 @@ import tools.refinery.language.web.xtext.servlet.XtextWebSocketServlet; | |||
25 | 23 | ||
26 | import java.io.IOException; | 24 | import java.io.IOException; |
27 | import java.net.InetSocketAddress; | 25 | import java.net.InetSocketAddress; |
26 | import java.net.ServerSocket; | ||
28 | import java.net.URI; | 27 | import java.net.URI; |
29 | import java.util.concurrent.CompletableFuture; | 28 | import java.util.concurrent.CompletableFuture; |
30 | import java.util.concurrent.CompletionException; | 29 | import java.util.concurrent.CompletionException; |
@@ -34,18 +33,29 @@ import static org.hamcrest.Matchers.*; | |||
34 | import static org.junit.jupiter.api.Assertions.assertThrows; | 33 | import static org.junit.jupiter.api.Assertions.assertThrows; |
35 | 34 | ||
36 | class ProblemWebSocketServletIntegrationTest { | 35 | class 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 @@ | |||
1 | package tools.refinery.language.web.tests; | 1 | package tools.refinery.language.web.tests; |
2 | 2 | ||
3 | import com.google.inject.Provider; | ||
3 | import org.jetbrains.annotations.NotNull; | 4 | import org.jetbrains.annotations.NotNull; |
4 | import org.slf4j.Logger; | 5 | import org.slf4j.Logger; |
5 | import org.slf4j.LoggerFactory; | 6 | import 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); |
@@ -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 |