~repos /edge-city

#react#js#ssr

git clone https://pyrossh.dev/repos/edge-city.git
Discussions: https://groups.google.com/g/rust-embed-devs

edge-city is a next level meta-framework for react that runs only on edge runtimes


c7f7584c pyrossh

2 years ago
refactor dir
example/package.json CHANGED
@@ -8,6 +8,7 @@
8
8
  "dev:wrangler": "cd build && wrangler pages dev static",
9
9
  "deploy:wrangler": "cd build && wrangler pages deploy static",
10
10
  "build": " edge-city build -p cloudflare",
11
+ "build-2": "vite build",
11
12
  "generate": "drizzle-kit generate:pg --out migrations --schema migrations/schema.js",
12
13
  "migrate": "node scripts/migrate.js",
13
14
  "test": "jest",
@@ -33,7 +34,10 @@
33
34
  "eslint-config-react-app": "^7.0.1",
34
35
  "postgres": "3.3.4",
35
36
  "prettier": "^2.8.8",
36
- "wrangler": "3.0.1"
37
+ "wrangler": "3.0.1",
38
+ "vite": "4.3.9",
39
+ "vite-plugin-pages": "0.30.1",
40
+ "@vitejs/plugin-react": "4.0.0"
37
41
  },
38
42
  "prettier": {
39
43
  "printWidth": 100,
example/src/components/Layout/Layout.jsx CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { Link } from "edge-city";
2
+ import Link from "edge-city/link";
3
3
  import "./Layout.css";
4
4
 
5
5
  const Layout = ({ children }) => {
example/src/pages/about/page.jsx CHANGED
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
+ import Link from "edge-city/link";
2
- import { Link, useRouter } from "edge-city";
3
+ import { useRouter } from "edge-city/router";
3
4
  import { Helmet } from "react-helmet-async";
4
5
  import "./page.css";
5
6
 
example/src/pages/page.jsx CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { useRouter } from "edge-city";
2
+ import { useRouter } from "edge-city/router";
3
3
  import Counter from "@/components/Counter/Counter";
4
4
  import { Helmet } from "react-helmet-async";
5
5
  import "./page.css";
example/src/pages/todos/Todo.jsx CHANGED
@@ -1,7 +1,7 @@
1
1
  import { useState } from "react";
2
2
  import { useForm } from "react-hook-form";
3
3
  import { TextField, Input } from "react-aria-components";
4
- import { cache, useMutation } from "edge-city";
4
+ import { cache, useMutation } from "edge-city/data";
5
5
  import { updateTodo, deleteTodo } from "@/services/todos.service";
6
6
  import "./Todo.css";
7
7
 
example/src/pages/todos/TodoList.jsx CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { useQuery } from "edge-city";
2
+ import { useQuery } from "edge-city/data";
3
3
  import { getTodos } from "@/services/todos.service";
4
4
  import Spinner from "@/components/Spinner/Spinner";
5
5
  import Todo from "./Todo";
example/src/pages/todos/page.jsx CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Suspense } from "react";
2
2
  import { ErrorBoundary } from "react-error-boundary";
3
3
  import { Helmet } from "react-helmet-async";
4
- import { cache, useMutation } from "edge-city";
4
+ import { cache, useMutation } from "edge-city/data";
5
5
  import { useForm } from "react-hook-form";
6
6
  import { Button, TextField, Input } from "react-aria-components";
7
7
  import Spinner from "@/components/Spinner/Spinner";
example/vite.config.js ADDED
@@ -0,0 +1,55 @@
1
+ import { defineConfig } from 'vite';
2
+
3
+ function pagesPlugin(userOptions) {
4
+ return {
5
+ name: 'vite-plugin-pages',
6
+ enforce: 'pre',
7
+ async configResolved(config) {
8
+ userOptions.resolver = 'react'
9
+ ctx = new PageContext(userOptions, config.root)
10
+ ctx.setLogger(config.logger)
11
+ await ctx.searchGlob()
12
+ },
13
+ api: {
14
+ getResolvedRoutes() {
15
+ return ctx.options.resolver.getComputedRoutes(ctx)
16
+ },
17
+ },
18
+ configureServer(server) {
19
+ ctx.setupViteServer(server)
20
+ },
21
+ resolveId(id) {
22
+ if (ctx.options.moduleIds.includes(id))
23
+ return `${MODULE_ID_VIRTUAL}?id=${id}`
24
+
25
+ if (routeBlockQueryRE.test(id))
26
+ return ROUTE_BLOCK_ID_VIRTUAL
27
+
28
+ return null
29
+ },
30
+ async load(id) {
31
+ const {
32
+ moduleId,
33
+ pageId,
34
+ } = parsePageRequest(id)
35
+
36
+ if (moduleId === MODULE_ID_VIRTUAL && pageId && ctx.options.moduleIds.includes(pageId))
37
+ return ctx.resolveRoutes()
38
+
39
+ if (id === ROUTE_BLOCK_ID_VIRTUAL) {
40
+ return {
41
+ code: 'export default {};',
42
+ map: null,
43
+ }
44
+ }
45
+
46
+ return null
47
+ },
48
+ }
49
+ }
50
+
51
+ // https://vitejs.dev/config/
52
+ export default defineConfig({
53
+ plugins: [
54
+ ],
55
+ })
index.js DELETED
@@ -1,201 +0,0 @@
1
- import React, {
2
- Suspense, createContext, useContext, useState, useEffect, useTransition, useCallback
3
- } from "react";
4
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
5
- import { HelmetProvider } from 'react-helmet-async';
6
- import { createBrowserHistory } from "history";
7
- import { createRouter } from "radix3";
8
- import routemap from '/routemap.json' assert {type: 'json'};
9
-
10
- export const isProd = () => process.env.NODE_ENV === "production";
11
- export const isClient = () => typeof window !== 'undefined';
12
- export const domain = () => isClient() ? window.origin : "http://0.0.0.0:3000";
13
-
14
- export const defineRpc = (serviceName) => async (params = {}) => {
15
- const res = await fetch(`${domain()}/_rpc/${serviceName}`, {
16
- method: "POST",
17
- headers: {
18
- "Accept": "application/json",
19
- "Content-Type": "application/json",
20
- },
21
- body: JSON.stringify(params),
22
- })
23
- return await res.json();
24
- }
25
-
26
- export const cache = {
27
- get: (k) => globalThis._EDGE_DATA_.data[k],
28
- set: (k, v) => {
29
- globalThis._EDGE_DATA_.data[k] = v;
30
- },
31
- invalidate: (k, setRefetch) => Promise.all(Array.from(globalThis._EDGE_DATA_.subs[k]).map((cb) => cb(setRefetch))),
32
- subscribe: (k, cb) => {
33
- if (!globalThis._EDGE_DATA_.subs[k]) {
34
- globalThis._EDGE_DATA_.subs[k] = new Set();
35
- }
36
- globalThis._EDGE_DATA_.subs[k].add(cb)
37
- return () => globalThis._EDGE_DATA_.subs[k].delete(cb);
38
- }
39
- }
40
-
41
- /**
42
- *
43
- * @param {*} fn
44
- * @param {*} params
45
- * @returns
46
- */
47
- export const useQuery = (key, fn) => {
48
- const [, toggle] = useState(false);
49
- const [isRefetching, setIsRefetching] = useState(false);
50
- const [err, setErr] = useState(null);
51
- const refetch = useCallback(async (setRefetch = true) => {
52
- try {
53
- if (setRefetch) {
54
- setIsRefetching(true);
55
- }
56
- setErr(null);
57
- cache.set(key, await fn());
58
- } catch (err) {
59
- setErr(err);
60
- throw err;
61
- } finally {
62
- if (setRefetch) {
63
- setIsRefetching(false);
64
- } else {
65
- toggle((v) => !v);
66
- }
67
- }
68
- }, [fn]);
69
- useEffect(() => {
70
- return cache.subscribe(key, refetch);
71
- }, [key])
72
- const value = cache.get(key);
73
- if (value) {
74
- if (value instanceof Promise) {
75
- throw value;
76
- } else if (value instanceof Error) {
77
- throw value;
78
- }
79
- return { data: value, isRefetching, err, refetch };
80
- }
81
- cache.set(key, fn().then((v) => cache.set(key, v)));
82
- throw cache.get(key);
83
- }
84
-
85
- export const useMutation = (fn) => {
86
- const [isMutating, setIsMutating] = useState(false);
87
- const [err, setErr] = useState(null);
88
- const mutate = useCallback(async (params) => {
89
- try {
90
- setIsMutating(true);
91
- setErr(null);
92
- await fn(params);
93
- } catch (err) {
94
- setErr(err)
95
- throw err;
96
- } finally {
97
- setIsMutating(false);
98
- }
99
- }, [fn])
100
- return {
101
- mutate,
102
- isMutating,
103
- err,
104
- }
105
- }
106
-
107
- export const RouterContext = createContext(undefined);
108
- export const RouterProvider = ({ router, history, helmetContext, App }) => {
109
- const [_, startTransition] = useTransition();
110
- const [pathname, setPathname] = useState(history.location.pathname);
111
- const page = router.lookup(pathname) || router.lookup("/_404");
112
- useEffect(() => {
113
- return history.listen(({ location }) => {
114
- // this causes 2 renders to happen but stops jitter or flash due to React.lazy
115
- startTransition(() => {
116
- setPathname(location.pathname);
117
- })
118
- });
119
- }, []);
120
- return _jsx(RouterContext.Provider, {
121
- value: {
122
- history,
123
- params: page.params || {},
124
- },
125
- children: _jsx(Suspense, {
126
- fallback: _jsx("div", {}, "Routing...."),
127
- children: _jsx(HelmetProvider, {
128
- context: helmetContext,
129
- children: _jsx(App, {
130
- children: _jsx(page, {}),
131
- })
132
- }),
133
- }),
134
- })
135
- }
136
-
137
- export const useRouter = () => {
138
- const { history, params } = useContext(RouterContext);
139
- return {
140
- pathname: history.location.pathname,
141
- query: new URLSearchParams(history.location.search),
142
- params,
143
- push: history.push,
144
- replace: history.replace,
145
- forward: history.forward,
146
- back: history.back,
147
- reload: () => window.location.reload(),
148
- };
149
- }
150
-
151
- export const Link = (props) => {
152
- const router = useRouter();
153
- return _jsx("a", {
154
- ...props,
155
- onMouseOver: (e) => {
156
- // Simple prefetching for now will work only with cache headers
157
- // fetch(getCssUrl(props.href));
158
- // fetch(getCssUrl(props.href).replace("css", "jsx"));
159
- },
160
- onClick: (e) => {
161
- e.preventDefault();
162
- if (props && props.onClick) {
163
- props.onClick(e);
164
- }
165
- router.push(props.href);
166
- },
167
- })
168
- }
169
-
170
- export const NavLink = ({ children, className, activeClassName, ...props }) => {
171
- const { pathname } = useRouter();
172
- const classNames = pathname === props.href ? [activeClassName, className] : [className];
173
- return _jsx(Link, {
174
- children,
175
- className: classNames,
176
- ...props,
177
- })
178
- }
179
-
180
- export const hydrateApp = async (App) => {
181
- if (!isProd()) {
182
- console.log("hydrating with", window._EDGE_DATA_);
183
- }
184
- const module = await import("react-dom/client");
185
- const history = createBrowserHistory();
186
- const router = createRouter({
187
- strictTrailingSlash: true,
188
- routes: Object.keys(routemap).reduce((acc, r) => {
189
- acc[r] = React.lazy(() => import(routemap[r]));
190
- return acc;
191
- }, {}),
192
- });
193
- const root = document.getElementById("root");
194
- module.default.hydrateRoot(root, _jsx(RouterProvider, {
195
- history,
196
- router,
197
- rpcContext: window._EDGE_DATA_ || {},
198
- helmetContext: {},
199
- App,
200
- }));
201
- }
cli.js → lib/bin/cli.js RENAMED
@@ -62,7 +62,7 @@ const bundleJs = async ({ entryPoints, isServer, outfile, ...options }, plg) =>
62
62
  entryPoints,
63
63
  outfile,
64
64
  format: 'esm',
65
- external: ["node:*"],
65
+ external: isServer ? [] : ["node:*"], // TODO: "react", "react-dom/client", "react-aria-components" "react-error-boundary" "react-helmet-async" "react-hook-form" "zod" "lodash" "date-fns"
66
66
  color: true,
67
67
  keepNames: !isProd,
68
68
  minify: isProd,
@@ -112,7 +112,7 @@ const bundlePages = async () => {
112
112
  build.onLoad({ filter: /\\*.page.jsx/, namespace: undefined }, (args) => {
113
113
  const data = fs.readFileSync(args.path);
114
114
  const newSrc = `
115
- import renderPage from "edge-city/renderPage";
115
+ import renderPage from "edge-city/server/renderPage";
116
116
  import init from "@/init";
117
117
  ${importAppComp}
118
118
 
@@ -156,14 +156,14 @@ const bundlePages = async () => {
156
156
  build.onLoad({ filter: /\\*.page.jsx/, namespace: undefined }, (args) => {
157
157
  const data = fs.readFileSync(args.path);
158
158
  const newSrc = `
159
- import { hydrateApp } from "edge-city";
159
+ import hydratePage from "edge-city/client/hydratePage";
160
160
  ${importAppComp}
161
161
 
162
162
  ${data.toString()}
163
163
 
164
164
  const searchParams = new URL(import.meta.url).searchParams;
165
165
  if (searchParams.get("hydrate") === "true") {
166
- hydrateApp(App)
166
+ hydratePage(App)
167
167
  }
168
168
  `
169
169
  return {
@@ -182,7 +182,7 @@ const bundlePages = async () => {
182
182
  const svcName = args.path.replace(srcDir, "").replace("/services/", "").replace(".service.js", "");
183
183
  const funcs = parseExports(src);
184
184
  const newSrc = `
185
- import { defineRpc } from "edge-city";
185
+ import { defineRpc } from "edge-city/data";
186
186
  ${funcs.map((f) => `export const ${f} = defineRpc("${svcName}/${f}")`).join("\n")}
187
187
  `
188
188
  return {
@@ -217,7 +217,7 @@ const bundleServices = async () => {
217
217
  setup(build) {
218
218
  build.onLoad({ filter: /\\*.service.js/, namespace: undefined }, async (args) => {
219
219
  const newSrc = `
220
- import renderApi from "edge-city/renderApi";
220
+ import renderApi from "edge-city/server/renderApi";
221
221
  import init from "@/init";
222
222
  ${src.toString()}
223
223
 
lib/client/hydratePage.js ADDED
@@ -0,0 +1,27 @@
1
+ import React from "react";
2
+ import { hydrateRoot } from "react-dom/client";
3
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
4
+ import { createBrowserHistory } from "history";
5
+ import { createRouter } from "radix3";
6
+ import { RouterProvider } from "../router";
7
+ import routemap from '/routemap.json' assert {type: 'json'};
8
+
9
+ const hydratePage = (App) => {
10
+ const history = createBrowserHistory();
11
+ const router = createRouter({
12
+ strictTrailingSlash: true,
13
+ routes: Object.keys(routemap).reduce((acc, r) => {
14
+ acc[r] = React.lazy(() => import(routemap[r]));
15
+ return acc;
16
+ }, {}),
17
+ });
18
+ const root = document.getElementById("root");
19
+ hydrateRoot(root, _jsx(RouterProvider, {
20
+ history,
21
+ router,
22
+ rpcContext: window._EDGE_DATA_ || {},
23
+ helmetContext: {},
24
+ App,
25
+ }));
26
+ }
27
+ export default hydratePage;
lib/data.js ADDED
@@ -0,0 +1,95 @@
1
+ import { useState, useEffect, useCallback } from "react";
2
+
3
+ export const defineRpc = (serviceName) => async (params = {}) => {
4
+ const res = await fetch(`/_rpc/${serviceName}`, {
5
+ method: "POST",
6
+ headers: {
7
+ "Accept": "application/json",
8
+ "Content-Type": "application/json",
9
+ },
10
+ body: JSON.stringify(params),
11
+ })
12
+ return await res.json();
13
+ }
14
+
15
+
16
+ export const cache = {
17
+ get: (k) => globalThis._EDGE_DATA_.data[k],
18
+ set: (k, v) => {
19
+ globalThis._EDGE_DATA_.data[k] = v;
20
+ },
21
+ invalidate: (k, setRefetch) => Promise.all(Array.from(globalThis._EDGE_DATA_.subs[k]).map((cb) => cb(setRefetch))),
22
+ subscribe: (k, cb) => {
23
+ if (!globalThis._EDGE_DATA_.subs[k]) {
24
+ globalThis._EDGE_DATA_.subs[k] = new Set();
25
+ }
26
+ globalThis._EDGE_DATA_.subs[k].add(cb)
27
+ return () => globalThis._EDGE_DATA_.subs[k].delete(cb);
28
+ }
29
+ }
30
+
31
+ /**
32
+ *
33
+ * @param {*} fn
34
+ * @param {*} params
35
+ * @returns
36
+ */
37
+ export const useQuery = (key, fn) => {
38
+ const [, toggle] = useState(false);
39
+ const [isRefetching, setIsRefetching] = useState(false);
40
+ const [err, setErr] = useState(null);
41
+ const refetch = useCallback(async (setRefetch = true) => {
42
+ try {
43
+ if (setRefetch) {
44
+ setIsRefetching(true);
45
+ }
46
+ setErr(null);
47
+ cache.set(key, await fn());
48
+ } catch (err) {
49
+ setErr(err);
50
+ throw err;
51
+ } finally {
52
+ if (setRefetch) {
53
+ setIsRefetching(false);
54
+ } else {
55
+ toggle((v) => !v);
56
+ }
57
+ }
58
+ }, [fn]);
59
+ useEffect(() => {
60
+ return cache.subscribe(key, refetch);
61
+ }, [key])
62
+ const value = cache.get(key);
63
+ if (value) {
64
+ if (value instanceof Promise) {
65
+ throw value;
66
+ } else if (value instanceof Error) {
67
+ throw value;
68
+ }
69
+ return { data: value, isRefetching, err, refetch };
70
+ }
71
+ cache.set(key, fn().then((v) => cache.set(key, v)));
72
+ throw cache.get(key);
73
+ }
74
+
75
+ export const useMutation = (fn) => {
76
+ const [isMutating, setIsMutating] = useState(false);
77
+ const [err, setErr] = useState(null);
78
+ const mutate = useCallback(async (params) => {
79
+ try {
80
+ setIsMutating(true);
81
+ setErr(null);
82
+ await fn(params);
83
+ } catch (err) {
84
+ setErr(err)
85
+ throw err;
86
+ } finally {
87
+ setIsMutating(false);
88
+ }
89
+ }, [fn])
90
+ return {
91
+ mutate,
92
+ isMutating,
93
+ err,
94
+ }
95
+ }
lib/index.js ADDED
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { createBrowserHistory } from "history";
4
+ import { createRouter } from "radix3";
5
+ import routemap from '/routemap.json' assert {type: 'json'};
6
+
7
+ export const isProd = () => process.env.NODE_ENV === "production";
8
+ export const hydrateApp = async (App) => {
9
+ if (!isProd()) {
10
+ console.log("hydrating with", window._EDGE_DATA_);
11
+ }
12
+ const module = await import("react-dom/client");
13
+ const history = createBrowserHistory();
14
+ const router = createRouter({
15
+ strictTrailingSlash: true,
16
+ routes: Object.keys(routemap).reduce((acc, r) => {
17
+ acc[r] = React.lazy(() => import(routemap[r]));
18
+ return acc;
19
+ }, {}),
20
+ });
21
+ const root = document.getElementById("root");
22
+ module.default.hydrateRoot(root, _jsx(RouterProvider, {
23
+ history,
24
+ router,
25
+ rpcContext: window._EDGE_DATA_ || {},
26
+ helmetContext: {},
27
+ App,
28
+ }));
29
+ }
index.test.js → lib/index.test.js RENAMED
File without changes
lib/link.js ADDED
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useRouter } from "./router";
3
+
4
+ const Link = (props) => {
5
+ const router = useRouter();
6
+ return _jsx("a", {
7
+ ...props,
8
+ onMouseOver: (e) => {
9
+ // Simple prefetching for now will work only with cache headers
10
+ // fetch(getCssUrl(props.href));
11
+ // fetch(getCssUrl(props.href).replace("css", "jsx"));
12
+ },
13
+ onClick: (e) => {
14
+ e.preventDefault();
15
+ if (props && props.onClick) {
16
+ props.onClick(e);
17
+ }
18
+ router.push(props.href);
19
+ },
20
+ })
21
+ }
22
+
23
+ export const NavLink = ({ children, className, activeClassName, ...props }) => {
24
+ const { pathname } = useRouter();
25
+ const classNames = pathname === props.href ? [activeClassName, className] : [className];
26
+ return _jsx(Link, {
27
+ children,
28
+ className: classNames,
29
+ ...props,
30
+ })
31
+ }
32
+
33
+ export default Link;
package.json → lib/package.json RENAMED
@@ -29,6 +29,9 @@
29
29
  "walkdir": "0.4.1",
30
30
  "esbuild-plugin-resolve": "2.0.0",
31
31
  "wrangler": "3.0.1",
32
+ "miniflare": "3.0.1",
33
+ "vite": "4.3.9",
34
+ "express": "4.18.2",
32
35
  "node-watch": "0.7.3",
33
36
  "dotenv": "16.0.3",
34
37
  "jest": "29.5.0"
@@ -40,7 +43,7 @@
40
43
  "react-helmet-async": "*"
41
44
  },
42
45
  "bin": {
43
- "edge-city": "cli.js"
46
+ "edge-city": "bin/cli.js"
44
47
  },
45
48
  "jest": {
46
49
  "verbose": true
lib/router.js ADDED
@@ -0,0 +1,49 @@
1
+ import {
2
+ Suspense, createContext, useContext, useState, useEffect, useTransition, useCallback
3
+ } from "react";
4
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
5
+ import { HelmetProvider } from 'react-helmet-async';
6
+
7
+ export const RouterContext = createContext(undefined);
8
+ export const RouterProvider = ({ router, history, helmetContext, App }) => {
9
+ const [_, startTransition] = useTransition();
10
+ const [pathname, setPathname] = useState(history.location.pathname);
11
+ const page = router.lookup(pathname) || router.lookup("/_404");
12
+ useEffect(() => {
13
+ return history.listen(({ location }) => {
14
+ // this causes 2 renders to happen but stops jitter or flash due to React.lazy
15
+ startTransition(() => {
16
+ setPathname(location.pathname);
17
+ })
18
+ });
19
+ }, []);
20
+ return _jsx(RouterContext.Provider, {
21
+ value: {
22
+ history,
23
+ params: page.params || {},
24
+ },
25
+ children: _jsx(Suspense, {
26
+ fallback: _jsx("div", {}, "Routing...."),
27
+ children: _jsx(HelmetProvider, {
28
+ context: helmetContext,
29
+ children: _jsx(App, {
30
+ children: _jsx(page, {}),
31
+ })
32
+ }),
33
+ }),
34
+ })
35
+ }
36
+
37
+ export const useRouter = () => {
38
+ const { history, params } = useContext(RouterContext);
39
+ return {
40
+ pathname: history.location.pathname,
41
+ query: new URLSearchParams(history.location.search),
42
+ params,
43
+ push: history.push,
44
+ replace: history.replace,
45
+ forward: history.forward,
46
+ back: history.back,
47
+ reload: () => window.location.reload(),
48
+ };
49
+ }
lib/server/dev-server.js ADDED
@@ -0,0 +1,18 @@
1
+ import http from "http";
2
+
3
+ const server = http.createServer((req, res) => {
4
+ res.writeHead(200, { 'Content-Type': 'application/json' });
5
+ res.end(JSON.stringify({
6
+ data: 'Hello World!',
7
+ }))
8
+ })
9
+ server.listen(3000);
10
+ server.on('error', (e) => {
11
+ if (e.code === 'EADDRINUSE') {
12
+ console.log('Address in use, retrying...');
13
+ setTimeout(() => {
14
+ server.close();
15
+ server.listen(PORT, HOST);
16
+ }, 1000);
17
+ }
18
+ });
renderApi.js → lib/server/renderApi.js RENAMED
File without changes
renderPage.js → lib/server/renderPage.js RENAMED
@@ -5,7 +5,7 @@ import { createRouter } from "radix3";
5
5
  import { renderToReadableStream } from "react-dom/server";
6
6
  import isbot from "isbot";
7
7
  import routemap from '/routemap.json' assert {type: 'json'};
8
- import { RouterProvider } from "./index";
8
+ import { RouterProvider } from "../router";
9
9
 
10
10
  const stringToStream = (str) => {
11
11
  return new ReadableStream({
pnpm-lock.yaml CHANGED
@@ -2,7 +2,77 @@ lockfileVersion: '6.0'
2
2
 
3
3
  importers:
4
4
 
5
+ docs:
6
+ dependencies:
7
+ '@markdoc/markdoc':
8
+ specifier: 0.2.2
9
+ version: 0.2.2
10
+
11
+ example:
12
+ dependencies:
13
+ '@neondatabase/serverless':
14
+ specifier: 0.4.5
15
+ version: 0.4.5
16
+ drizzle-orm:
17
+ specifier: 0.26.0
18
+ version: 0.26.0(@neondatabase/serverless@0.4.5)(postgres@3.3.4)
19
+ edge-city:
20
+ specifier: workspace:*
21
+ version: link:../lib
22
+ react:
23
+ specifier: 18.2.0
24
+ version: 18.2.0
25
+ react-aria-components:
26
+ specifier: 1.0.0-alpha.3
27
+ version: 1.0.0-alpha.3(react-dom@18.2.0)(react@18.2.0)
28
+ react-dom:
29
+ specifier: 18.2.0
30
+ version: 18.2.0(react@18.2.0)
31
+ react-error-boundary:
32
+ specifier: 4.0.4
33
+ version: 4.0.4(react@18.2.0)
34
+ react-helmet-async:
35
+ specifier: 1.3.0
36
+ version: 1.3.0(react-dom@18.2.0)(react@18.2.0)
37
+ react-hook-form:
38
+ specifier: 7.43.9
39
+ version: 7.43.9(react@18.2.0)
40
+ sql-highlight:
41
+ specifier: ^4.3.2
42
+ version: 4.3.2
5
- .:
43
+ zod:
44
+ specifier: ^3.21.4
45
+ version: 3.21.4
46
+ devDependencies:
47
+ '@playwright/test':
48
+ specifier: ^1.31.2
49
+ version: 1.31.2
50
+ '@vitejs/plugin-react':
51
+ specifier: 4.0.0
52
+ version: 4.0.0(vite@4.3.9)
53
+ drizzle-kit:
54
+ specifier: 0.18.0
55
+ version: 0.18.0
56
+ eslint:
57
+ specifier: ^8.35.0
58
+ version: 8.35.0
59
+ eslint-config-react-app:
60
+ specifier: ^7.0.1
61
+ version: 7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.5)(eslint@8.35.0)(typescript@5.0.4)
62
+ postgres:
63
+ specifier: 3.3.4
64
+ version: 3.3.4
65
+ prettier:
66
+ specifier: ^2.8.8
67
+ version: 2.8.8
68
+ vite:
69
+ specifier: 4.3.9
70
+ version: 4.3.9
71
+ wrangler:
72
+ specifier: 3.0.1
73
+ version: 3.0.1
74
+
75
+ lib:
6
76
  dependencies:
7
77
  history:
8
78
  specifier: ^5.3.0
@@ -41,6 +111,9 @@ importers:
41
111
  esbuild-plugin-resolve:
42
112
  specifier: 2.0.0
43
113
  version: 2.0.0
114
+ express:
115
+ specifier: 4.18.2
116
+ version: 4.18.2
44
117
  fs-extra:
45
118
  specifier: 11.1.1
46
119
  version: 11.1.1
@@ -50,6 +123,9 @@ importers:
50
123
  mime-types:
51
124
  specifier: 2.1.35
52
125
  version: 2.1.35
126
+ miniflare:
127
+ specifier: 3.0.1
128
+ version: 3.0.1
53
129
  ms:
54
130
  specifier: 2.1.3
55
131
  version: 2.1.3
@@ -68,6 +144,9 @@ importers:
68
144
  postcss-nesting:
69
145
  specifier: ^11.2.1
70
146
  version: 11.2.1(postcss@8.4.21)
147
+ vite:
148
+ specifier: 4.3.9
149
+ version: 4.3.9
71
150
  walkdir:
72
151
  specifier: 0.4.1
73
152
  version: 0.4.1
@@ -78,70 +157,6 @@ importers:
78
157
  specifier: 17.7.2
79
158
  version: 17.7.2
80
159
 
81
- docs:
82
- dependencies:
83
- '@markdoc/markdoc':
84
- specifier: 0.2.2
85
- version: 0.2.2(react@18.2.0)
86
-
87
- example:
88
- dependencies:
89
- '@neondatabase/serverless':
90
- specifier: 0.4.5
91
- version: 0.4.5
92
- drizzle-orm:
93
- specifier: 0.26.0
94
- version: 0.26.0(@neondatabase/serverless@0.4.5)(postgres@3.3.4)
95
- edge-city:
96
- specifier: workspace:*
97
- version: link:..
98
- react:
99
- specifier: 18.2.0
100
- version: 18.2.0
101
- react-aria-components:
102
- specifier: 1.0.0-alpha.3
103
- version: 1.0.0-alpha.3(react-dom@18.2.0)(react@18.2.0)
104
- react-dom:
105
- specifier: 18.2.0
106
- version: 18.2.0(react@18.2.0)
107
- react-error-boundary:
108
- specifier: 4.0.4
109
- version: 4.0.4(react@18.2.0)
110
- react-helmet-async:
111
- specifier: 1.3.0
112
- version: 1.3.0(react-dom@18.2.0)(react@18.2.0)
113
- react-hook-form:
114
- specifier: 7.43.9
115
- version: 7.43.9(react@18.2.0)
116
- sql-highlight:
117
- specifier: ^4.3.2
118
- version: 4.3.2
119
- zod:
120
- specifier: ^3.21.4
121
- version: 3.21.4
122
- devDependencies:
123
- '@playwright/test':
124
- specifier: ^1.31.2
125
- version: 1.31.2
126
- drizzle-kit:
127
- specifier: 0.18.0
128
- version: 0.18.0
129
- eslint:
130
- specifier: ^8.35.0
131
- version: 8.35.0
132
- eslint-config-react-app:
133
- specifier: ^7.0.1
134
- version: 7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.5)(eslint@8.35.0)(jest@29.5.0)(typescript@5.0.4)
135
- postgres:
136
- specifier: 3.3.4
137
- version: 3.3.4
138
- prettier:
139
- specifier: ^2.8.8
140
- version: 2.8.8
141
- wrangler:
142
- specifier: 3.0.1
143
- version: 3.0.1
144
-
145
160
  packages:
146
161
 
147
162
  /@ampproject/remapping@2.2.1:
@@ -1172,6 +1187,26 @@ packages:
1172
1187
  '@babel/plugin-transform-react-jsx': 7.21.5(@babel/core@7.21.8)
1173
1188
  dev: true
1174
1189
 
1190
+ /@babel/plugin-transform-react-jsx-self@7.21.0(@babel/core@7.21.8):
1191
+ resolution: {integrity: sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==}
1192
+ engines: {node: '>=6.9.0'}
1193
+ peerDependencies:
1194
+ '@babel/core': ^7.0.0-0
1195
+ dependencies:
1196
+ '@babel/core': 7.21.8
1197
+ '@babel/helper-plugin-utils': 7.21.5
1198
+ dev: true
1199
+
1200
+ /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.21.8):
1201
+ resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==}
1202
+ engines: {node: '>=6.9.0'}
1203
+ peerDependencies:
1204
+ '@babel/core': ^7.0.0-0
1205
+ dependencies:
1206
+ '@babel/core': 7.21.8
1207
+ '@babel/helper-plugin-utils': 7.21.5
1208
+ dev: true
1209
+
1175
1210
  /@babel/plugin-transform-react-jsx@7.21.5(@babel/core@7.21.8):
1176
1211
  resolution: {integrity: sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==}
1177
1212
  engines: {node: '>=6.9.0'}
@@ -2410,7 +2445,7 @@ packages:
2410
2445
  '@jridgewell/sourcemap-codec': 1.4.14
2411
2446
  dev: true
2412
2447
 
2413
- /@markdoc/markdoc@0.2.2(react@18.2.0):
2448
+ /@markdoc/markdoc@0.2.2:
2414
2449
  resolution: {integrity: sha512-0TiD9jmA5h5znN4lxo7HECAu3WieU5g5vUsfByeucrdR/x88hEilpt16EydFyJwJddQ/3w5HQgW7Ovy62r4cyw==}
2415
2450
  engines: {node: '>=14.7.0'}
2416
2451
  peerDependencies:
@@ -2421,8 +2456,6 @@ packages:
2421
2456
  optional: true
2422
2457
  react:
2423
2458
  optional: true
2424
- dependencies:
2425
- react: 18.2.0
2426
2459
  optionalDependencies:
2427
2460
  '@types/markdown-it': 12.2.3
2428
2461
  dev: false
@@ -3955,6 +3988,29 @@ packages:
3955
3988
  eslint-visitor-keys: 3.4.1
3956
3989
  dev: true
3957
3990
 
3991
+ /@vitejs/plugin-react@4.0.0(vite@4.3.9):
3992
+ resolution: {integrity: sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==}
3993
+ engines: {node: ^14.18.0 || >=16.0.0}
3994
+ peerDependencies:
3995
+ vite: ^4.2.0
3996
+ dependencies:
3997
+ '@babel/core': 7.21.8
3998
+ '@babel/plugin-transform-react-jsx-self': 7.21.0(@babel/core@7.21.8)
3999
+ '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.21.8)
4000
+ react-refresh: 0.14.0
4001
+ vite: 4.3.9
4002
+ transitivePeerDependencies:
4003
+ - supports-color
4004
+ dev: true
4005
+
4006
+ /accepts@1.3.8:
4007
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
4008
+ engines: {node: '>= 0.6'}
4009
+ dependencies:
4010
+ mime-types: 2.1.35
4011
+ negotiator: 0.6.3
4012
+ dev: true
4013
+
3958
4014
  /acorn-jsx@5.3.2(acorn@8.8.2):
3959
4015
  resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
3960
4016
  peerDependencies:
@@ -4045,6 +4101,10 @@ packages:
4045
4101
  is-array-buffer: 3.0.2
4046
4102
  dev: true
4047
4103
 
4104
+ /array-flatten@1.1.1:
4105
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
4106
+ dev: true
4107
+
4048
4108
  /array-includes@3.1.6:
4049
4109
  resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
4050
4110
  engines: {node: '>= 0.4'}
@@ -4317,6 +4377,26 @@ packages:
4317
4377
  resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
4318
4378
  dev: true
4319
4379
 
4380
+ /body-parser@1.20.1:
4381
+ resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
4382
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
4383
+ dependencies:
4384
+ bytes: 3.1.2
4385
+ content-type: 1.0.5
4386
+ debug: 2.6.9
4387
+ depd: 2.0.0
4388
+ destroy: 1.2.0
4389
+ http-errors: 2.0.0
4390
+ iconv-lite: 0.4.24
4391
+ on-finished: 2.4.1
4392
+ qs: 6.11.0
4393
+ raw-body: 2.5.1
4394
+ type-is: 1.6.18
4395
+ unpipe: 1.0.0
4396
+ transitivePeerDependencies:
4397
+ - supports-color
4398
+ dev: true
4399
+
4320
4400
  /brace-expansion@1.1.11:
4321
4401
  resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
4322
4402
  dependencies:
@@ -4540,6 +4620,18 @@ packages:
4540
4620
  resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
4541
4621
  dev: true
4542
4622
 
4623
+ /content-disposition@0.5.4:
4624
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
4625
+ engines: {node: '>= 0.6'}
4626
+ dependencies:
4627
+ safe-buffer: 5.2.1
4628
+ dev: true
4629
+
4630
+ /content-type@1.0.5:
4631
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
4632
+ engines: {node: '>= 0.6'}
4633
+ dev: true
4634
+
4543
4635
  /convert-source-map@1.9.0:
4544
4636
  resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
4545
4637
  dev: true
@@ -4548,6 +4640,10 @@ packages:
4548
4640
  resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
4549
4641
  dev: true
4550
4642
 
4643
+ /cookie-signature@1.0.6:
4644
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
4645
+ dev: true
4646
+
4551
4647
  /cookie@0.5.0:
4552
4648
  resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
4553
4649
  engines: {node: '>= 0.6'}
@@ -4600,6 +4696,17 @@ packages:
4600
4696
  resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==}
4601
4697
  dev: true
4602
4698
 
4699
+ /debug@2.6.9:
4700
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
4701
+ peerDependencies:
4702
+ supports-color: '*'
4703
+ peerDependenciesMeta:
4704
+ supports-color:
4705
+ optional: true
4706
+ dependencies:
4707
+ ms: 2.0.0
4708
+ dev: true
4709
+
4603
4710
  /debug@3.2.7:
4604
4711
  resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
4605
4712
  peerDependencies:
@@ -4679,6 +4786,16 @@ packages:
4679
4786
  object-keys: 1.1.1
4680
4787
  dev: true
4681
4788
 
4789
+ /depd@2.0.0:
4790
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
4791
+ engines: {node: '>= 0.8'}
4792
+ dev: true
4793
+
4794
+ /destroy@1.2.0:
4795
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
4796
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
4797
+ dev: true
4798
+
4682
4799
  /detect-libc@2.0.1:
4683
4800
  resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==}
4684
4801
  engines: {node: '>=8'}
@@ -4814,6 +4931,10 @@ packages:
4814
4931
  postgres: 3.3.4
4815
4932
  dev: false
4816
4933
 
4934
+ /ee-first@1.1.1:
4935
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
4936
+ dev: true
4937
+
4817
4938
  /electron-to-chromium@1.4.402:
4818
4939
  resolution: {integrity: sha512-gWYvJSkohOiBE6ecVYXkrDgNaUjo47QEKK0kQzmWyhkH+yoYiG44bwuicTGNSIQRG3WDMsWVZJLRnJnLNkbWvA==}
4819
4940
  dev: true
@@ -4831,6 +4952,11 @@ packages:
4831
4952
  resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
4832
4953
  dev: true
4833
4954
 
4955
+ /encodeurl@1.0.2:
4956
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
4957
+ engines: {node: '>= 0.8'}
4958
+ dev: true
4959
+
4834
4960
  /end-of-stream@1.4.4:
4835
4961
  resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
4836
4962
  dependencies:
@@ -5245,6 +5371,10 @@ packages:
5245
5371
  engines: {node: '>=6'}
5246
5372
  dev: true
5247
5373
 
5374
+ /escape-html@1.0.3:
5375
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
5376
+ dev: true
5377
+
5248
5378
  /escape-string-regexp@1.0.5:
5249
5379
  resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
5250
5380
  engines: {node: '>=0.8.0'}
@@ -5260,7 +5390,7 @@ packages:
5260
5390
  engines: {node: '>=10'}
5261
5391
  dev: true
5262
5392
 
5263
- /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.5)(eslint@8.35.0)(jest@29.5.0)(typescript@5.0.4):
5393
+ /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.5)(eslint@8.35.0)(typescript@5.0.4):
5264
5394
  resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==}
5265
5395
  engines: {node: '>=14.0.0'}
5266
5396
  peerDependencies:
@@ -5280,7 +5410,7 @@ packages:
5280
5410
  eslint: 8.35.0
5281
5411
  eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.21.4)(@babel/plugin-transform-react-jsx@7.21.5)(eslint@8.35.0)
5282
5412
  eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.6)(eslint@8.35.0)
5283
- eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.59.6)(eslint@8.35.0)(jest@29.5.0)(typescript@5.0.4)
5413
+ eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.59.6)(eslint@8.35.0)(typescript@5.0.4)
5284
5414
  eslint-plugin-jsx-a11y: 6.7.1(eslint@8.35.0)
5285
5415
  eslint-plugin-react: 7.32.2(eslint@8.35.0)
5286
5416
  eslint-plugin-react-hooks: 4.6.0(eslint@8.35.0)
@@ -5382,7 +5512,7 @@ packages:
5382
5512
  - supports-color
5383
5513
  dev: true
5384
5514
 
5385
- /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.59.6)(eslint@8.35.0)(jest@29.5.0)(typescript@5.0.4):
5515
+ /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.59.6)(eslint@8.35.0)(typescript@5.0.4):
5386
5516
  resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==}
5387
5517
  engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
5388
5518
  peerDependencies:
@@ -5398,7 +5528,6 @@ packages:
5398
5528
  '@typescript-eslint/eslint-plugin': 5.59.6(@typescript-eslint/parser@5.59.6)(eslint@8.35.0)(typescript@5.0.4)
5399
5529
  '@typescript-eslint/experimental-utils': 5.59.6(eslint@8.35.0)(typescript@5.0.4)
5400
5530
  eslint: 8.35.0
5401
- jest: 29.5.0
5402
5531
  transitivePeerDependencies:
5403
5532
  - supports-color
5404
5533
  - typescript
@@ -5608,6 +5737,11 @@ packages:
5608
5737
  engines: {node: '>=0.10.0'}
5609
5738
  dev: true
5610
5739
 
5740
+ /etag@1.8.1:
5741
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
5742
+ engines: {node: '>= 0.6'}
5743
+ dev: true
5744
+
5611
5745
  /event-emitter@0.3.5:
5612
5746
  resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
5613
5747
  dependencies:
@@ -5656,6 +5790,45 @@ packages:
5656
5790
  jest-util: 29.5.0
5657
5791
  dev: true
5658
5792
 
5793
+ /express@4.18.2:
5794
+ resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
5795
+ engines: {node: '>= 0.10.0'}
5796
+ dependencies:
5797
+ accepts: 1.3.8
5798
+ array-flatten: 1.1.1
5799
+ body-parser: 1.20.1
5800
+ content-disposition: 0.5.4
5801
+ content-type: 1.0.5
5802
+ cookie: 0.5.0
5803
+ cookie-signature: 1.0.6
5804
+ debug: 2.6.9
5805
+ depd: 2.0.0
5806
+ encodeurl: 1.0.2
5807
+ escape-html: 1.0.3
5808
+ etag: 1.8.1
5809
+ finalhandler: 1.2.0
5810
+ fresh: 0.5.2
5811
+ http-errors: 2.0.0
5812
+ merge-descriptors: 1.0.1
5813
+ methods: 1.1.2
5814
+ on-finished: 2.4.1
5815
+ parseurl: 1.3.3
5816
+ path-to-regexp: 0.1.7
5817
+ proxy-addr: 2.0.7
5818
+ qs: 6.11.0
5819
+ range-parser: 1.2.1
5820
+ safe-buffer: 5.2.1
5821
+ send: 0.18.0
5822
+ serve-static: 1.15.0
5823
+ setprototypeof: 1.2.0
5824
+ statuses: 2.0.1
5825
+ type-is: 1.6.18
5826
+ utils-merge: 1.0.1
5827
+ vary: 1.1.2
5828
+ transitivePeerDependencies:
5829
+ - supports-color
5830
+ dev: true
5831
+
5659
5832
  /ext@1.7.0:
5660
5833
  resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
5661
5834
  dependencies:
@@ -5715,6 +5888,21 @@ packages:
5715
5888
  to-regex-range: 5.0.1
5716
5889
  dev: true
5717
5890
 
5891
+ /finalhandler@1.2.0:
5892
+ resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
5893
+ engines: {node: '>= 0.8'}
5894
+ dependencies:
5895
+ debug: 2.6.9
5896
+ encodeurl: 1.0.2
5897
+ escape-html: 1.0.3
5898
+ on-finished: 2.4.1
5899
+ parseurl: 1.3.3
5900
+ statuses: 2.0.1
5901
+ unpipe: 1.0.0
5902
+ transitivePeerDependencies:
5903
+ - supports-color
5904
+ dev: true
5905
+
5718
5906
  /find-up@4.1.0:
5719
5907
  resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
5720
5908
  engines: {node: '>=8'}
@@ -5749,10 +5937,20 @@ packages:
5749
5937
  is-callable: 1.2.7
5750
5938
  dev: true
5751
5939
 
5940
+ /forwarded@0.2.0:
5941
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
5942
+ engines: {node: '>= 0.6'}
5943
+ dev: true
5944
+
5752
5945
  /fraction.js@4.2.0:
5753
5946
  resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
5754
5947
  dev: true
5755
5948
 
5949
+ /fresh@0.5.2:
5950
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
5951
+ engines: {node: '>= 0.6'}
5952
+ dev: true
5953
+
5756
5954
  /fs-constants@1.0.0:
5757
5955
  resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
5758
5956
  dev: true
@@ -5998,11 +6196,29 @@ packages:
5998
6196
  resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
5999
6197
  dev: true
6000
6198
 
6199
+ /http-errors@2.0.0:
6200
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
6201
+ engines: {node: '>= 0.8'}
6202
+ dependencies:
6203
+ depd: 2.0.0
6204
+ inherits: 2.0.4
6205
+ setprototypeof: 1.2.0
6206
+ statuses: 2.0.1
6207
+ toidentifier: 1.0.1
6208
+ dev: true
6209
+
6001
6210
  /human-signals@2.1.0:
6002
6211
  resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
6003
6212
  engines: {node: '>=10.17.0'}
6004
6213
  dev: true
6005
6214
 
6215
+ /iconv-lite@0.4.24:
6216
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
6217
+ engines: {node: '>=0.10.0'}
6218
+ dependencies:
6219
+ safer-buffer: 2.1.2
6220
+ dev: true
6221
+
6006
6222
  /ieee754@1.2.1:
6007
6223
  resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
6008
6224
  dev: true
@@ -6073,6 +6289,11 @@ packages:
6073
6289
  loose-envify: 1.4.0
6074
6290
  dev: false
6075
6291
 
6292
+ /ipaddr.js@1.9.1:
6293
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
6294
+ engines: {node: '>= 0.10'}
6295
+ dev: true
6296
+
6076
6297
  /is-arguments@1.1.1:
6077
6298
  resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
6078
6299
  engines: {node: '>= 0.4'}
@@ -6911,6 +7132,11 @@ packages:
6911
7132
  tmpl: 1.0.5
6912
7133
  dev: true
6913
7134
 
7135
+ /media-typer@0.3.0:
7136
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
7137
+ engines: {node: '>= 0.6'}
7138
+ dev: true
7139
+
6914
7140
  /memoizee@0.4.15:
6915
7141
  resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==}
6916
7142
  dependencies:
@@ -6924,6 +7150,10 @@ packages:
6924
7150
  timers-ext: 0.1.7
6925
7151
  dev: true
6926
7152
 
7153
+ /merge-descriptors@1.0.1:
7154
+ resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
7155
+ dev: true
7156
+
6927
7157
  /merge-stream@2.0.0:
6928
7158
  resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
6929
7159
  dev: true
@@ -6933,6 +7163,11 @@ packages:
6933
7163
  engines: {node: '>= 8'}
6934
7164
  dev: true
6935
7165
 
7166
+ /methods@1.1.2:
7167
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
7168
+ engines: {node: '>= 0.6'}
7169
+ dev: true
7170
+
6936
7171
  /micromatch@4.0.5:
6937
7172
  resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
6938
7173
  engines: {node: '>=8.6'}
@@ -6953,6 +7188,12 @@ packages:
6953
7188
  mime-db: 1.52.0
6954
7189
  dev: true
6955
7190
 
7191
+ /mime@1.6.0:
7192
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
7193
+ engines: {node: '>=4'}
7194
+ hasBin: true
7195
+ dev: true
7196
+
6956
7197
  /mime@3.0.0:
6957
7198
  resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
6958
7199
  engines: {node: '>=10.0.0'}
@@ -6969,8 +7210,8 @@ packages:
6969
7210
  engines: {node: '>=10'}
6970
7211
  dev: true
6971
7212
 
6972
- /miniflare@3.0.0:
7213
+ /miniflare@3.0.1:
6973
- resolution: {integrity: sha512-CW8yS00pQCbq2o4K8drePzJBkE0heL9cCY/O8DcYJOHd4M0RVutjrp+LqUP4hfzweZ+LqrLo8+Rzy4cORisQoQ==}
7214
+ resolution: {integrity: sha512-aLOB8d26lOTn493GOv1LmpGHVLSxmeT4MixPG/k3Ze10j0wDKnMj8wsFgbZ6Q4cr1N4faf8O3IbNRJuQ+rLoJA==}
6974
7215
  engines: {node: '>=16.13'}
6975
7216
  dependencies:
6976
7217
  acorn: 8.8.2
@@ -7022,6 +7263,10 @@ packages:
7022
7263
  resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
7023
7264
  dev: true
7024
7265
 
7266
+ /ms@2.0.0:
7267
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
7268
+ dev: true
7269
+
7025
7270
  /ms@2.1.2:
7026
7271
  resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
7027
7272
  dev: true
@@ -7053,6 +7298,11 @@ packages:
7053
7298
  resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
7054
7299
  dev: true
7055
7300
 
7301
+ /negotiator@0.6.3:
7302
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
7303
+ engines: {node: '>= 0.6'}
7304
+ dev: true
7305
+
7056
7306
  /next-tick@1.1.0:
7057
7307
  resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
7058
7308
  dev: true
@@ -7168,6 +7418,13 @@ packages:
7168
7418
  resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
7169
7419
  dev: false
7170
7420
 
7421
+ /on-finished@2.4.1:
7422
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
7423
+ engines: {node: '>= 0.8'}
7424
+ dependencies:
7425
+ ee-first: 1.1.1
7426
+ dev: true
7427
+
7171
7428
  /once@1.4.0:
7172
7429
  resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
7173
7430
  dependencies:
@@ -7243,6 +7500,11 @@ packages:
7243
7500
  lines-and-columns: 1.2.4
7244
7501
  dev: true
7245
7502
 
7503
+ /parseurl@1.3.3:
7504
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
7505
+ engines: {node: '>= 0.8'}
7506
+ dev: true
7507
+
7246
7508
  /path-exists@4.0.0:
7247
7509
  resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
7248
7510
  engines: {node: '>=8'}
@@ -7262,6 +7524,10 @@ packages:
7262
7524
  resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
7263
7525
  dev: true
7264
7526
 
7527
+ /path-to-regexp@0.1.7:
7528
+ resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
7529
+ dev: true
7530
+
7265
7531
  /path-to-regexp@6.2.1:
7266
7532
  resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==}
7267
7533
  dev: true
@@ -7370,6 +7636,15 @@ packages:
7370
7636
  source-map-js: 1.0.2
7371
7637
  dev: true
7372
7638
 
7639
+ /postcss@8.4.24:
7640
+ resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==}
7641
+ engines: {node: ^10 || ^12 || >=14}
7642
+ dependencies:
7643
+ nanoid: 3.3.6
7644
+ picocolors: 1.0.0
7645
+ source-map-js: 1.0.2
7646
+ dev: true
7647
+
7373
7648
  /postgres-array@3.0.2:
7374
7649
  resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==}
7375
7650
  engines: {node: '>=12'}
@@ -7457,6 +7732,14 @@ packages:
7457
7732
  object-assign: 4.1.1
7458
7733
  react-is: 16.13.1
7459
7734
 
7735
+ /proxy-addr@2.0.7:
7736
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
7737
+ engines: {node: '>= 0.10'}
7738
+ dependencies:
7739
+ forwarded: 0.2.0
7740
+ ipaddr.js: 1.9.1
7741
+ dev: true
7742
+
7460
7743
  /pump@3.0.0:
7461
7744
  resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
7462
7745
  dependencies:
@@ -7473,6 +7756,13 @@ packages:
7473
7756
  resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==}
7474
7757
  dev: true
7475
7758
 
7759
+ /qs@6.11.0:
7760
+ resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
7761
+ engines: {node: '>=0.6'}
7762
+ dependencies:
7763
+ side-channel: 1.0.4
7764
+ dev: true
7765
+
7476
7766
  /queue-microtask@1.2.3:
7477
7767
  resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
7478
7768
  dev: true
@@ -7481,6 +7771,21 @@ packages:
7481
7771
  resolution: {integrity: sha512-6n3AEXth91ASapMVKiEh2wrbFJmI+NBilrWE0AbiGgfm0xet0QXC8+a3K19r1UVYjUjctUgB053c3V/J6V0kCQ==}
7482
7772
  dev: false
7483
7773
 
7774
+ /range-parser@1.2.1:
7775
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
7776
+ engines: {node: '>= 0.6'}
7777
+ dev: true
7778
+
7779
+ /raw-body@2.5.1:
7780
+ resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
7781
+ engines: {node: '>= 0.8'}
7782
+ dependencies:
7783
+ bytes: 3.1.2
7784
+ http-errors: 2.0.0
7785
+ iconv-lite: 0.4.24
7786
+ unpipe: 1.0.0
7787
+ dev: true
7788
+
7484
7789
  /rc@1.2.8:
7485
7790
  resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
7486
7791
  hasBin: true
@@ -7611,6 +7916,11 @@ packages:
7611
7916
  resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
7612
7917
  dev: true
7613
7918
 
7919
+ /react-refresh@0.14.0:
7920
+ resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
7921
+ engines: {node: '>=0.10.0'}
7922
+ dev: true
7923
+
7614
7924
  /react-stately@3.22.0(react@18.2.0):
7615
7925
  resolution: {integrity: sha512-w5itlPtjfUpxy+195LxRbaCNaGN1NVfPHelhYXuoPoKNgUvmy54uKXvP1Ek1ETZ9e55BaXuMs83yXv94wIMdpQ==}
7616
7926
  peerDependencies:
@@ -7795,6 +8105,14 @@ packages:
7795
8105
  estree-walker: 0.6.1
7796
8106
  dev: true
7797
8107
 
8108
+ /rollup@3.23.0:
8109
+ resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==}
8110
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
8111
+ hasBin: true
8112
+ optionalDependencies:
8113
+ fsevents: 2.3.2
8114
+ dev: true
8115
+
7798
8116
  /run-parallel@1.2.0:
7799
8117
  resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
7800
8118
  dependencies:
@@ -7813,6 +8131,10 @@ packages:
7813
8131
  is-regex: 1.1.4
7814
8132
  dev: true
7815
8133
 
8134
+ /safer-buffer@2.1.2:
8135
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
8136
+ dev: true
8137
+
7816
8138
  /scheduler@0.23.0:
7817
8139
  resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
7818
8140
  dependencies:
@@ -7839,6 +8161,43 @@ packages:
7839
8161
  lru-cache: 6.0.0
7840
8162
  dev: true
7841
8163
 
8164
+ /send@0.18.0:
8165
+ resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
8166
+ engines: {node: '>= 0.8.0'}
8167
+ dependencies:
8168
+ debug: 2.6.9
8169
+ depd: 2.0.0
8170
+ destroy: 1.2.0
8171
+ encodeurl: 1.0.2
8172
+ escape-html: 1.0.3
8173
+ etag: 1.8.1
8174
+ fresh: 0.5.2
8175
+ http-errors: 2.0.0
8176
+ mime: 1.6.0
8177
+ ms: 2.1.3
8178
+ on-finished: 2.4.1
8179
+ range-parser: 1.2.1
8180
+ statuses: 2.0.1
8181
+ transitivePeerDependencies:
8182
+ - supports-color
8183
+ dev: true
8184
+
8185
+ /serve-static@1.15.0:
8186
+ resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
8187
+ engines: {node: '>= 0.8.0'}
8188
+ dependencies:
8189
+ encodeurl: 1.0.2
8190
+ escape-html: 1.0.3
8191
+ parseurl: 1.3.3
8192
+ send: 0.18.0
8193
+ transitivePeerDependencies:
8194
+ - supports-color
8195
+ dev: true
8196
+
8197
+ /setprototypeof@1.2.0:
8198
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
8199
+ dev: true
8200
+
7842
8201
  /shallowequal@1.1.0:
7843
8202
  resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
7844
8203
  dev: false
@@ -7945,6 +8304,11 @@ packages:
7945
8304
  get-source: 2.0.12
7946
8305
  dev: true
7947
8306
 
8307
+ /statuses@2.0.1:
8308
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
8309
+ engines: {node: '>= 0.8'}
8310
+ dev: true
8311
+
7948
8312
  /stop-iteration-iterator@1.0.0:
7949
8313
  resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
7950
8314
  engines: {node: '>= 0.4'}
@@ -8141,6 +8505,11 @@ packages:
8141
8505
  is-number: 7.0.0
8142
8506
  dev: true
8143
8507
 
8508
+ /toidentifier@1.0.1:
8509
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
8510
+ engines: {node: '>=0.6'}
8511
+ dev: true
8512
+
8144
8513
  /tsconfig-paths@3.14.2:
8145
8514
  resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==}
8146
8515
  dependencies:
@@ -8195,6 +8564,14 @@ packages:
8195
8564
  engines: {node: '>=10'}
8196
8565
  dev: true
8197
8566
 
8567
+ /type-is@1.6.18:
8568
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
8569
+ engines: {node: '>= 0.6'}
8570
+ dependencies:
8571
+ media-typer: 0.3.0
8572
+ mime-types: 2.1.35
8573
+ dev: true
8574
+
8198
8575
  /type@1.2.0:
8199
8576
  resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==}
8200
8577
  dev: true
@@ -8261,6 +8638,11 @@ packages:
8261
8638
  engines: {node: '>= 10.0.0'}
8262
8639
  dev: true
8263
8640
 
8641
+ /unpipe@1.0.0:
8642
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
8643
+ engines: {node: '>= 0.8'}
8644
+ dev: true
8645
+
8264
8646
  /update-browserslist-db@1.0.11(browserslist@4.21.5):
8265
8647
  resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
8266
8648
  hasBin: true
@@ -8290,6 +8672,11 @@ packages:
8290
8672
  resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
8291
8673
  dev: true
8292
8674
 
8675
+ /utils-merge@1.0.1:
8676
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
8677
+ engines: {node: '>= 0.4.0'}
8678
+ dev: true
8679
+
8293
8680
  /v8-to-istanbul@9.1.0:
8294
8681
  resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==}
8295
8682
  engines: {node: '>=10.12.0'}
@@ -8299,6 +8686,43 @@ packages:
8299
8686
  convert-source-map: 1.9.0
8300
8687
  dev: true
8301
8688
 
8689
+ /vary@1.1.2:
8690
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
8691
+ engines: {node: '>= 0.8'}
8692
+ dev: true
8693
+
8694
+ /vite@4.3.9:
8695
+ resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==}
8696
+ engines: {node: ^14.18.0 || >=16.0.0}
8697
+ hasBin: true
8698
+ peerDependencies:
8699
+ '@types/node': '>= 14'
8700
+ less: '*'
8701
+ sass: '*'
8702
+ stylus: '*'
8703
+ sugarss: '*'
8704
+ terser: ^5.4.0
8705
+ peerDependenciesMeta:
8706
+ '@types/node':
8707
+ optional: true
8708
+ less:
8709
+ optional: true
8710
+ sass:
8711
+ optional: true
8712
+ stylus:
8713
+ optional: true
8714
+ sugarss:
8715
+ optional: true
8716
+ terser:
8717
+ optional: true
8718
+ dependencies:
8719
+ esbuild: 0.17.19
8720
+ postcss: 8.4.24
8721
+ rollup: 3.23.0
8722
+ optionalDependencies:
8723
+ fsevents: 2.3.2
8724
+ dev: true
8725
+
8302
8726
  /walkdir@0.4.1:
8303
8727
  resolution: {integrity: sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==}
8304
8728
  engines: {node: '>=6.0.0'}
@@ -8382,7 +8806,7 @@ packages:
8382
8806
  blake3-wasm: 2.1.5
8383
8807
  chokidar: 3.5.3
8384
8808
  esbuild: 0.16.3
8385
- miniflare: 3.0.0
8809
+ miniflare: 3.0.1
8386
8810
  nanoid: 3.3.6
8387
8811
  path-to-regexp: 6.2.1
8388
8812
  selfsigned: 2.1.1
pnpm-workspace.yaml CHANGED
@@ -1,4 +1,4 @@
1
1
  packages:
2
- - "./"
2
+ - "lib"
3
3
  - "example"
4
4
  - "docs"