~repos /edge-city

#react#js#ssr

git clone https://pyrossh.dev/repos/edge-city.git

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


e284d5ba Peter John

2 years ago
initial build
Files changed (85) hide show
  1. .gitignore +1 -1
  2. docs/package.json +7 -0
  3. {packages/example → example}/.gitignore +0 -0
  4. example/.vscode/extensions.json +6 -0
  5. {packages/example → example}/.vscode/settings.json +6 -1
  6. example/globals.d.ts +5 -0
  7. {packages/example → example}/jsconfig.json +1 -1
  8. example/migrations/0000_cheerful_omega_sentinel.sql +7 -0
  9. {packages/example/db → example}/migrations/meta/0000_snapshot.json +1 -1
  10. {packages/example/db → example}/migrations/meta/_journal.json +3 -2
  11. example/migrations/schema.js +5 -0
  12. example/package.json +68 -0
  13. {packages/example → example}/playwright.config.js +3 -4
  14. example/readme.md +22 -0
  15. example/scripts/migrate.js +14 -0
  16. example/src/components/Counter/Counter.css +7 -0
  17. example/src/components/Counter/Counter.jsx +22 -0
  18. example/src/components/Layout/Layout.css +28 -0
  19. example/src/components/Layout/Layout.jsx +18 -0
  20. example/src/components/Spinner/Spinner.css +40 -0
  21. example/src/components/Spinner/Spinner.jsx +11 -0
  22. {packages/example → example/src}/components/Timer/Timer.jsx +3 -3
  23. example/src/init.js +20 -0
  24. {packages/example → example/src}/pages/_404/page.css +5 -5
  25. {packages/example → example/src}/pages/_404/page.jsx +5 -7
  26. {packages/example → example/src}/pages/_500/page.css +5 -4
  27. {packages/example → example/src}/pages/_500/page.jsx +5 -7
  28. {packages/example → example/src}/pages/about/page.css +2 -3
  29. example/src/pages/about/page.jsx +25 -0
  30. example/src/pages/app.css +25 -0
  31. example/src/pages/app.jsx +23 -0
  32. example/src/pages/normalize.css +396 -0
  33. example/src/pages/page.css +8 -0
  34. example/src/pages/page.jsx +21 -0
  35. {packages/example → example/src}/pages/page.spec.js +2 -2
  36. example/src/pages/spectrum.css +431 -0
  37. example/src/pages/todos/Todo.css +44 -0
  38. example/src/pages/todos/Todo.jsx +72 -0
  39. example/src/pages/todos/TodoList.jsx +23 -0
  40. example/src/pages/todos/page.css +46 -0
  41. example/src/pages/todos/page.jsx +52 -0
  42. {packages/example → example/src}/services/auth.service.js +0 -0
  43. {packages/example → example/src}/services/todos.service.js +29 -19
  44. example/src/services/todos.service.test.js +36 -0
  45. {packages/example → example/src}/static/favicon.ico +0 -0
  46. {packages/example → example/src}/static/logo192.png +0 -0
  47. {packages/example → example/src}/static/logo512.png +0 -0
  48. {packages/example → example/src}/static/manifest.json +0 -0
  49. {packages/example → example/src}/static/robots.txt +0 -0
  50. example/vite.config.js +55 -0
  51. lib/bin/cli.js +305 -0
  52. lib/data.js +95 -0
  53. lib/hydratePage.js +27 -0
  54. lib/link.js +33 -0
  55. lib/package.json +51 -0
  56. lib/router.js +41 -0
  57. lib/server/dev-server.js +18 -0
  58. lib/server/renderApi.js +21 -0
  59. lib/server/renderPage.js +160 -0
  60. packages/cli/index.js +0 -388
  61. packages/cli/package.json +0 -27
  62. packages/example/.vscode/extensions.json +0 -5
  63. packages/example/Dockerfile +0 -8
  64. packages/example/components/Counter/Counter.jsx +0 -16
  65. packages/example/components/Layout/Layout.css +0 -5
  66. packages/example/components/Layout/Layout.jsx +0 -19
  67. packages/example/components/Todo/Todo.css +0 -16
  68. packages/example/components/Todo/Todo.jsx +0 -94
  69. packages/example/db/index.js +0 -20
  70. packages/example/db/migrations/0000_empty_shatterstar.sql +0 -7
  71. packages/example/drizzle.config.json +0 -4
  72. packages/example/main.js +0 -6
  73. packages/example/package.json +0 -59
  74. packages/example/pages/about/page.jsx +0 -28
  75. packages/example/pages/page.css +0 -17
  76. packages/example/pages/page.jsx +0 -29
  77. packages/example/pages/todos/page.css +0 -71
  78. packages/example/pages/todos/page.jsx +0 -61
  79. packages/example/readme.md +0 -18
  80. packages/example/services/todos.service.test.js +0 -41
  81. packages/runtime/index.js +0 -315
  82. packages/runtime/package.json +0 -14
  83. pnpm-lock.yaml +3362 -405
  84. pnpm-workspace.yaml +3 -1
  85. readme.md +42 -12
.gitignore CHANGED
@@ -1 +1 @@
1
- node_modules/
1
+ node_modules
docs/package.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "edge-city-docs",
3
+ "type": "module",
4
+ "dependencies": {
5
+ "@markdoc/markdoc": "0.2.2"
6
+ }
7
+ }
{packages/example → example}/.gitignore RENAMED
File without changes
example/.vscode/extensions.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "recommendations": [
3
+ "ms-playwright.playwright",
4
+ "esbenp.prettier-vscode"
5
+ ]
6
+ }
{packages/example → example}/.vscode/settings.json RENAMED
@@ -9,5 +9,10 @@
9
9
  "**/dist": true,
10
10
  "**/playwright-report": true,
11
11
  "test-results": true
12
- }
12
+ },
13
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
14
+ "[javascript]": {
15
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
16
+ "editor.formatOnSave": true
17
+ },
13
18
  }
example/globals.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { NeonDatabase } from "drizzle-orm/neon-serverless"
2
+
3
+ declare global {
4
+ const db: NeonDatabase;
5
+ }
{packages/example → example}/jsconfig.json RENAMED
@@ -2,7 +2,7 @@
2
2
  "compilerOptions": {
3
3
  "paths": {
4
4
  "@/*": [
5
- "./*"
5
+ "./src/*"
6
6
  ]
7
7
  }
8
8
  }
example/migrations/0000_cheerful_omega_sentinel.sql ADDED
@@ -0,0 +1,7 @@
1
+ create table if not exists "todos" (
2
+ "id" serial primary key not null,
3
+ "text" text not null,
4
+ "completed" boolean not null,
5
+ "createdAt" date not null,
6
+ "updatedAt" date
7
+ );
{packages/example/db → example}/migrations/meta/0000_snapshot.json RENAMED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "5",
3
3
  "dialect": "pg",
4
- "id": "7b876e3f-3db0-4282-b1c9-a5961b930b99",
4
+ "id": "d0432aeb-cfc0-4ad1-af0d-b91474ba236a",
5
5
  "prevId": "00000000-0000-0000-0000-000000000000",
6
6
  "tables": {
7
7
  "todos": {
{packages/example/db → example}/migrations/meta/_journal.json RENAMED
@@ -5,8 +5,9 @@
5
5
  {
6
6
  "idx": 0,
7
7
  "version": "5",
8
- "when": 1683227001598,
8
+ "when": 1684994794751,
9
- "tag": "0000_empty_shatterstar"
9
+ "tag": "0000_cheerful_omega_sentinel",
10
+ "breakpoints": false
10
11
  }
11
12
  ]
12
13
  }
example/migrations/schema.js ADDED
@@ -0,0 +1,5 @@
1
+ import { todos } from "../src/services/todos.service";
2
+
3
+ export {
4
+ todos,
5
+ }
example/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "edge-city-example",
3
+ "type": "module",
4
+ "scripts": {
5
+ "lint": "eslint ./src",
6
+ "fmt": "prettier ./src --write",
7
+ "dev": "edge-city dev -p cloudflare",
8
+ "dev:wrangler": "cd build && wrangler pages dev static",
9
+ "deploy:wrangler": "cd build && wrangler pages deploy static",
10
+ "build": " edge-city build -p cloudflare",
11
+ "build-2": "vite build",
12
+ "generate": "drizzle-kit generate:pg --out migrations --schema migrations/schema.js",
13
+ "migrate": "node scripts/migrate.js",
14
+ "test": "jest",
15
+ "test-e2e": "playwright test"
16
+ },
17
+ "dependencies": {
18
+ "@neondatabase/serverless": "0.4.5",
19
+ "drizzle-orm": "0.26.0",
20
+ "edge-city": "workspace:*",
21
+ "react": "18.2.0",
22
+ "react-aria-components": "1.0.0-alpha.3",
23
+ "react-dom": "18.2.0",
24
+ "react-error-boundary": "4.0.4",
25
+ "react-helmet-async": "1.3.0",
26
+ "react-hook-form": "7.43.9",
27
+ "sql-highlight": "^4.3.2",
28
+ "zod": "^3.21.4"
29
+ },
30
+ "devDependencies": {
31
+ "@playwright/test": "^1.31.2",
32
+ "drizzle-kit": "0.18.0",
33
+ "eslint": "^8.35.0",
34
+ "eslint-config-react-app": "^7.0.1",
35
+ "postgres": "3.3.4",
36
+ "prettier": "^2.8.8",
37
+ "wrangler": "3.0.1",
38
+ "vite": "4.3.9",
39
+ "vite-plugin-pages": "0.30.1",
40
+ "@vitejs/plugin-react": "4.0.0"
41
+ },
42
+ "prettier": {
43
+ "printWidth": 100,
44
+ "singleQuote": false,
45
+ "jsxSingleQuote": false,
46
+ "bracketSameLine": false,
47
+ "trailingComma": "all"
48
+ },
49
+ "eslintConfig": {
50
+ "parserOptions": {
51
+ "ecmaVersion": "latest",
52
+ "sourceType": "module"
53
+ },
54
+ "extends": [
55
+ "eslint:recommended",
56
+ "react-app"
57
+ ],
58
+ "rules": {
59
+ "react/prop-types": "warn",
60
+ "react/react-in-jsx-scope": "off",
61
+ "no-unused-vars": "warn"
62
+ },
63
+ "globals": {
64
+ "globalThis": false,
65
+ "db": false
66
+ }
67
+ }
68
+ }
{packages/example → example}/playwright.config.js RENAMED
@@ -58,8 +58,7 @@ export default defineConfig({
58
58
  ],
59
59
  outputDir: 'test-results/',
60
60
  webServer: {
61
- command: '../parotta/cli.js',
61
+ command: 'npm run dev',
62
- port: 3000,
62
+ port: 8788,
63
63
  },
64
- });
64
+ });
65
-
example/readme.md ADDED
@@ -0,0 +1,22 @@
1
+ # Sample edge-city app
2
+
3
+ ## Requirements
4
+
5
+ 1. node >= v20
6
+
7
+ ## Setup
8
+
9
+ 1. `npm i`
10
+ 2. `npx playright install`
11
+
12
+ ## Running
13
+
14
+ `npm run dev`
15
+
16
+ ## Testing
17
+
18
+ `npm test`
19
+
20
+ ## Build
21
+
22
+ `npm run build`
example/scripts/migrate.js ADDED
@@ -0,0 +1,14 @@
1
+ import { drizzle } from 'drizzle-orm/postgres-js';
2
+ import { migrate } from 'drizzle-orm/postgres-js/migrator';
3
+ import postgres from 'postgres';
4
+ import dotenv from 'dotenv';
5
+ dotenv.config();
6
+
7
+ const main = async () => {
8
+ console.log("migration started");
9
+ const client = postgres(process.env.EDGE_PG_CONN_URL + "?sslmode=require", { max: 1 });
10
+ await migrate(drizzle(client), { migrationsFolder: './migrations' });
11
+ console.log("migration complete");
12
+ }
13
+
14
+ main();
example/src/components/Counter/Counter.css ADDED
@@ -0,0 +1,7 @@
1
+ .counter {
2
+ & .button {
3
+ border-radius: 0.25rem;
4
+ padding: 1rem;
5
+ margin-left: 0.5rem;
6
+ }
7
+ }
example/src/components/Counter/Counter.jsx ADDED
@@ -0,0 +1,22 @@
1
+ import React, { useState } from "react";
2
+ import { Button } from "react-aria-components";
3
+ import "./Counter.css";
4
+
5
+ const Counter = () => {
6
+ const [count, setCount] = useState(5);
7
+ const increment = () => setCount(count - 1);
8
+ const decrement = () => setCount(count + 1);
9
+ return (
10
+ <div className="counter">
11
+ <Button onPress={increment}>
12
+ -
13
+ </Button>
14
+ <span className="count">{count}</span>
15
+ <Button onPress={decrement}>
16
+ +
17
+ </Button>
18
+ </div>
19
+ );
20
+ };
21
+
22
+ export default Counter;
example/src/components/Layout/Layout.css ADDED
@@ -0,0 +1,28 @@
1
+ .layout {
2
+ display: flex;
3
+ margin-left: 20%;
4
+
5
+ & .sidebar {
6
+ display: flex;
7
+ flex-shrink: 0;
8
+ flex-direction: column;
9
+ align-items: center;
10
+ padding: 20px;
11
+ padding-top: 42px;
12
+ line-height: 1.8em;
13
+
14
+ & a {
15
+ margin-right: 20px;
16
+ padding: 0.25rem;
17
+ }
18
+ }
19
+
20
+ & .content {
21
+ display: flex;
22
+ flex: 1;
23
+ padding: 20px;
24
+ padding-bottom: 50px;
25
+ border-left: 2px solid #eee;
26
+ min-height: 100vh;
27
+ }
28
+ }
example/src/components/Layout/Layout.jsx ADDED
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+ import Link from "edge-city/link";
3
+ import "./Layout.css";
4
+
5
+ const Layout = ({ children }) => {
6
+ return (
7
+ <div className="layout">
8
+ <div className="sidebar">
9
+ <Link href="/">Home</Link>
10
+ <Link href="/about">About us</Link>
11
+ <Link href="/todos">Todos</Link>
12
+ </div>
13
+ <div className="content">{children}</div>
14
+ </div>
15
+ );
16
+ };
17
+
18
+ export default Layout;
example/src/components/Spinner/Spinner.css ADDED
@@ -0,0 +1,40 @@
1
+ .spinner-container {
2
+ display: flex;
3
+ flex: 1;
4
+ align-items: center;
5
+ justify-content: center;
6
+ padding: 1rem;
7
+ }
8
+
9
+ .spinner {
10
+ animation: rotate 2s linear infinite;
11
+ width: 50px;
12
+ height: 50px;
13
+ }
14
+
15
+ .spinner-path {
16
+ stroke: #2563eb;
17
+ stroke-linecap: round;
18
+ animation: dash 1.5s ease-in-out infinite;
19
+ }
20
+
21
+ @keyframes rotate {
22
+ 100% {
23
+ transform: rotate(360deg);
24
+ }
25
+ }
26
+
27
+ @keyframes dash {
28
+ 0% {
29
+ stroke-dasharray: 1, 150;
30
+ stroke-dashoffset: 0;
31
+ }
32
+ 50% {
33
+ stroke-dasharray: 90, 150;
34
+ stroke-dashoffset: -35;
35
+ }
36
+ 100% {
37
+ stroke-dasharray: 90, 150;
38
+ stroke-dashoffset: -124;
39
+ }
40
+ }
example/src/components/Spinner/Spinner.jsx ADDED
@@ -0,0 +1,11 @@
1
+ import "./Spinner.css";
2
+
3
+ export default function Spinner() {
4
+ return (
5
+ <div className="spinner-container">
6
+ <svg className="spinner" viewBox="0 0 50 50">
7
+ <circle className="spinner-path" cx="25" cy="25" r="20" fill="none" strokeWidth="5"></circle>
8
+ </svg>
9
+ </div>
10
+ )
11
+ }
{packages/example → example/src}/components/Timer/Timer.jsx RENAMED
@@ -1,4 +1,4 @@
1
- import { useState, useEffect } from 'react';
1
+ import { useState, useEffect } from "react";
2
2
 
3
3
  export default function Timer() {
4
4
  const [counter, setCounter] = useState(0);
@@ -8,11 +8,11 @@ export default function Timer() {
8
8
  }, 100);
9
9
  return () => {
10
10
  clearInterval(ref);
11
- }
11
+ };
12
12
  }, []);
13
13
  return (
14
14
  <div>
15
15
  <p>(This page is interactive while data is loading: {counter})</p>
16
16
  </div>
17
17
  );
18
- }
18
+ }
example/src/init.js ADDED
@@ -0,0 +1,20 @@
1
+ import { drizzle } from "drizzle-orm/neon-serverless";
2
+ import { Pool } from "@neondatabase/serverless";
3
+ import { highlight } from "sql-highlight";
4
+
5
+ const init = async () => {
6
+ const pool = new Pool({
7
+ connectionString: process.env.EDGE_PG_CONN_URL,
8
+ });
9
+ const db = drizzle(pool, {
10
+ logger: {
11
+ logQuery: (query, params) => {
12
+ const sqlString = params.reduce((acc, v, i) => acc.replaceAll("$" + (i + 1), v), query);
13
+ console.log(highlight(sqlString));
14
+ },
15
+ },
16
+ });
17
+ globalThis.db = db;
18
+ };
19
+
20
+ export default init;
{packages/example → example/src}/pages/_404/page.css RENAMED
@@ -1,17 +1,17 @@
1
- body {
1
+ .notfound-page {
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  align-items: center;
5
5
  justify-content: center;
6
6
  color: #000;
7
7
  background: #fff;
8
- font-family: -apple-system, BlinkMacSystemFont, Roboto, "Segoe UI", "Fira Sans", Avenir, "Helvetica Neue", "Lucida Grande", sans-serif;
8
+ font-family: -apple-system, BlinkMacSystemFont, Roboto, "Segoe UI", "Fira Sans", Avenir,
9
- height: 100vh;
9
+ "Helvetica Neue", "Lucida Grande", sans-serif;
10
10
  text-align: center;
11
11
 
12
12
  & h1 {
13
13
  display: inline-block;
14
- border-right: 1px solid rgba(0, 0, 0, .3);
14
+ border-right: 1px solid rgba(0, 0, 0, 0.3);
15
15
  margin: 0;
16
16
  margin-right: 20px;
17
17
  padding: 10px 23px 10px 0;
@@ -35,4 +35,4 @@ body {
35
35
  margin: 0;
36
36
  padding: 0;
37
37
  }
38
- }
38
+ }
{packages/example → example/src}/pages/_404/page.jsx RENAMED
@@ -1,10 +1,10 @@
1
- import React from 'react';
1
+ import React from "react";
2
- import { Helmet } from 'react-helmet-async';
2
+ import { Helmet } from "react-helmet-async";
3
3
  import "./page.css";
4
4
 
5
- const Page = () => {
5
+ export default function Page() {
6
6
  return (
7
- <div>
7
+ <div className="notfound-page">
8
8
  <Helmet>
9
9
  <title>Page not found</title>
10
10
  </Helmet>
@@ -13,7 +13,5 @@ const Page = () => {
13
13
  <h2>This page could not be found</h2>
14
14
  </div>
15
15
  </div>
16
- )
16
+ );
17
17
  }
18
-
19
- export default Page;
{packages/example → example/src}/pages/_500/page.css RENAMED
@@ -1,17 +1,18 @@
1
- body {
1
+ .err-page {
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  align-items: center;
5
5
  justify-content: center;
6
6
  color: #000;
7
7
  background: #fff;
8
- font-family: -apple-system, BlinkMacSystemFont, Roboto, "Segoe UI", "Fira Sans", Avenir, "Helvetica Neue", "Lucida Grande", sans-serif;
8
+ font-family: -apple-system, BlinkMacSystemFont, Roboto, "Segoe UI", "Fira Sans", Avenir,
9
+ "Helvetica Neue", "Lucida Grande", sans-serif;
9
10
  height: 100vh;
10
11
  text-align: center;
11
12
 
12
13
  & h1 {
13
14
  display: inline-block;
14
- border-right: 1px solid rgba(0, 0, 0, .3);
15
+ border-right: 1px solid rgba(0, 0, 0, 0.3);
15
16
  margin: 0;
16
17
  margin-right: 20px;
17
18
  padding: 10px 23px 10px 0;
@@ -35,4 +36,4 @@ body {
35
36
  margin: 0;
36
37
  padding: 0;
37
38
  }
38
- }
39
+ }
{packages/example → example/src}/pages/_500/page.jsx RENAMED
@@ -1,10 +1,10 @@
1
- import React from 'react';
1
+ import React from "react";
2
- import { Helmet } from 'react-helmet-async';
2
+ import { Helmet } from "react-helmet-async";
3
3
  import "./page.css";
4
4
 
5
- const Page = () => {
5
+ export default function Page() {
6
6
  return (
7
- <div>
7
+ <div className="err-page">
8
8
  <Helmet>
9
9
  <title>Oop's Something went wrong</title>
10
10
  </Helmet>
@@ -13,7 +13,5 @@ const Page = () => {
13
13
  <h2>Internal Server Error</h2>
14
14
  </div>
15
15
  </div>
16
- )
16
+ );
17
17
  }
18
-
19
- export default Page;
{packages/example → example/src}/pages/about/page.css RENAMED
@@ -1,10 +1,9 @@
1
- body {
1
+ .about-page {
2
2
  margin: 0;
3
3
  padding: 20px;
4
4
  padding-bottom: 130px;
5
- background-color: violet;
6
5
 
7
6
  & footer {
8
7
  margin-top: 100px;
9
8
  }
10
- }
9
+ }
example/src/pages/about/page.jsx ADDED
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import Link from "edge-city/link";
3
+ import { useRouter } from "edge-city/router";
4
+ import { Helmet } from "react-helmet-async";
5
+ import "./page.css";
6
+
7
+ export default function Page() {
8
+ const router = useRouter();
9
+ return (
10
+ <div className="about-page">
11
+ <Helmet>
12
+ <title>About | Edge City</title>
13
+ <meta name="description" content="Showcase of using edge-city meta-framework." />
14
+ </Helmet>
15
+ <div>
16
+ <h1>About Page</h1>
17
+ <p>Path: {router.pathname}</p>
18
+ <p>Showcase of using edge-city meta-framework.</p>
19
+ </div>
20
+ <footer>
21
+ <Link href="/">Back</Link>
22
+ </footer>
23
+ </div>
24
+ );
25
+ }
example/src/pages/app.css ADDED
@@ -0,0 +1,25 @@
1
+ html {
2
+ line-height: 1.5;
3
+ font-size: 16px;
4
+ -webkit-text-size-adjust: 100%;
5
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
6
+ "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
7
+ "Segoe UI Symbol", "Noto Color Emoji";
8
+ }
9
+
10
+ body {
11
+ font-family: inherit;
12
+ line-height: inherit;
13
+ }
14
+
15
+ h1 {
16
+ font-size: 1.25rem;
17
+ line-height: 1.75rem;
18
+ font-weight: 700;
19
+ margin-top: 1rem;
20
+ margin-bottom: 1rem;
21
+ }
22
+
23
+ a:hover {
24
+ text-decoration: underline;
25
+ }
example/src/pages/app.jsx ADDED
@@ -0,0 +1,23 @@
1
+ import { Suspense } from "react";
2
+ import { SSRProvider } from "react-aria";
3
+ import { HelmetProvider } from 'react-helmet-async';
4
+ import { usePage } from "edge-city/router";
5
+ import Layout from "@/components/Layout/Layout";
6
+ import "./normalize.css";
7
+ import "./spectrum.css";
8
+ import "./app.css";
9
+
10
+ export default function App({ helmetContext }) {
11
+ const Page = usePage();
12
+ return (
13
+ <HelmetProvider context={helmetContext}>
14
+ <SSRProvider>
15
+ <Layout>
16
+ <Suspense fallback={<p>Routing....</p>}>
17
+ <Page />
18
+ </Suspense>
19
+ </Layout>
20
+ </SSRProvider>
21
+ </HelmetProvider>
22
+ );
23
+ }
example/src/pages/normalize.css ADDED
@@ -0,0 +1,396 @@
1
+
2
+ /*
3
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
4
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
5
+ */
6
+
7
+ *,
8
+ ::before,
9
+ ::after {
10
+ box-sizing: border-box; /* 1 */
11
+ border-width: 0; /* 2 */
12
+ border-style: solid; /* 2 */
13
+ border-color: theme("borderColor.DEFAULT", currentColor); /* 2 */
14
+ }
15
+
16
+ ::before,
17
+ ::after {
18
+ --tw-content: "";
19
+ }
20
+
21
+ /*
22
+ 1. Use a consistent sensible line-height in all browsers.
23
+ 2. Prevent adjustments of font size after orientation changes in iOS.
24
+ 3. Use a more readable tab size.
25
+ 4. Use the user's configured `sans` font-family by default.
26
+ 5. Use the user's configured `sans` font-feature-settings by default.
27
+ 6. Use the user's configured `sans` font-variation-settings by default.
28
+ */
29
+
30
+ html {
31
+ line-height: 1.5; /* 1 */
32
+ -webkit-text-size-adjust: 100%; /* 2 */
33
+ -moz-tab-size: 4; /* 3 */
34
+ tab-size: 4; /* 3 */
35
+ font-family: theme(
36
+ "fontFamily.sans",
37
+ ui-sans-serif,
38
+ system-ui,
39
+ -apple-system,
40
+ BlinkMacSystemFont,
41
+ "Segoe UI",
42
+ Roboto,
43
+ "Helvetica Neue",
44
+ Arial,
45
+ "Noto Sans",
46
+ sans-serif,
47
+ "Apple Color Emoji",
48
+ "Segoe UI Emoji",
49
+ "Segoe UI Symbol",
50
+ "Noto Color Emoji"
51
+ ); /* 4 */
52
+ font-feature-settings: theme("fontFamily.sans[1].fontFeatureSettings", normal); /* 5 */
53
+ font-variation-settings: theme("fontFamily.sans[1].fontVariationSettings", normal); /* 6 */
54
+ }
55
+
56
+ /*
57
+ 1. Remove the margin in all browsers.
58
+ 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
59
+ */
60
+
61
+ body {
62
+ margin: 0; /* 1 */
63
+ line-height: inherit; /* 2 */
64
+ }
65
+
66
+ /*
67
+ 1. Add the correct height in Firefox.
68
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
69
+ 3. Ensure horizontal rules are visible by default.
70
+ */
71
+
72
+ hr {
73
+ height: 0; /* 1 */
74
+ color: inherit; /* 2 */
75
+ border-top-width: 1px; /* 3 */
76
+ }
77
+
78
+ /*
79
+ Add the correct text decoration in Chrome, Edge, and Safari.
80
+ */
81
+
82
+ abbr:where([title]) {
83
+ text-decoration: underline dotted;
84
+ }
85
+
86
+ /*
87
+ Remove the default font size and weight for headings.
88
+ */
89
+
90
+ h1,
91
+ h2,
92
+ h3,
93
+ h4,
94
+ h5,
95
+ h6 {
96
+ font-size: inherit;
97
+ font-weight: inherit;
98
+ }
99
+
100
+ /*
101
+ Reset links to optimize for opt-in styling instead of opt-out.
102
+ */
103
+
104
+ a {
105
+ color: inherit;
106
+ text-decoration: inherit;
107
+ }
108
+
109
+ /*
110
+ Add the correct font weight in Edge and Safari.
111
+ */
112
+
113
+ b,
114
+ strong {
115
+ font-weight: bolder;
116
+ }
117
+
118
+ /*
119
+ 1. Use the user's configured `mono` font family by default.
120
+ 2. Correct the odd `em` font sizing in all browsers.
121
+ */
122
+
123
+ code,
124
+ kbd,
125
+ samp,
126
+ pre {
127
+ font-family: theme(
128
+ "fontFamily.mono",
129
+ ui-monospace,
130
+ SFMono-Regular,
131
+ Menlo,
132
+ Monaco,
133
+ Consolas,
134
+ "Liberation Mono",
135
+ "Courier New",
136
+ monospace
137
+ ); /* 1 */
138
+ font-size: 1em; /* 2 */
139
+ }
140
+
141
+ /*
142
+ Add the correct font size in all browsers.
143
+ */
144
+
145
+ small {
146
+ font-size: 80%;
147
+ }
148
+
149
+ /*
150
+ Prevent `sub` and `sup` elements from affecting the line height in all browsers.
151
+ */
152
+
153
+ sub,
154
+ sup {
155
+ font-size: 75%;
156
+ line-height: 0;
157
+ position: relative;
158
+ vertical-align: baseline;
159
+ }
160
+
161
+ sub {
162
+ bottom: -0.25em;
163
+ }
164
+
165
+ sup {
166
+ top: -0.5em;
167
+ }
168
+
169
+ /*
170
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
171
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
172
+ 3. Remove gaps between table borders by default.
173
+ */
174
+
175
+ table {
176
+ text-indent: 0; /* 1 */
177
+ border-color: inherit; /* 2 */
178
+ border-collapse: collapse; /* 3 */
179
+ }
180
+
181
+ /*
182
+ 1. Change the font styles in all browsers.
183
+ 2. Remove the margin in Firefox and Safari.
184
+ 3. Remove default padding in all browsers.
185
+ */
186
+
187
+ button,
188
+ input,
189
+ optgroup,
190
+ select,
191
+ textarea {
192
+ font-family: inherit; /* 1 */
193
+ font-size: 100%; /* 1 */
194
+ font-weight: inherit; /* 1 */
195
+ line-height: inherit; /* 1 */
196
+ color: inherit; /* 1 */
197
+ margin: 0; /* 2 */
198
+ padding: 0; /* 3 */
199
+ }
200
+
201
+ /*
202
+ Remove the inheritance of text transform in Edge and Firefox.
203
+ */
204
+
205
+ button,
206
+ select {
207
+ text-transform: none;
208
+ }
209
+
210
+ /*
211
+ 1. Correct the inability to style clickable types in iOS and Safari.
212
+ 2. Remove default button styles.
213
+ */
214
+
215
+ button,
216
+ [type="button"],
217
+ [type="reset"],
218
+ [type="submit"] {
219
+ -webkit-appearance: button; /* 1 */
220
+ background-color: transparent; /* 2 */
221
+ background-image: none; /* 2 */
222
+ }
223
+
224
+ /*
225
+ Use the modern Firefox focus style for all focusable elements.
226
+ */
227
+
228
+ :-moz-focusring {
229
+ outline: auto;
230
+ }
231
+
232
+ /*
233
+ Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
234
+ */
235
+
236
+ :-moz-ui-invalid {
237
+ box-shadow: none;
238
+ }
239
+
240
+ /*
241
+ Add the correct vertical alignment in Chrome and Firefox.
242
+ */
243
+
244
+ progress {
245
+ vertical-align: baseline;
246
+ }
247
+
248
+ /*
249
+ Correct the cursor style of increment and decrement buttons in Safari.
250
+ */
251
+
252
+ ::-webkit-inner-spin-button,
253
+ ::-webkit-outer-spin-button {
254
+ height: auto;
255
+ }
256
+
257
+ /*
258
+ 1. Correct the odd appearance in Chrome and Safari.
259
+ 2. Correct the outline style in Safari.
260
+ */
261
+
262
+ [type="search"] {
263
+ -webkit-appearance: textfield; /* 1 */
264
+ outline-offset: -2px; /* 2 */
265
+ }
266
+
267
+ /*
268
+ Remove the inner padding in Chrome and Safari on macOS.
269
+ */
270
+
271
+ ::-webkit-search-decoration {
272
+ -webkit-appearance: none;
273
+ }
274
+
275
+ /*
276
+ 1. Correct the inability to style clickable types in iOS and Safari.
277
+ 2. Change font properties to `inherit` in Safari.
278
+ */
279
+
280
+ ::-webkit-file-upload-button {
281
+ -webkit-appearance: button; /* 1 */
282
+ font: inherit; /* 2 */
283
+ }
284
+
285
+ /*
286
+ Add the correct display in Chrome and Safari.
287
+ */
288
+
289
+ summary {
290
+ display: list-item;
291
+ }
292
+
293
+ /*
294
+ Removes the default spacing and border for appropriate elements.
295
+ */
296
+
297
+ blockquote,
298
+ dl,
299
+ dd,
300
+ h1,
301
+ h2,
302
+ h3,
303
+ h4,
304
+ h5,
305
+ h6,
306
+ hr,
307
+ figure,
308
+ p,
309
+ pre {
310
+ margin: 0;
311
+ }
312
+
313
+ fieldset {
314
+ margin: 0;
315
+ padding: 0;
316
+ }
317
+
318
+ legend {
319
+ padding: 0;
320
+ }
321
+
322
+ ol,
323
+ ul,
324
+ menu {
325
+ list-style: none;
326
+ margin: 0;
327
+ padding: 0;
328
+ }
329
+
330
+ /*
331
+ Prevent resizing textareas horizontally by default.
332
+ */
333
+
334
+ textarea {
335
+ resize: vertical;
336
+ }
337
+
338
+ /*
339
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
340
+ 2. Set the default placeholder color to the user's configured gray 400 color.
341
+ */
342
+
343
+ input::placeholder,
344
+ textarea::placeholder {
345
+ opacity: 1; /* 1 */
346
+ color: theme("colors.gray.400", #9ca3af); /* 2 */
347
+ }
348
+
349
+ /*
350
+ Set the default cursor for buttons.
351
+ */
352
+
353
+ button,
354
+ [role="button"] {
355
+ cursor: pointer;
356
+ }
357
+
358
+ /*
359
+ Make sure disabled buttons don't get the pointer cursor.
360
+ */
361
+ :disabled {
362
+ cursor: default;
363
+ }
364
+
365
+ /*
366
+ 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
367
+ 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
368
+ This can trigger a poorly considered lint error in some tools but is included by design.
369
+ */
370
+
371
+ img,
372
+ svg,
373
+ video,
374
+ canvas,
375
+ audio,
376
+ iframe,
377
+ embed,
378
+ object {
379
+ display: block; /* 1 */
380
+ vertical-align: middle; /* 2 */
381
+ }
382
+
383
+ /*
384
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
385
+ */
386
+
387
+ img,
388
+ video {
389
+ max-width: 100%;
390
+ height: auto;
391
+ }
392
+
393
+ /* Make elements with the HTML hidden attribute stay hidden by default */
394
+ [hidden] {
395
+ display: none;
396
+ }
example/src/pages/page.css ADDED
@@ -0,0 +1,8 @@
1
+ .home-page {
2
+ & .count {
3
+ color: black;
4
+ padding: 40px;
5
+ font-size: 30px;
6
+ font-weight: 600;
7
+ }
8
+ }
example/src/pages/page.jsx ADDED
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { useRouter } from "edge-city/router";
3
+ import Counter from "@/components/Counter/Counter";
4
+ import { Helmet } from "react-helmet-async";
5
+ import "./page.css";
6
+
7
+ export default function Page() {
8
+ const router = useRouter();
9
+ return (
10
+ <div>
11
+ <Helmet>
12
+ <title>Edge City</title>
13
+ </Helmet>
14
+ <div className="home-page">
15
+ <h1>Home Page</h1>
16
+ <p>Path: {router.pathname}</p>
17
+ <Counter />
18
+ </div>
19
+ </div>
20
+ );
21
+ }
{packages/example → example/src}/pages/page.spec.js RENAMED
@@ -6,7 +6,7 @@
6
6
  // })
7
7
 
8
8
  // test('has title', async ({ page }) => {
9
- // await expect(page).toHaveTitle(/Parotta/);
9
+ // await expect(page).toHaveTitle(/Edge City/);
10
10
  // });
11
11
 
12
12
  // test('has links', async ({ page }) => {
@@ -16,4 +16,4 @@
16
16
  // test('has counter', async ({ page }) => {
17
17
  // const counter = page.getByText("Counter");
18
18
  // expect(counter.innerText).toEqual("123");
19
- // });
19
+ // });
example/src/pages/spectrum.css ADDED
@@ -0,0 +1,431 @@
1
+ :root {
2
+ --spectrum-global-color-status: Verified;
3
+ --spectrum-global-color-version: 5.1.0;
4
+ --spectrum-gray-50: rgb(255, 255, 255);
5
+ --spectrum-gray-75: rgb(253, 253, 253);
6
+ --spectrum-gray-100: rgb(248, 248, 248);
7
+ --spectrum-gray-200: rgb(230, 230, 230);
8
+ --spectrum-gray-300: rgb(213, 213, 213);
9
+ --spectrum-gray-400: rgb(177, 177, 177);
10
+ --spectrum-gray-500: rgb(144, 144, 144);
11
+ --spectrum-gray-600: rgb(109, 109, 109);
12
+ --spectrum-gray-700: rgb(70, 70, 70);
13
+ --spectrum-gray-800: rgb(34, 34, 34);
14
+ --spectrum-gray-900: rgb(0, 0, 0);
15
+ --spectrum-red-100: rgb(255, 235, 231);
16
+ --spectrum-red-200: rgb(255, 221, 214);
17
+ --spectrum-red-300: rgb(255, 205, 195);
18
+ --spectrum-red-400: rgb(255, 183, 169);
19
+ --spectrum-red-500: rgb(255, 155, 136);
20
+ --spectrum-red-600: rgb(255, 124, 101);
21
+ --spectrum-red-700: rgb(247, 92, 70);
22
+ --spectrum-red-800: rgb(234, 56, 41);
23
+ --spectrum-red-900: rgb(211, 21, 16);
24
+ --spectrum-red-1000: rgb(180, 0, 0);
25
+ --spectrum-red-1100: rgb(147, 0, 0);
26
+ --spectrum-red-1200: rgb(116, 0, 0);
27
+ --spectrum-red-1300: rgb(89, 0, 0);
28
+ --spectrum-red-1400: rgb(67, 0, 0);
29
+ --spectrum-orange-100: rgb(255, 236, 204);
30
+ --spectrum-orange-200: rgb(255, 223, 173);
31
+ --spectrum-orange-300: rgb(253, 210, 145);
32
+ --spectrum-orange-400: rgb(255, 187, 99);
33
+ --spectrum-orange-500: rgb(255, 160, 55);
34
+ --spectrum-orange-600: rgb(246, 133, 17);
35
+ --spectrum-orange-700: rgb(228, 111, 0);
36
+ --spectrum-orange-800: rgb(203, 93, 0);
37
+ --spectrum-orange-900: rgb(177, 76, 0);
38
+ --spectrum-orange-1000: rgb(149, 61, 0);
39
+ --spectrum-orange-1100: rgb(122, 47, 0);
40
+ --spectrum-orange-1200: rgb(97, 35, 0);
41
+ --spectrum-orange-1300: rgb(73, 25, 1);
42
+ --spectrum-orange-1400: rgb(53, 18, 1);
43
+ --spectrum-yellow-100: rgb(251, 241, 152);
44
+ --spectrum-yellow-200: rgb(248, 231, 80);
45
+ --spectrum-yellow-300: rgb(248, 217, 4);
46
+ --spectrum-yellow-400: rgb(232, 198, 0);
47
+ --spectrum-yellow-500: rgb(215, 179, 0);
48
+ --spectrum-yellow-600: rgb(196, 159, 0);
49
+ --spectrum-yellow-700: rgb(176, 140, 0);
50
+ --spectrum-yellow-800: rgb(155, 120, 0);
51
+ --spectrum-yellow-900: rgb(133, 102, 0);
52
+ --spectrum-yellow-1000: rgb(112, 83, 0);
53
+ --spectrum-yellow-1100: rgb(91, 67, 0);
54
+ --spectrum-yellow-1200: rgb(72, 51, 0);
55
+ --spectrum-yellow-1300: rgb(54, 37, 0);
56
+ --spectrum-yellow-1400: rgb(40, 26, 0);
57
+ --spectrum-chartreuse-100: rgb(219, 252, 110);
58
+ --spectrum-chartreuse-200: rgb(203, 244, 67);
59
+ --spectrum-chartreuse-300: rgb(188, 233, 42);
60
+ --spectrum-chartreuse-400: rgb(170, 216, 22);
61
+ --spectrum-chartreuse-500: rgb(152, 197, 10);
62
+ --spectrum-chartreuse-600: rgb(135, 177, 3);
63
+ --spectrum-chartreuse-700: rgb(118, 156, 0);
64
+ --spectrum-chartreuse-800: rgb(103, 136, 0);
65
+ --spectrum-chartreuse-900: rgb(87, 116, 0);
66
+ --spectrum-chartreuse-1000: rgb(72, 96, 0);
67
+ --spectrum-chartreuse-1100: rgb(58, 77, 0);
68
+ --spectrum-chartreuse-1200: rgb(44, 59, 0);
69
+ --spectrum-chartreuse-1300: rgb(33, 44, 0);
70
+ --spectrum-chartreuse-1400: rgb(24, 31, 0);
71
+ --spectrum-celery-100: rgb(205, 252, 191);
72
+ --spectrum-celery-200: rgb(174, 246, 157);
73
+ --spectrum-celery-300: rgb(150, 238, 133);
74
+ --spectrum-celery-400: rgb(114, 224, 106);
75
+ --spectrum-celery-500: rgb(78, 207, 80);
76
+ --spectrum-celery-600: rgb(39, 187, 54);
77
+ --spectrum-celery-700: rgb(7, 167, 33);
78
+ --spectrum-celery-800: rgb(0, 145, 18);
79
+ --spectrum-celery-900: rgb(0, 124, 15);
80
+ --spectrum-celery-1000: rgb(0, 103, 15);
81
+ --spectrum-celery-1100: rgb(0, 83, 13);
82
+ --spectrum-celery-1200: rgb(0, 64, 10);
83
+ --spectrum-celery-1300: rgb(0, 48, 7);
84
+ --spectrum-celery-1400: rgb(0, 34, 5);
85
+ --spectrum-green-100: rgb(206, 248, 224);
86
+ --spectrum-green-200: rgb(173, 244, 206);
87
+ --spectrum-green-300: rgb(137, 236, 188);
88
+ --spectrum-green-400: rgb(103, 222, 168);
89
+ --spectrum-green-500: rgb(73, 204, 147);
90
+ --spectrum-green-600: rgb(47, 184, 128);
91
+ --spectrum-green-700: rgb(21, 164, 110);
92
+ --spectrum-green-800: rgb(0, 143, 93);
93
+ --spectrum-green-900: rgb(0, 122, 77);
94
+ --spectrum-green-1000: rgb(0, 101, 62);
95
+ --spectrum-green-1100: rgb(0, 81, 50);
96
+ --spectrum-green-1200: rgb(5, 63, 39);
97
+ --spectrum-green-1300: rgb(10, 46, 29);
98
+ --spectrum-green-1400: rgb(10, 32, 21);
99
+ --spectrum-seafoam-100: rgb(206, 247, 243);
100
+ --spectrum-seafoam-200: rgb(170, 241, 234);
101
+ --spectrum-seafoam-300: rgb(140, 233, 226);
102
+ --spectrum-seafoam-400: rgb(101, 218, 210);
103
+ --spectrum-seafoam-500: rgb(63, 201, 193);
104
+ --spectrum-seafoam-600: rgb(15, 181, 174);
105
+ --spectrum-seafoam-700: rgb(0, 161, 154);
106
+ --spectrum-seafoam-800: rgb(0, 140, 135);
107
+ --spectrum-seafoam-900: rgb(0, 119, 114);
108
+ --spectrum-seafoam-1000: rgb(0, 99, 95);
109
+ --spectrum-seafoam-1100: rgb(12, 79, 76);
110
+ --spectrum-seafoam-1200: rgb(18, 60, 58);
111
+ --spectrum-seafoam-1300: rgb(18, 44, 43);
112
+ --spectrum-seafoam-1400: rgb(15, 31, 30);
113
+ --spectrum-cyan-100: rgb(197, 248, 255);
114
+ --spectrum-cyan-200: rgb(164, 240, 255);
115
+ --spectrum-cyan-300: rgb(136, 231, 250);
116
+ --spectrum-cyan-400: rgb(96, 216, 243);
117
+ --spectrum-cyan-500: rgb(51, 197, 232);
118
+ --spectrum-cyan-600: rgb(18, 176, 218);
119
+ --spectrum-cyan-700: rgb(1, 156, 200);
120
+ --spectrum-cyan-800: rgb(0, 134, 180);
121
+ --spectrum-cyan-900: rgb(0, 113, 159);
122
+ --spectrum-cyan-1000: rgb(0, 93, 137);
123
+ --spectrum-cyan-1100: rgb(0, 74, 115);
124
+ --spectrum-cyan-1200: rgb(0, 57, 93);
125
+ --spectrum-cyan-1300: rgb(0, 42, 70);
126
+ --spectrum-cyan-1400: rgb(0, 30, 51);
127
+ --spectrum-blue-100: rgb(224, 242, 255);
128
+ --spectrum-blue-200: rgb(202, 232, 255);
129
+ --spectrum-blue-300: rgb(181, 222, 255);
130
+ --spectrum-blue-400: rgb(150, 206, 253);
131
+ --spectrum-blue-500: rgb(120, 187, 250);
132
+ --spectrum-blue-600: rgb(89, 167, 246);
133
+ --spectrum-blue-700: rgb(56, 146, 243);
134
+ --spectrum-blue-800: rgb(20, 122, 243);
135
+ --spectrum-blue-900: rgb(2, 101, 220);
136
+ --spectrum-blue-1000: rgb(0, 84, 182);
137
+ --spectrum-blue-1100: rgb(0, 68, 145);
138
+ --spectrum-blue-1200: rgb(0, 53, 113);
139
+ --spectrum-blue-1300: rgb(0, 39, 84);
140
+ --spectrum-blue-1400: rgb(0, 28, 60);
141
+ --spectrum-indigo-100: rgb(237, 238, 255);
142
+ --spectrum-indigo-200: rgb(224, 226, 255);
143
+ --spectrum-indigo-300: rgb(211, 213, 255);
144
+ --spectrum-indigo-400: rgb(193, 196, 255);
145
+ --spectrum-indigo-500: rgb(172, 175, 255);
146
+ --spectrum-indigo-600: rgb(149, 153, 255);
147
+ --spectrum-indigo-700: rgb(126, 132, 252);
148
+ --spectrum-indigo-800: rgb(104, 109, 244);
149
+ --spectrum-indigo-900: rgb(82, 88, 228);
150
+ --spectrum-indigo-1000: rgb(64, 70, 202);
151
+ --spectrum-indigo-1100: rgb(50, 54, 168);
152
+ --spectrum-indigo-1200: rgb(38, 41, 134);
153
+ --spectrum-indigo-1300: rgb(27, 30, 100);
154
+ --spectrum-indigo-1400: rgb(20, 22, 72);
155
+ --spectrum-purple-100: rgb(246, 235, 255);
156
+ --spectrum-purple-200: rgb(238, 221, 255);
157
+ --spectrum-purple-300: rgb(230, 208, 255);
158
+ --spectrum-purple-400: rgb(219, 187, 254);
159
+ --spectrum-purple-500: rgb(204, 164, 253);
160
+ --spectrum-purple-600: rgb(189, 139, 252);
161
+ --spectrum-purple-700: rgb(174, 114, 249);
162
+ --spectrum-purple-800: rgb(157, 87, 244);
163
+ --spectrum-purple-900: rgb(137, 61, 231);
164
+ --spectrum-purple-1000: rgb(115, 38, 211);
165
+ --spectrum-purple-1100: rgb(93, 19, 183);
166
+ --spectrum-purple-1200: rgb(71, 12, 148);
167
+ --spectrum-purple-1300: rgb(51, 16, 106);
168
+ --spectrum-purple-1400: rgb(35, 15, 73);
169
+ --spectrum-fuchsia-100: rgb(255, 233, 252);
170
+ --spectrum-fuchsia-200: rgb(255, 218, 250);
171
+ --spectrum-fuchsia-300: rgb(254, 199, 248);
172
+ --spectrum-fuchsia-400: rgb(251, 174, 246);
173
+ --spectrum-fuchsia-500: rgb(245, 146, 243);
174
+ --spectrum-fuchsia-600: rgb(237, 116, 237);
175
+ --spectrum-fuchsia-700: rgb(224, 85, 226);
176
+ --spectrum-fuchsia-800: rgb(205, 58, 206);
177
+ --spectrum-fuchsia-900: rgb(182, 34, 183);
178
+ --spectrum-fuchsia-1000: rgb(157, 3, 158);
179
+ --spectrum-fuchsia-1100: rgb(128, 0, 129);
180
+ --spectrum-fuchsia-1200: rgb(100, 6, 100);
181
+ --spectrum-fuchsia-1300: rgb(71, 14, 70);
182
+ --spectrum-fuchsia-1400: rgb(50, 13, 49);
183
+ --spectrum-magenta-100: rgb(255, 234, 241);
184
+ --spectrum-magenta-200: rgb(255, 220, 232);
185
+ --spectrum-magenta-300: rgb(255, 202, 221);
186
+ --spectrum-magenta-400: rgb(255, 178, 206);
187
+ --spectrum-magenta-500: rgb(255, 149, 189);
188
+ --spectrum-magenta-600: rgb(250, 119, 170);
189
+ --spectrum-magenta-700: rgb(239, 90, 152);
190
+ --spectrum-magenta-800: rgb(222, 61, 130);
191
+ --spectrum-magenta-900: rgb(200, 34, 105);
192
+ --spectrum-magenta-1000: rgb(173, 9, 85);
193
+ --spectrum-magenta-1100: rgb(142, 0, 69);
194
+ --spectrum-magenta-1200: rgb(112, 0, 55);
195
+ --spectrum-magenta-1300: rgb(84, 3, 42);
196
+ --spectrum-magenta-1400: rgb(60, 6, 29);
197
+ --spectrum-alias-background-color-modal-overlay: rgba(0,0,0,0.4);
198
+ --spectrum-alias-dropshadow-color: rgba(0,0,0,0.15);
199
+ --spectrum-alias-background-color-hover-overlay: rgba(0,0,0,0.04);
200
+ --spectrum-alias-highlight-hover: rgba(0,0,0,0.06);
201
+ --spectrum-alias-highlight-active: rgba(44,44,44,0.1);
202
+ --spectrum-alias-highlight-selected: rgba(2,101,220,0.1);
203
+ --spectrum-alias-highlight-selected-hover: rgba(2,101,220,0.2);
204
+ --spectrum-alias-highlight-invalid: rgba(211, 21, 16, 0.15); /* matches red-900 */
205
+ --spectrum-alias-text-highlight-color: rgba(2,101,220,0.2);
206
+ --spectrum-alias-background-color-quickactions: rgba(248,248,248,0.9);
207
+ --spectrum-alias-radial-reaction-color-default: rgba(34,34,34,0.6);
208
+ --spectrum-alias-pasteboard-background-color: var(--spectrum-global-color-gray-300);
209
+ --spectrum-alias-appframe-border-color: var(--spectrum-global-color-gray-300);
210
+ --spectrum-alias-appframe-separator-color: var(--spectrum-global-color-gray-300);
211
+ --spectrum-colorarea-border-color: rgba(44,44,44,0.1);
212
+ --spectrum-colorarea-border-color-hover: rgba(44,44,44,0.1);
213
+ --spectrum-colorarea-border-color-down: rgba(44,44,44,0.1);
214
+ --spectrum-colorarea-border-color-key-focus: rgba(44,44,44,0.1);
215
+ --spectrum-colorslider-border-color: rgba(44,44,44,0.1);
216
+ --spectrum-colorslider-border-color-hover: rgba(44,44,44,0.1);
217
+ --spectrum-colorslider-border-color-down: rgba(44,44,44,0.1);
218
+ --spectrum-colorslider-border-color-key-focus: rgba(44,44,44,0.1);
219
+ --spectrum-colorslider-vertical-border-color: rgba(44,44,44,0.1);
220
+ --spectrum-colorslider-vertical-border-color-hover: rgba(44,44,44,0.1);
221
+ --spectrum-colorslider-vertical-border-color-down: rgba(44,44,44,0.1);
222
+ --spectrum-colorslider-vertical-border-color-key-focus: rgba(44,44,44,0.1);
223
+ --spectrum-colorwheel-border-color: rgba(44,44,44,0.1);
224
+ --spectrum-colorwheel-border-color-hover: rgba(44,44,44,0.1);
225
+ --spectrum-colorwheel-border-color-down: rgba(44,44,44,0.1);
226
+ --spectrum-colorwheel-border-color-key-focus: rgba(44,44,44,0.1);
227
+ --spectrum-miller-column-item-background-color-selected: rgba(20,115,230,0.1);
228
+ --spectrum-miller-column-item-background-color-selected-hover: rgba(20,115,230,0.2);
229
+ --spectrum-tabs-compact-selection-indicator-color: var(--spectrum-global-color-blue-500);
230
+ --spectrum-tabs-compact-vertical-rule-color: var(--spectrum-global-color-gray-200);
231
+ --spectrum-tabs-compact-vertical-emphasized-selection-indicator-color: var(--spectrum-global-color-blue-500);
232
+ --spectrum-tabs-compact-vertical-emphasized-rule-color: var(--spectrum-global-color-gray-200);
233
+ --spectrum-tabs-emphasized-selection-indicator-color: var(--spectrum-global-color-blue-500);
234
+ --spectrum-tabs-quiet-compact-emphasized-selection-indicator-color: var(--spectrum-global-color-blue-500);
235
+ --spectrum-tabs-quiet-compact-vertical-emphasized-selection-indicator-color: var(--spectrum-global-color-blue-500);
236
+ --spectrum-tabs-quiet-emphasized-selection-indicator-color: var(--spectrum-global-color-blue-500);
237
+ --spectrum-tabs-quiet-vertical-emphasized-selection-indicator-color: var(--spectrum-global-color-blue-500);
238
+ --spectrum-well-background-color: rgba(34,34,34,0.02);
239
+ --spectrum-well-border-color: rgba(0,0,0,0.05);
240
+ --spectrum-tray-background-color: var(--spectrum-global-color-gray-50);
241
+ /* react spectrum additions */
242
+ --react-spectrum-datepicker-placeholder-color: rgb(118, 118, 118); /* 4.54:1 contrast ratio */
243
+
244
+ --spectrum-accent-background-color-default: var(--spectrum-accent-color-900);
245
+ --spectrum-accent-background-color-hover: var(--spectrum-accent-color-1000);
246
+ --spectrum-accent-background-color-down: var(--spectrum-accent-color-1100);
247
+ --spectrum-accent-background-color-key-focus: var(--spectrum-accent-color-1000);
248
+
249
+ --spectrum-neutral-background-color-default: var(--spectrum-gray-800);
250
+ --spectrum-neutral-background-color-hover: var(--spectrum-gray-900);
251
+ --spectrum-neutral-background-color-down: var(--spectrum-gray-900);
252
+ --spectrum-neutral-background-color-key-focus: var(--spectrum-gray-900);
253
+
254
+ --spectrum-neutral-subdued-background-color-default: var(--spectrum-gray-600);
255
+ --spectrum-neutral-subdued-background-color-hover: var(--spectrum-gray-700);
256
+ --spectrum-neutral-subdued-background-color-down: var(--spectrum-gray-800);
257
+ --spectrum-neutral-subdued-background-color-key-focus: var(--spectrum-gray-700);
258
+
259
+ --spectrum-negative-background-color-default: var(--spectrum-red-900);
260
+ --spectrum-negative-background-color-hover: var(--spectrum-red-1000);
261
+ --spectrum-negative-background-color-down: var(--spectrum-red-1100);
262
+ --spectrum-negative-background-color-key-focus: var(--spectrum-red-1000);
263
+
264
+ --spectrum-positive-background-color-default: var(--spectrum-green-900);
265
+ --spectrum-positive-background-color-hover: var(--spectrum-green-1000);
266
+ --spectrum-positive-background-color-down: var(--spectrum-green-1100);
267
+ --spectrum-positive-background-color-key-focus: var(--spectrum-green-1000);
268
+
269
+ --spectrum-informative-background-color-default: var(--spectrum-blue-900);
270
+ --spectrum-informative-background-color-hover: var(--spectrum-blue-1000);
271
+ --spectrum-informative-background-color-down: var(--spectrum-blue-1100);
272
+ --spectrum-informative-background-color-key-focus: var(--spectrum-blue-1000);
273
+
274
+ --spectrum-gray-background-color-default: var(--spectrum-gray-700);
275
+ --spectrum-red-background-color-default: var(--spectrum-red-600);
276
+ --spectrum-orange-background-color-default: var(--spectrum-orange-600);
277
+ --spectrum-yellow-background-color-default: var(--spectrum-yellow-400);
278
+ --spectrum-chartreuse-background-color-default: var(--spectrum-chartreuse-500);
279
+ --spectrum-celery-background-color-default: var(--spectrum-celery-600);
280
+ --spectrum-green-background-color-default: var(--spectrum-green-900);
281
+ --spectrum-seafoam-background-color-default: var(--spectrum-seafoam-900);
282
+ --spectrum-cyan-background-color-default: var(--spectrum-cyan-900);
283
+ --spectrum-blue-background-color-default: var(--spectrum-blue-900);
284
+ --spectrum-indigo-background-color-default: var(--spectrum-indigo-900);
285
+ --spectrum-purple-background-color-default: var(--spectrum-purple-900);
286
+ --spectrum-fuchsia-background-color-default: var(--spectrum-fuchsia-900);
287
+ --spectrum-magenta-background-color-default: var(--spectrum-magenta-900);
288
+
289
+ --spectrum-negative-visual-color: var(--spectrum-red-800);
290
+ --spectrum-positive-visual-color: var(--spectrum-green-700);
291
+ --spectrum-notice-visual-color: var(--spectrum-orange-700);
292
+ --spectrum-informative-visual-color: var(--spectrum-blue-800);
293
+
294
+ --spectrum-gray-visual-color: var(--spectrum-gray-500);
295
+ --spectrum-red-visual-color: var(--spectrum-red-800);
296
+ --spectrum-orange-visual-color: var(--spectrum-orange-700);
297
+ --spectrum-yellow-visual-color: var(--spectrum-yellow-600);
298
+ --spectrum-chartreuse-visual-color: var(--spectrum-chartreuse-600);
299
+ --spectrum-celery-visual-color: var(--spectrum-celery-700);
300
+ --spectrum-green-visual-color: var(--spectrum-green-700);
301
+ --spectrum-seafoam-visual-color: var(--spectrum-seafoam-700);
302
+ --spectrum-cyan-visual-color: var(--spectrum-cyan-600);
303
+ --spectrum-blue-visual-color: var(--spectrum-blue-800);
304
+ --spectrum-indigo-visual-color: var(--spectrum-indigo-800);
305
+ --spectrum-purple-visual-color: var(--spectrum-purple-800);
306
+ --spectrum-fuchsia-visual-color: var(--spectrum-fuchsia-800);
307
+ --spectrum-magenta-visual-color: var(--spectrum-magenta-800);
308
+
309
+ --spectrum-alias-border-color: var(--spectrum-gray-400);
310
+ --spectrum-alias-border-color-hover: var(--spectrum-gray-500);
311
+ --spectrum-alias-border-color-down: var(--spectrum-gray-900);
312
+ }
313
+
314
+ .react-aria-Button {
315
+ --border-color: var(--spectrum-alias-border-color);
316
+ --border-color-pressed: var(--spectrum-alias-border-color-down);
317
+ --border-color-disabled: var(--spectrum-alias-border-color-disabled);
318
+ --background-color: var(--spectrum-global-color-gray-50);
319
+ --background-color-pressed: var(--spectrum-global-color-gray-100);
320
+ --text-color: var(--spectrum-alias-text-color);
321
+ --text-color-disabled: var(--spectrum-alias-text-color-disabled);
322
+ --focus-ring-color: slateblue;
323
+
324
+ color: var(--text-color);
325
+ background: var(--background-color);
326
+ border: 1px solid var(--border-color);
327
+ border-radius: 4px;
328
+ appearance: none;
329
+ vertical-align: middle;
330
+ font-size: 1.2rem;
331
+ text-align: center;
332
+ margin: 0;
333
+ outline: none;
334
+ padding: 4px 12px;
335
+
336
+ &[data-pressed] {
337
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.1);
338
+ background: var(--background-color-pressed);
339
+ border-color: var(--border-color-pressed);
340
+ }
341
+
342
+ &[data-focus-visible] {
343
+ border-color: var(--focus-ring-color);
344
+ box-shadow: 0 0 0 1px var(--focus-ring-color);
345
+ }
346
+
347
+ &:disabled {
348
+ border-color: var(--border-color-disabled);
349
+ color: var(--text-color-disabled);
350
+ }
351
+ }
352
+
353
+ @media (forced-colors: active) {
354
+ .react-aria-Button {
355
+ forced-color-adjust: none;
356
+ --border-color: ButtonBorder;
357
+ --border-color-pressed: ButtonBorder;
358
+ --border-color-disabled: GrayText;
359
+ --background-color: ButtonFace;
360
+ --background-color-pressed: ButtonFace;
361
+ --text-color: ButtonText;
362
+ --text-color-disabled: GrayText;
363
+ --focus-ring-color: Highlight;
364
+ }
365
+ }
366
+
367
+ .react-aria-TextField {
368
+ --field-border: var(--spectrum-alias-border-color);
369
+ --field-border-disabled: var(--spectrum-alias-border-color-disabled);
370
+ --field-background: var(--spectrum-global-color-gray-50);
371
+ --text-color: var(--spectrum-alias-text-color);
372
+ --text-color-disabled: var(--spectrum-alias-text-color-disabled);
373
+ --focus-ring-color: slateblue;
374
+ --invalid-color: var(--spectrum-global-color-red-600);
375
+ display: flex;
376
+ flex: 1;
377
+ flex-direction: column;
378
+
379
+ .react-aria-Input {
380
+ margin: 0;
381
+ border: 1px solid var(--field-border);
382
+ border-radius: 6px;
383
+ background: var(--field-background);
384
+ font-size: 1.143rem;
385
+ color: var(--text-color);
386
+ border-radius: 0.25rem;
387
+ margin-right: 1rem;
388
+ border-width: 1px;
389
+ width: 100%;
390
+ padding-left: 0.75rem;
391
+ padding-right: 0.75rem;
392
+ padding-bottom: 0.5rem;
393
+ padding-top: 0.5rem;
394
+
395
+ &[aria-invalid] {
396
+ border-color: var(--invalid-color);
397
+ }
398
+
399
+ &:focus {
400
+ outline: none;
401
+ border-color: var(--focus-ring-color);
402
+ box-shadow: 0 0 0 1px var(--focus-ring-color);
403
+ }
404
+
405
+ &:disabled {
406
+ border-color: var(--field-border-disabled);
407
+ color: var(--text-color-disabled);
408
+ }
409
+ }
410
+
411
+ [slot="description"] {
412
+ font-size: 12px;
413
+ }
414
+
415
+ [slot="errorMessage"] {
416
+ font-size: 12px;
417
+ color: var(--invalid-color);
418
+ }
419
+ }
420
+
421
+ @media (forced-colors: active) {
422
+ .react-aria-TextField {
423
+ --field-border: ButtonBorder;
424
+ --field-border-disabled: GrayText;
425
+ --field-background: Field;
426
+ --text-color: FieldText;
427
+ --text-color-disabled: GrayText;
428
+ --focus-ring-color: Highlight;
429
+ --invalid-color: LinkText;
430
+ }
431
+ }
example/src/pages/todos/Todo.css ADDED
@@ -0,0 +1,44 @@
1
+ .todo {
2
+ display: flex;
3
+ border-bottom-width: 1px;
4
+ border-color: #d1d5db;
5
+ align-items: center;
6
+ height: 4rem;
7
+ margin-bottom: 0.5rem;
8
+ margin-top: 0.5rem;
9
+
10
+ & .text {
11
+ display: flex;
12
+ flex: 1;
13
+ flex-direction: column;
14
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
15
+ "Courier New", monospace;
16
+ margin-left: 0.5rem;
17
+ }
18
+
19
+ & form {
20
+ display: flex;
21
+ flex: 1;
22
+
23
+ & .text-input {
24
+ display: flex;
25
+ flex: 1;
26
+ margin-right: 0.5rem;
27
+ }
28
+ }
29
+
30
+ & .timestamp {
31
+ line-height: 2;
32
+ opacity: 0.5;
33
+ font-size: 0.75rem;
34
+ }
35
+
36
+ & .edit-button {
37
+ padding: 0.5rem;
38
+ margin-right: 0.5rem;
39
+ }
40
+
41
+ & .delete-button {
42
+ padding: 0.5rem;
43
+ }
44
+ }
example/src/pages/todos/Todo.jsx ADDED
@@ -0,0 +1,72 @@
1
+ import { useState } from "react";
2
+ import { useForm } from "react-hook-form";
3
+ import { TextField, Input } from "react-aria-components";
4
+ import { cache, useMutation } from "edge-city/data";
5
+ import { updateTodo, deleteTodo } from "@/services/todos.service";
6
+ import "./Todo.css";
7
+
8
+ const Todo = ({ item }) => {
9
+ const [editing, setEditing] = useState(false);
10
+ const {
11
+ register,
12
+ handleSubmit,
13
+ reset,
14
+ } = useForm();
15
+ const updateMutation = useMutation(async ({ text }) => {
16
+ await updateTodo({ id: item.id, text, completed: item.completed });
17
+ await cache.invalidate("todos", false);
18
+ setEditing(false);
19
+ });
20
+ const deleteMutation = useMutation(async (id) => {
21
+ await deleteTodo(id);
22
+ await cache.invalidate("todos", false);
23
+ });
24
+ return (
25
+ <li className="todo" style={{ opacity: deleteMutation.isMutating || updateMutation.isMutating ? 0.5 : 1 }}>
26
+ {!editing && (
27
+ <>
28
+ <input type="checkbox" />
29
+ <div className="text">
30
+ <p>{item.text}</p>
31
+ <p className="timestamp">{item.createdAt}</p>
32
+ </div>
33
+ <button className="edit-button" title="Edit" onClick={() => setEditing(true)}>
34
+ ✏️
35
+ </button>
36
+ <button className="delete-button" title="Delete" onClick={() => deleteMutation.mutate(item.id)}>
37
+ 🗑️
38
+ </button>
39
+ </>
40
+ )}
41
+ {editing && (
42
+ <form onSubmit={handleSubmit(updateMutation.mutate)}>
43
+ <TextField isRequired isReadOnly={updateMutation.isMutating} isDisabled={updateMutation.isMutating}>
44
+ <Input {...register("text")} defaultValue={item.text} />
45
+ {/* {err?.text && <p>{err.text._errors[0]}</p>} */}
46
+ </TextField>
47
+ <button
48
+ type="submit"
49
+ className="edit-button"
50
+ title="Save"
51
+ disabled={updateMutation.isMutating}
52
+ >
53
+ 💾
54
+ </button>
55
+ <button
56
+ className="delete-button"
57
+ title="Cancel"
58
+ onClick={() => {
59
+ reset({ text: item.text });
60
+ setEditing(false);
61
+ }}
62
+ disabled={updateMutation.isMutating}
63
+ >
64
+ 🚫
65
+ </button>
66
+ </form>
67
+ )}
68
+ </li>
69
+ );
70
+ };
71
+
72
+ export default Todo;
example/src/pages/todos/TodoList.jsx ADDED
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import { useQuery } from "edge-city/data";
3
+ import { getTodos } from "@/services/todos.service";
4
+ import Spinner from "@/components/Spinner/Spinner";
5
+ import Todo from "./Todo";
6
+ import "./page.css";
7
+
8
+ export default function TodoList({ isMutating }) {
9
+ const { data, isRefetching } = useQuery("todos", () => getTodos());
10
+ return (
11
+ <>
12
+ {isMutating || isRefetching ? <Spinner /> : null}
13
+ <ul>
14
+ {data.map((item) => (
15
+ <Todo
16
+ key={item.id}
17
+ item={item}
18
+ />
19
+ ))}
20
+ </ul>
21
+ </>
22
+ );
23
+ }
example/src/pages/todos/page.css ADDED
@@ -0,0 +1,46 @@
1
+ .todos-page {
2
+ display: flex;
3
+ flex: 1;
4
+ flex-direction: column;
5
+ max-width: 36rem;
6
+
7
+ & .title {
8
+ font-size: 1.25rem;
9
+ line-height: 1.75rem;
10
+ font-weight: 700;
11
+ }
12
+
13
+ & .container {
14
+ display: flex;
15
+ flex-direction: column;
16
+ }
17
+
18
+ & .subtitle {
19
+ font-size: 0.875rem;
20
+ line-height: 1.25rem;
21
+ opacity: 0.5;
22
+ margin-top: 0.5rem;
23
+ }
24
+
25
+ & form {
26
+ display: flex;
27
+ margin-top: 1rem;
28
+ }
29
+
30
+ & ul {
31
+ display: flex;
32
+ flex-direction: column;
33
+ }
34
+
35
+ & .add-button {
36
+ border-radius: 0.25rem;
37
+ padding: 0.5rem 0.7rem;
38
+ background-color: #2563eb;
39
+ color: white;
40
+ margin-left: 0.5rem;
41
+
42
+ &:disabled {
43
+ opacity: 0.5;
44
+ }
45
+ }
46
+ }
example/src/pages/todos/page.jsx ADDED
@@ -0,0 +1,52 @@
1
+ import { Suspense } from "react";
2
+ import { ErrorBoundary } from "react-error-boundary";
3
+ import { Helmet } from "react-helmet-async";
4
+ import { cache, useMutation } from "edge-city/data";
5
+ import { useForm } from "react-hook-form";
6
+ import { Button, TextField, Input } from "react-aria-components";
7
+ import Spinner from "@/components/Spinner/Spinner";
8
+ import TodoList from "./TodoList";
9
+ import { createTodo } from "@/services/todos.service";
10
+ import "./page.css";
11
+
12
+ export default function Page() {
13
+ const {
14
+ register,
15
+ handleSubmit,
16
+ reset,
17
+ formState: { errors },
18
+ } = useForm();
19
+ const { mutate, isMutating, err } = useMutation(async ({ text }) => {
20
+ await createTodo({
21
+ text,
22
+ completed: false,
23
+ });
24
+ await cache.invalidate("todos");
25
+ reset();
26
+ });
27
+ return (
28
+ <div className="todos-page">
29
+ <h1 className="title">Todo List</h1>
30
+ <Helmet>
31
+ <title>Todo List</title>
32
+ </Helmet>
33
+ <div className="container">
34
+ <p className="subtitle">Share this page to collaborate with others.</p>
35
+ <form onSubmit={handleSubmit(mutate)}>
36
+ <TextField isRequired isReadOnly={isMutating} aria-label="add-todo">
37
+ <Input id="text" aria-labelledby="text" aria-describedby="text" {...register("text")} placeholder="Add a todo item" />
38
+ {err?.text && <p>{err.text._errors[0]}</p>}
39
+ </TextField>
40
+ <Button className="add-button" type="submit" isDisabled={isMutating}>
41
+ Add
42
+ </Button>
43
+ </form>
44
+ <ErrorBoundary onError={(err) => console.log("err", err)} fallback={<p>Oops something went wrong</p>}>
45
+ <Suspense fallback={<Spinner />}>
46
+ <TodoList isMutating={isMutating} />
47
+ </Suspense>
48
+ </ErrorBoundary>
49
+ </div>
50
+ </div>
51
+ );
52
+ }
{packages/example → example/src}/services/auth.service.js RENAMED
File without changes
{packages/example → example/src}/services/todos.service.js RENAMED
@@ -1,14 +1,13 @@
1
- import { eq, asc } from 'drizzle-orm';
1
+ import { eq, desc } from "drizzle-orm";
2
- import db from "@/db";
3
- import { boolean, date, pgTable, serial, text } from 'drizzle-orm/pg-core';
2
+ import { boolean, date, pgTable, serial, text } from "drizzle-orm/pg-core";
4
- import { z } from 'zod';
3
+ import { z } from "zod";
5
-
4
+
6
- const todos = pgTable('todos', {
5
+ export const todos = pgTable("todos", {
7
- id: serial('id').primaryKey(),
6
+ id: serial("id").primaryKey(),
8
- text: text('text').notNull(),
7
+ text: text("text").notNull(),
9
- completed: boolean('completed').notNull(),
8
+ completed: boolean("completed").notNull(),
10
- createdAt: date('createdAt').notNull(),
9
+ createdAt: date("createdAt").notNull(),
11
- updatedAt: date('updatedAt'),
10
+ updatedAt: date("updatedAt"),
12
11
  });
13
12
 
14
13
  export const createSchema = z.object({
@@ -16,34 +15,45 @@ export const createSchema = z.object({
16
15
  completed: z.boolean(),
17
16
  });
18
17
 
19
- export const updateSchema = z.object({
18
+ const updateSchema = z.object({
19
+ id: z.number().positive().int("must be an integer"),
20
20
  text: z.string().nonempty("please enter some text"),
21
21
  completed: z.boolean(),
22
22
  });
23
23
 
24
24
  export const getTodos = async () => {
25
+ await new Promise((resolve) => {
26
+ setTimeout(() => {
27
+ resolve();
28
+ }, 2000)
29
+ });
25
- return await db.select().from(todos).orderBy(asc(todos.id));
30
+ return await db.select().from(todos).orderBy(desc(todos.id));
26
- }
31
+ };
27
32
 
28
33
  /** @param {z.infer<typeof createSchema>} params */
29
34
  export const createTodo = async (params) => {
35
+ await new Promise((resolve) => {
36
+ setTimeout(() => {
37
+ resolve();
38
+ }, 2000)
39
+ });
30
40
  const item = createSchema.parse(params);
31
41
  item.createdAt = new Date();
32
42
  return await db.insert(todos).values(item).returning();
33
- }
43
+ };
34
44
 
35
45
  export const getTodo = async (id) => {
36
46
  const results = await db.select().from(todos).where(eq(todos.id, id));
37
- return results[0]
47
+ return results[0];
38
- }
48
+ };
39
49
 
40
50
  /** @param {z.infer<typeof updateSchema>} params */
41
51
  export const updateTodo = async (params) => {
42
52
  const item = updateSchema.parse(params);
43
53
  item.updatedAt = new Date();
44
54
  return await db.update(todos).set(item).where(eq(todos.id, item.id)).returning();
45
- }
55
+ };
46
56
 
47
57
  export const deleteTodo = async (id) => {
48
58
  return await db.delete(todos).where(eq(todos.id, id)).returning();
49
- }
59
+ };
example/src/services/todos.service.test.js ADDED
@@ -0,0 +1,36 @@
1
+ import { createSchema } from "./todos.service";
2
+
3
+ test("validate createSchema", () => {
4
+ expect(createSchema.safeParse({}).error.issues).toEqual([
5
+ {
6
+ code: "invalid_type",
7
+ expected: "string",
8
+ message: "Required",
9
+ path: ["text"],
10
+ received: "undefined",
11
+ },
12
+ {
13
+ code: "invalid_type",
14
+ expected: "boolean",
15
+ message: "Required",
16
+ path: ["completed"],
17
+ received: "undefined",
18
+ },
19
+ ]);
20
+ expect(
21
+ createSchema.safeParse({
22
+ text: "",
23
+ completed: true,
24
+ }).error.issues,
25
+ ).toEqual([
26
+ {
27
+ code: "too_small",
28
+ exact: false,
29
+ inclusive: true,
30
+ message: "please enter some text",
31
+ minimum: 1,
32
+ path: ["text"],
33
+ type: "string",
34
+ },
35
+ ]);
36
+ });
{packages/example → example/src}/static/favicon.ico RENAMED
File without changes
{packages/example → example/src}/static/logo192.png RENAMED
File without changes
{packages/example → example/src}/static/logo512.png RENAMED
File without changes
{packages/example → example/src}/static/manifest.json RENAMED
File without changes
{packages/example → example/src}/static/robots.txt RENAMED
File without changes
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
+ })
lib/bin/cli.js ADDED
@@ -0,0 +1,305 @@
1
+ #!/usr/bin/env node
2
+ import yargs from 'yargs'
3
+ import { hideBin } from 'yargs/helpers'
4
+ import esbuild from 'esbuild';
5
+ import resolve from 'esbuild-plugin-resolve';
6
+ import fs from "fs";
7
+ import fse from "fs-extra";
8
+ import path from 'path';
9
+ import walkdir from 'walkdir';
10
+ import postcss from "postcss"
11
+ import autoprefixer from "autoprefixer";
12
+ import postcssCustomMedia from "postcss-custom-media";
13
+ import postcssNesting from "postcss-nesting";
14
+ import bytes from 'bytes';
15
+ import pc from 'picocolors';
16
+ import ms from 'ms';
17
+ import watch from 'node-watch';
18
+ import dotenv from 'dotenv';
19
+
20
+ dotenv.config();
21
+
22
+ let isProd = false;
23
+ const srcDir = path.join(process.cwd(), "src");
24
+ const pagesDir = path.join(srcDir, "pages");
25
+ const inputStaticDir = path.join(srcDir, "static");
26
+ const buildDir = path.join(process.cwd(), "build");
27
+ const staticDir = path.join(buildDir, "static");
28
+
29
+ const recordSize = (buildStart, dest) => {
30
+ const outLength = fs.statSync(dest).size;
31
+ const builtTime = ms(Date.now() - buildStart);
32
+ console.log(
33
+ `${pc.green("✓ Bundled")} ${dest.replace(process.cwd() + "/", "")} ${pc.cyan(`(${bytes(outLength)})`)} ${pc.gray(`[${builtTime}]`)}`
34
+ );
35
+ }
36
+
37
+ let generatedCss = ``;
38
+ const serverEnvs = Object.keys(process.env)
39
+ .filter((k) => k.startsWith("EDGE_") || k === "NODE_ENV")
40
+ .reduce((acc, k) => {
41
+ acc[`process.env.${k}`] = JSON.stringify(process.env[k]);
42
+ return acc
43
+ }, {});
44
+ const clientEnvs = Object.keys(process.env)
45
+ .filter((k) => k.startsWith("EDGE_PUBLIC") || k === "NODE_ENV")
46
+ .reduce((acc, k) => {
47
+ acc[`process.env.${k}`] = JSON.stringify(process.env[k]);
48
+ return acc
49
+ }, {});
50
+
51
+ const parseExports = (src) => {
52
+ return src.split("\n").filter((l) => l.includes("export const") && l.includes("=>"))
53
+ .map((l) => /export const (.*) = async/g.exec(l))
54
+ .filter((n) => n && n[1])
55
+ .map((n) => n[1]);
56
+ }
57
+
58
+ const bundleJs = async ({ entryPoints, isServer, outfile, ...options }, plg) => {
59
+ const result = await esbuild.build({
60
+ bundle: true,
61
+ target: ['es2022'],
62
+ entryPoints,
63
+ outfile,
64
+ format: 'esm',
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
+ color: true,
67
+ keepNames: !isProd,
68
+ minify: isProd,
69
+ treeShaking: true,
70
+ jsxDev: !isProd,
71
+ jsx: 'automatic',
72
+ ...options,
73
+ define: isServer ? serverEnvs : clientEnvs,
74
+ plugins: [
75
+ resolve({
76
+ "/routemap.json": `${staticDir}/routemap.json`,
77
+ }),
78
+ plg,
79
+ ]
80
+ });
81
+ return result;
82
+ }
83
+
84
+ const buildRouteMap = (routes) => {
85
+ const buildStart = new Date();
86
+ const routemap = routes.reduce((acc, r) => {
87
+ const key = r.out.replace("index", "").replace(".js", "");
88
+ acc[key === "" ? "/" : key] = "/js" + r.out;
89
+ return acc
90
+ }, {});
91
+ const outfile = path.join(staticDir, "routemap.json");
92
+ fs.writeFileSync(outfile, JSON.stringify(routemap, null, 2));
93
+ recordSize(buildStart, outfile);
94
+ }
95
+
96
+ const bundlePages = async () => {
97
+ const appExists = fs.existsSync(path.join(pagesDir, "app.jsx"));
98
+ const importAppComp = appExists ? `import App from "@/pages/app";` : ""
99
+ const routes = walkdir.sync(pagesDir)
100
+ .filter((p) => p.includes("page.jsx"))
101
+ .map((r) => ({
102
+ in: r,
103
+ out: (r.replace(srcDir, "").replace("/pages", "").replace("/page.jsx", "") || "/index") + ".js",
104
+ }));
105
+ buildRouteMap(routes);
106
+ for (const r of routes) {
107
+ const buildStart = Date.now();
108
+ const outfile = `build/functions${r.out}`;
109
+ await bundleJs({ isServer: true, entryPoints: [r.in], outfile }, {
110
+ name: "page-plugin",
111
+ setup(build) {
112
+ build.onLoad({ filter: /\\*.page.jsx/, namespace: undefined }, (args) => {
113
+ const data = fs.readFileSync(args.path);
114
+ const newSrc = `
115
+ import renderPage from "edge-city/server/renderPage";
116
+ import init from "@/init";
117
+ ${importAppComp}
118
+
119
+ ${data.toString()}
120
+
121
+ export async function onRequest(context) {
122
+ await init();
123
+ return renderPage(Page, App, context.request);
124
+ }
125
+ `
126
+ return {
127
+ contents: newSrc,
128
+ loader: "jsx",
129
+ }
130
+ });
131
+ build.onLoad({ filter: /\\*.css/, namespace: undefined }, (args) => {
132
+ const css = fs.readFileSync(args.path);
133
+ generatedCss += css + "\n\n";
134
+ return {
135
+ contents: "",
136
+ loader: "file",
137
+ }
138
+ });
139
+ }
140
+ });
141
+ recordSize(buildStart, outfile);
142
+ }
143
+ await bundleJs({
144
+ isServer: false,
145
+ entryPoints: routes.map((r) => ({
146
+ in: r.in,
147
+ out: "." + r.out.replace(".js", ""),
148
+ })),
149
+ outdir: "build/static/js",
150
+ splitting: true,
151
+ entryNames: '[dir]/[name]',
152
+ chunkNames: 'chunks/[name]-[hash]'
153
+ }, {
154
+ name: "page-js-plugin",
155
+ setup(build) {
156
+ build.onLoad({ filter: /\\*.page.jsx/, namespace: undefined }, (args) => {
157
+ const data = fs.readFileSync(args.path);
158
+ const newSrc = `
159
+ import hydratePage from "edge-city/hydratePage";
160
+ ${importAppComp}
161
+
162
+ ${data.toString()}
163
+
164
+ const searchParams = new URL(import.meta.url).searchParams;
165
+ if (searchParams.get("hydrate") === "true") {
166
+ hydratePage(App)
167
+ }
168
+ `
169
+ return {
170
+ contents: newSrc,
171
+ loader: "jsx",
172
+ }
173
+ });
174
+ build.onLoad({ filter: /\\*.css/, namespace: undefined }, (args) => {
175
+ return {
176
+ contents: "",
177
+ loader: "file",
178
+ }
179
+ });
180
+ build.onLoad({ filter: /\\*.service.js/, namespace: undefined }, async (args) => {
181
+ const src = fs.readFileSync(args.path, "utf8");
182
+ const svcName = args.path.replace(srcDir, "").replace("/services/", "").replace(".service.js", "");
183
+ const funcs = parseExports(src);
184
+ const newSrc = `
185
+ import { defineRpc } from "edge-city/data";
186
+ ${funcs.map((f) => `export const ${f} = defineRpc("${svcName}/${f}")`).join("\n")}
187
+ `
188
+ return {
189
+ contents: newSrc,
190
+ loader: "js",
191
+ };
192
+ });
193
+ }
194
+ });
195
+ for (const r of routes) {
196
+ recordSize(Date.now(), `build/static/js${r.out}`);
197
+ }
198
+ }
199
+
200
+ const bundleServices = async () => {
201
+ const services = walkdir.sync(path.join(srcDir, "services"))
202
+ .filter((s) => s.includes(".service.js"));
203
+ for (const s of services) {
204
+ const dest = s.replace(srcDir, "").replace("/services", "").replace(".service.js", "");
205
+ const src = fs.readFileSync(s, 'utf8');
206
+ const funcs = parseExports(src);
207
+ for (const p of funcs) {
208
+ const buildStart = Date.now();
209
+ const result = await bundleJs({
210
+ isServer: true,
211
+ write: false,
212
+ entryPoints: [s],
213
+ // outfile: `build/functions/_rpc${dest}.js`,
214
+ },
215
+ {
216
+ name: "service-plugin",
217
+ setup(build) {
218
+ build.onLoad({ filter: /\\*.service.js/, namespace: undefined }, async (args) => {
219
+ const newSrc = `
220
+ import renderApi from "edge-city/server/renderApi";
221
+ import init from "@/init";
222
+ ${src.toString()}
223
+
224
+ export async function onRequest(c) {
225
+ await init();
226
+ return renderApi(${p}, c.request);
227
+ }
228
+ `
229
+ return {
230
+ contents: newSrc,
231
+ loader: "js",
232
+ };
233
+ });
234
+ }
235
+ })
236
+ fse.ensureDirSync(`build/functions/_rpc${dest}`)
237
+ const outfile = `build/functions/_rpc${dest}/${p}.js`;
238
+ fs.writeFileSync(outfile, result.outputFiles[0].contents);
239
+ recordSize(buildStart, outfile);
240
+ }
241
+ }
242
+ }
243
+
244
+ const bundleCss = async () => {
245
+ const result = await postcss([
246
+ autoprefixer(),
247
+ postcssCustomMedia(),
248
+ postcssNesting,
249
+ ]).process(generatedCss, { from: "app.css", to: "app.css" });
250
+ fse.ensureDirSync(`build/static/css`)
251
+ fs.writeFileSync(`${process.cwd()}/build/static/css/app.css`, result.toString());
252
+ }
253
+
254
+ const build = async (platform, setProd) => {
255
+ fse.removeSync(buildDir);
256
+ fse.ensureDirSync(buildDir);
257
+ fse.ensureDirSync(staticDir);
258
+ fse.copySync(inputStaticDir, staticDir);
259
+ if (setProd) {
260
+ process.env.NODE_ENV = "production";
261
+ isProd = true;
262
+ }
263
+ await bundlePages();
264
+ await bundleServices();
265
+ await bundleCss();
266
+ if (!setProd) {
267
+ // watch src files, imports and dotenv
268
+ console.log("watching for changes");
269
+ watch(srcDir, { recursive: true }, async (evt, name) => {
270
+ generatedCss = "";
271
+ await bundlePages();
272
+ await bundleServices();
273
+ await bundleCss();
274
+ });
275
+ }
276
+ if (platform === "cloudflare") {
277
+ // create _routes.json for cloudflare which only includes the pages and services
278
+ }
279
+ }
280
+
281
+ yargs(hideBin(process.argv))
282
+ .scriptName("edge-city")
283
+ .usage('$0 <cmd> [args]')
284
+ .command('build', 'build the project', (y) => {
285
+ y.option('platform', {
286
+ alias: 'p',
287
+ description: 'The edge platform',
288
+ choices: ['cloudflare', 'vercel'],
289
+ })
290
+ .demandOption("p")
291
+ }, ({ platform }) => {
292
+ build(platform, true);
293
+ })
294
+ .command('dev', 'run the dev server', (y) => {
295
+ y.option('platform', {
296
+ alias: 'p',
297
+ type: 'string',
298
+ description: 'cloudflare or vercel',
299
+ choices: ['cloudflare', 'vercel']
300
+ })
301
+ }, ({ platform }) => {
302
+ build(platform, false);
303
+ })
304
+ .demandCommand(1)
305
+ .parse();
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/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 { state } 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
+ state.set({
19
+ router,
20
+ history,
21
+ helmetContext: {},
22
+ })
23
+ const root = document.getElementById("root");
24
+ hydrateRoot(root, _jsx(App, { helmetContext: {} }));
25
+ }
26
+
27
+ export default hydratePage;
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 StyleLink = ({ 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;
lib/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "edge-city",
3
+ "version": "0.5.0",
4
+ "type": "module",
5
+ "main": "client",
6
+ "engines": {
7
+ "node": ">= 20"
8
+ },
9
+ "scripts": {
10
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest index.test.js"
11
+ },
12
+ "dependencies": {
13
+ "history": "^5.3.0",
14
+ "radix3": "^1.0.0",
15
+ "isbot": "3.6.10"
16
+ },
17
+ "devDependencies": {
18
+ "autoprefixer": "^10.4.14",
19
+ "bytes": "3.1.2",
20
+ "esbuild": "0.17.19",
21
+ "yargs": "17.7.2",
22
+ "mime-types": "2.1.35",
23
+ "fs-extra": "11.1.1",
24
+ "ms": "2.1.3",
25
+ "picocolors": "1.0.0",
26
+ "postcss": "^8.4.21",
27
+ "postcss-custom-media": "^9.1.2",
28
+ "postcss-nesting": "^11.2.1",
29
+ "walkdir": "0.4.1",
30
+ "esbuild-plugin-resolve": "2.0.0",
31
+ "wrangler": "3.0.1",
32
+ "miniflare": "3.0.1",
33
+ "vite": "4.3.9",
34
+ "express": "4.18.2",
35
+ "node-watch": "0.7.3",
36
+ "dotenv": "16.0.3",
37
+ "jest": "29.5.0"
38
+ },
39
+ "peerDependencies": {
40
+ "react": "*",
41
+ "react-dom": "*",
42
+ "react-error-boundary": "*",
43
+ "react-helmet-async": "*"
44
+ },
45
+ "bin": {
46
+ "edge-city": "bin/cli.js"
47
+ },
48
+ "jest": {
49
+ "verbose": true
50
+ }
51
+ }
lib/router.js ADDED
@@ -0,0 +1,41 @@
1
+ import {
2
+ useState, useEffect, useTransition
3
+ } from "react";
4
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
5
+
6
+ export let state = {
7
+ get: () => globalThis._EDGE_ROUTER_STATE_,
8
+ set: (v) => {
9
+ globalThis._EDGE_ROUTER_STATE_ = v;
10
+ },
11
+ }
12
+
13
+ export const usePage = () => {
14
+ const { history, router } = state.get();
15
+ const [_, startTransition] = useTransition();
16
+ const [pathname, setPathname] = useState(history.location.pathname);
17
+ const Page = router.lookup(pathname) || router.lookup("/_404");
18
+ useEffect(() => {
19
+ return history.listen(({ location }) => {
20
+ // this causes 2 renders to happen but stops jitter or flash due to React.lazy
21
+ startTransition(() => {
22
+ setPathname(location.pathname);
23
+ })
24
+ });
25
+ }, []);
26
+ return Page;
27
+ }
28
+
29
+ export const useRouter = () => {
30
+ const { history, params } = state.get();
31
+ return {
32
+ pathname: history.location.pathname,
33
+ query: new URLSearchParams(history.location.search),
34
+ params,
35
+ push: history.push,
36
+ replace: history.replace,
37
+ forward: history.forward,
38
+ back: history.back,
39
+ reload: () => window.location.reload(),
40
+ };
41
+ }
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
+ });
lib/server/renderApi.js ADDED
@@ -0,0 +1,21 @@
1
+ export const renderApi = async (fn, req) => {
2
+ const url = new URL(req.url);
3
+ const params = req.method === "POST" ? await req.json() : Object.fromEntries(url.searchParams);
4
+ try {
5
+ const result = await fn(params);
6
+ return new Response(JSON.stringify(result), {
7
+ headers: { 'Content-Type': 'application/json' },
8
+ status: 200,
9
+ });
10
+ } catch (err) {
11
+ console.log("err: renderApi", err);
12
+ const message = err.format ? err.format() : err.message;
13
+ const data = process.env.NODE_ENV === "development" ? { message, stack: err.stack } : { message };
14
+ return new Response(JSON.stringify(data), {
15
+ headers: { 'Content-Type': 'application/json' },
16
+ status: 400,
17
+ });
18
+ }
19
+ }
20
+
21
+ export default renderApi;
lib/server/renderPage.js ADDED
@@ -0,0 +1,160 @@
1
+ import React from "react";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { createMemoryHistory } from "history";
4
+ import { createRouter } from "radix3";
5
+ import { renderToReadableStream } from "react-dom/server";
6
+ import isbot from "isbot";
7
+ import routemap from '/routemap.json' assert {type: 'json'};
8
+ import { state } from "../router";
9
+
10
+ const stringToStream = (str) => {
11
+ return new ReadableStream({
12
+ start(controller) {
13
+ controller.enqueue(new TextEncoder().encode(str))
14
+ controller.close()
15
+ },
16
+ })
17
+ }
18
+
19
+ const createTagHtmlInjectTransformer = (
20
+ token,
21
+ oneTime,
22
+ inject,
23
+ ) => {
24
+ let injected = false
25
+
26
+ return new TransformStream({
27
+ transform(chunk, controller) {
28
+ if (!oneTime || !injected) {
29
+ const content = new TextDecoder().decode(chunk)
30
+ let index
31
+ if ((index = content.indexOf(token)) !== -1) {
32
+ const newContent =
33
+ content.slice(0, index) +
34
+ inject() +
35
+ content.slice(index, content.length)
36
+ injected = true
37
+ controller.enqueue(new TextEncoder().encode(newContent))
38
+ return
39
+ }
40
+ }
41
+ controller.enqueue(chunk)
42
+ },
43
+ })
44
+ }
45
+
46
+ const createEndHtmlInjectTransformer = (inject) => {
47
+ return new TransformStream({
48
+ flush(controller) {
49
+ controller.enqueue(new TextEncoder().encode(inject()))
50
+ },
51
+ transform(chunk, controller) {
52
+ controller.enqueue(chunk)
53
+ },
54
+ })
55
+ }
56
+
57
+ const render = async (children, {
58
+ injectBeforeBodyClose,
59
+ injectBeforeHeadClose,
60
+ injectBeforeEveryScript,
61
+ injectOnEnd,
62
+ isSeo,
63
+ }) => {
64
+ function transfromStream(stream) {
65
+ let out = stream
66
+ if (injectBeforeBodyClose) {
67
+ out = out.pipeThrough(
68
+ createTagHtmlInjectTransformer('</body>', true, injectBeforeBodyClose)
69
+ )
70
+ }
71
+ if (injectBeforeHeadClose) {
72
+ out = out.pipeThrough(
73
+ createTagHtmlInjectTransformer('</head>', true, injectBeforeHeadClose)
74
+ )
75
+ }
76
+ if (injectBeforeEveryScript) {
77
+ out = out.pipeThrough(
78
+ createTagHtmlInjectTransformer(
79
+ '<script>',
80
+ false,
81
+ injectBeforeEveryScript
82
+ )
83
+ )
84
+ }
85
+ if (injectOnEnd) {
86
+ out = out.pipeThrough(
87
+ createEndHtmlInjectTransformer(injectOnEnd)
88
+ )
89
+ }
90
+ return out;
91
+ }
92
+
93
+ try {
94
+ const reactStream = await renderToReadableStream(children)
95
+ if (isSeo) {
96
+ await reactStream.allReady;
97
+ }
98
+ return transfromStream(reactStream);
99
+ } catch (error) {
100
+ throw error;
101
+ }
102
+ }
103
+
104
+ const renderPage = async (Page, App, req) => {
105
+ const url = new URL(req.url);
106
+ const history = createMemoryHistory({
107
+ initialEntries: [url.pathname + url.search],
108
+ });
109
+ const router = createRouter({
110
+ strictTrailingSlash: true,
111
+ routes: Object.keys(routemap).reduce((acc, r) => {
112
+ acc[r] = React.lazy(() => Promise.resolve({ default: Page }));
113
+ return acc;
114
+ }, {}),
115
+ });
116
+ const jsScript = url.pathname === "/" ? "/index" : url.pathname;
117
+ const helmetContext = {};
118
+ globalThis._EDGE_DATA_ = { data: {}, subs: {} };
119
+ state.set({
120
+ router,
121
+ history,
122
+ helmetContext,
123
+ })
124
+ const stream = await render(
125
+ _jsxs("html", {
126
+ lang: "en",
127
+ children: [
128
+ _jsxs("head", {
129
+ children: [
130
+ _jsx("link", {
131
+ rel: "stylesheet",
132
+ href: "/css/app.css"
133
+ }),
134
+ ]
135
+ }),
136
+ _jsx("body", {
137
+ children: _jsx("div", {
138
+ id: "root",
139
+ children: _jsx(App, { helmetContext }),
140
+ })
141
+ })]
142
+ }), {
143
+ isSeo: isbot(req.headers.get('User-Agent')) || url.search.includes("ec_is_bot=true"),
144
+ injectBeforeHeadClose: () =>
145
+ Object.keys(helmetContext.helmet)
146
+ .map((k) => helmetContext.helmet[k].toString())
147
+ .join(''),
148
+ injectOnEnd: () => {
149
+ return ''
150
+ + `<script>globalThis._EDGE_DATA_ = ${JSON.stringify(globalThis._EDGE_DATA_)};</script>`
151
+ + `<script type="module" src="/js${jsScript}.js?hydrate=true"></script>`
152
+ }
153
+ });
154
+ return new Response(stream, {
155
+ headers: { 'Content-Type': 'text/html' },
156
+ status: 200,
157
+ });
158
+ }
159
+
160
+ export default renderPage;
packages/cli/index.js DELETED
@@ -1,388 +0,0 @@
1
- #!/usr/bin/env bun
2
- import meow from 'meow';
3
- import React from "react";
4
- import esbuild from 'esbuild';
5
- import resolve from 'esbuild-plugin-resolve';
6
- import { renderToReadableStream } from "react-dom/server";
7
- import fs, { mkdir } from "fs";
8
- import path from 'path';
9
- import walkdir from 'walkdir';
10
- import postcss from "postcss"
11
- import autoprefixer from "autoprefixer";
12
- import postcssCustomMedia from "postcss-custom-media";
13
- import postcssNesting from "postcss-nesting";
14
- import mimeTypes from "mime-types";
15
- import bytes from 'bytes';
16
- import pc from 'picocolors';
17
- import ms from 'ms';
18
- import pkg from "./package.json";
19
-
20
- const cli = meow(`
21
- parotta v${pkg.version}
22
-
23
- Usage
24
- $ parotta build cloudflare
25
- $ parotta build vercel
26
- `, {
27
- importMeta: import.meta,
28
- autoVersion: true,
29
- });
30
- if (cli.input.length != 2) {
31
- cli.showHelp();
32
- process.exit(0);
33
- }
34
-
35
-
36
-
37
- if (!globalThis.firstRun) {
38
- globalThis.firstRun = true
39
- const version = (await import(path.join(import.meta.dir, "package.json"))).default.version;
40
- console.log(`parotta v${version}`)
41
- console.log(`running with cwd=${path.basename(process.cwd())} node_env=${process.env.NODE_ENV}`);
42
- } else {
43
- console.log(`server reloading`);
44
- }
45
- const isProd = process.env.NODE_ENV === "production";
46
- const routes = walkdir.sync(path.join(process.cwd(), "pages"))
47
- .filter((p) => p.includes("page.jsx"));
48
- const services = walkdir.sync(path.join(process.cwd(), "services"))
49
- .map((s) => s.replace(process.cwd(), ""))
50
- .filter((s) => s.includes(".service.js"))
51
- .forEach((s) => {
52
- const serviceName = s.replace(".service.js", "");
53
- routes[serviceName + "/*"] = { key: serviceName, service: s };
54
- });
55
-
56
- const mapDeps = (dir) => {
57
- return walkdir.sync(path.join(process.cwd(), dir))
58
- .map((s) => s.replace(process.cwd(), ""))
59
- .filter((s) => s.includes(".jsx") || s.includes(".js"))
60
- .reduce((acc, s) => {
61
- if (s.includes(".jsx")) {
62
- acc['@' + s.replace(".jsx", "")] = s
63
- }
64
- if (s.includes(".js")) {
65
- acc['@' + s.replace(".js", "")] = s
66
- }
67
- return acc;
68
- }, {});
69
- }
70
-
71
- const staticDir = path.join(process.cwd(), "build", "static");
72
-
73
- const createDirs = () => {
74
- if (!fs.existsSync(staticDir)) {
75
- fs.mkdirSync(staticDir, { recursive: true });
76
- }
77
- }
78
-
79
- const buildImportMap = async () => {
80
- const packageJson = await import(path.join(process.cwd(), "package.json"));
81
- const config = packageJson.default.parotta || { hydrate: true };
82
- const devTag = !isProd ? "-dev-" : "";
83
- const devQueryParam = !isProd ? `?dev` : "";
84
- const nodeDeps = Object.keys(packageJson.default.dependencies).reduce((acc, dep) => {
85
- acc[dep] = `https://esm.sh/${dep}@${packageJson.default.dependencies[dep]}`;
86
- return acc;
87
- }, {})
88
- const components = mapDeps("components");
89
- const importmap = {
90
- "radix3": `https://esm.sh/radix3@1.0.1`,
91
- "history": "https://esm.sh/history@5.3.0",
92
- "react": `https://esm.sh/react@18.2.0${devQueryParam}`,
93
- [`react/jsx${devTag}runtime`]: `https://esm.sh/react@18.2.0${devQueryParam}/jsx${devTag}runtime`,
94
- "react-dom/client": `https://esm.sh/react-dom@18.2.0${devQueryParam}/client`,
95
- "nprogress": "https://esm.sh/nprogress@0.2.0",
96
- ...nodeDeps,
97
- ...components,
98
- }
99
- const outfile = path.join(staticDir, "importmap.json");
100
- fs.writeFileSync(outfile, JSON.stringify(importmap, null, 2));
101
- }
102
-
103
- const buildRouteMap = () => {
104
- const routemap = routes.reduce((acc, p) => {
105
- const r = p.replace(process.cwd(), "");
106
- const key = r.replace("/pages", "").replace("/page.jsx", "")
107
- acc[key === "" ? "/" : key] = r;
108
- return acc
109
- }, {});
110
- const outfile = path.join(staticDir, "routemap.json");
111
- fs.writeFileSync(outfile, JSON.stringify(routemap, null, 2));
112
- }
113
-
114
- const buildServer = async (r) => {
115
- const buildStart = Date.now();
116
- const shortName = r.replace(process.cwd(), "").replace("/pages", "");
117
- const outfile = `${process.cwd()}/build/functions${shortName.replace("page.jsx", "index.js")}`;
118
- const result = await esbuild.build({
119
- bundle: true,
120
- target: ['es2022'],
121
- entryPoints: [r],
122
- outfile: outfile,
123
- format: 'esm',
124
- keepNames: true,
125
- external: ["node:*"],
126
- color: true,
127
- treeShaking: true,
128
- // metafile: true,
129
- jsxDev: !isProd,
130
- jsx: 'automatic',
131
- define: {
132
- 'process.env.NODE_ENV': `"${process.env.NODE_ENV}"`,
133
- },
134
- plugins: [resolve({
135
- "/static/routemap.json": `${staticDir}/routemap.json`
136
- })]
137
- });
138
- // console.log(await analyzeMetafile(result.metafile))
139
- const outLength = fs.statSync(outfile).size;
140
- const builtTime = ms(Date.now() - buildStart);
141
- console.log(
142
- `${pc.green("✓ Bundled")} ${outfile.replace(process.cwd() + "/", "")} ${pc.cyan(`(${bytes(outLength)})`)} ${pc.gray(`[${builtTime}]`)}`
143
- );
144
- }
145
-
146
- const bundleBun = async (r) => {
147
- const buildStart = Date.now();
148
- const shortName = r.replace(process.cwd(), "").replace("/page.jsx", "");
149
- const result = await Bun.build({
150
- entrypoints: [r],
151
- outdir: `${process.cwd()}/bb/functions/${shortName}`,
152
- });
153
- if (!result.success) {
154
- console.error("Build failed");
155
- for (const message of result.logs) {
156
- // Bun will pretty print the message object
157
- console.error(message);
158
- }
159
- }
160
- for (const o of result.outputs) {
161
- const outLength = (await o.arrayBuffer()).byteLength;
162
- const builtTime = ms(Date.now() - buildStart);
163
- console.log(
164
- `✓ Bundled ${o.kind} ${o.path.replace(process.cwd() + "/bb", "")} ${pc.cyan(`(${bytes(outLength)})`)} ${pc.gray(`[${builtTime}]`)}`
165
- );
166
- }
167
- }
168
-
169
- const main = async () => {
170
- createDirs();
171
- buildImportMap();
172
- buildRouteMap();
173
- for (const r of routes) {
174
- buildServer(r);
175
- }
176
- }
177
-
178
- main();
179
-
180
- // const createServerRouter = async () => {
181
- // const routes = {};
182
- // const dirs = walkdir.sync(path.join(process.cwd(), "pages"))
183
- // .map((s) => s.replace(process.cwd(), "")
184
- // .replace("/pages", "")
185
- // // .replaceAll("[", ":")
186
- // // .replaceAll("]", "")
187
- // )
188
-
189
- // dirs.filter((p) => p.includes('page.jsx'))
190
- // .map((s) => ({ path: s, route: s.replace("/page.jsx", "") }))
191
- // .forEach((page) => {
192
- // const key = page.route || "/";
193
- // routes[key] = { key: key, page: page.path };
194
- // });
195
- // walkdir.sync(path.join(process.cwd(), "static"))
196
- // .map((s) => s.replace(process.cwd(), "").replace("/static", ""))
197
- // .forEach((route) => {
198
- // routes[route] = { key: route, file: route }
199
- // });
200
-
201
- // return createRouter({
202
- // strictTrailingSlash: true,
203
- // routes: routes,
204
- // });
205
- // }
206
-
207
- // const createClientRouter = async () => {
208
- // const routes = await walkdir.sync(path.join(process.cwd(), "pages"))
209
- // .filter((p) => p.includes("page.jsx"))
210
- // .filter((p) => !p.includes("/_"))
211
- // .map((s) => s.replace(process.cwd(), ""))
212
- // .map((s) => s.replace("/pages", ""))
213
- // .map((s) => s.replace("/page.jsx", ""))
214
- // .reduce(async (accp, r) => {
215
- // const acc = await accp;
216
- // const src = await import(`${process.cwd()}/pages${r}/page.jsx`);
217
- // if (!result.success) {
218
- // console.error("Build failed");
219
- // for (const message of result.logs) {
220
- // // Bun will pretty print the message object
221
- // console.error(message);
222
- // }
223
- // }
224
- // acc[r === "" ? "/" : r] = src.default;
225
- // return acc
226
- // }, Promise.resolve({}));
227
- // // console.log(clientRoutes);
228
- // };
229
-
230
-
231
- // const serverRouter = await createServerRouter();
232
- // const clientRouter = await createClientRouter();
233
- // const transpiler = new Bun.Transpiler({
234
- // loader: "jsx",
235
- // autoImportJSX: true,
236
- // jsxOptimizationInline: true,
237
-
238
- // // TODO
239
- // // autoImportJSX: false,
240
- // // jsxOptimizationInline: false,
241
- // });
242
-
243
- // const renderApi = async (key, filePath, req) => {
244
- // const url = new URL(req.url);
245
- // const params = req.method === "POST" ? await req.json() : Object.fromEntries(url.searchParams);
246
- // const funcName = url.pathname.replace(`${key}/`, "");
247
- // const js = await import(path.join(process.cwd(), filePath));
248
- // try {
249
- // const result = await js[funcName](params);
250
- // return new Response(JSON.stringify(result), {
251
- // headers: { 'Content-Type': 'application/json' },
252
- // status: 200,
253
- // });
254
- // } catch (err) {
255
- // const message = err.format ? err.format() : err;
256
- // return new Response(JSON.stringify(message), {
257
- // headers: { 'Content-Type': 'application/json' },
258
- // status: 400,
259
- // });
260
- // }
261
-
262
- // }
263
-
264
- // const renderCss = async (src) => {
265
- // try {
266
- // const cssText = await Bun.file(src).text();
267
- // const result = await postcss([
268
- // autoprefixer(),
269
- // postcssCustomMedia(),
270
- // // postcssNormalize({ browsers: 'last 2 versions' }),
271
- // postcssNesting,
272
- // ]).process(cssText, { from: src, to: src });
273
- // return new Response(result.css, {
274
- // headers: { 'Content-Type': 'text/css' },
275
- // status: 200,
276
- // });
277
- // } catch (err) {
278
- // return new Response(`Not Found`, {
279
- // headers: { 'Content-Type': 'text/html' },
280
- // status: 404,
281
- // });
282
- // }
283
- // }
284
-
285
- // const renderJs = async (srcFile) => {
286
- // try {
287
- // const jsText = await Bun.file(srcFile).text();
288
- // const result = await transpiler.transform(jsText);
289
- // // inject code which calls the api for that function
290
- // const lines = result.split("\n");
291
- // // lines.unshift(`import React from "react";`);
292
-
293
- // // replace all .service imports which rpc interface
294
- // let addRpcImport = false;
295
- // lines.forEach((ln) => {
296
- // if (ln.includes(".service")) {
297
- // addRpcImport = true;
298
- // const [importName, serviceName] = ln.match(/\@\/services\/(.*)\.service/);
299
- // const funcsText = ln.replace(`from "${importName}"`, "").replace("import", "").replace("{", "").replace("}", "").replace(";", "");
300
- // const funcsName = funcsText.split(",");
301
- // funcsName.forEach((fnName) => {
302
- // lines.push(`const ${fnName} = rpc("${serviceName}/${fnName.trim()}")`);
303
- // })
304
- // }
305
- // })
306
- // if (addRpcImport) {
307
- // lines.unshift(`import { rpc } from "parotta/runtime";`);
308
- // }
309
- // // remove .css and .service imports
310
- // const filteredJsx = lines.filter((ln) => !ln.includes(`.css"`) && !ln.includes(`.service"`)).join("\n");
311
- // //.replaceAll("$jsx", "React.createElement");
312
- // return new Response(filteredJsx, {
313
- // headers: {
314
- // 'Content-Type': 'application/javascript',
315
- // },
316
- // status: 200,
317
- // });
318
- // } catch (err) {
319
- // return new Response(`Not Found`, {
320
- // headers: { 'Content-Type': 'text/html' },
321
- // status: 404,
322
- // });
323
- // }
324
- // }
325
-
326
- // const sendFile = async (src) => {
327
- // try {
328
- // const contentType = mimeTypes.lookup(src) || "application/octet-stream";
329
- // const stream = await Bun.file(src).stream();
330
- // return new Response(stream, {
331
- // headers: { 'Content-Type': contentType },
332
- // status: 200,
333
- // });
334
- // } catch (err) {
335
- // return new Response(`Not Found`, {
336
- // headers: { 'Content-Type': 'text/html' },
337
- // status: 404,
338
- // });
339
- // }
340
- // }
341
-
342
- // // const mf = new Miniflare({
343
- // // script: `
344
- // // addEventListener("fetch", (event) => {
345
- // // event.respondWith(new Response("Hello Miniflare!"));
346
- // // });
347
- // // `,
348
- // // });
349
- // // const res = await mf.dispatchFetch("http://localhost:3000/");
350
- // // console.log(await res.text()); // Hello Miniflare!
351
-
352
- // const server = async (req) => {
353
- // const url = new URL(req.url);
354
- // console.log(req.method, url.pathname);
355
- // // maybe this is needed
356
- // if (url.pathname.startsWith("/parotta/")) {
357
- // return renderJs(path.join(import.meta.dir, url.pathname.replace("/parotta/", "")));
358
- // }
359
- // if (url.pathname.endsWith(".css")) {
360
- // return renderCss(path.join(process.cwd(), url.pathname));
361
- // }
362
- // if (url.pathname.endsWith(".js") || url.pathname.endsWith(".jsx")) {
363
- // return renderJs(path.join(process.cwd(), url.pathname));
364
- // }
365
- // const match = serverRouter.lookup(url.pathname);
366
- // if (match && !match.key.includes("/_")) {
367
- // if (match.file) {
368
- // return sendFile(path.join(process.cwd(), `/static${match.file}`));
369
- // }
370
- // if (match.page && req.headers.get("Accept")?.includes('text/html')) {
371
- // return renderPage(url);
372
- // }
373
- // if (match.service) {
374
- // return renderApi(match.key, match.service, req);
375
- // }
376
- // }
377
- // if (req.headers.get("Accept")?.includes('text/html')) {
378
- // // not found html page
379
- // return renderPage(new URL(`${url.protocol}//${url.host}/_404`));
380
- // }
381
- // // not found generic page
382
- // return new Response(`{"message": "not found"}`, {
383
- // headers: { 'Content-Type': 'application/json' },
384
- // status: 404,
385
- // });
386
- // }
387
-
388
- // export default server;
packages/cli/package.json DELETED
@@ -1,27 +0,0 @@
1
- {
2
- "name": "parotta-cli",
3
- "version": "0.5.0",
4
- "type": "module",
5
- "dependencies": {
6
- "autoprefixer": "^10.4.14",
7
- "bytes": "3.1.2",
8
- "esbuild": "0.17.19",
9
- "meow": "12.0.1",
10
- "mime-types": "2.1.35",
11
- "ms": "2.1.3",
12
- "parotta-runtime": "workspace:*",
13
- "picocolors": "1.0.0",
14
- "postcss": "^8.4.21",
15
- "postcss-custom-media": "^9.1.2",
16
- "postcss-nesting": "^11.2.1",
17
- "walkdir": "0.4.1",
18
- "esbuild-plugin-resolve": "2.0.0"
19
- },
20
- "peerDependencies": {
21
- "react": "*",
22
- "react-dom": "*"
23
- },
24
- "bin": {
25
- "parotta": "index.js"
26
- }
27
- }
packages/example/.vscode/extensions.json DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "recommendations": [
3
- "ms-playwright.playwright"
4
- ]
5
- }
packages/example/Dockerfile DELETED
@@ -1,8 +0,0 @@
1
- FROM oven/bun:0.5.8
2
-
3
- ENV NODE_ENV production
4
-
5
- WORKDIR /app
6
- COPY . /app
7
-
8
- CMD ["bun", "start"]
packages/example/components/Counter/Counter.jsx DELETED
@@ -1,16 +0,0 @@
1
- import React, { useState } from "react";
2
-
3
- const Counter = () => {
4
- const [count, setCount] = useState(5);
5
- return (
6
- <div>
7
- <button onClick={() => setCount(count - 1)}>-</button>
8
- <span className="count">
9
- {count}
10
- </span>
11
- <button onClick={() => setCount(count + 1)}>+</button>
12
- </div>
13
- )
14
- }
15
-
16
- export default Counter;
packages/example/components/Layout/Layout.css DELETED
@@ -1,5 +0,0 @@
1
- .layout-header {
2
- & a {
3
- margin-right: 20px;
4
- }
5
- }
packages/example/components/Layout/Layout.jsx DELETED
@@ -1,19 +0,0 @@
1
- import React from 'react';
2
- import { Link } from "parotta-runtime";
3
- import "./Layout.css";
4
-
5
- const Layout = ({ children }) => {
6
- return (
7
- <div>
8
- <header className="layout-header">
9
- <Link href="/about">About us</Link>
10
- <Link href="/todos">Todos</Link>
11
- </header>
12
- <div>
13
- {children}
14
- </div>
15
- </div>
16
- )
17
- }
18
-
19
- export default Layout;
packages/example/components/Todo/Todo.css DELETED
@@ -1,16 +0,0 @@
1
- .todo {
2
- & label {
3
- list-style-type: none;
4
- padding: 1em;
5
- border-radius: 0.5em;
6
- background-color: #ddd;
7
- margin-top: 1em;
8
- display: flex;
9
- justify-content: space-between;
10
- align-items: center;
11
- }
12
-
13
- & .done {
14
- text-decoration: line-through;
15
- }
16
- }
packages/example/components/Todo/Todo.jsx DELETED
@@ -1,94 +0,0 @@
1
- import { useState } from "react";
2
- // import PropTypes from 'prop-types';
3
- // import { Button, InputGroup } from "@blueprintjs/core";
4
- // import useMutation from '@/hooks/useMutation';
5
- // import { TodoPropType } from '@/models/Todo';
6
- import "./Todo.css";
7
-
8
- // const propTypes = {
9
- // // todo: PropTypes.shape(TodoPropType).isRequired,
10
- // }
11
-
12
- const Todo = ({ todo }) => {
13
- const [state, setState] = useState({ text: todo.text, editing: false });
14
- // const updateMutation = useMutation(async (data) => {
15
- // await onUpdate({ ...todo, ...data });
16
- // await refetch();
17
- // });
18
- // const deleteMutation = useMutation(async () => {
19
- // await onDelete(todo.id);
20
- // await refetch();
21
- // })
22
- return (
23
- <li className="todo">
24
- {!state.editing && (
25
- <label>
26
- <input
27
- type="checkbox"
28
- checked={todo.completed}
29
- onChange={(e) => {
30
- // updateMutation.mutate({ completed: e.target.checked })
31
- }}
32
- />{" "}
33
- <span className={todo.completed ? "done" : undefined}>{todo.text}</span>{" "}
34
- </label>
35
- )}
36
-
37
- {/* {state.editing && (
38
- <InputGroup
39
- autoFocus
40
- value={state.text}
41
- onChange={(e) => setState({ text: e.target.value, editing: true })}
42
- onKeyDown={async (e) => {
43
- if (e.key === "Enter") {
44
- await updateMutation.mutate({ text: state.text });
45
- setState({ text: todo.text, editing: false });
46
- } else if (e.key === "Escape") {
47
- setState({ text: todo.text, editing: false });
48
- }
49
- }}
50
- />
51
- )}
52
-
53
- <span>
54
- {!todo.completed && !state.editing && (
55
- <Button
56
- onClick={() => setState({ text: todo.text, editing: true })}
57
- >
58
- Edit
59
- </Button>
60
- )}
61
-
62
- {todo.completed && (
63
- <Button loading={deleteMutation.isMutating} onClick={deleteMutation.mutate}>
64
- Delete
65
- </Button>
66
- )}
67
-
68
- {state.editing && state.text !== todo.text && (
69
- <Button
70
- loading={updateMutation.isMutating}
71
- onClick={async () => {
72
- await updateMutation.mutate({ text: state.text });
73
- setState({ text: todo.text, editing: false });
74
- }}
75
- >
76
- Save
77
- </Button>
78
- )}
79
-
80
- {state.editing && (
81
- <Button
82
- onClick={() => setState({ text: todo.text, editing: false })}
83
- >
84
- Cancel
85
- </Button>
86
- )}
87
- </span> */}
88
- </li>
89
- );
90
- };
91
-
92
- // Todo.propTypes = propTypes;
93
-
94
- export default Todo;
packages/example/db/index.js DELETED
@@ -1,20 +0,0 @@
1
- import { drizzle } from 'drizzle-orm/neon-serverless';
2
- import { Pool } from '@neondatabase/serverless';
3
- import { highlight } from 'sql-highlight';
4
-
5
- export const pool = new Pool({ connectionString: process.env.PG_CONN_URL });
6
- const db = drizzle(pool, {
7
- logger: {
8
- logQuery: (query, params) => {
9
- const sqlString = params.reduce((acc, v, i) => acc.replaceAll("$" + (i + 1), v), query);
10
- console.log(highlight(sqlString));
11
- }
12
- }
13
- });
14
-
15
- export default db;
16
-
17
- // import { migrate } from 'drizzle-orm/neon-serverless/migrator';
18
- // export const migrateAll = async () => {
19
- // await migrate(db, { migrationsFolder: './db/migrations' });
20
- // }
packages/example/db/migrations/0000_empty_shatterstar.sql DELETED
@@ -1,7 +0,0 @@
1
- CREATE TABLE IF NOT EXISTS "todos" (
2
- "id" serial PRIMARY KEY NOT NULL,
3
- "text" text NOT NULL,
4
- "completed" boolean NOT NULL,
5
- "createdAt" date NOT NULL,
6
- "updatedAt" date
7
- );
packages/example/drizzle.config.json DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "out": "./db/migrations/",
3
- "schema": "./db/index.js"
4
- }
packages/example/main.js DELETED
@@ -1,6 +0,0 @@
1
- import server from "parotta/server.js";
2
-
3
- export default {
4
- port: 3000,
5
- fetch: server,
6
- }
packages/example/package.json DELETED
@@ -1,59 +0,0 @@
1
- {
2
- "name": "parotta-example",
3
- "type": "module",
4
- "scripts": {
5
- "start": "bun main.js",
6
- "build": "parotta build cloudflare",
7
- "run": "docker run -p 3000:3000 example",
8
- "test": "bun test",
9
- "test-e2e": "playwright test"
10
- },
11
- "dependencies": {
12
- "@neondatabase/serverless": "^0.2.9",
13
- "drizzle-orm": "0.26.0",
14
- "normalize.css": "^8.0.1",
15
- "react": "18.2.0",
16
- "react-aria-components": "1.0.0-alpha.3",
17
- "react-dom": "18.2.0",
18
- "react-error-boundary": "4.0.4",
19
- "react-helmet-async": "1.3.0",
20
- "react-hook-form": "7.43.9",
21
- "sql-highlight": "^4.3.2",
22
- "zod": "^3.21.4",
23
- "parotta-runtime": "workspace:*"
24
- },
25
- "devDependencies": {
26
- "parotta-cli": "workspace:*",
27
- "@playwright/test": "^1.31.2",
28
- "eslint": "^8.35.0",
29
- "eslint-config-react-app": "^7.0.1"
30
- },
31
- "parotta": {
32
- "hydrate": true,
33
- "css": [
34
- "node_modules/normalize.css/normalize.css"
35
- ]
36
- },
37
- "prettier": {
38
- "printWidth": 120
39
- },
40
- "eslintConfig": {
41
- "root": true,
42
- "parserOptions": {
43
- "ecmaVersion": "latest",
44
- "sourceType": "module"
45
- },
46
- "extends": [
47
- "eslint:recommended",
48
- "react-app"
49
- ],
50
- "ignorePatterns": [
51
- "build"
52
- ],
53
- "rules": {
54
- "react/prop-types": "warn",
55
- "react/react-in-jsx-scope": "off",
56
- "no-unused-vars": "warn"
57
- }
58
- }
59
- }
packages/example/pages/about/page.jsx DELETED
@@ -1,28 +0,0 @@
1
- import React from 'react';
2
- import { Link, useRouter } from "parotta-runtime";
3
- import { Helmet } from 'react-helmet-async';
4
- import Layout from '@/components/Layout/Layout';
5
- import "./page.css";
6
-
7
- export const Page = () => {
8
- const router = useRouter();
9
- return (
10
- <Layout>
11
- <div className="about-page">
12
- <Helmet>
13
- <title>About Page @ {router.pathname}</title>
14
- <meta name="description" content="Showcase of using parotta meta-framework." />
15
- </Helmet>
16
- <div>
17
- <h1>About Page @ {router.pathname}</h1>
18
- <p>Showcase of using parotta meta-framework.</p>
19
- </div>
20
- <footer>
21
- <Link href="/">Back</Link>
22
- </footer>
23
- </div>
24
- </Layout>
25
- )
26
- }
27
-
28
- export default Page;
packages/example/pages/page.css DELETED
@@ -1,17 +0,0 @@
1
- body {
2
- margin: 0;
3
- padding: 20px;
4
- margin: 0;
5
- background-color: turquoise;
6
-
7
- & .count {
8
- color: black;
9
- padding: 40px;
10
- font-size: 30px;
11
- font-weight: 600;
12
- }
13
-
14
- & footer {
15
- margin-top: 100px;
16
- }
17
- }
packages/example/pages/page.jsx DELETED
@@ -1,29 +0,0 @@
1
- import React, { useEffect } from 'react';
2
- import { useRouter } from "parotta-runtime";
3
- import Layout from '@/components/Layout/Layout';
4
- import Counter from "@/components/Counter/Counter";
5
- import { Helmet } from 'react-helmet-async';
6
- import "./page.css";
7
-
8
- const Page = () => {
9
- const router = useRouter();
10
- useEffect(() => {
11
-
12
- }, []);
13
- return (
14
- <Layout>
15
- <Helmet>
16
- <title>Parotta App</title>
17
- </Helmet>
18
- <div>
19
- <h1>Home Page</h1>
20
- <p>
21
- Path: {router.pathname}
22
- </p>
23
- <Counter />
24
- </div>
25
- </Layout>
26
- )
27
- }
28
-
29
- export default Page;
packages/example/pages/todos/page.css DELETED
@@ -1,71 +0,0 @@
1
- body {
2
- padding: 10px;
3
- background-color: turquoise;
4
- }
5
-
6
-
7
- :root {
8
- --spectrum-alias-border-color: black;
9
- --spectrum-global-color-gray-50: white;
10
- }
11
-
12
-
13
- .react-aria-TextField {
14
- --field-border: var(--spectrum-alias-border-color);
15
- --field-border-disabled: var(--spectrum-alias-border-color-disabled);
16
- --field-background: var(--spectrum-global-color-gray-50);
17
- --text-color: var(--spectrum-alias-text-color);
18
- --text-color-disabled: var(--spectrum-alias-text-color-disabled);
19
- --focus-ring-color: slateblue;
20
- --invalid-color: var(--spectrum-global-color-red-600);
21
-
22
- display: flex;
23
- flex-direction: column;
24
- width: fit-content;
25
-
26
- .react-aria-Input {
27
- padding: 0.286rem;
28
- margin: 0;
29
- border: 1px solid var(--field-border);
30
- border-radius: 6px;
31
- background: var(--field-background);
32
- font-size: 1.143rem;
33
- color: var(--text-color);
34
-
35
- &[aria-invalid] {
36
- border-color: var(--invalid-color);
37
- }
38
-
39
- &:focus {
40
- outline: none;
41
- border-color: var(--focus-ring-color);
42
- box-shadow: 0 0 0 1px var(--focus-ring-color);
43
- }
44
-
45
- &:disabled {
46
- border-color: var(--field-border-disabled);
47
- color: var(--text-color-disabled);
48
- }
49
- }
50
-
51
- [slot=description] {
52
- font-size: 12px;
53
- }
54
-
55
- [slot=errorMessage] {
56
- font-size: 12px;
57
- color: var(--invalid-color);
58
- }
59
- }
60
-
61
- @media (forced-colors: active) {
62
- .react-aria-TextField {
63
- --field-border: ButtonBorder;
64
- --field-border-disabled: GrayText;
65
- --field-background: Field;
66
- --text-color: FieldText;
67
- --text-color-disabled: GrayText;
68
- --focus-ring-color: Highlight;
69
- --invalid-color: LinkText;
70
- }
71
- }
packages/example/pages/todos/page.jsx DELETED
@@ -1,61 +0,0 @@
1
- import React, { Suspense } from 'react';
2
- import { Helmet } from 'react-helmet-async';
3
- import { useQuery, useMutation } from "parotta-runtime";
4
- import { useForm } from 'react-hook-form';
5
- import Todo from "@/components/Todo/Todo";
6
- import { TextField, Label, Input } from 'react-aria-components';
7
- import { Button } from 'react-aria-components';
8
- import { getTodos, createTodo } from "@/services/todos.service";
9
- import Layout from '@/components/Layout/Layout';
10
- import "./page.css";
11
-
12
- const TodoList = () => {
13
- const { data, refetch } = useQuery("todos", () => getTodos());
14
- const { mutate, isMutating, err } = useMutation(async ({ text }) => {
15
- await createTodo({
16
- text,
17
- completed: false,
18
- })
19
- await refetch();
20
- });
21
- const { register, handleSubmit, formState: { errors } } = useForm();
22
- console.log('err', err, errors);
23
- return (
24
- <div>
25
- <ul>
26
- {data.map((item) => (
27
- <Todo key={item.id} todo={item} />
28
- ))}
29
- </ul>
30
- <form onSubmit={handleSubmit(mutate)}>
31
- <TextField isRequired isReadOnly={isMutating}>
32
- <Label>Text (required)</Label>
33
- <Input {...register('text')} />
34
- {err?.text && <p>{err.text._errors[0]}</p>}
35
- </TextField>
36
- <Button type="submit" isDisabled={isMutating}>Add Todo</Button>
37
- {isMutating && <div>
38
- <p>Creating...</p>
39
- </div>}
40
- </form>
41
- </div>
42
- )
43
- }
44
-
45
- const Page = () => {
46
- return (
47
- <Layout>
48
- <h1>Todos</h1>
49
- <Helmet>
50
- <title>Todos Page</title>
51
- </Helmet>
52
- <div>
53
- <Suspense fallback="Loading...">
54
- <TodoList />
55
- </Suspense>
56
- </div>
57
- </Layout>
58
- )
59
- }
60
-
61
- export default Page;
packages/example/readme.md DELETED
@@ -1,18 +0,0 @@
1
- # Sample Parotta Application
2
-
3
- ## Requirements
4
-
5
- 1. bun >= v0.5.8
6
-
7
- ## Setup
8
-
9
- 1. `bun i`
10
- 2. `bunx playright install`
11
-
12
- ## Running
13
-
14
- `bun run dev`
15
-
16
- ## Testing
17
-
18
- `bun test`
packages/example/services/todos.service.test.js DELETED
@@ -1,41 +0,0 @@
1
- import { test, expect } from "bun:test";
2
- import { createSchema } from "./todos.service";
3
-
4
- test("validate createSchema", () => {
5
- expect(createSchema.safeParse({}).error.issues).toEqual([
6
- {
7
- "code": "invalid_type",
8
- "expected": "string",
9
- "message": "Required",
10
- "path": [
11
- "text"
12
- ],
13
- "received": "undefined"
14
- },
15
- {
16
- "code": "invalid_type",
17
- "expected": "boolean",
18
- "message": "Required",
19
- "path": [
20
- "completed"
21
- ],
22
- "received": "undefined"
23
- }
24
- ])
25
- expect(createSchema.safeParse({
26
- text: '',
27
- completed: true,
28
- }).error.issues).toEqual([
29
- {
30
- "code": "too_small",
31
- "exact": false,
32
- "inclusive": true,
33
- "message": "please enter some text",
34
- "minimum": 1,
35
- "path": [
36
- "text"
37
- ],
38
- "type": "string"
39
- },
40
- ])
41
- })
packages/runtime/index.js DELETED
@@ -1,315 +0,0 @@
1
- import React, {
2
- Suspense, createElement, createContext, useContext, useState, useEffect, useTransition, useCallback
3
- } from "react";
4
- import { HelmetProvider } from 'react-helmet-async';
5
- import { ErrorBoundary } from "react-error-boundary";
6
- import { createMemoryHistory } from "history";
7
- import { createRouter } from "radix3";
8
- import routes from '/static/routemap.json' assert {type: 'json'};
9
-
10
- /**
11
- * CSR related functions
12
- */
13
-
14
- export const domain = () => typeof window !== 'undefined' ? window.origin : "http://0.0.0.0:3000";
15
-
16
- export const rpc = (serviceName) => async (params = {}) => {
17
- const res = await fetch(`${domain()}/services/${serviceName}`, {
18
- method: "POST",
19
- headers: {
20
- "Accept": "application/json",
21
- "Content-Type": "application/json",
22
- },
23
- body: JSON.stringify(params),
24
- })
25
- return await res.json();
26
- }
27
-
28
- export const RpcContext = createContext(undefined);
29
-
30
- // global way to refresh maybe without being tied to a hook like refetch
31
- export const useInvalidate = () => {
32
- const ctx = useContext(RpcContext);
33
- return (regex) => {
34
- Object.keys(ctx)
35
- .filter((k) => regex.test(k))
36
- .forEach((k) => {
37
- delete ctx[k];
38
- });
39
- }
40
- }
41
-
42
- export const useRpcCache = (k) => {
43
- const ctx = useContext(RpcContext);
44
- const [_, rerender] = useState(false);
45
- const get = () => ctx[k]
46
- const set = (v) => {
47
- ctx[k] = v;
48
- rerender((c) => !c);
49
- }
50
- const invalidate = () => {
51
- delete ctx[k];
52
- rerender((c) => !c);
53
- }
54
- return {
55
- get,
56
- set,
57
- invalidate,
58
- }
59
- }
60
-
61
- /**
62
- *
63
- * @param {*} fn
64
- * @param {*} params
65
- * @returns
66
- */
67
- export const useQuery = (key, fn) => {
68
- const [isRefetching, setIsRefetching] = useState(false);
69
- const [err, setErr] = useState(null);
70
- const cache = useRpcCache(key);
71
- const refetch = useCallback(async () => {
72
- try {
73
- setIsRefetching(true);
74
- setErr(null);
75
- cache.set(await fn());
76
- } catch (err) {
77
- setErr(err);
78
- throw err;
79
- } finally {
80
- setIsRefetching(false);
81
- }
82
- }, [fn]);
83
- const value = cache.get();
84
- if (value) {
85
- if (value instanceof Promise) {
86
- throw value;
87
- } else if (value instanceof Error) {
88
- throw value;
89
- }
90
- return { data: value, isRefetching, err, refetch };
91
- }
92
- cache.set(fn().then((v) => cache.set(v)));
93
- throw cache.get();
94
- }
95
-
96
- export const useMutation = (fn) => {
97
- const [isMutating, setIsMutating] = useState(false);
98
- const [err, setErr] = useState(null);
99
- const mutate = useCallback(async (params) => {
100
- try {
101
- setIsMutating(true);
102
- setErr(null);
103
- await fn(params);
104
- } catch (err) {
105
- setErr(err)
106
- throw err;
107
- } finally {
108
- setIsMutating(false);
109
- }
110
- }, [fn])
111
- return {
112
- mutate,
113
- isMutating,
114
- err,
115
- }
116
- }
117
-
118
- export const RouterContext = createContext(undefined);
119
-
120
- const getMatch = (radixRouter, pathname) => {
121
- const matchedPage = radixRouter.lookup(pathname);
122
- if (!matchedPage) {
123
- return radixRouter.lookup("_404")
124
- }
125
- return matchedPage;
126
- }
127
-
128
- const getCssUrl = (pathname) => `/pages${pathname === "/" ? "" : pathname}/page.css`;
129
-
130
- export const App = ({ nProgress, history, radixRouter, rpcCache, helmetContext }) => {
131
- const [isPending, startTransition] = useTransition();
132
- const [match, setMatch] = useState(() => getMatch(radixRouter, history.location.pathname));
133
- useEffect(() => {
134
- return history.listen(({ location }) => {
135
- const href = getCssUrl(location.pathname);
136
- // const isLoaded = Array.from(document.getElementsByTagName("link"))
137
- // .map((link) => link.href.replace(window.origin, "")).includes(href);
138
- // if (!isLoaded) {
139
- // const link = document.createElement('link');
140
- // link.setAttribute("rel", "stylesheet");
141
- // link.setAttribute("type", "text/css");
142
- // link.onload = () => {
143
- // nProgress.start();
144
- // startTransition(() => {
145
- // setMatch(getMatch(radixRouter, location.pathname));
146
- // })
147
- // };
148
- // link.setAttribute("href", href);
149
- // document.getElementsByTagName("head")[0].appendChild(link);
150
- // } else {
151
- const link = document.createElement('link');
152
- link.setAttribute("rel", "stylesheet");
153
- link.setAttribute("type", "text/css");
154
- link.setAttribute("href", href);
155
- document.getElementsByTagName("head")[0].appendChild(link);
156
- nProgress.start();
157
- startTransition(() => {
158
- setMatch(getMatch(radixRouter, location.pathname));
159
- })
160
- // }
161
- });
162
- }, []);
163
- useEffect(() => {
164
- if (!isPending) {
165
- nProgress.done();
166
- }
167
- }, [isPending]);
168
- return createElement(HelmetProvider, {
169
- context: helmetContext,
170
- children: createElement(RpcContext.Provider, {
171
- value: rpcCache,
172
- children: createElement(RouterContext.Provider, {
173
- value: {
174
- history: history,
175
- params: match.params || {},
176
- },
177
- children: createElement(ErrorBoundary, {
178
- onError: (err) => console.log(err),
179
- fallback: createElement("p", {}, "Oops something went wrong"),
180
- children: createElement(Suspense, {
181
- fallback: createElement("p", {}, "Loading..."),
182
- children: createElement(match, {}),
183
- }),
184
- }),
185
- }),
186
- }),
187
- });
188
- }
189
-
190
- export const useRouter = () => {
191
- const { history, params } = useContext(RouterContext);
192
- return {
193
- pathname: history.location.pathname,
194
- query: new URLSearchParams(history.location.search),
195
- params,
196
- push: history.push,
197
- replace: history.replace,
198
- forward: history.forward,
199
- back: history.back,
200
- reload: () => window.location.reload(),
201
- };
202
- }
203
-
204
- export const Link = (props) => {
205
- const router = useRouter();
206
- return createElement("a", {
207
- ...props,
208
- onMouseOver: (e) => {
209
- // Simple prefetching for now will work only with cache headers
210
- // fetch(getCssUrl(props.href));
211
- // fetch(getCssUrl(props.href).replace("css", "jsx"));
212
- },
213
- onClick: (e) => {
214
- e.preventDefault();
215
- if (props && props.onClick) {
216
- props.onClick(e);
217
- }
218
- router.push(props.href)
219
- },
220
- })
221
- }
222
-
223
- export const NavLink = ({ children, className, activeClassName, ...props }) => {
224
- const { pathname } = useRouter();
225
- const classNames = pathname === props.href ? [activeClassName, className] : [className];
226
- return createElement(Link, {
227
- children,
228
- className: classNames,
229
- ...props,
230
- })
231
- }
232
-
233
- /**
234
- * SSR related functions
235
- */
236
- export const renderPage = async () => {
237
- const clientRouter = createRouter({
238
- strictTrailingSlash: true,
239
- routes: Object.keys(routes).reduce((acc, r) => {
240
- acc[r] = React.lazy(() => import(`/pages${r}/page.jsx`));
241
- return acc;
242
- }, {}),
243
- });
244
- const history = createMemoryHistory({
245
- initialEntries: [url.pathname + url.search],
246
- });
247
- const helmetContext = {}
248
- const nProgress = { start: () => { }, done: () => { } }
249
- // const stream = await renderToReadableStream(
250
- // <html lang="en">
251
- // <head>
252
- // <link rel="stylesheet" href="https://unpkg.com/nprogress@0.2.0/nprogress.css" />
253
- // <link id="pageCss" rel="stylesheet" href={`/pages${url.pathname}/page.css`} />
254
- // <script type="importmap" src="/static/importmap.json" />
255
- // </head>
256
- // <body>
257
- // <App
258
- // nProgress={nProgress}
259
- // history={history}
260
- // radixRouter={clientRouter}
261
- // rpcCache={{}}
262
- // helmetContext={helmetContext}
263
- // />
264
- // {false &&
265
- // <>
266
- // <script type="module" defer={true} dangerouslySetInnerHTML={{
267
- // __html: `
268
- // import React from "react";
269
- // import { hydrateRoot } from "react-dom/client";
270
- // import { createBrowserHistory } from "history";
271
- // import nProgress from "nprogress";
272
- // import { createRouter } from "radix3";
273
- // import { App } from "parotta/runtime";
274
- // import routes from '/static/routemap.json' assert {type: 'json'};
275
- // // import sheet from './styles.css' assert { type: 'css' };
276
-
277
- // const history = createBrowserHistory();
278
- // const radixRouter = createRouter({
279
- // strictTrailingSlash: true,
280
- // routes: {
281
- // ${Object.keys(routes).map((r) => `"${r}": React.lazy(() => import("/pages${r}/page.jsx"))`).join(',\n ')}
282
- // },
283
- // });
284
-
285
- // hydrateRoot(document.body, React.createElement(App, {
286
- // nProgress,
287
- // history,
288
- // radixRouter,
289
- // rpcCache: {},
290
- // helmetContext: {},
291
- // }));`
292
- // }}>
293
- // </script>
294
- // </>
295
- // }
296
- // </body>
297
- // </html>
298
- // );
299
- const stream = await renderToReadableStream(React.createElement(App, {
300
- nProgress,
301
- history,
302
- radixRouter: clientRouter,
303
- rpcCache: {},
304
- helmetContext: helmetContext,
305
- }));
306
- // TODO:
307
- // if (bot || isCrawler) {
308
- // await stream.allReady
309
- // add helmetContext to head
310
- // }
311
- return new Response(stream, {
312
- headers: { 'Content-Type': 'text/html' },
313
- status: 200,
314
- });
315
- }
packages/runtime/package.json DELETED
@@ -1,14 +0,0 @@
1
- {
2
- "name": "parotta-runtime",
3
- "version": "0.5.0",
4
- "type": "module",
5
- "dependencies": {
6
- "history": "^5.3.0",
7
- "radix3": "^1.0.0"
8
- },
9
- "peerDependencies": {
10
- "react": "*",
11
- "react-error-boundary": "*",
12
- "react-helmet-async": "*"
13
- }
14
- }
pnpm-lock.yaml CHANGED
@@ -2,68 +2,23 @@ lockfileVersion: '6.0'
2
2
 
3
3
  importers:
4
4
 
5
- packages/cli:
5
+ docs:
6
6
  dependencies:
7
- autoprefixer:
8
- specifier: ^10.4.14
9
- version: 10.4.14(postcss@8.4.21)
7
+ '@markdoc/markdoc':
10
- bytes:
11
- specifier: 3.1.2
8
+ specifier: 0.2.2
12
- version: 3.1.2
9
+ version: 0.2.2
13
- esbuild:
14
- specifier: 0.17.19
15
- version: 0.17.19
16
- esbuild-plugin-resolve:
17
- specifier: 2.0.0
18
- version: 2.0.0
19
- meow:
20
- specifier: 12.0.1
21
- version: 12.0.1
22
- mime-types:
23
- specifier: 2.1.35
24
- version: 2.1.35
25
- ms:
26
- specifier: 2.1.3
27
- version: 2.1.3
28
- parotta-runtime:
29
- specifier: workspace:*
30
- version: link:../runtime
31
- picocolors:
32
- specifier: 1.0.0
33
- version: 1.0.0
34
- postcss:
35
- specifier: ^8.4.21
36
- version: 8.4.21
37
- postcss-custom-media:
38
- specifier: ^9.1.2
39
- version: 9.1.2(postcss@8.4.21)
40
- postcss-nesting:
41
- specifier: ^11.2.1
42
- version: 11.2.1(postcss@8.4.21)
43
- react:
44
- specifier: '*'
45
- version: 18.2.0
46
- react-dom:
47
- specifier: '*'
48
- version: 18.2.0(react@18.2.0)
49
- walkdir:
50
- specifier: 0.4.1
51
- version: 0.4.1
52
10
 
53
- packages/example:
11
+ example:
54
12
  dependencies:
55
13
  '@neondatabase/serverless':
56
- specifier: ^0.2.9
14
+ specifier: 0.4.5
57
- version: 0.2.9
15
+ version: 0.4.5
58
16
  drizzle-orm:
59
17
  specifier: 0.26.0
60
- version: 0.26.0(@neondatabase/serverless@0.2.9)
18
+ version: 0.26.0(@neondatabase/serverless@0.4.5)(postgres@3.3.4)
61
- normalize.css:
19
+ edge-city:
62
- specifier: ^8.0.1
63
- version: 8.0.1
64
- parotta-runtime:
65
20
  specifier: workspace:*
66
- version: link:../runtime
21
+ version: link:../lib
67
22
  react:
68
23
  specifier: 18.2.0
69
24
  version: 18.2.0
@@ -92,33 +47,115 @@ importers:
92
47
  '@playwright/test':
93
48
  specifier: ^1.31.2
94
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
95
56
  eslint:
96
57
  specifier: ^8.35.0
97
58
  version: 8.35.0
98
59
  eslint-config-react-app:
99
60
  specifier: ^7.0.1
100
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
101
- parotta-cli:
65
+ prettier:
102
- specifier: workspace:*
66
+ specifier: ^2.8.8
103
- version: link:../cli
67
+ version: 2.8.8
104
-
68
+ vite:
105
- packages/runtime:
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:
106
76
  dependencies:
107
77
  history:
108
78
  specifier: ^5.3.0
109
79
  version: 5.3.0
80
+ isbot:
81
+ specifier: 3.6.10
82
+ version: 3.6.10
110
83
  radix3:
111
84
  specifier: ^1.0.0
112
85
  version: 1.0.0
113
86
  react:
114
87
  specifier: '*'
115
88
  version: 18.2.0
89
+ react-dom:
90
+ specifier: '*'
91
+ version: 18.2.0(react@18.2.0)
116
92
  react-error-boundary:
117
93
  specifier: '*'
118
94
  version: 4.0.4(react@18.2.0)
119
95
  react-helmet-async:
120
96
  specifier: '*'
121
97
  version: 1.3.0(react-dom@18.2.0)(react@18.2.0)
98
+ devDependencies:
99
+ autoprefixer:
100
+ specifier: ^10.4.14
101
+ version: 10.4.14(postcss@8.4.21)
102
+ bytes:
103
+ specifier: 3.1.2
104
+ version: 3.1.2
105
+ dotenv:
106
+ specifier: 16.0.3
107
+ version: 16.0.3
108
+ esbuild:
109
+ specifier: 0.17.19
110
+ version: 0.17.19
111
+ esbuild-plugin-resolve:
112
+ specifier: 2.0.0
113
+ version: 2.0.0
114
+ express:
115
+ specifier: 4.18.2
116
+ version: 4.18.2
117
+ fs-extra:
118
+ specifier: 11.1.1
119
+ version: 11.1.1
120
+ jest:
121
+ specifier: 29.5.0
122
+ version: 29.5.0
123
+ mime-types:
124
+ specifier: 2.1.35
125
+ version: 2.1.35
126
+ miniflare:
127
+ specifier: 3.0.1
128
+ version: 3.0.1
129
+ ms:
130
+ specifier: 2.1.3
131
+ version: 2.1.3
132
+ node-watch:
133
+ specifier: 0.7.3
134
+ version: 0.7.3
135
+ picocolors:
136
+ specifier: 1.0.0
137
+ version: 1.0.0
138
+ postcss:
139
+ specifier: ^8.4.21
140
+ version: 8.4.21
141
+ postcss-custom-media:
142
+ specifier: ^9.1.2
143
+ version: 9.1.2(postcss@8.4.21)
144
+ postcss-nesting:
145
+ specifier: ^11.2.1
146
+ version: 11.2.1(postcss@8.4.21)
147
+ vite:
148
+ specifier: 4.3.9
149
+ version: 4.3.9
150
+ walkdir:
151
+ specifier: 0.4.1
152
+ version: 0.4.1
153
+ wrangler:
154
+ specifier: 3.0.1
155
+ version: 3.0.1
156
+ yargs:
157
+ specifier: 17.7.2
158
+ version: 17.7.2
122
159
 
123
160
  packages:
124
161
 
@@ -135,6 +172,7 @@ packages:
135
172
  engines: {node: '>=6.9.0'}
136
173
  dependencies:
137
174
  '@babel/highlight': 7.18.6
175
+ dev: true
138
176
 
139
177
  /@babel/compat-data@7.21.7:
140
178
  resolution: {integrity: sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==}
@@ -384,6 +422,7 @@ packages:
384
422
  /@babel/helper-validator-identifier@7.19.1:
385
423
  resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
386
424
  engines: {node: '>=6.9.0'}
425
+ dev: true
387
426
 
388
427
  /@babel/helper-validator-option@7.21.0:
389
428
  resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==}
@@ -420,6 +459,7 @@ packages:
420
459
  '@babel/helper-validator-identifier': 7.19.1
421
460
  chalk: 2.4.2
422
461
  js-tokens: 4.0.0
462
+ dev: true
423
463
 
424
464
  /@babel/parser@7.21.8:
425
465
  resolution: {integrity: sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==}
@@ -660,6 +700,15 @@ packages:
660
700
  '@babel/helper-plugin-utils': 7.21.5
661
701
  dev: true
662
702
 
703
+ /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.8):
704
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
705
+ peerDependencies:
706
+ '@babel/core': ^7.0.0-0
707
+ dependencies:
708
+ '@babel/core': 7.21.8
709
+ '@babel/helper-plugin-utils': 7.21.5
710
+ dev: true
711
+
663
712
  /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.8):
664
713
  resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
665
714
  peerDependencies:
@@ -1138,6 +1187,26 @@ packages:
1138
1187
  '@babel/plugin-transform-react-jsx': 7.21.5(@babel/core@7.21.8)
1139
1188
  dev: true
1140
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
+
1141
1210
  /@babel/plugin-transform-react-jsx@7.21.5(@babel/core@7.21.8):
1142
1211
  resolution: {integrity: sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==}
1143
1212
  engines: {node: '>=6.9.0'}
@@ -1465,6 +1534,61 @@ packages:
1465
1534
  to-fast-properties: 2.0.0
1466
1535
  dev: true
1467
1536
 
1537
+ /@bcoe/v8-coverage@0.2.3:
1538
+ resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
1539
+ dev: true
1540
+
1541
+ /@cloudflare/kv-asset-handler@0.2.0:
1542
+ resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==}
1543
+ dependencies:
1544
+ mime: 3.0.0
1545
+ dev: true
1546
+
1547
+ /@cloudflare/workerd-darwin-64@1.20230518.0:
1548
+ resolution: {integrity: sha512-reApIf2/do6GjLlajU6LbRYh8gm/XcaRtzGbF8jo5IzyDSsdStmfNuvq7qssZXG92219Yp1kuTgR9+D1GGZGbg==}
1549
+ engines: {node: '>=16'}
1550
+ cpu: [x64]
1551
+ os: [darwin]
1552
+ requiresBuild: true
1553
+ dev: true
1554
+ optional: true
1555
+
1556
+ /@cloudflare/workerd-darwin-arm64@1.20230518.0:
1557
+ resolution: {integrity: sha512-1l+xdbmPddqb2YIHd1YJ3YG/Fl1nhayzcxfL30xfNS89zJn9Xn3JomM0XMD4mk0d5GruBP3q8BQZ1Uo4rRLF3A==}
1558
+ engines: {node: '>=16'}
1559
+ cpu: [arm64]
1560
+ os: [darwin]
1561
+ requiresBuild: true
1562
+ dev: true
1563
+ optional: true
1564
+
1565
+ /@cloudflare/workerd-linux-64@1.20230518.0:
1566
+ resolution: {integrity: sha512-/pfR+YBpMOPr2cAlwjtInil0hRZjD8KX9LqK9JkfkEiaBH8CYhnJQcOdNHZI+3OjcY09JnQtEVC5xC4nbW7Bvw==}
1567
+ engines: {node: '>=16'}
1568
+ cpu: [x64]
1569
+ os: [linux]
1570
+ requiresBuild: true
1571
+ dev: true
1572
+ optional: true
1573
+
1574
+ /@cloudflare/workerd-linux-arm64@1.20230518.0:
1575
+ resolution: {integrity: sha512-q3HQvn3J4uEkE0cfDAGG8zqzSZrD47cavB/Tzv4mNutqwg6B4wL3ifjtGeB55tnP2K2KL0GVmX4tObcvpUF4BA==}
1576
+ engines: {node: '>=16'}
1577
+ cpu: [arm64]
1578
+ os: [linux]
1579
+ requiresBuild: true
1580
+ dev: true
1581
+ optional: true
1582
+
1583
+ /@cloudflare/workerd-windows-64@1.20230518.0:
1584
+ resolution: {integrity: sha512-vNEHKS5gKKduNOBYtQjcBopAmFT1iScuPWMZa2nJboSjOB9I/5oiVsUpSyk5Y2ARyrohXNz0y8D7p87YzTASWw==}
1585
+ engines: {node: '>=16'}
1586
+ cpu: [x64]
1587
+ os: [win32]
1588
+ requiresBuild: true
1589
+ dev: true
1590
+ optional: true
1591
+
1468
1592
  /@csstools/cascade-layer-name-parser@1.0.2(@csstools/css-parser-algorithms@2.1.1)(@csstools/css-tokenizer@2.1.1):
1469
1593
  resolution: {integrity: sha512-xm7Mgwej/wBfLoK0K5LfntmPJzoULayl1XZY9JYgQgT29JiqNw++sLnx95u5y9zCihblzkyaRYJrsRMhIBzRdg==}
1470
1594
  engines: {node: ^14 || ^16 || >=18}
@@ -1474,7 +1598,7 @@ packages:
1474
1598
  dependencies:
1475
1599
  '@csstools/css-parser-algorithms': 2.1.1(@csstools/css-tokenizer@2.1.1)
1476
1600
  '@csstools/css-tokenizer': 2.1.1
1477
- dev: false
1601
+ dev: true
1478
1602
 
1479
1603
  /@csstools/css-parser-algorithms@2.1.1(@csstools/css-tokenizer@2.1.1):
1480
1604
  resolution: {integrity: sha512-viRnRh02AgO4mwIQb2xQNJju0i+Fh9roNgmbR5xEuG7J3TGgxjnE95HnBLgsFJOJOksvcfxOUCgODcft6Y07cA==}
@@ -1483,12 +1607,12 @@ packages:
1483
1607
  '@csstools/css-tokenizer': ^2.1.1
1484
1608
  dependencies:
1485
1609
  '@csstools/css-tokenizer': 2.1.1
1486
- dev: false
1610
+ dev: true
1487
1611
 
1488
1612
  /@csstools/css-tokenizer@2.1.1:
1489
1613
  resolution: {integrity: sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA==}
1490
1614
  engines: {node: ^14 || ^16 || >=18}
1491
- dev: false
1615
+ dev: true
1492
1616
 
1493
1617
  /@csstools/media-query-list-parser@2.0.4(@csstools/css-parser-algorithms@2.1.1)(@csstools/css-tokenizer@2.1.1):
1494
1618
  resolution: {integrity: sha512-GyYot6jHgcSDZZ+tLSnrzkR7aJhF2ZW6d+CXH66mjy5WpAQhZD4HDke2OQ36SivGRWlZJpAz7TzbW6OKlEpxAA==}
@@ -1499,7 +1623,7 @@ packages:
1499
1623
  dependencies:
1500
1624
  '@csstools/css-parser-algorithms': 2.1.1(@csstools/css-tokenizer@2.1.1)
1501
1625
  '@csstools/css-tokenizer': 2.1.1
1502
- dev: false
1626
+ dev: true
1503
1627
 
1504
1628
  /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.13):
1505
1629
  resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==}
@@ -1508,7 +1632,34 @@ packages:
1508
1632
  postcss-selector-parser: ^6.0.10
1509
1633
  dependencies:
1510
1634
  postcss-selector-parser: 6.0.13
1511
- dev: false
1635
+ dev: true
1636
+
1637
+ /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3):
1638
+ resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==}
1639
+ peerDependencies:
1640
+ esbuild: '*'
1641
+ dependencies:
1642
+ esbuild: 0.16.3
1643
+ dev: true
1644
+
1645
+ /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3):
1646
+ resolution: {integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==}
1647
+ peerDependencies:
1648
+ esbuild: '*'
1649
+ dependencies:
1650
+ esbuild: 0.16.3
1651
+ escape-string-regexp: 4.0.0
1652
+ rollup-plugin-node-polyfills: 0.2.1
1653
+ dev: true
1654
+
1655
+ /@esbuild/android-arm64@0.16.3:
1656
+ resolution: {integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==}
1657
+ engines: {node: '>=12'}
1658
+ cpu: [arm64]
1659
+ os: [android]
1660
+ requiresBuild: true
1661
+ dev: true
1662
+ optional: true
1512
1663
 
1513
1664
  /@esbuild/android-arm64@0.17.19:
1514
1665
  resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
@@ -1516,7 +1667,25 @@ packages:
1516
1667
  cpu: [arm64]
1517
1668
  os: [android]
1518
1669
  requiresBuild: true
1519
- dev: false
1670
+ dev: true
1671
+ optional: true
1672
+
1673
+ /@esbuild/android-arm@0.15.18:
1674
+ resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==}
1675
+ engines: {node: '>=12'}
1676
+ cpu: [arm]
1677
+ os: [android]
1678
+ requiresBuild: true
1679
+ dev: true
1680
+ optional: true
1681
+
1682
+ /@esbuild/android-arm@0.16.3:
1683
+ resolution: {integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==}
1684
+ engines: {node: '>=12'}
1685
+ cpu: [arm]
1686
+ os: [android]
1687
+ requiresBuild: true
1688
+ dev: true
1520
1689
  optional: true
1521
1690
 
1522
1691
  /@esbuild/android-arm@0.17.19:
@@ -1525,7 +1694,16 @@ packages:
1525
1694
  cpu: [arm]
1526
1695
  os: [android]
1527
1696
  requiresBuild: true
1528
- dev: false
1697
+ dev: true
1698
+ optional: true
1699
+
1700
+ /@esbuild/android-x64@0.16.3:
1701
+ resolution: {integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==}
1702
+ engines: {node: '>=12'}
1703
+ cpu: [x64]
1704
+ os: [android]
1705
+ requiresBuild: true
1706
+ dev: true
1529
1707
  optional: true
1530
1708
 
1531
1709
  /@esbuild/android-x64@0.17.19:
@@ -1534,7 +1712,16 @@ packages:
1534
1712
  cpu: [x64]
1535
1713
  os: [android]
1536
1714
  requiresBuild: true
1537
- dev: false
1715
+ dev: true
1716
+ optional: true
1717
+
1718
+ /@esbuild/darwin-arm64@0.16.3:
1719
+ resolution: {integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==}
1720
+ engines: {node: '>=12'}
1721
+ cpu: [arm64]
1722
+ os: [darwin]
1723
+ requiresBuild: true
1724
+ dev: true
1538
1725
  optional: true
1539
1726
 
1540
1727
  /@esbuild/darwin-arm64@0.17.19:
@@ -1543,7 +1730,16 @@ packages:
1543
1730
  cpu: [arm64]
1544
1731
  os: [darwin]
1545
1732
  requiresBuild: true
1546
- dev: false
1733
+ dev: true
1734
+ optional: true
1735
+
1736
+ /@esbuild/darwin-x64@0.16.3:
1737
+ resolution: {integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==}
1738
+ engines: {node: '>=12'}
1739
+ cpu: [x64]
1740
+ os: [darwin]
1741
+ requiresBuild: true
1742
+ dev: true
1547
1743
  optional: true
1548
1744
 
1549
1745
  /@esbuild/darwin-x64@0.17.19:
@@ -1552,7 +1748,16 @@ packages:
1552
1748
  cpu: [x64]
1553
1749
  os: [darwin]
1554
1750
  requiresBuild: true
1555
- dev: false
1751
+ dev: true
1752
+ optional: true
1753
+
1754
+ /@esbuild/freebsd-arm64@0.16.3:
1755
+ resolution: {integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==}
1756
+ engines: {node: '>=12'}
1757
+ cpu: [arm64]
1758
+ os: [freebsd]
1759
+ requiresBuild: true
1760
+ dev: true
1556
1761
  optional: true
1557
1762
 
1558
1763
  /@esbuild/freebsd-arm64@0.17.19:
@@ -1561,7 +1766,16 @@ packages:
1561
1766
  cpu: [arm64]
1562
1767
  os: [freebsd]
1563
1768
  requiresBuild: true
1564
- dev: false
1769
+ dev: true
1770
+ optional: true
1771
+
1772
+ /@esbuild/freebsd-x64@0.16.3:
1773
+ resolution: {integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==}
1774
+ engines: {node: '>=12'}
1775
+ cpu: [x64]
1776
+ os: [freebsd]
1777
+ requiresBuild: true
1778
+ dev: true
1565
1779
  optional: true
1566
1780
 
1567
1781
  /@esbuild/freebsd-x64@0.17.19:
@@ -1570,7 +1784,16 @@ packages:
1570
1784
  cpu: [x64]
1571
1785
  os: [freebsd]
1572
1786
  requiresBuild: true
1573
- dev: false
1787
+ dev: true
1788
+ optional: true
1789
+
1790
+ /@esbuild/linux-arm64@0.16.3:
1791
+ resolution: {integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==}
1792
+ engines: {node: '>=12'}
1793
+ cpu: [arm64]
1794
+ os: [linux]
1795
+ requiresBuild: true
1796
+ dev: true
1574
1797
  optional: true
1575
1798
 
1576
1799
  /@esbuild/linux-arm64@0.17.19:
@@ -1579,34 +1802,79 @@ packages:
1579
1802
  cpu: [arm64]
1580
1803
  os: [linux]
1581
1804
  requiresBuild: true
1582
- dev: false
1805
+ dev: true
1583
1806
  optional: true
1584
1807
 
1585
- /@esbuild/linux-arm@0.17.19:
1808
+ /@esbuild/linux-arm@0.16.3:
1586
- resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
1809
+ resolution: {integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==}
1587
1810
  engines: {node: '>=12'}
1588
1811
  cpu: [arm]
1589
1812
  os: [linux]
1590
1813
  requiresBuild: true
1591
- dev: false
1814
+ dev: true
1592
1815
  optional: true
1593
1816
 
1594
- /@esbuild/linux-ia32@0.17.19:
1817
+ /@esbuild/linux-arm@0.17.19:
1595
- resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
1818
+ resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
1596
1819
  engines: {node: '>=12'}
1597
- cpu: [ia32]
1820
+ cpu: [arm]
1598
1821
  os: [linux]
1599
1822
  requiresBuild: true
1600
- dev: false
1823
+ dev: true
1601
1824
  optional: true
1602
1825
 
1603
- /@esbuild/linux-loong64@0.17.19:
1826
+ /@esbuild/linux-ia32@0.16.3:
1604
- resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
1827
+ resolution: {integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==}
1605
1828
  engines: {node: '>=12'}
1606
- cpu: [loong64]
1829
+ cpu: [ia32]
1607
1830
  os: [linux]
1608
1831
  requiresBuild: true
1609
- dev: false
1832
+ dev: true
1833
+ optional: true
1834
+
1835
+ /@esbuild/linux-ia32@0.17.19:
1836
+ resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
1837
+ engines: {node: '>=12'}
1838
+ cpu: [ia32]
1839
+ os: [linux]
1840
+ requiresBuild: true
1841
+ dev: true
1842
+ optional: true
1843
+
1844
+ /@esbuild/linux-loong64@0.15.18:
1845
+ resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==}
1846
+ engines: {node: '>=12'}
1847
+ cpu: [loong64]
1848
+ os: [linux]
1849
+ requiresBuild: true
1850
+ dev: true
1851
+ optional: true
1852
+
1853
+ /@esbuild/linux-loong64@0.16.3:
1854
+ resolution: {integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==}
1855
+ engines: {node: '>=12'}
1856
+ cpu: [loong64]
1857
+ os: [linux]
1858
+ requiresBuild: true
1859
+ dev: true
1860
+ optional: true
1861
+
1862
+ /@esbuild/linux-loong64@0.17.19:
1863
+ resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
1864
+ engines: {node: '>=12'}
1865
+ cpu: [loong64]
1866
+ os: [linux]
1867
+ requiresBuild: true
1868
+ dev: true
1869
+ optional: true
1870
+
1871
+ /@esbuild/linux-mips64el@0.16.3:
1872
+ resolution: {integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==}
1873
+ engines: {node: '>=12'}
1874
+ cpu: [mips64el]
1875
+ os: [linux]
1876
+ requiresBuild: true
1877
+ dev: true
1610
1878
  optional: true
1611
1879
 
1612
1880
  /@esbuild/linux-mips64el@0.17.19:
@@ -1615,7 +1883,16 @@ packages:
1615
1883
  cpu: [mips64el]
1616
1884
  os: [linux]
1617
1885
  requiresBuild: true
1618
- dev: false
1886
+ dev: true
1887
+ optional: true
1888
+
1889
+ /@esbuild/linux-ppc64@0.16.3:
1890
+ resolution: {integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==}
1891
+ engines: {node: '>=12'}
1892
+ cpu: [ppc64]
1893
+ os: [linux]
1894
+ requiresBuild: true
1895
+ dev: true
1619
1896
  optional: true
1620
1897
 
1621
1898
  /@esbuild/linux-ppc64@0.17.19:
@@ -1624,7 +1901,16 @@ packages:
1624
1901
  cpu: [ppc64]
1625
1902
  os: [linux]
1626
1903
  requiresBuild: true
1627
- dev: false
1904
+ dev: true
1905
+ optional: true
1906
+
1907
+ /@esbuild/linux-riscv64@0.16.3:
1908
+ resolution: {integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==}
1909
+ engines: {node: '>=12'}
1910
+ cpu: [riscv64]
1911
+ os: [linux]
1912
+ requiresBuild: true
1913
+ dev: true
1628
1914
  optional: true
1629
1915
 
1630
1916
  /@esbuild/linux-riscv64@0.17.19:
@@ -1633,7 +1919,16 @@ packages:
1633
1919
  cpu: [riscv64]
1634
1920
  os: [linux]
1635
1921
  requiresBuild: true
1636
- dev: false
1922
+ dev: true
1923
+ optional: true
1924
+
1925
+ /@esbuild/linux-s390x@0.16.3:
1926
+ resolution: {integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==}
1927
+ engines: {node: '>=12'}
1928
+ cpu: [s390x]
1929
+ os: [linux]
1930
+ requiresBuild: true
1931
+ dev: true
1637
1932
  optional: true
1638
1933
 
1639
1934
  /@esbuild/linux-s390x@0.17.19:
@@ -1642,7 +1937,16 @@ packages:
1642
1937
  cpu: [s390x]
1643
1938
  os: [linux]
1644
1939
  requiresBuild: true
1645
- dev: false
1940
+ dev: true
1941
+ optional: true
1942
+
1943
+ /@esbuild/linux-x64@0.16.3:
1944
+ resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==}
1945
+ engines: {node: '>=12'}
1946
+ cpu: [x64]
1947
+ os: [linux]
1948
+ requiresBuild: true
1949
+ dev: true
1646
1950
  optional: true
1647
1951
 
1648
1952
  /@esbuild/linux-x64@0.17.19:
@@ -1651,7 +1955,16 @@ packages:
1651
1955
  cpu: [x64]
1652
1956
  os: [linux]
1653
1957
  requiresBuild: true
1654
- dev: false
1958
+ dev: true
1959
+ optional: true
1960
+
1961
+ /@esbuild/netbsd-x64@0.16.3:
1962
+ resolution: {integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==}
1963
+ engines: {node: '>=12'}
1964
+ cpu: [x64]
1965
+ os: [netbsd]
1966
+ requiresBuild: true
1967
+ dev: true
1655
1968
  optional: true
1656
1969
 
1657
1970
  /@esbuild/netbsd-x64@0.17.19:
@@ -1660,7 +1973,16 @@ packages:
1660
1973
  cpu: [x64]
1661
1974
  os: [netbsd]
1662
1975
  requiresBuild: true
1663
- dev: false
1976
+ dev: true
1977
+ optional: true
1978
+
1979
+ /@esbuild/openbsd-x64@0.16.3:
1980
+ resolution: {integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==}
1981
+ engines: {node: '>=12'}
1982
+ cpu: [x64]
1983
+ os: [openbsd]
1984
+ requiresBuild: true
1985
+ dev: true
1664
1986
  optional: true
1665
1987
 
1666
1988
  /@esbuild/openbsd-x64@0.17.19:
@@ -1669,7 +1991,16 @@ packages:
1669
1991
  cpu: [x64]
1670
1992
  os: [openbsd]
1671
1993
  requiresBuild: true
1672
- dev: false
1994
+ dev: true
1995
+ optional: true
1996
+
1997
+ /@esbuild/sunos-x64@0.16.3:
1998
+ resolution: {integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==}
1999
+ engines: {node: '>=12'}
2000
+ cpu: [x64]
2001
+ os: [sunos]
2002
+ requiresBuild: true
2003
+ dev: true
1673
2004
  optional: true
1674
2005
 
1675
2006
  /@esbuild/sunos-x64@0.17.19:
@@ -1678,7 +2009,16 @@ packages:
1678
2009
  cpu: [x64]
1679
2010
  os: [sunos]
1680
2011
  requiresBuild: true
1681
- dev: false
2012
+ dev: true
2013
+ optional: true
2014
+
2015
+ /@esbuild/win32-arm64@0.16.3:
2016
+ resolution: {integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==}
2017
+ engines: {node: '>=12'}
2018
+ cpu: [arm64]
2019
+ os: [win32]
2020
+ requiresBuild: true
2021
+ dev: true
1682
2022
  optional: true
1683
2023
 
1684
2024
  /@esbuild/win32-arm64@0.17.19:
@@ -1687,7 +2027,16 @@ packages:
1687
2027
  cpu: [arm64]
1688
2028
  os: [win32]
1689
2029
  requiresBuild: true
1690
- dev: false
2030
+ dev: true
2031
+ optional: true
2032
+
2033
+ /@esbuild/win32-ia32@0.16.3:
2034
+ resolution: {integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==}
2035
+ engines: {node: '>=12'}
2036
+ cpu: [ia32]
2037
+ os: [win32]
2038
+ requiresBuild: true
2039
+ dev: true
1691
2040
  optional: true
1692
2041
 
1693
2042
  /@esbuild/win32-ia32@0.17.19:
@@ -1696,7 +2045,16 @@ packages:
1696
2045
  cpu: [ia32]
1697
2046
  os: [win32]
1698
2047
  requiresBuild: true
1699
- dev: false
2048
+ dev: true
2049
+ optional: true
2050
+
2051
+ /@esbuild/win32-x64@0.16.3:
2052
+ resolution: {integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==}
2053
+ engines: {node: '>=12'}
2054
+ cpu: [x64]
2055
+ os: [win32]
2056
+ requiresBuild: true
2057
+ dev: true
1700
2058
  optional: true
1701
2059
 
1702
2060
  /@esbuild/win32-x64@0.17.19:
@@ -1705,7 +2063,7 @@ packages:
1705
2063
  cpu: [x64]
1706
2064
  os: [win32]
1707
2065
  requiresBuild: true
1708
- dev: false
2066
+ dev: true
1709
2067
  optional: true
1710
2068
 
1711
2069
  /@eslint-community/eslint-utils@4.4.0(eslint@8.35.0):
@@ -1824,6 +2182,235 @@ packages:
1824
2182
  '@swc/helpers': 0.4.14
1825
2183
  dev: false
1826
2184
 
2185
+ /@istanbuljs/load-nyc-config@1.1.0:
2186
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
2187
+ engines: {node: '>=8'}
2188
+ dependencies:
2189
+ camelcase: 5.3.1
2190
+ find-up: 4.1.0
2191
+ get-package-type: 0.1.0
2192
+ js-yaml: 3.14.1
2193
+ resolve-from: 5.0.0
2194
+ dev: true
2195
+
2196
+ /@istanbuljs/schema@0.1.3:
2197
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
2198
+ engines: {node: '>=8'}
2199
+ dev: true
2200
+
2201
+ /@jest/console@29.5.0:
2202
+ resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==}
2203
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2204
+ dependencies:
2205
+ '@jest/types': 29.5.0
2206
+ '@types/node': 20.2.1
2207
+ chalk: 4.1.2
2208
+ jest-message-util: 29.5.0
2209
+ jest-util: 29.5.0
2210
+ slash: 3.0.0
2211
+ dev: true
2212
+
2213
+ /@jest/core@29.5.0:
2214
+ resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==}
2215
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2216
+ peerDependencies:
2217
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
2218
+ peerDependenciesMeta:
2219
+ node-notifier:
2220
+ optional: true
2221
+ dependencies:
2222
+ '@jest/console': 29.5.0
2223
+ '@jest/reporters': 29.5.0
2224
+ '@jest/test-result': 29.5.0
2225
+ '@jest/transform': 29.5.0
2226
+ '@jest/types': 29.5.0
2227
+ '@types/node': 20.2.1
2228
+ ansi-escapes: 4.3.2
2229
+ chalk: 4.1.2
2230
+ ci-info: 3.8.0
2231
+ exit: 0.1.2
2232
+ graceful-fs: 4.2.11
2233
+ jest-changed-files: 29.5.0
2234
+ jest-config: 29.5.0(@types/node@20.2.1)
2235
+ jest-haste-map: 29.5.0
2236
+ jest-message-util: 29.5.0
2237
+ jest-regex-util: 29.4.3
2238
+ jest-resolve: 29.5.0
2239
+ jest-resolve-dependencies: 29.5.0
2240
+ jest-runner: 29.5.0
2241
+ jest-runtime: 29.5.0
2242
+ jest-snapshot: 29.5.0
2243
+ jest-util: 29.5.0
2244
+ jest-validate: 29.5.0
2245
+ jest-watcher: 29.5.0
2246
+ micromatch: 4.0.5
2247
+ pretty-format: 29.5.0
2248
+ slash: 3.0.0
2249
+ strip-ansi: 6.0.1
2250
+ transitivePeerDependencies:
2251
+ - supports-color
2252
+ - ts-node
2253
+ dev: true
2254
+
2255
+ /@jest/environment@29.5.0:
2256
+ resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==}
2257
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2258
+ dependencies:
2259
+ '@jest/fake-timers': 29.5.0
2260
+ '@jest/types': 29.5.0
2261
+ '@types/node': 20.2.1
2262
+ jest-mock: 29.5.0
2263
+ dev: true
2264
+
2265
+ /@jest/expect-utils@29.5.0:
2266
+ resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==}
2267
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2268
+ dependencies:
2269
+ jest-get-type: 29.4.3
2270
+ dev: true
2271
+
2272
+ /@jest/expect@29.5.0:
2273
+ resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==}
2274
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2275
+ dependencies:
2276
+ expect: 29.5.0
2277
+ jest-snapshot: 29.5.0
2278
+ transitivePeerDependencies:
2279
+ - supports-color
2280
+ dev: true
2281
+
2282
+ /@jest/fake-timers@29.5.0:
2283
+ resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==}
2284
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2285
+ dependencies:
2286
+ '@jest/types': 29.5.0
2287
+ '@sinonjs/fake-timers': 10.2.0
2288
+ '@types/node': 20.2.1
2289
+ jest-message-util: 29.5.0
2290
+ jest-mock: 29.5.0
2291
+ jest-util: 29.5.0
2292
+ dev: true
2293
+
2294
+ /@jest/globals@29.5.0:
2295
+ resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==}
2296
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2297
+ dependencies:
2298
+ '@jest/environment': 29.5.0
2299
+ '@jest/expect': 29.5.0
2300
+ '@jest/types': 29.5.0
2301
+ jest-mock: 29.5.0
2302
+ transitivePeerDependencies:
2303
+ - supports-color
2304
+ dev: true
2305
+
2306
+ /@jest/reporters@29.5.0:
2307
+ resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==}
2308
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2309
+ peerDependencies:
2310
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
2311
+ peerDependenciesMeta:
2312
+ node-notifier:
2313
+ optional: true
2314
+ dependencies:
2315
+ '@bcoe/v8-coverage': 0.2.3
2316
+ '@jest/console': 29.5.0
2317
+ '@jest/test-result': 29.5.0
2318
+ '@jest/transform': 29.5.0
2319
+ '@jest/types': 29.5.0
2320
+ '@jridgewell/trace-mapping': 0.3.18
2321
+ '@types/node': 20.2.1
2322
+ chalk: 4.1.2
2323
+ collect-v8-coverage: 1.0.1
2324
+ exit: 0.1.2
2325
+ glob: 7.2.3
2326
+ graceful-fs: 4.2.11
2327
+ istanbul-lib-coverage: 3.2.0
2328
+ istanbul-lib-instrument: 5.2.1
2329
+ istanbul-lib-report: 3.0.0
2330
+ istanbul-lib-source-maps: 4.0.1
2331
+ istanbul-reports: 3.1.5
2332
+ jest-message-util: 29.5.0
2333
+ jest-util: 29.5.0
2334
+ jest-worker: 29.5.0
2335
+ slash: 3.0.0
2336
+ string-length: 4.0.2
2337
+ strip-ansi: 6.0.1
2338
+ v8-to-istanbul: 9.1.0
2339
+ transitivePeerDependencies:
2340
+ - supports-color
2341
+ dev: true
2342
+
2343
+ /@jest/schemas@29.4.3:
2344
+ resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==}
2345
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2346
+ dependencies:
2347
+ '@sinclair/typebox': 0.25.24
2348
+ dev: true
2349
+
2350
+ /@jest/source-map@29.4.3:
2351
+ resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==}
2352
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2353
+ dependencies:
2354
+ '@jridgewell/trace-mapping': 0.3.18
2355
+ callsites: 3.1.0
2356
+ graceful-fs: 4.2.11
2357
+ dev: true
2358
+
2359
+ /@jest/test-result@29.5.0:
2360
+ resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==}
2361
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2362
+ dependencies:
2363
+ '@jest/console': 29.5.0
2364
+ '@jest/types': 29.5.0
2365
+ '@types/istanbul-lib-coverage': 2.0.4
2366
+ collect-v8-coverage: 1.0.1
2367
+ dev: true
2368
+
2369
+ /@jest/test-sequencer@29.5.0:
2370
+ resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==}
2371
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2372
+ dependencies:
2373
+ '@jest/test-result': 29.5.0
2374
+ graceful-fs: 4.2.11
2375
+ jest-haste-map: 29.5.0
2376
+ slash: 3.0.0
2377
+ dev: true
2378
+
2379
+ /@jest/transform@29.5.0:
2380
+ resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==}
2381
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2382
+ dependencies:
2383
+ '@babel/core': 7.21.8
2384
+ '@jest/types': 29.5.0
2385
+ '@jridgewell/trace-mapping': 0.3.18
2386
+ babel-plugin-istanbul: 6.1.1
2387
+ chalk: 4.1.2
2388
+ convert-source-map: 2.0.0
2389
+ fast-json-stable-stringify: 2.1.0
2390
+ graceful-fs: 4.2.11
2391
+ jest-haste-map: 29.5.0
2392
+ jest-regex-util: 29.4.3
2393
+ jest-util: 29.5.0
2394
+ micromatch: 4.0.5
2395
+ pirates: 4.0.5
2396
+ slash: 3.0.0
2397
+ write-file-atomic: 4.0.2
2398
+ transitivePeerDependencies:
2399
+ - supports-color
2400
+ dev: true
2401
+
2402
+ /@jest/types@29.5.0:
2403
+ resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==}
2404
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
2405
+ dependencies:
2406
+ '@jest/schemas': 29.4.3
2407
+ '@types/istanbul-lib-coverage': 2.0.4
2408
+ '@types/istanbul-reports': 3.0.1
2409
+ '@types/node': 20.2.1
2410
+ '@types/yargs': 17.0.24
2411
+ chalk: 4.1.2
2412
+ dev: true
2413
+
1827
2414
  /@jridgewell/gen-mapping@0.3.3:
1828
2415
  resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
1829
2416
  engines: {node: '>=6.0.0'}
@@ -1858,8 +2445,25 @@ packages:
1858
2445
  '@jridgewell/sourcemap-codec': 1.4.14
1859
2446
  dev: true
1860
2447
 
2448
+ /@markdoc/markdoc@0.2.2:
2449
+ resolution: {integrity: sha512-0TiD9jmA5h5znN4lxo7HECAu3WieU5g5vUsfByeucrdR/x88hEilpt16EydFyJwJddQ/3w5HQgW7Ovy62r4cyw==}
2450
+ engines: {node: '>=14.7.0'}
2451
+ peerDependencies:
2452
+ '@types/react': '*'
2453
+ react: '*'
2454
+ peerDependenciesMeta:
2455
+ '@types/react':
2456
+ optional: true
2457
+ react:
2458
+ optional: true
2459
+ optionalDependencies:
2460
+ '@types/markdown-it': 12.2.3
2461
+ dev: false
2462
+
1861
- /@neondatabase/serverless@0.2.9:
2463
+ /@neondatabase/serverless@0.4.5:
1862
- resolution: {integrity: sha512-fp7gXG8rt+uP+UT2ReGoCrf8GYb25Tv6xklDtZEoe8XKkBtVyZO+sii5oLNRwhvTLkqt7FX49MBCh3Est9b2KQ==}
2464
+ resolution: {integrity: sha512-+wYPtiqrIimONiOvHczfEdstxNUSWZ0dY+MD9vFwHBdr4Vx1adRKIKWQivG1MJ7uRpWsZZwEFQ7qhDJrgnidqw==}
2465
+ dependencies:
2466
+ '@types/pg': 8.10.1
1863
2467
  dev: false
1864
2468
 
1865
2469
  /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1:
@@ -3104,40 +3708,143 @@ packages:
3104
3708
  resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
3105
3709
  dev: true
3106
3710
 
3711
+ /@sinclair/typebox@0.25.24:
3712
+ resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==}
3713
+ dev: true
3714
+
3715
+ /@sinonjs/commons@3.0.0:
3716
+ resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==}
3717
+ dependencies:
3718
+ type-detect: 4.0.8
3719
+ dev: true
3720
+
3721
+ /@sinonjs/fake-timers@10.2.0:
3722
+ resolution: {integrity: sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==}
3723
+ dependencies:
3724
+ '@sinonjs/commons': 3.0.0
3725
+ dev: true
3726
+
3107
3727
  /@swc/helpers@0.4.14:
3108
3728
  resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
3109
3729
  dependencies:
3110
3730
  tslib: 2.5.2
3111
3731
  dev: false
3112
3732
 
3113
- /@types/json-schema@7.0.11:
3733
+ /@types/babel__core@7.20.0:
3114
- resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
3734
+ resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==}
3735
+ dependencies:
3736
+ '@babel/parser': 7.21.8
3737
+ '@babel/types': 7.21.5
3738
+ '@types/babel__generator': 7.6.4
3739
+ '@types/babel__template': 7.4.1
3740
+ '@types/babel__traverse': 7.18.5
3115
3741
  dev: true
3116
3742
 
3117
- /@types/json5@0.0.29:
3743
+ /@types/babel__generator@7.6.4:
3118
- resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
3744
+ resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
3745
+ dependencies:
3746
+ '@babel/types': 7.21.5
3119
3747
  dev: true
3120
3748
 
3121
- /@types/minimist@1.2.2:
3749
+ /@types/babel__template@7.4.1:
3122
- resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==}
3750
+ resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
3751
+ dependencies:
3752
+ '@babel/parser': 7.21.8
3753
+ '@babel/types': 7.21.5
3123
- dev: false
3754
+ dev: true
3124
3755
 
3756
+ /@types/babel__traverse@7.18.5:
3757
+ resolution: {integrity: sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==}
3758
+ dependencies:
3759
+ '@babel/types': 7.21.5
3760
+ dev: true
3761
+
3762
+ /@types/graceful-fs@4.1.6:
3763
+ resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==}
3764
+ dependencies:
3125
- /@types/node@20.2.1:
3765
+ '@types/node': 20.2.1
3766
+ dev: true
3767
+
3768
+ /@types/istanbul-lib-coverage@2.0.4:
3769
+ resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
3770
+ dev: true
3771
+
3772
+ /@types/istanbul-lib-report@3.0.0:
3126
- resolution: {integrity: sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg==}
3773
+ resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==}
3774
+ dependencies:
3775
+ '@types/istanbul-lib-coverage': 2.0.4
3776
+ dev: true
3777
+
3778
+ /@types/istanbul-reports@3.0.1:
3779
+ resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==}
3780
+ dependencies:
3781
+ '@types/istanbul-lib-report': 3.0.0
3127
3782
  dev: true
3128
3783
 
3784
+ /@types/json-schema@7.0.11:
3785
+ resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
3786
+ dev: true
3787
+
3788
+ /@types/json5@0.0.29:
3789
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
3790
+ dev: true
3791
+
3129
- /@types/normalize-package-data@2.4.1:
3792
+ /@types/linkify-it@3.0.2:
3130
- resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
3793
+ resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==}
3794
+ dev: false
3795
+ optional: true
3796
+
3797
+ /@types/markdown-it@12.2.3:
3798
+ resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==}
3799
+ requiresBuild: true
3800
+ dependencies:
3801
+ '@types/linkify-it': 3.0.2
3802
+ '@types/mdurl': 1.0.2
3803
+ dev: false
3804
+ optional: true
3805
+
3806
+ /@types/mdurl@1.0.2:
3807
+ resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==}
3131
3808
  dev: false
3809
+ optional: true
3810
+
3811
+ /@types/node@20.2.1:
3812
+ resolution: {integrity: sha512-DqJociPbZP1lbZ5SQPk4oag6W7AyaGMO6gSfRwq3PWl4PXTwJpRQJhDq4W0kzrg3w6tJ1SwlvGZ5uKFHY13LIg==}
3132
3813
 
3133
3814
  /@types/parse-json@4.0.0:
3134
3815
  resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
3135
3816
  dev: true
3136
3817
 
3818
+ /@types/pg@8.10.1:
3819
+ resolution: {integrity: sha512-AmEHA/XxMxemQom5iDwP62FYNkv+gDDnetRG7v2N2dPtju7UKI7FknUimcZo7SodKTHtckYPzaTqUEvUKbVJEA==}
3820
+ dependencies:
3821
+ '@types/node': 20.2.1
3822
+ pg-protocol: 1.6.0
3823
+ pg-types: 4.0.1
3824
+ dev: false
3825
+
3826
+ /@types/prettier@2.7.2:
3827
+ resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==}
3828
+ dev: true
3829
+
3137
3830
  /@types/semver@7.5.0:
3138
3831
  resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==}
3139
3832
  dev: true
3140
3833
 
3834
+ /@types/stack-utils@2.0.1:
3835
+ resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
3836
+ dev: true
3837
+
3838
+ /@types/yargs-parser@21.0.0:
3839
+ resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
3840
+ dev: true
3841
+
3842
+ /@types/yargs@17.0.24:
3843
+ resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==}
3844
+ dependencies:
3845
+ '@types/yargs-parser': 21.0.0
3846
+ dev: true
3847
+
3141
3848
  /@typescript-eslint/eslint-plugin@5.59.6(@typescript-eslint/parser@5.59.6)(eslint@8.35.0)(typescript@5.0.4):
3142
3849
  resolution: {integrity: sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==}
3143
3850
  engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -3281,6 +3988,29 @@ packages:
3281
3988
  eslint-visitor-keys: 3.4.1
3282
3989
  dev: true
3283
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
+
3284
4014
  /acorn-jsx@5.3.2(acorn@8.8.2):
3285
4015
  resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
3286
4016
  peerDependencies:
@@ -3289,6 +4019,11 @@ packages:
3289
4019
  acorn: 8.8.2
3290
4020
  dev: true
3291
4021
 
4022
+ /acorn-walk@8.2.0:
4023
+ resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
4024
+ engines: {node: '>=0.4.0'}
4025
+ dev: true
4026
+
3292
4027
  /acorn@8.8.2:
3293
4028
  resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
3294
4029
  engines: {node: '>=0.4.0'}
@@ -3304,6 +4039,13 @@ packages:
3304
4039
  uri-js: 4.4.1
3305
4040
  dev: true
3306
4041
 
4042
+ /ansi-escapes@4.3.2:
4043
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
4044
+ engines: {node: '>=8'}
4045
+ dependencies:
4046
+ type-fest: 0.21.3
4047
+ dev: true
4048
+
3307
4049
  /ansi-regex@5.0.1:
3308
4050
  resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
3309
4051
  engines: {node: '>=8'}
@@ -3314,6 +4056,7 @@ packages:
3314
4056
  engines: {node: '>=4'}
3315
4057
  dependencies:
3316
4058
  color-convert: 1.9.3
4059
+ dev: true
3317
4060
 
3318
4061
  /ansi-styles@4.3.0:
3319
4062
  resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
@@ -3322,6 +4065,25 @@ packages:
3322
4065
  color-convert: 2.0.1
3323
4066
  dev: true
3324
4067
 
4068
+ /ansi-styles@5.2.0:
4069
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
4070
+ engines: {node: '>=10'}
4071
+ dev: true
4072
+
4073
+ /anymatch@3.1.3:
4074
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
4075
+ engines: {node: '>= 8'}
4076
+ dependencies:
4077
+ normalize-path: 3.0.0
4078
+ picomatch: 2.3.1
4079
+ dev: true
4080
+
4081
+ /argparse@1.0.10:
4082
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
4083
+ dependencies:
4084
+ sprintf-js: 1.0.3
4085
+ dev: true
4086
+
3325
4087
  /argparse@2.0.1:
3326
4088
  resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
3327
4089
  dev: true
@@ -3339,6 +4101,10 @@ packages:
3339
4101
  is-array-buffer: 3.0.2
3340
4102
  dev: true
3341
4103
 
4104
+ /array-flatten@1.1.1:
4105
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
4106
+ dev: true
4107
+
3342
4108
  /array-includes@3.1.6:
3343
4109
  resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
3344
4110
  engines: {node: '>= 0.4'}
@@ -3385,10 +4151,11 @@ packages:
3385
4151
  get-intrinsic: 1.2.1
3386
4152
  dev: true
3387
4153
 
3388
- /arrify@1.0.1:
4154
+ /as-table@1.0.55:
3389
- resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
4155
+ resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==}
4156
+ dependencies:
3390
- engines: {node: '>=0.10.0'}
4157
+ printable-characters: 1.0.42
3391
- dev: false
4158
+ dev: true
3392
4159
 
3393
4160
  /ast-types-flow@0.0.7:
3394
4161
  resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
@@ -3408,7 +4175,7 @@ packages:
3408
4175
  picocolors: 1.0.0
3409
4176
  postcss: 8.4.21
3410
4177
  postcss-value-parser: 4.2.0
3411
- dev: false
4178
+ dev: true
3412
4179
 
3413
4180
  /available-typed-arrays@1.0.5:
3414
4181
  resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
@@ -3426,6 +4193,47 @@ packages:
3426
4193
  deep-equal: 2.2.1
3427
4194
  dev: true
3428
4195
 
4196
+ /babel-jest@29.5.0(@babel/core@7.21.8):
4197
+ resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==}
4198
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4199
+ peerDependencies:
4200
+ '@babel/core': ^7.8.0
4201
+ dependencies:
4202
+ '@babel/core': 7.21.8
4203
+ '@jest/transform': 29.5.0
4204
+ '@types/babel__core': 7.20.0
4205
+ babel-plugin-istanbul: 6.1.1
4206
+ babel-preset-jest: 29.5.0(@babel/core@7.21.8)
4207
+ chalk: 4.1.2
4208
+ graceful-fs: 4.2.11
4209
+ slash: 3.0.0
4210
+ transitivePeerDependencies:
4211
+ - supports-color
4212
+ dev: true
4213
+
4214
+ /babel-plugin-istanbul@6.1.1:
4215
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
4216
+ engines: {node: '>=8'}
4217
+ dependencies:
4218
+ '@babel/helper-plugin-utils': 7.21.5
4219
+ '@istanbuljs/load-nyc-config': 1.1.0
4220
+ '@istanbuljs/schema': 0.1.3
4221
+ istanbul-lib-instrument: 5.2.1
4222
+ test-exclude: 6.0.0
4223
+ transitivePeerDependencies:
4224
+ - supports-color
4225
+ dev: true
4226
+
4227
+ /babel-plugin-jest-hoist@29.5.0:
4228
+ resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==}
4229
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4230
+ dependencies:
4231
+ '@babel/template': 7.20.7
4232
+ '@babel/types': 7.21.5
4233
+ '@types/babel__core': 7.20.0
4234
+ '@types/babel__traverse': 7.18.5
4235
+ dev: true
4236
+
3429
4237
  /babel-plugin-macros@3.1.0:
3430
4238
  resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
3431
4239
  engines: {node: '>=10', npm: '>=6'}
@@ -3475,6 +4283,37 @@ packages:
3475
4283
  resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==}
3476
4284
  dev: true
3477
4285
 
4286
+ /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.8):
4287
+ resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
4288
+ peerDependencies:
4289
+ '@babel/core': ^7.0.0
4290
+ dependencies:
4291
+ '@babel/core': 7.21.8
4292
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.8)
4293
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.8)
4294
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.8)
4295
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.8)
4296
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.8)
4297
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.8)
4298
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.8)
4299
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.8)
4300
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.8)
4301
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.8)
4302
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.8)
4303
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.8)
4304
+ dev: true
4305
+
4306
+ /babel-preset-jest@29.5.0(@babel/core@7.21.8):
4307
+ resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==}
4308
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4309
+ peerDependencies:
4310
+ '@babel/core': ^7.0.0
4311
+ dependencies:
4312
+ '@babel/core': 7.21.8
4313
+ babel-plugin-jest-hoist: 29.5.0
4314
+ babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.8)
4315
+ dev: true
4316
+
3478
4317
  /babel-preset-react-app@10.0.1:
3479
4318
  resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==}
3480
4319
  dependencies:
@@ -3503,6 +4342,61 @@ packages:
3503
4342
  resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
3504
4343
  dev: true
3505
4344
 
4345
+ /base64-js@1.5.1:
4346
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
4347
+ dev: true
4348
+
4349
+ /better-sqlite3@8.4.0:
4350
+ resolution: {integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==}
4351
+ requiresBuild: true
4352
+ dependencies:
4353
+ bindings: 1.5.0
4354
+ prebuild-install: 7.1.1
4355
+ dev: true
4356
+
4357
+ /binary-extensions@2.2.0:
4358
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
4359
+ engines: {node: '>=8'}
4360
+ dev: true
4361
+
4362
+ /bindings@1.5.0:
4363
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
4364
+ dependencies:
4365
+ file-uri-to-path: 1.0.0
4366
+ dev: true
4367
+
4368
+ /bl@4.1.0:
4369
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
4370
+ dependencies:
4371
+ buffer: 5.7.1
4372
+ inherits: 2.0.4
4373
+ readable-stream: 3.6.2
4374
+ dev: true
4375
+
4376
+ /blake3-wasm@2.1.5:
4377
+ resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
4378
+ dev: true
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
+
3506
4400
  /brace-expansion@1.1.11:
3507
4401
  resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
3508
4402
  dependencies:
@@ -3510,6 +4404,12 @@ packages:
3510
4404
  concat-map: 0.0.1
3511
4405
  dev: true
3512
4406
 
4407
+ /brace-expansion@2.0.1:
4408
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
4409
+ dependencies:
4410
+ balanced-match: 1.0.2
4411
+ dev: true
4412
+
3513
4413
  /braces@3.0.2:
3514
4414
  resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
3515
4415
  engines: {node: '>=8'}
@@ -3526,11 +4426,36 @@ packages:
3526
4426
  electron-to-chromium: 1.4.402
3527
4427
  node-releases: 2.0.10
3528
4428
  update-browserslist-db: 1.0.11(browserslist@4.21.5)
4429
+ dev: true
4430
+
4431
+ /bser@2.1.1:
4432
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
4433
+ dependencies:
4434
+ node-int64: 0.4.0
4435
+ dev: true
4436
+
4437
+ /buffer-from@1.1.2:
4438
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
4439
+ dev: true
4440
+
4441
+ /buffer@5.7.1:
4442
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
4443
+ dependencies:
4444
+ base64-js: 1.5.1
4445
+ ieee754: 1.2.1
4446
+ dev: true
4447
+
4448
+ /busboy@1.6.0:
4449
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
4450
+ engines: {node: '>=10.16.0'}
4451
+ dependencies:
4452
+ streamsearch: 1.1.0
4453
+ dev: true
3529
4454
 
3530
4455
  /bytes@3.1.2:
3531
4456
  resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
3532
4457
  engines: {node: '>= 0.8'}
3533
- dev: false
4458
+ dev: true
3534
4459
 
3535
4460
  /call-bind@1.0.2:
3536
4461
  resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
@@ -3544,23 +4469,33 @@ packages:
3544
4469
  engines: {node: '>=6'}
3545
4470
  dev: true
3546
4471
 
3547
- /camelcase-keys@8.0.2:
4472
+ /camelcase@5.3.1:
4473
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
4474
+ engines: {node: '>=6'}
4475
+ dev: true
4476
+
4477
+ /camelcase@6.3.0:
3548
- resolution: {integrity: sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==}
4478
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
3549
- engines: {node: '>=14.16'}
4479
+ engines: {node: '>=10'}
3550
- dependencies:
3551
- camelcase: 7.0.1
3552
- map-obj: 4.3.0
3553
- quick-lru: 6.1.1
3554
- type-fest: 2.19.0
3555
- dev: false
4480
+ dev: true
3556
4481
 
3557
4482
  /camelcase@7.0.1:
3558
4483
  resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==}
3559
4484
  engines: {node: '>=14.16'}
3560
- dev: false
4485
+ dev: true
3561
4486
 
3562
4487
  /caniuse-lite@1.0.30001488:
3563
4488
  resolution: {integrity: sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==}
4489
+ dev: true
4490
+
4491
+ /capnp-ts@0.7.0:
4492
+ resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==}
4493
+ dependencies:
4494
+ debug: 4.3.4
4495
+ tslib: 2.5.2
4496
+ transitivePeerDependencies:
4497
+ - supports-color
4498
+ dev: true
3564
4499
 
3565
4500
  /chalk@2.4.2:
3566
4501
  resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
@@ -3569,6 +4504,7 @@ packages:
3569
4504
  ansi-styles: 3.2.1
3570
4505
  escape-string-regexp: 1.0.5
3571
4506
  supports-color: 5.5.0
4507
+ dev: true
3572
4508
 
3573
4509
  /chalk@4.1.2:
3574
4510
  resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@@ -3578,15 +4514,83 @@ packages:
3578
4514
  supports-color: 7.2.0
3579
4515
  dev: true
3580
4516
 
4517
+ /chalk@5.2.0:
4518
+ resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==}
4519
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
4520
+ dev: true
4521
+
4522
+ /char-regex@1.0.2:
4523
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
4524
+ engines: {node: '>=10'}
4525
+ dev: true
4526
+
4527
+ /chokidar@3.5.3:
4528
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
4529
+ engines: {node: '>= 8.10.0'}
4530
+ dependencies:
4531
+ anymatch: 3.1.3
4532
+ braces: 3.0.2
4533
+ glob-parent: 5.1.2
4534
+ is-binary-path: 2.1.0
4535
+ is-glob: 4.0.3
4536
+ normalize-path: 3.0.0
4537
+ readdirp: 3.6.0
4538
+ optionalDependencies:
4539
+ fsevents: 2.3.2
4540
+ dev: true
4541
+
4542
+ /chownr@1.1.4:
4543
+ resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
4544
+ dev: true
4545
+
4546
+ /ci-info@3.8.0:
4547
+ resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
4548
+ engines: {node: '>=8'}
4549
+ dev: true
4550
+
4551
+ /cjs-module-lexer@1.2.2:
4552
+ resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
4553
+ dev: true
4554
+
4555
+ /cli-color@2.0.3:
4556
+ resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==}
4557
+ engines: {node: '>=0.10'}
4558
+ dependencies:
4559
+ d: 1.0.1
4560
+ es5-ext: 0.10.62
4561
+ es6-iterator: 2.0.3
4562
+ memoizee: 0.4.15
4563
+ timers-ext: 0.1.7
4564
+ dev: true
4565
+
4566
+ /cliui@8.0.1:
4567
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
4568
+ engines: {node: '>=12'}
4569
+ dependencies:
4570
+ string-width: 4.2.3
4571
+ strip-ansi: 6.0.1
4572
+ wrap-ansi: 7.0.0
4573
+ dev: true
4574
+
3581
4575
  /clsx@1.2.1:
3582
4576
  resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
3583
4577
  engines: {node: '>=6'}
3584
4578
  dev: false
3585
4579
 
4580
+ /co@4.6.0:
4581
+ resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
4582
+ engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
4583
+ dev: true
4584
+
4585
+ /collect-v8-coverage@1.0.1:
4586
+ resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==}
4587
+ dev: true
4588
+
3586
4589
  /color-convert@1.9.3:
3587
4590
  resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
3588
4591
  dependencies:
3589
4592
  color-name: 1.1.3
4593
+ dev: true
3590
4594
 
3591
4595
  /color-convert@2.0.1:
3592
4596
  resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
@@ -3597,11 +4601,17 @@ packages:
3597
4601
 
3598
4602
  /color-name@1.1.3:
3599
4603
  resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
4604
+ dev: true
3600
4605
 
3601
4606
  /color-name@1.1.4:
3602
4607
  resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
3603
4608
  dev: true
3604
4609
 
4610
+ /commander@9.5.0:
4611
+ resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
4612
+ engines: {node: ^12.20.0 || >=14}
4613
+ dev: true
4614
+
3605
4615
  /concat-map@0.0.1:
3606
4616
  resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
3607
4617
  dev: true
@@ -3610,10 +4620,35 @@ packages:
3610
4620
  resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
3611
4621
  dev: true
3612
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
+
3613
4635
  /convert-source-map@1.9.0:
3614
4636
  resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
3615
4637
  dev: true
3616
4638
 
4639
+ /convert-source-map@2.0.0:
4640
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
4641
+ dev: true
4642
+
4643
+ /cookie-signature@1.0.6:
4644
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
4645
+ dev: true
4646
+
4647
+ /cookie@0.5.0:
4648
+ resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
4649
+ engines: {node: '>= 0.6'}
4650
+ dev: true
4651
+
3617
4652
  /core-js-compat@3.30.2:
3618
4653
  resolution: {integrity: sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==}
3619
4654
  dependencies:
@@ -3644,26 +4679,48 @@ packages:
3644
4679
  resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
3645
4680
  engines: {node: '>=4'}
3646
4681
  hasBin: true
3647
- dev: false
4682
+ dev: true
4683
+
4684
+ /d@1.0.1:
4685
+ resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==}
4686
+ dependencies:
4687
+ es5-ext: 0.10.62
4688
+ type: 1.2.0
4689
+ dev: true
3648
4690
 
3649
4691
  /damerau-levenshtein@1.0.8:
3650
4692
  resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
3651
4693
  dev: true
3652
4694
 
4695
+ /data-uri-to-buffer@2.0.2:
4696
+ resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==}
4697
+ dev: true
4698
+
3653
- /debug@3.2.7:
4699
+ /debug@2.6.9:
3654
- resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
4700
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
3655
4701
  peerDependencies:
3656
4702
  supports-color: '*'
3657
4703
  peerDependenciesMeta:
3658
4704
  supports-color:
3659
4705
  optional: true
3660
4706
  dependencies:
3661
- ms: 2.1.3
4707
+ ms: 2.0.0
3662
4708
  dev: true
3663
4709
 
4710
+ /debug@3.2.7:
4711
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
4712
+ peerDependencies:
4713
+ supports-color: '*'
4714
+ peerDependenciesMeta:
4715
+ supports-color:
4716
+ optional: true
4717
+ dependencies:
4718
+ ms: 2.1.3
4719
+ dev: true
4720
+
3664
- /debug@4.3.4:
4721
+ /debug@4.3.4:
3665
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
4722
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
3666
- engines: {node: '>=6.0'}
4723
+ engines: {node: '>=6.0'}
3667
4724
  peerDependencies:
3668
4725
  supports-color: '*'
3669
4726
  peerDependenciesMeta:
@@ -3673,20 +4730,16 @@ packages:
3673
4730
  ms: 2.1.2
3674
4731
  dev: true
3675
4732
 
3676
- /decamelize-keys@2.0.1:
4733
+ /decompress-response@6.0.0:
3677
- resolution: {integrity: sha512-nrNeSCtU2gV3Apcmn/EZ+aR20zKDuNDStV67jPiupokD3sOAFeMzslLMCFdKv1sPqzwoe5ZUhsSW9IAVgKSL/Q==}
4734
+ resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
3678
- engines: {node: '>=14.16'}
4735
+ engines: {node: '>=10'}
3679
4736
  dependencies:
3680
- decamelize: 6.0.0
3681
- map-obj: 4.3.0
3682
- quick-lru: 6.1.1
3683
- type-fest: 3.11.0
4737
+ mimic-response: 3.1.0
3684
- dev: false
4738
+ dev: true
3685
4739
 
3686
- /decamelize@6.0.0:
4740
+ /dedent@0.7.0:
3687
- resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==}
4741
+ resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
3688
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
3689
- dev: false
4742
+ dev: true
3690
4743
 
3691
4744
  /deep-equal@2.2.1:
3692
4745
  resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==}
@@ -3711,10 +4764,20 @@ packages:
3711
4764
  which-typed-array: 1.1.9
3712
4765
  dev: true
3713
4766
 
4767
+ /deep-extend@0.6.0:
4768
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
4769
+ engines: {node: '>=4.0.0'}
4770
+ dev: true
4771
+
3714
4772
  /deep-is@0.1.4:
3715
4773
  resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
3716
4774
  dev: true
3717
4775
 
4776
+ /deepmerge@4.3.1:
4777
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
4778
+ engines: {node: '>=0.10.0'}
4779
+ dev: true
4780
+
3718
4781
  /define-properties@1.2.0:
3719
4782
  resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
3720
4783
  engines: {node: '>= 0.4'}
@@ -3723,6 +4786,37 @@ packages:
3723
4786
  object-keys: 1.1.1
3724
4787
  dev: true
3725
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
+
4799
+ /detect-libc@2.0.1:
4800
+ resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==}
4801
+ engines: {node: '>=8'}
4802
+ dev: true
4803
+
4804
+ /detect-newline@3.1.0:
4805
+ resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
4806
+ engines: {node: '>=8'}
4807
+ dev: true
4808
+
4809
+ /diff-sequences@29.4.3:
4810
+ resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==}
4811
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4812
+ dev: true
4813
+
4814
+ /difflib@0.2.4:
4815
+ resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==}
4816
+ dependencies:
4817
+ heap: 0.2.7
4818
+ dev: true
4819
+
3726
4820
  /dir-glob@3.0.1:
3727
4821
  resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
3728
4822
  engines: {node: '>=8'}
@@ -3744,7 +4838,37 @@ packages:
3744
4838
  esutils: 2.0.3
3745
4839
  dev: true
3746
4840
 
4841
+ /dotenv@16.0.3:
4842
+ resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
4843
+ engines: {node: '>=12'}
4844
+ dev: true
4845
+
4846
+ /dreamopt@0.8.0:
4847
+ resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==}
4848
+ engines: {node: '>=0.4.0'}
4849
+ dependencies:
4850
+ wordwrap: 1.0.0
4851
+ dev: true
4852
+
4853
+ /drizzle-kit@0.18.0:
4854
+ resolution: {integrity: sha512-43oH0XNWJDfMmVtDVnW8OV+tIs3xXDb1MjdsDiv0a7unQAylr0hpGG0HD5uEPWSbt7oxBots+hnYWxo98D0KAg==}
4855
+ hasBin: true
4856
+ dependencies:
4857
+ camelcase: 7.0.1
4858
+ chalk: 5.2.0
4859
+ commander: 9.5.0
4860
+ esbuild: 0.15.18
4861
+ esbuild-register: 3.4.2(esbuild@0.15.18)
4862
+ glob: 8.1.0
4863
+ hanji: 0.0.5
4864
+ json-diff: 0.9.0
4865
+ minimatch: 7.4.6
4866
+ zod: 3.21.4
4867
+ transitivePeerDependencies:
4868
+ - supports-color
4869
+ dev: true
4870
+
3747
- /drizzle-orm@0.26.0(@neondatabase/serverless@0.2.9):
4871
+ /drizzle-orm@0.26.0(@neondatabase/serverless@0.4.5)(postgres@3.3.4):
3748
4872
  resolution: {integrity: sha512-ztjhHehcuG5+lpGYxfT/L5I+yd/Z0dOf0fV3cS2ywBU01wkpxjwl4EJZVT7kVzjYfM8kwMGDghAPRPBCK0vULA==}
3749
4873
  peerDependencies:
3750
4874
  '@aws-sdk/client-rds-data': '>=3'
@@ -3803,20 +4927,47 @@ packages:
3803
4927
  sqlite3:
3804
4928
  optional: true
3805
4929
  dependencies:
3806
- '@neondatabase/serverless': 0.2.9
4930
+ '@neondatabase/serverless': 0.4.5
4931
+ postgres: 3.3.4
3807
4932
  dev: false
3808
4933
 
4934
+ /ee-first@1.1.1:
4935
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
4936
+ dev: true
4937
+
3809
4938
  /electron-to-chromium@1.4.402:
3810
4939
  resolution: {integrity: sha512-gWYvJSkohOiBE6ecVYXkrDgNaUjo47QEKK0kQzmWyhkH+yoYiG44bwuicTGNSIQRG3WDMsWVZJLRnJnLNkbWvA==}
4940
+ dev: true
4941
+
4942
+ /emittery@0.13.1:
4943
+ resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
4944
+ engines: {node: '>=12'}
4945
+ dev: true
4946
+
4947
+ /emoji-regex@8.0.0:
4948
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
4949
+ dev: true
3811
4950
 
3812
4951
  /emoji-regex@9.2.2:
3813
4952
  resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
3814
4953
  dev: true
3815
4954
 
4955
+ /encodeurl@1.0.2:
4956
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
4957
+ engines: {node: '>= 0.8'}
4958
+ dev: true
4959
+
4960
+ /end-of-stream@1.4.4:
4961
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
4962
+ dependencies:
4963
+ once: 1.4.0
4964
+ dev: true
4965
+
3816
4966
  /error-ex@1.3.2:
3817
4967
  resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
3818
4968
  dependencies:
3819
4969
  is-arrayish: 0.2.1
4970
+ dev: true
3820
4971
 
3821
4972
  /es-abstract@1.21.2:
3822
4973
  resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
@@ -3896,9 +5047,294 @@ packages:
3896
5047
  is-symbol: 1.0.4
3897
5048
  dev: true
3898
5049
 
5050
+ /es5-ext@0.10.62:
5051
+ resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==}
5052
+ engines: {node: '>=0.10'}
5053
+ requiresBuild: true
5054
+ dependencies:
5055
+ es6-iterator: 2.0.3
5056
+ es6-symbol: 3.1.3
5057
+ next-tick: 1.1.0
5058
+ dev: true
5059
+
5060
+ /es6-iterator@2.0.3:
5061
+ resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
5062
+ dependencies:
5063
+ d: 1.0.1
5064
+ es5-ext: 0.10.62
5065
+ es6-symbol: 3.1.3
5066
+ dev: true
5067
+
5068
+ /es6-symbol@3.1.3:
5069
+ resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==}
5070
+ dependencies:
5071
+ d: 1.0.1
5072
+ ext: 1.7.0
5073
+ dev: true
5074
+
5075
+ /es6-weak-map@2.0.3:
5076
+ resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==}
5077
+ dependencies:
5078
+ d: 1.0.1
5079
+ es5-ext: 0.10.62
5080
+ es6-iterator: 2.0.3
5081
+ es6-symbol: 3.1.3
5082
+ dev: true
5083
+
5084
+ /esbuild-android-64@0.15.18:
5085
+ resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==}
5086
+ engines: {node: '>=12'}
5087
+ cpu: [x64]
5088
+ os: [android]
5089
+ requiresBuild: true
5090
+ dev: true
5091
+ optional: true
5092
+
5093
+ /esbuild-android-arm64@0.15.18:
5094
+ resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==}
5095
+ engines: {node: '>=12'}
5096
+ cpu: [arm64]
5097
+ os: [android]
5098
+ requiresBuild: true
5099
+ dev: true
5100
+ optional: true
5101
+
5102
+ /esbuild-darwin-64@0.15.18:
5103
+ resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==}
5104
+ engines: {node: '>=12'}
5105
+ cpu: [x64]
5106
+ os: [darwin]
5107
+ requiresBuild: true
5108
+ dev: true
5109
+ optional: true
5110
+
5111
+ /esbuild-darwin-arm64@0.15.18:
5112
+ resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==}
5113
+ engines: {node: '>=12'}
5114
+ cpu: [arm64]
5115
+ os: [darwin]
5116
+ requiresBuild: true
5117
+ dev: true
5118
+ optional: true
5119
+
5120
+ /esbuild-freebsd-64@0.15.18:
5121
+ resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==}
5122
+ engines: {node: '>=12'}
5123
+ cpu: [x64]
5124
+ os: [freebsd]
5125
+ requiresBuild: true
5126
+ dev: true
5127
+ optional: true
5128
+
5129
+ /esbuild-freebsd-arm64@0.15.18:
5130
+ resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==}
5131
+ engines: {node: '>=12'}
5132
+ cpu: [arm64]
5133
+ os: [freebsd]
5134
+ requiresBuild: true
5135
+ dev: true
5136
+ optional: true
5137
+
5138
+ /esbuild-linux-32@0.15.18:
5139
+ resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==}
5140
+ engines: {node: '>=12'}
5141
+ cpu: [ia32]
5142
+ os: [linux]
5143
+ requiresBuild: true
5144
+ dev: true
5145
+ optional: true
5146
+
5147
+ /esbuild-linux-64@0.15.18:
5148
+ resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==}
5149
+ engines: {node: '>=12'}
5150
+ cpu: [x64]
5151
+ os: [linux]
5152
+ requiresBuild: true
5153
+ dev: true
5154
+ optional: true
5155
+
5156
+ /esbuild-linux-arm64@0.15.18:
5157
+ resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==}
5158
+ engines: {node: '>=12'}
5159
+ cpu: [arm64]
5160
+ os: [linux]
5161
+ requiresBuild: true
5162
+ dev: true
5163
+ optional: true
5164
+
5165
+ /esbuild-linux-arm@0.15.18:
5166
+ resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==}
5167
+ engines: {node: '>=12'}
5168
+ cpu: [arm]
5169
+ os: [linux]
5170
+ requiresBuild: true
5171
+ dev: true
5172
+ optional: true
5173
+
5174
+ /esbuild-linux-mips64le@0.15.18:
5175
+ resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==}
5176
+ engines: {node: '>=12'}
5177
+ cpu: [mips64el]
5178
+ os: [linux]
5179
+ requiresBuild: true
5180
+ dev: true
5181
+ optional: true
5182
+
5183
+ /esbuild-linux-ppc64le@0.15.18:
5184
+ resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==}
5185
+ engines: {node: '>=12'}
5186
+ cpu: [ppc64]
5187
+ os: [linux]
5188
+ requiresBuild: true
5189
+ dev: true
5190
+ optional: true
5191
+
5192
+ /esbuild-linux-riscv64@0.15.18:
5193
+ resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==}
5194
+ engines: {node: '>=12'}
5195
+ cpu: [riscv64]
5196
+ os: [linux]
5197
+ requiresBuild: true
5198
+ dev: true
5199
+ optional: true
5200
+
5201
+ /esbuild-linux-s390x@0.15.18:
5202
+ resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==}
5203
+ engines: {node: '>=12'}
5204
+ cpu: [s390x]
5205
+ os: [linux]
5206
+ requiresBuild: true
5207
+ dev: true
5208
+ optional: true
5209
+
5210
+ /esbuild-netbsd-64@0.15.18:
5211
+ resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==}
5212
+ engines: {node: '>=12'}
5213
+ cpu: [x64]
5214
+ os: [netbsd]
5215
+ requiresBuild: true
5216
+ dev: true
5217
+ optional: true
5218
+
5219
+ /esbuild-openbsd-64@0.15.18:
5220
+ resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==}
5221
+ engines: {node: '>=12'}
5222
+ cpu: [x64]
5223
+ os: [openbsd]
5224
+ requiresBuild: true
5225
+ dev: true
5226
+ optional: true
5227
+
3899
5228
  /esbuild-plugin-resolve@2.0.0:
3900
5229
  resolution: {integrity: sha512-eJy9B8yDW5X/J48eWtR1uVmv+DKfHvYYnrrcqQoe/nUkVHVOTZlJnSevkYyGOz6hI90t036Y5QIPDrGzmppxfg==}
3901
- dev: false
5230
+ dev: true
5231
+
5232
+ /esbuild-register@3.4.2(esbuild@0.15.18):
5233
+ resolution: {integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==}
5234
+ peerDependencies:
5235
+ esbuild: '>=0.12 <1'
5236
+ dependencies:
5237
+ debug: 4.3.4
5238
+ esbuild: 0.15.18
5239
+ transitivePeerDependencies:
5240
+ - supports-color
5241
+ dev: true
5242
+
5243
+ /esbuild-sunos-64@0.15.18:
5244
+ resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==}
5245
+ engines: {node: '>=12'}
5246
+ cpu: [x64]
5247
+ os: [sunos]
5248
+ requiresBuild: true
5249
+ dev: true
5250
+ optional: true
5251
+
5252
+ /esbuild-windows-32@0.15.18:
5253
+ resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==}
5254
+ engines: {node: '>=12'}
5255
+ cpu: [ia32]
5256
+ os: [win32]
5257
+ requiresBuild: true
5258
+ dev: true
5259
+ optional: true
5260
+
5261
+ /esbuild-windows-64@0.15.18:
5262
+ resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==}
5263
+ engines: {node: '>=12'}
5264
+ cpu: [x64]
5265
+ os: [win32]
5266
+ requiresBuild: true
5267
+ dev: true
5268
+ optional: true
5269
+
5270
+ /esbuild-windows-arm64@0.15.18:
5271
+ resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==}
5272
+ engines: {node: '>=12'}
5273
+ cpu: [arm64]
5274
+ os: [win32]
5275
+ requiresBuild: true
5276
+ dev: true
5277
+ optional: true
5278
+
5279
+ /esbuild@0.15.18:
5280
+ resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==}
5281
+ engines: {node: '>=12'}
5282
+ hasBin: true
5283
+ requiresBuild: true
5284
+ optionalDependencies:
5285
+ '@esbuild/android-arm': 0.15.18
5286
+ '@esbuild/linux-loong64': 0.15.18
5287
+ esbuild-android-64: 0.15.18
5288
+ esbuild-android-arm64: 0.15.18
5289
+ esbuild-darwin-64: 0.15.18
5290
+ esbuild-darwin-arm64: 0.15.18
5291
+ esbuild-freebsd-64: 0.15.18
5292
+ esbuild-freebsd-arm64: 0.15.18
5293
+ esbuild-linux-32: 0.15.18
5294
+ esbuild-linux-64: 0.15.18
5295
+ esbuild-linux-arm: 0.15.18
5296
+ esbuild-linux-arm64: 0.15.18
5297
+ esbuild-linux-mips64le: 0.15.18
5298
+ esbuild-linux-ppc64le: 0.15.18
5299
+ esbuild-linux-riscv64: 0.15.18
5300
+ esbuild-linux-s390x: 0.15.18
5301
+ esbuild-netbsd-64: 0.15.18
5302
+ esbuild-openbsd-64: 0.15.18
5303
+ esbuild-sunos-64: 0.15.18
5304
+ esbuild-windows-32: 0.15.18
5305
+ esbuild-windows-64: 0.15.18
5306
+ esbuild-windows-arm64: 0.15.18
5307
+ dev: true
5308
+
5309
+ /esbuild@0.16.3:
5310
+ resolution: {integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==}
5311
+ engines: {node: '>=12'}
5312
+ hasBin: true
5313
+ requiresBuild: true
5314
+ optionalDependencies:
5315
+ '@esbuild/android-arm': 0.16.3
5316
+ '@esbuild/android-arm64': 0.16.3
5317
+ '@esbuild/android-x64': 0.16.3
5318
+ '@esbuild/darwin-arm64': 0.16.3
5319
+ '@esbuild/darwin-x64': 0.16.3
5320
+ '@esbuild/freebsd-arm64': 0.16.3
5321
+ '@esbuild/freebsd-x64': 0.16.3
5322
+ '@esbuild/linux-arm': 0.16.3
5323
+ '@esbuild/linux-arm64': 0.16.3
5324
+ '@esbuild/linux-ia32': 0.16.3
5325
+ '@esbuild/linux-loong64': 0.16.3
5326
+ '@esbuild/linux-mips64el': 0.16.3
5327
+ '@esbuild/linux-ppc64': 0.16.3
5328
+ '@esbuild/linux-riscv64': 0.16.3
5329
+ '@esbuild/linux-s390x': 0.16.3
5330
+ '@esbuild/linux-x64': 0.16.3
5331
+ '@esbuild/netbsd-x64': 0.16.3
5332
+ '@esbuild/openbsd-x64': 0.16.3
5333
+ '@esbuild/sunos-x64': 0.16.3
5334
+ '@esbuild/win32-arm64': 0.16.3
5335
+ '@esbuild/win32-ia32': 0.16.3
5336
+ '@esbuild/win32-x64': 0.16.3
5337
+ dev: true
3902
5338
 
3903
5339
  /esbuild@0.17.19:
3904
5340
  resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
@@ -3928,15 +5364,26 @@ packages:
3928
5364
  '@esbuild/win32-arm64': 0.17.19
3929
5365
  '@esbuild/win32-ia32': 0.17.19
3930
5366
  '@esbuild/win32-x64': 0.17.19
3931
- dev: false
5367
+ dev: true
3932
5368
 
3933
5369
  /escalade@3.1.1:
3934
5370
  resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
3935
5371
  engines: {node: '>=6'}
5372
+ dev: true
5373
+
5374
+ /escape-html@1.0.3:
5375
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
5376
+ dev: true
3936
5377
 
3937
5378
  /escape-string-regexp@1.0.5:
3938
5379
  resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
3939
5380
  engines: {node: '>=0.8.0'}
5381
+ dev: true
5382
+
5383
+ /escape-string-regexp@2.0.0:
5384
+ resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
5385
+ engines: {node: '>=8'}
5386
+ dev: true
3940
5387
 
3941
5388
  /escape-string-regexp@4.0.0:
3942
5389
  resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
@@ -4251,9 +5698,15 @@ packages:
4251
5698
  eslint-visitor-keys: 3.4.1
4252
5699
  dev: true
4253
5700
 
5701
+ /esprima@4.0.1:
5702
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
5703
+ engines: {node: '>=4'}
5704
+ hasBin: true
5705
+ dev: true
5706
+
4254
- /esquery@1.5.0:
5707
+ /esquery@1.5.0:
4255
- resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
5708
+ resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
4256
- engines: {node: '>=0.10'}
5709
+ engines: {node: '>=0.10'}
4257
5710
  dependencies:
4258
5711
  estraverse: 5.3.0
4259
5712
  dev: true
@@ -4275,11 +5728,113 @@ packages:
4275
5728
  engines: {node: '>=4.0'}
4276
5729
  dev: true
4277
5730
 
5731
+ /estree-walker@0.6.1:
5732
+ resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
5733
+ dev: true
5734
+
4278
5735
  /esutils@2.0.3:
4279
5736
  resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
4280
5737
  engines: {node: '>=0.10.0'}
4281
5738
  dev: true
4282
5739
 
5740
+ /etag@1.8.1:
5741
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
5742
+ engines: {node: '>= 0.6'}
5743
+ dev: true
5744
+
5745
+ /event-emitter@0.3.5:
5746
+ resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
5747
+ dependencies:
5748
+ d: 1.0.1
5749
+ es5-ext: 0.10.62
5750
+ dev: true
5751
+
5752
+ /execa@5.1.1:
5753
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
5754
+ engines: {node: '>=10'}
5755
+ dependencies:
5756
+ cross-spawn: 7.0.3
5757
+ get-stream: 6.0.1
5758
+ human-signals: 2.1.0
5759
+ is-stream: 2.0.1
5760
+ merge-stream: 2.0.0
5761
+ npm-run-path: 4.0.1
5762
+ onetime: 5.1.2
5763
+ signal-exit: 3.0.7
5764
+ strip-final-newline: 2.0.0
5765
+ dev: true
5766
+
5767
+ /exit-hook@2.2.1:
5768
+ resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==}
5769
+ engines: {node: '>=6'}
5770
+ dev: true
5771
+
5772
+ /exit@0.1.2:
5773
+ resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
5774
+ engines: {node: '>= 0.8.0'}
5775
+ dev: true
5776
+
5777
+ /expand-template@2.0.3:
5778
+ resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
5779
+ engines: {node: '>=6'}
5780
+ dev: true
5781
+
5782
+ /expect@29.5.0:
5783
+ resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==}
5784
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
5785
+ dependencies:
5786
+ '@jest/expect-utils': 29.5.0
5787
+ jest-get-type: 29.4.3
5788
+ jest-matcher-utils: 29.5.0
5789
+ jest-message-util: 29.5.0
5790
+ jest-util: 29.5.0
5791
+ dev: true
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
+
5832
+ /ext@1.7.0:
5833
+ resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
5834
+ dependencies:
5835
+ type: 2.7.2
5836
+ dev: true
5837
+
4283
5838
  /fast-deep-equal@3.1.3:
4284
5839
  resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
4285
5840
  dev: true
@@ -4309,6 +5864,12 @@ packages:
4309
5864
  reusify: 1.0.4
4310
5865
  dev: true
4311
5866
 
5867
+ /fb-watchman@2.0.2:
5868
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
5869
+ dependencies:
5870
+ bser: 2.1.1
5871
+ dev: true
5872
+
4312
5873
  /file-entry-cache@6.0.1:
4313
5874
  resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
4314
5875
  engines: {node: ^10.12.0 || >=12.0.0}
@@ -4316,6 +5877,10 @@ packages:
4316
5877
  flat-cache: 3.0.4
4317
5878
  dev: true
4318
5879
 
5880
+ /file-uri-to-path@1.0.0:
5881
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
5882
+ dev: true
5883
+
4319
5884
  /fill-range@7.0.1:
4320
5885
  resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
4321
5886
  engines: {node: '>=8'}
@@ -4323,6 +5888,29 @@ packages:
4323
5888
  to-regex-range: 5.0.1
4324
5889
  dev: true
4325
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
+
5906
+ /find-up@4.1.0:
5907
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
5908
+ engines: {node: '>=8'}
5909
+ dependencies:
5910
+ locate-path: 5.0.0
5911
+ path-exists: 4.0.0
5912
+ dev: true
5913
+
4326
5914
  /find-up@5.0.0:
4327
5915
  resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
4328
5916
  engines: {node: '>=10'}
@@ -4331,14 +5919,6 @@ packages:
4331
5919
  path-exists: 4.0.0
4332
5920
  dev: true
4333
5921
 
4334
- /find-up@6.3.0:
4335
- resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==}
4336
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
4337
- dependencies:
4338
- locate-path: 7.2.0
4339
- path-exists: 5.0.0
4340
- dev: false
4341
-
4342
5922
  /flat-cache@3.0.4:
4343
5923
  resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
4344
5924
  engines: {node: ^10.12.0 || >=12.0.0}
@@ -4357,9 +5937,32 @@ packages:
4357
5937
  is-callable: 1.2.7
4358
5938
  dev: true
4359
5939
 
5940
+ /forwarded@0.2.0:
5941
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
5942
+ engines: {node: '>= 0.6'}
5943
+ dev: true
5944
+
4360
5945
  /fraction.js@4.2.0:
4361
5946
  resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
4362
- dev: false
5947
+ dev: true
5948
+
5949
+ /fresh@0.5.2:
5950
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
5951
+ engines: {node: '>= 0.6'}
5952
+ dev: true
5953
+
5954
+ /fs-constants@1.0.0:
5955
+ resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
5956
+ dev: true
5957
+
5958
+ /fs-extra@11.1.1:
5959
+ resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
5960
+ engines: {node: '>=14.14'}
5961
+ dependencies:
5962
+ graceful-fs: 4.2.11
5963
+ jsonfile: 6.1.0
5964
+ universalify: 2.0.0
5965
+ dev: true
4363
5966
 
4364
5967
  /fs.realpath@1.0.0:
4365
5968
  resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
@@ -4375,6 +5978,7 @@ packages:
4375
5978
 
4376
5979
  /function-bind@1.1.1:
4377
5980
  resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
5981
+ dev: true
4378
5982
 
4379
5983
  /function.prototype.name@1.1.5:
4380
5984
  resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
@@ -4395,6 +5999,11 @@ packages:
4395
5999
  engines: {node: '>=6.9.0'}
4396
6000
  dev: true
4397
6001
 
6002
+ /get-caller-file@2.0.5:
6003
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
6004
+ engines: {node: 6.* || 8.* || >= 10.*}
6005
+ dev: true
6006
+
4398
6007
  /get-intrinsic@1.2.1:
4399
6008
  resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
4400
6009
  dependencies:
@@ -4404,6 +6013,23 @@ packages:
4404
6013
  has-symbols: 1.0.3
4405
6014
  dev: true
4406
6015
 
6016
+ /get-package-type@0.1.0:
6017
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
6018
+ engines: {node: '>=8.0.0'}
6019
+ dev: true
6020
+
6021
+ /get-source@2.0.12:
6022
+ resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==}
6023
+ dependencies:
6024
+ data-uri-to-buffer: 2.0.2
6025
+ source-map: 0.6.1
6026
+ dev: true
6027
+
6028
+ /get-stream@6.0.1:
6029
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
6030
+ engines: {node: '>=10'}
6031
+ dev: true
6032
+
4407
6033
  /get-symbol-description@1.0.0:
4408
6034
  resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
4409
6035
  engines: {node: '>= 0.4'}
@@ -4412,6 +6038,10 @@ packages:
4412
6038
  get-intrinsic: 1.2.1
4413
6039
  dev: true
4414
6040
 
6041
+ /github-from-package@0.0.0:
6042
+ resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
6043
+ dev: true
6044
+
4415
6045
  /glob-parent@5.1.2:
4416
6046
  resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
4417
6047
  engines: {node: '>= 6'}
@@ -4426,6 +6056,10 @@ packages:
4426
6056
  is-glob: 4.0.3
4427
6057
  dev: true
4428
6058
 
6059
+ /glob-to-regexp@0.4.1:
6060
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
6061
+ dev: true
6062
+
4429
6063
  /glob@7.2.3:
4430
6064
  resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
4431
6065
  dependencies:
@@ -4437,6 +6071,17 @@ packages:
4437
6071
  path-is-absolute: 1.0.1
4438
6072
  dev: true
4439
6073
 
6074
+ /glob@8.1.0:
6075
+ resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
6076
+ engines: {node: '>=12'}
6077
+ dependencies:
6078
+ fs.realpath: 1.0.0
6079
+ inflight: 1.0.6
6080
+ inherits: 2.0.4
6081
+ minimatch: 5.1.6
6082
+ once: 1.4.0
6083
+ dev: true
6084
+
4440
6085
  /globals@11.12.0:
4441
6086
  resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
4442
6087
  engines: {node: '>=4'}
@@ -4474,14 +6119,20 @@ packages:
4474
6119
  get-intrinsic: 1.2.1
4475
6120
  dev: true
4476
6121
 
6122
+ /graceful-fs@4.2.11:
6123
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
6124
+ dev: true
6125
+
4477
6126
  /grapheme-splitter@1.0.4:
4478
6127
  resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
4479
6128
  dev: true
4480
6129
 
4481
- /hard-rejection@2.1.0:
6130
+ /hanji@0.0.5:
4482
- resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
6131
+ resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==}
6132
+ dependencies:
4483
- engines: {node: '>=6'}
6133
+ lodash.throttle: 4.1.1
6134
+ sisteransi: 1.0.5
4484
- dev: false
6135
+ dev: true
4485
6136
 
4486
6137
  /has-bigints@1.0.2:
4487
6138
  resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
@@ -4490,6 +6141,7 @@ packages:
4490
6141
  /has-flag@3.0.0:
4491
6142
  resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
4492
6143
  engines: {node: '>=4'}
6144
+ dev: true
4493
6145
 
4494
6146
  /has-flag@4.0.0:
4495
6147
  resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
@@ -4524,6 +6176,11 @@ packages:
4524
6176
  engines: {node: '>= 0.4.0'}
4525
6177
  dependencies:
4526
6178
  function-bind: 1.1.1
6179
+ dev: true
6180
+
6181
+ /heap@0.2.7:
6182
+ resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==}
6183
+ dev: true
4527
6184
 
4528
6185
  /history@5.3.0:
4529
6186
  resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==}
@@ -4531,19 +6188,40 @@ packages:
4531
6188
  '@babel/runtime': 7.21.5
4532
6189
  dev: false
4533
6190
 
6191
+ /html-escaper@2.0.2:
6192
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
6193
+ dev: true
6194
+
6195
+ /http-cache-semantics@4.1.1:
6196
+ resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
6197
+ dev: true
6198
+
4534
- /hosted-git-info@4.1.0:
6199
+ /http-errors@2.0.0:
4535
- resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
6200
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
4536
- engines: {node: '>=10'}
6201
+ engines: {node: '>= 0.8'}
4537
6202
  dependencies:
6203
+ depd: 2.0.0
4538
- lru-cache: 6.0.0
6204
+ inherits: 2.0.4
6205
+ setprototypeof: 1.2.0
6206
+ statuses: 2.0.1
6207
+ toidentifier: 1.0.1
4539
- dev: false
6208
+ dev: true
6209
+
6210
+ /human-signals@2.1.0:
6211
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
6212
+ engines: {node: '>=10.17.0'}
6213
+ dev: true
4540
6214
 
4541
- /hosted-git-info@6.1.1:
6215
+ /iconv-lite@0.4.24:
4542
- resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==}
6216
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
4543
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
6217
+ engines: {node: '>=0.10.0'}
4544
6218
  dependencies:
4545
- lru-cache: 7.18.3
6219
+ safer-buffer: 2.1.2
4546
- dev: false
6220
+ dev: true
6221
+
6222
+ /ieee754@1.2.1:
6223
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
6224
+ dev: true
4547
6225
 
4548
6226
  /ignore@5.2.4:
4549
6227
  resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
@@ -4558,16 +6236,20 @@ packages:
4558
6236
  resolve-from: 4.0.0
4559
6237
  dev: true
4560
6238
 
6239
+ /import-local@3.1.0:
6240
+ resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
6241
+ engines: {node: '>=8'}
6242
+ hasBin: true
6243
+ dependencies:
6244
+ pkg-dir: 4.2.0
6245
+ resolve-cwd: 3.0.0
6246
+ dev: true
6247
+
4561
6248
  /imurmurhash@0.1.4:
4562
6249
  resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
4563
6250
  engines: {node: '>=0.8.19'}
4564
6251
  dev: true
4565
6252
 
4566
- /indent-string@5.0.0:
4567
- resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
4568
- engines: {node: '>=12'}
4569
- dev: false
4570
-
4571
6253
  /inflight@1.0.6:
4572
6254
  resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
4573
6255
  dependencies:
@@ -4579,6 +6261,10 @@ packages:
4579
6261
  resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
4580
6262
  dev: true
4581
6263
 
6264
+ /ini@1.3.8:
6265
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
6266
+ dev: true
6267
+
4582
6268
  /internal-slot@1.0.5:
4583
6269
  resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
4584
6270
  engines: {node: '>= 0.4'}
@@ -4603,6 +6289,11 @@ packages:
4603
6289
  loose-envify: 1.4.0
4604
6290
  dev: false
4605
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
+
4606
6297
  /is-arguments@1.1.1:
4607
6298
  resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
4608
6299
  engines: {node: '>= 0.4'}
@@ -4621,6 +6312,7 @@ packages:
4621
6312
 
4622
6313
  /is-arrayish@0.2.1:
4623
6314
  resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
6315
+ dev: true
4624
6316
 
4625
6317
  /is-bigint@1.0.4:
4626
6318
  resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
@@ -4628,6 +6320,13 @@ packages:
4628
6320
  has-bigints: 1.0.2
4629
6321
  dev: true
4630
6322
 
6323
+ /is-binary-path@2.1.0:
6324
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
6325
+ engines: {node: '>=8'}
6326
+ dependencies:
6327
+ binary-extensions: 2.2.0
6328
+ dev: true
6329
+
4631
6330
  /is-boolean-object@1.1.2:
4632
6331
  resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
4633
6332
  engines: {node: '>= 0.4'}
@@ -4645,6 +6344,7 @@ packages:
4645
6344
  resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
4646
6345
  dependencies:
4647
6346
  has: 1.0.3
6347
+ dev: true
4648
6348
 
4649
6349
  /is-date-object@1.0.5:
4650
6350
  resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
@@ -4658,6 +6358,16 @@ packages:
4658
6358
  engines: {node: '>=0.10.0'}
4659
6359
  dev: true
4660
6360
 
6361
+ /is-fullwidth-code-point@3.0.0:
6362
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
6363
+ engines: {node: '>=8'}
6364
+ dev: true
6365
+
6366
+ /is-generator-fn@2.1.0:
6367
+ resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
6368
+ engines: {node: '>=6'}
6369
+ dev: true
6370
+
4661
6371
  /is-glob@4.0.3:
4662
6372
  resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
4663
6373
  engines: {node: '>=0.10.0'}
@@ -4691,10 +6401,9 @@ packages:
4691
6401
  engines: {node: '>=8'}
4692
6402
  dev: true
4693
6403
 
4694
- /is-plain-obj@1.1.0:
6404
+ /is-promise@2.2.2:
4695
- resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
6405
+ resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
4696
- engines: {node: '>=0.10.0'}
4697
- dev: false
6406
+ dev: true
4698
6407
 
4699
6408
  /is-regex@1.1.4:
4700
6409
  resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
@@ -4714,6 +6423,11 @@ packages:
4714
6423
  call-bind: 1.0.2
4715
6424
  dev: true
4716
6425
 
6426
+ /is-stream@2.0.1:
6427
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
6428
+ engines: {node: '>=8'}
6429
+ dev: true
6430
+
4717
6431
  /is-string@1.0.7:
4718
6432
  resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
4719
6433
  engines: {node: '>= 0.4'}
@@ -4760,106 +6474,603 @@ packages:
4760
6474
  resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
4761
6475
  dev: true
4762
6476
 
6477
+ /isbot@3.6.10:
6478
+ resolution: {integrity: sha512-+I+2998oyP4oW9+OTQD8TS1r9P6wv10yejukj+Ksj3+UR5pUhsZN3f8W7ysq0p1qxpOVNbl5mCuv0bCaF8y5iQ==}
6479
+ engines: {node: '>=12'}
6480
+ dev: false
6481
+
4763
6482
  /isexe@2.0.0:
4764
6483
  resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
4765
6484
  dev: true
4766
6485
 
4767
- /js-sdsl@4.4.0:
6486
+ /istanbul-lib-coverage@3.2.0:
4768
- resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==}
6487
+ resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
6488
+ engines: {node: '>=8'}
4769
6489
  dev: true
4770
6490
 
4771
- /js-tokens@4.0.0:
6491
+ /istanbul-lib-instrument@5.2.1:
4772
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
6492
+ resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
4773
-
4774
- /js-yaml@4.1.0:
6493
+ engines: {node: '>=8'}
4775
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
4776
- hasBin: true
4777
6494
  dependencies:
6495
+ '@babel/core': 7.21.8
6496
+ '@babel/parser': 7.21.8
6497
+ '@istanbuljs/schema': 0.1.3
6498
+ istanbul-lib-coverage: 3.2.0
4778
- argparse: 2.0.1
6499
+ semver: 6.3.0
6500
+ transitivePeerDependencies:
6501
+ - supports-color
4779
6502
  dev: true
4780
6503
 
4781
- /jsesc@0.5.0:
6504
+ /istanbul-lib-report@3.0.0:
4782
- resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
6505
+ resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==}
6506
+ engines: {node: '>=8'}
6507
+ dependencies:
6508
+ istanbul-lib-coverage: 3.2.0
4783
- hasBin: true
6509
+ make-dir: 3.1.0
6510
+ supports-color: 7.2.0
4784
6511
  dev: true
4785
6512
 
4786
- /jsesc@2.5.2:
6513
+ /istanbul-lib-source-maps@4.0.1:
4787
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
6514
+ resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
4788
- engines: {node: '>=4'}
6515
+ engines: {node: '>=10'}
6516
+ dependencies:
4789
- hasBin: true
6517
+ debug: 4.3.4
6518
+ istanbul-lib-coverage: 3.2.0
6519
+ source-map: 0.6.1
6520
+ transitivePeerDependencies:
6521
+ - supports-color
4790
6522
  dev: true
4791
6523
 
4792
- /json-parse-even-better-errors@2.3.1:
4793
- resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
4794
-
4795
- /json-schema-traverse@0.4.1:
6524
+ /istanbul-reports@3.1.5:
4796
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
6525
+ resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==}
6526
+ engines: {node: '>=8'}
6527
+ dependencies:
6528
+ html-escaper: 2.0.2
6529
+ istanbul-lib-report: 3.0.0
4797
6530
  dev: true
4798
6531
 
4799
- /json-stable-stringify-without-jsonify@1.0.1:
6532
+ /jest-changed-files@29.5.0:
4800
- resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
6533
+ resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==}
6534
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6535
+ dependencies:
6536
+ execa: 5.1.1
6537
+ p-limit: 3.1.0
4801
6538
  dev: true
4802
6539
 
4803
- /json5@1.0.2:
6540
+ /jest-circus@29.5.0:
4804
- resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
6541
+ resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==}
4805
- hasBin: true
6542
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4806
6543
  dependencies:
6544
+ '@jest/environment': 29.5.0
6545
+ '@jest/expect': 29.5.0
6546
+ '@jest/test-result': 29.5.0
6547
+ '@jest/types': 29.5.0
6548
+ '@types/node': 20.2.1
6549
+ chalk: 4.1.2
6550
+ co: 4.6.0
6551
+ dedent: 0.7.0
6552
+ is-generator-fn: 2.1.0
6553
+ jest-each: 29.5.0
6554
+ jest-matcher-utils: 29.5.0
6555
+ jest-message-util: 29.5.0
6556
+ jest-runtime: 29.5.0
6557
+ jest-snapshot: 29.5.0
6558
+ jest-util: 29.5.0
4807
- minimist: 1.2.8
6559
+ p-limit: 3.1.0
6560
+ pretty-format: 29.5.0
6561
+ pure-rand: 6.0.2
6562
+ slash: 3.0.0
6563
+ stack-utils: 2.0.6
6564
+ transitivePeerDependencies:
6565
+ - supports-color
4808
6566
  dev: true
4809
6567
 
4810
- /json5@2.2.3:
6568
+ /jest-cli@29.5.0:
4811
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
6569
+ resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==}
4812
- engines: {node: '>=6'}
6570
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4813
6571
  hasBin: true
6572
+ peerDependencies:
6573
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
6574
+ peerDependenciesMeta:
6575
+ node-notifier:
6576
+ optional: true
6577
+ dependencies:
6578
+ '@jest/core': 29.5.0
6579
+ '@jest/test-result': 29.5.0
6580
+ '@jest/types': 29.5.0
6581
+ chalk: 4.1.2
6582
+ exit: 0.1.2
6583
+ graceful-fs: 4.2.11
6584
+ import-local: 3.1.0
6585
+ jest-config: 29.5.0(@types/node@20.2.1)
6586
+ jest-util: 29.5.0
6587
+ jest-validate: 29.5.0
6588
+ prompts: 2.4.2
6589
+ yargs: 17.7.2
6590
+ transitivePeerDependencies:
6591
+ - '@types/node'
6592
+ - supports-color
6593
+ - ts-node
4814
6594
  dev: true
4815
6595
 
4816
- /jsx-ast-utils@3.3.3:
6596
+ /jest-config@29.5.0(@types/node@20.2.1):
4817
- resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
6597
+ resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==}
6598
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6599
+ peerDependencies:
6600
+ '@types/node': '*'
4818
- engines: {node: '>=4.0'}
6601
+ ts-node: '>=9.0.0'
6602
+ peerDependenciesMeta:
6603
+ '@types/node':
6604
+ optional: true
6605
+ ts-node:
6606
+ optional: true
4819
6607
  dependencies:
6608
+ '@babel/core': 7.21.8
6609
+ '@jest/test-sequencer': 29.5.0
6610
+ '@jest/types': 29.5.0
6611
+ '@types/node': 20.2.1
6612
+ babel-jest: 29.5.0(@babel/core@7.21.8)
6613
+ chalk: 4.1.2
6614
+ ci-info: 3.8.0
6615
+ deepmerge: 4.3.1
6616
+ glob: 7.2.3
6617
+ graceful-fs: 4.2.11
6618
+ jest-circus: 29.5.0
6619
+ jest-environment-node: 29.5.0
6620
+ jest-get-type: 29.4.3
6621
+ jest-regex-util: 29.4.3
6622
+ jest-resolve: 29.5.0
6623
+ jest-runner: 29.5.0
6624
+ jest-util: 29.5.0
6625
+ jest-validate: 29.5.0
6626
+ micromatch: 4.0.5
6627
+ parse-json: 5.2.0
6628
+ pretty-format: 29.5.0
6629
+ slash: 3.0.0
4820
- array-includes: 3.1.6
6630
+ strip-json-comments: 3.1.1
6631
+ transitivePeerDependencies:
4821
- object.assign: 4.1.4
6632
+ - supports-color
4822
6633
  dev: true
4823
6634
 
4824
- /kind-of@6.0.3:
6635
+ /jest-diff@29.5.0:
4825
- resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
6636
+ resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==}
4826
- engines: {node: '>=0.10.0'}
6637
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4827
- dev: false
6638
+ dependencies:
4828
-
6639
+ chalk: 4.1.2
4829
- /language-subtag-registry@0.3.22:
6640
+ diff-sequences: 29.4.3
4830
- resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
6641
+ jest-get-type: 29.4.3
6642
+ pretty-format: 29.5.0
4831
6643
  dev: true
4832
6644
 
4833
- /language-tags@1.0.5:
6645
+ /jest-docblock@29.4.3:
4834
- resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
6646
+ resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==}
6647
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4835
6648
  dependencies:
4836
- language-subtag-registry: 0.3.22
6649
+ detect-newline: 3.1.0
4837
6650
  dev: true
4838
6651
 
4839
- /levn@0.4.1:
6652
+ /jest-each@29.5.0:
4840
- resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
6653
+ resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==}
4841
- engines: {node: '>= 0.8.0'}
6654
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4842
6655
  dependencies:
4843
- prelude-ls: 1.2.1
6656
+ '@jest/types': 29.5.0
4844
- type-check: 0.4.0
6657
+ chalk: 4.1.2
6658
+ jest-get-type: 29.4.3
6659
+ jest-util: 29.5.0
6660
+ pretty-format: 29.5.0
4845
6661
  dev: true
4846
6662
 
4847
- /lines-and-columns@1.2.4:
6663
+ /jest-environment-node@29.5.0:
4848
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
6664
+ resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==}
4849
-
4850
- /locate-path@6.0.0:
4851
- resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
4852
- engines: {node: '>=10'}
6665
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4853
6666
  dependencies:
6667
+ '@jest/environment': 29.5.0
6668
+ '@jest/fake-timers': 29.5.0
6669
+ '@jest/types': 29.5.0
6670
+ '@types/node': 20.2.1
4854
- p-locate: 5.0.0
6671
+ jest-mock: 29.5.0
6672
+ jest-util: 29.5.0
4855
6673
  dev: true
4856
6674
 
4857
- /locate-path@7.2.0:
6675
+ /jest-get-type@29.4.3:
4858
- resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
6676
+ resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==}
4859
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
6677
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6678
+ dev: true
6679
+
6680
+ /jest-haste-map@29.5.0:
6681
+ resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==}
6682
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
4860
- dependencies:
6683
+ dependencies:
6684
+ '@jest/types': 29.5.0
6685
+ '@types/graceful-fs': 4.1.6
6686
+ '@types/node': 20.2.1
6687
+ anymatch: 3.1.3
6688
+ fb-watchman: 2.0.2
6689
+ graceful-fs: 4.2.11
6690
+ jest-regex-util: 29.4.3
6691
+ jest-util: 29.5.0
6692
+ jest-worker: 29.5.0
6693
+ micromatch: 4.0.5
6694
+ walker: 1.0.8
6695
+ optionalDependencies:
6696
+ fsevents: 2.3.2
6697
+ dev: true
6698
+
6699
+ /jest-leak-detector@29.5.0:
6700
+ resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==}
6701
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6702
+ dependencies:
6703
+ jest-get-type: 29.4.3
6704
+ pretty-format: 29.5.0
6705
+ dev: true
6706
+
6707
+ /jest-matcher-utils@29.5.0:
6708
+ resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==}
6709
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6710
+ dependencies:
6711
+ chalk: 4.1.2
6712
+ jest-diff: 29.5.0
6713
+ jest-get-type: 29.4.3
6714
+ pretty-format: 29.5.0
6715
+ dev: true
6716
+
6717
+ /jest-message-util@29.5.0:
6718
+ resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==}
6719
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6720
+ dependencies:
6721
+ '@babel/code-frame': 7.21.4
6722
+ '@jest/types': 29.5.0
6723
+ '@types/stack-utils': 2.0.1
6724
+ chalk: 4.1.2
6725
+ graceful-fs: 4.2.11
6726
+ micromatch: 4.0.5
6727
+ pretty-format: 29.5.0
6728
+ slash: 3.0.0
6729
+ stack-utils: 2.0.6
6730
+ dev: true
6731
+
6732
+ /jest-mock@29.5.0:
6733
+ resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==}
6734
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6735
+ dependencies:
6736
+ '@jest/types': 29.5.0
6737
+ '@types/node': 20.2.1
6738
+ jest-util: 29.5.0
6739
+ dev: true
6740
+
6741
+ /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0):
6742
+ resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
6743
+ engines: {node: '>=6'}
6744
+ peerDependencies:
6745
+ jest-resolve: '*'
6746
+ peerDependenciesMeta:
6747
+ jest-resolve:
6748
+ optional: true
6749
+ dependencies:
6750
+ jest-resolve: 29.5.0
6751
+ dev: true
6752
+
6753
+ /jest-regex-util@29.4.3:
6754
+ resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==}
6755
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6756
+ dev: true
6757
+
6758
+ /jest-resolve-dependencies@29.5.0:
6759
+ resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==}
6760
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6761
+ dependencies:
6762
+ jest-regex-util: 29.4.3
6763
+ jest-snapshot: 29.5.0
6764
+ transitivePeerDependencies:
6765
+ - supports-color
6766
+ dev: true
6767
+
6768
+ /jest-resolve@29.5.0:
6769
+ resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==}
6770
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6771
+ dependencies:
6772
+ chalk: 4.1.2
6773
+ graceful-fs: 4.2.11
6774
+ jest-haste-map: 29.5.0
6775
+ jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0)
6776
+ jest-util: 29.5.0
6777
+ jest-validate: 29.5.0
6778
+ resolve: 1.22.2
6779
+ resolve.exports: 2.0.2
6780
+ slash: 3.0.0
6781
+ dev: true
6782
+
6783
+ /jest-runner@29.5.0:
6784
+ resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==}
6785
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6786
+ dependencies:
6787
+ '@jest/console': 29.5.0
6788
+ '@jest/environment': 29.5.0
6789
+ '@jest/test-result': 29.5.0
6790
+ '@jest/transform': 29.5.0
6791
+ '@jest/types': 29.5.0
6792
+ '@types/node': 20.2.1
6793
+ chalk: 4.1.2
6794
+ emittery: 0.13.1
6795
+ graceful-fs: 4.2.11
6796
+ jest-docblock: 29.4.3
6797
+ jest-environment-node: 29.5.0
6798
+ jest-haste-map: 29.5.0
6799
+ jest-leak-detector: 29.5.0
6800
+ jest-message-util: 29.5.0
6801
+ jest-resolve: 29.5.0
6802
+ jest-runtime: 29.5.0
6803
+ jest-util: 29.5.0
6804
+ jest-watcher: 29.5.0
6805
+ jest-worker: 29.5.0
6806
+ p-limit: 3.1.0
6807
+ source-map-support: 0.5.13
6808
+ transitivePeerDependencies:
6809
+ - supports-color
6810
+ dev: true
6811
+
6812
+ /jest-runtime@29.5.0:
6813
+ resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==}
6814
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6815
+ dependencies:
6816
+ '@jest/environment': 29.5.0
6817
+ '@jest/fake-timers': 29.5.0
6818
+ '@jest/globals': 29.5.0
6819
+ '@jest/source-map': 29.4.3
6820
+ '@jest/test-result': 29.5.0
6821
+ '@jest/transform': 29.5.0
6822
+ '@jest/types': 29.5.0
6823
+ '@types/node': 20.2.1
6824
+ chalk: 4.1.2
6825
+ cjs-module-lexer: 1.2.2
6826
+ collect-v8-coverage: 1.0.1
6827
+ glob: 7.2.3
6828
+ graceful-fs: 4.2.11
6829
+ jest-haste-map: 29.5.0
6830
+ jest-message-util: 29.5.0
6831
+ jest-mock: 29.5.0
6832
+ jest-regex-util: 29.4.3
6833
+ jest-resolve: 29.5.0
6834
+ jest-snapshot: 29.5.0
6835
+ jest-util: 29.5.0
6836
+ slash: 3.0.0
6837
+ strip-bom: 4.0.0
6838
+ transitivePeerDependencies:
6839
+ - supports-color
6840
+ dev: true
6841
+
6842
+ /jest-snapshot@29.5.0:
6843
+ resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==}
6844
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6845
+ dependencies:
6846
+ '@babel/core': 7.21.8
6847
+ '@babel/generator': 7.21.5
6848
+ '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.8)
6849
+ '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.8)
6850
+ '@babel/traverse': 7.21.5
6851
+ '@babel/types': 7.21.5
6852
+ '@jest/expect-utils': 29.5.0
6853
+ '@jest/transform': 29.5.0
6854
+ '@jest/types': 29.5.0
6855
+ '@types/babel__traverse': 7.18.5
6856
+ '@types/prettier': 2.7.2
6857
+ babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.8)
6858
+ chalk: 4.1.2
6859
+ expect: 29.5.0
6860
+ graceful-fs: 4.2.11
6861
+ jest-diff: 29.5.0
6862
+ jest-get-type: 29.4.3
6863
+ jest-matcher-utils: 29.5.0
6864
+ jest-message-util: 29.5.0
6865
+ jest-util: 29.5.0
6866
+ natural-compare: 1.4.0
6867
+ pretty-format: 29.5.0
6868
+ semver: 7.5.1
6869
+ transitivePeerDependencies:
6870
+ - supports-color
6871
+ dev: true
6872
+
6873
+ /jest-util@29.5.0:
6874
+ resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==}
6875
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6876
+ dependencies:
6877
+ '@jest/types': 29.5.0
6878
+ '@types/node': 20.2.1
6879
+ chalk: 4.1.2
6880
+ ci-info: 3.8.0
6881
+ graceful-fs: 4.2.11
6882
+ picomatch: 2.3.1
6883
+ dev: true
6884
+
6885
+ /jest-validate@29.5.0:
6886
+ resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==}
6887
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6888
+ dependencies:
6889
+ '@jest/types': 29.5.0
6890
+ camelcase: 6.3.0
6891
+ chalk: 4.1.2
6892
+ jest-get-type: 29.4.3
6893
+ leven: 3.1.0
6894
+ pretty-format: 29.5.0
6895
+ dev: true
6896
+
6897
+ /jest-watcher@29.5.0:
6898
+ resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==}
6899
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6900
+ dependencies:
6901
+ '@jest/test-result': 29.5.0
6902
+ '@jest/types': 29.5.0
6903
+ '@types/node': 20.2.1
6904
+ ansi-escapes: 4.3.2
6905
+ chalk: 4.1.2
6906
+ emittery: 0.13.1
6907
+ jest-util: 29.5.0
6908
+ string-length: 4.0.2
6909
+ dev: true
6910
+
6911
+ /jest-worker@29.5.0:
6912
+ resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==}
6913
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6914
+ dependencies:
6915
+ '@types/node': 20.2.1
6916
+ jest-util: 29.5.0
6917
+ merge-stream: 2.0.0
6918
+ supports-color: 8.1.1
6919
+ dev: true
6920
+
6921
+ /jest@29.5.0:
6922
+ resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==}
6923
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
6924
+ hasBin: true
6925
+ peerDependencies:
6926
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
6927
+ peerDependenciesMeta:
6928
+ node-notifier:
6929
+ optional: true
6930
+ dependencies:
6931
+ '@jest/core': 29.5.0
6932
+ '@jest/types': 29.5.0
6933
+ import-local: 3.1.0
6934
+ jest-cli: 29.5.0
6935
+ transitivePeerDependencies:
6936
+ - '@types/node'
6937
+ - supports-color
6938
+ - ts-node
6939
+ dev: true
6940
+
6941
+ /js-sdsl@4.4.0:
6942
+ resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==}
6943
+ dev: true
6944
+
6945
+ /js-tokens@4.0.0:
6946
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
6947
+
6948
+ /js-yaml@3.14.1:
6949
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
6950
+ hasBin: true
6951
+ dependencies:
6952
+ argparse: 1.0.10
6953
+ esprima: 4.0.1
6954
+ dev: true
6955
+
6956
+ /js-yaml@4.1.0:
6957
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
6958
+ hasBin: true
6959
+ dependencies:
6960
+ argparse: 2.0.1
6961
+ dev: true
6962
+
6963
+ /jsesc@0.5.0:
6964
+ resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
6965
+ hasBin: true
6966
+ dev: true
6967
+
6968
+ /jsesc@2.5.2:
6969
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
6970
+ engines: {node: '>=4'}
6971
+ hasBin: true
6972
+ dev: true
6973
+
6974
+ /json-diff@0.9.0:
6975
+ resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==}
6976
+ hasBin: true
6977
+ dependencies:
6978
+ cli-color: 2.0.3
6979
+ difflib: 0.2.4
6980
+ dreamopt: 0.8.0
6981
+ dev: true
6982
+
6983
+ /json-parse-even-better-errors@2.3.1:
6984
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
6985
+ dev: true
6986
+
6987
+ /json-schema-traverse@0.4.1:
6988
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
6989
+ dev: true
6990
+
6991
+ /json-stable-stringify-without-jsonify@1.0.1:
6992
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
6993
+ dev: true
6994
+
6995
+ /json5@1.0.2:
6996
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
6997
+ hasBin: true
6998
+ dependencies:
6999
+ minimist: 1.2.8
7000
+ dev: true
7001
+
7002
+ /json5@2.2.3:
7003
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
7004
+ engines: {node: '>=6'}
7005
+ hasBin: true
7006
+ dev: true
7007
+
7008
+ /jsonfile@6.1.0:
7009
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
7010
+ dependencies:
7011
+ universalify: 2.0.0
7012
+ optionalDependencies:
7013
+ graceful-fs: 4.2.11
7014
+ dev: true
7015
+
7016
+ /jsx-ast-utils@3.3.3:
7017
+ resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
7018
+ engines: {node: '>=4.0'}
7019
+ dependencies:
7020
+ array-includes: 3.1.6
7021
+ object.assign: 4.1.4
7022
+ dev: true
7023
+
7024
+ /kleur@3.0.3:
7025
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
7026
+ engines: {node: '>=6'}
7027
+ dev: true
7028
+
7029
+ /kleur@4.1.5:
7030
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
7031
+ engines: {node: '>=6'}
7032
+ dev: true
7033
+
7034
+ /language-subtag-registry@0.3.22:
7035
+ resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
7036
+ dev: true
7037
+
7038
+ /language-tags@1.0.5:
7039
+ resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
7040
+ dependencies:
7041
+ language-subtag-registry: 0.3.22
7042
+ dev: true
7043
+
7044
+ /leven@3.1.0:
7045
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
7046
+ engines: {node: '>=6'}
7047
+ dev: true
7048
+
7049
+ /levn@0.4.1:
7050
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
7051
+ engines: {node: '>= 0.8.0'}
7052
+ dependencies:
7053
+ prelude-ls: 1.2.1
7054
+ type-check: 0.4.0
7055
+ dev: true
7056
+
7057
+ /lines-and-columns@1.2.4:
7058
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
7059
+ dev: true
7060
+
7061
+ /locate-path@5.0.0:
7062
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
7063
+ engines: {node: '>=8'}
7064
+ dependencies:
7065
+ p-locate: 4.1.0
7066
+ dev: true
7067
+
7068
+ /locate-path@6.0.0:
7069
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
7070
+ engines: {node: '>=10'}
7071
+ dependencies:
4861
- p-locate: 6.0.0
7072
+ p-locate: 5.0.0
4862
- dev: false
7073
+ dev: true
4863
7074
 
4864
7075
  /lodash.debounce@4.0.8:
4865
7076
  resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
@@ -4869,6 +7080,10 @@ packages:
4869
7080
  resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
4870
7081
  dev: true
4871
7082
 
7083
+ /lodash.throttle@4.1.1:
7084
+ resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
7085
+ dev: true
7086
+
4872
7087
  /lodash@4.17.21:
4873
7088
  resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
4874
7089
  dev: true
@@ -4890,40 +7105,69 @@ packages:
4890
7105
  engines: {node: '>=10'}
4891
7106
  dependencies:
4892
7107
  yallist: 4.0.0
7108
+ dev: true
4893
7109
 
4894
- /lru-cache@7.18.3:
7110
+ /lru-queue@0.1.0:
4895
- resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
7111
+ resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==}
7112
+ dependencies:
4896
- engines: {node: '>=12'}
7113
+ es5-ext: 0.10.62
4897
- dev: false
7114
+ dev: true
4898
7115
 
7116
+ /magic-string@0.25.9:
7117
+ resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
7118
+ dependencies:
7119
+ sourcemap-codec: 1.4.8
7120
+ dev: true
7121
+
4899
- /map-obj@4.3.0:
7122
+ /make-dir@3.1.0:
4900
- resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
7123
+ resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
4901
7124
  engines: {node: '>=8'}
7125
+ dependencies:
7126
+ semver: 6.3.0
4902
- dev: false
7127
+ dev: true
4903
7128
 
4904
- /meow@12.0.1:
7129
+ /makeerror@1.0.12:
4905
- resolution: {integrity: sha512-/QOqMALNoKQcJAOOdIXjNLtfcCdLXbMFyB1fOOPdm6RzfBTlsuodOCTBDjVbeUSmgDQb8UI2oONqYGtq1PKKKA==}
7130
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
4906
- engines: {node: '>=16.10'}
4907
- dependencies:
7131
+ dependencies:
4908
- '@types/minimist': 1.2.2
4909
- camelcase-keys: 8.0.2
4910
- decamelize: 6.0.0
4911
- decamelize-keys: 2.0.1
4912
- hard-rejection: 2.1.0
4913
- minimist-options: 4.1.0
4914
- normalize-package-data: 5.0.0
4915
- read-pkg-up: 9.1.0
4916
- redent: 4.0.0
7132
+ tmpl: 1.0.5
4917
- trim-newlines: 5.0.0
4918
- type-fest: 3.11.0
4919
- yargs-parser: 21.1.1
4920
- dev: false
7133
+ dev: true
7134
+
7135
+ /media-typer@0.3.0:
7136
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
7137
+ engines: {node: '>= 0.6'}
7138
+ dev: true
7139
+
7140
+ /memoizee@0.4.15:
7141
+ resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==}
7142
+ dependencies:
7143
+ d: 1.0.1
7144
+ es5-ext: 0.10.62
7145
+ es6-weak-map: 2.0.3
7146
+ event-emitter: 0.3.5
7147
+ is-promise: 2.2.2
7148
+ lru-queue: 0.1.0
7149
+ next-tick: 1.1.0
7150
+ timers-ext: 0.1.7
7151
+ dev: true
7152
+
7153
+ /merge-descriptors@1.0.1:
7154
+ resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
7155
+ dev: true
7156
+
7157
+ /merge-stream@2.0.0:
7158
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
7159
+ dev: true
4921
7160
 
4922
7161
  /merge2@1.4.1:
4923
7162
  resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
4924
7163
  engines: {node: '>= 8'}
4925
7164
  dev: true
4926
7165
 
7166
+ /methods@1.1.2:
7167
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
7168
+ engines: {node: '>= 0.6'}
7169
+ dev: true
7170
+
4927
7171
  /micromatch@4.0.5:
4928
7172
  resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
4929
7173
  engines: {node: '>=8.6'}
@@ -4935,19 +7179,61 @@ packages:
4935
7179
  /mime-db@1.52.0:
4936
7180
  resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
4937
7181
  engines: {node: '>= 0.6'}
4938
- dev: false
7182
+ dev: true
4939
7183
 
4940
7184
  /mime-types@2.1.35:
4941
7185
  resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
4942
7186
  engines: {node: '>= 0.6'}
4943
7187
  dependencies:
4944
7188
  mime-db: 1.52.0
4945
- dev: false
7189
+ dev: true
4946
7190
 
4947
- /min-indent@1.0.1:
7191
+ /mime@1.6.0:
4948
- resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
7192
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
4949
7193
  engines: {node: '>=4'}
7194
+ hasBin: true
4950
- dev: false
7195
+ dev: true
7196
+
7197
+ /mime@3.0.0:
7198
+ resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
7199
+ engines: {node: '>=10.0.0'}
7200
+ hasBin: true
7201
+ dev: true
7202
+
7203
+ /mimic-fn@2.1.0:
7204
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
7205
+ engines: {node: '>=6'}
7206
+ dev: true
7207
+
7208
+ /mimic-response@3.1.0:
7209
+ resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
7210
+ engines: {node: '>=10'}
7211
+ dev: true
7212
+
7213
+ /miniflare@3.0.1:
7214
+ resolution: {integrity: sha512-aLOB8d26lOTn493GOv1LmpGHVLSxmeT4MixPG/k3Ze10j0wDKnMj8wsFgbZ6Q4cr1N4faf8O3IbNRJuQ+rLoJA==}
7215
+ engines: {node: '>=16.13'}
7216
+ dependencies:
7217
+ acorn: 8.8.2
7218
+ acorn-walk: 8.2.0
7219
+ better-sqlite3: 8.4.0
7220
+ capnp-ts: 0.7.0
7221
+ exit-hook: 2.2.1
7222
+ glob-to-regexp: 0.4.1
7223
+ http-cache-semantics: 4.1.1
7224
+ kleur: 4.1.5
7225
+ source-map-support: 0.5.21
7226
+ stoppable: 1.1.0
7227
+ undici: 5.22.1
7228
+ workerd: 1.20230518.0
7229
+ ws: 8.13.0
7230
+ youch: 3.2.3
7231
+ zod: 3.21.4
7232
+ transitivePeerDependencies:
7233
+ - bufferutil
7234
+ - supports-color
7235
+ - utf-8-validate
7236
+ dev: true
4951
7237
 
4952
7238
  /minimatch@3.1.2:
4953
7239
  resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -4955,31 +7241,54 @@ packages:
4955
7241
  brace-expansion: 1.1.11
4956
7242
  dev: true
4957
7243
 
4958
- /minimist-options@4.1.0:
7244
+ /minimatch@5.1.6:
4959
- resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
7245
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
4960
- engines: {node: '>= 6'}
7246
+ engines: {node: '>=10'}
4961
7247
  dependencies:
4962
- arrify: 1.0.1
4963
- is-plain-obj: 1.1.0
7248
+ brace-expansion: 2.0.1
4964
- kind-of: 6.0.3
4965
- dev: false
7249
+ dev: true
7250
+
7251
+ /minimatch@7.4.6:
7252
+ resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==}
7253
+ engines: {node: '>=10'}
7254
+ dependencies:
7255
+ brace-expansion: 2.0.1
7256
+ dev: true
4966
7257
 
4967
7258
  /minimist@1.2.8:
4968
7259
  resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
4969
7260
  dev: true
4970
7261
 
7262
+ /mkdirp-classic@0.5.3:
7263
+ resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
7264
+ dev: true
7265
+
7266
+ /ms@2.0.0:
7267
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
7268
+ dev: true
7269
+
4971
7270
  /ms@2.1.2:
4972
7271
  resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
4973
7272
  dev: true
4974
7273
 
4975
7274
  /ms@2.1.3:
4976
7275
  resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
7276
+ dev: true
7277
+
7278
+ /mustache@4.2.0:
7279
+ resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==}
7280
+ hasBin: true
7281
+ dev: true
4977
7282
 
4978
7283
  /nanoid@3.3.6:
4979
7284
  resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
4980
7285
  engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
4981
7286
  hasBin: true
4982
- dev: false
7287
+ dev: true
7288
+
7289
+ /napi-build-utils@1.0.2:
7290
+ resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
7291
+ dev: true
4983
7292
 
4984
7293
  /natural-compare-lite@1.4.0:
4985
7294
  resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
@@ -4989,37 +7298,56 @@ packages:
4989
7298
  resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
4990
7299
  dev: true
4991
7300
 
4992
- /node-releases@2.0.10:
7301
+ /negotiator@0.6.3:
7302
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
7303
+ engines: {node: '>= 0.6'}
7304
+ dev: true
7305
+
7306
+ /next-tick@1.1.0:
4993
- resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
7307
+ resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
7308
+ dev: true
4994
7309
 
4995
- /normalize-package-data@3.0.3:
7310
+ /node-abi@3.40.0:
4996
- resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
7311
+ resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==}
4997
7312
  engines: {node: '>=10'}
4998
7313
  dependencies:
4999
- hosted-git-info: 4.1.0
5000
- is-core-module: 2.12.1
5001
7314
  semver: 7.5.1
5002
- validate-npm-package-license: 3.0.4
5003
- dev: false
7315
+ dev: true
5004
7316
 
7317
+ /node-forge@1.3.1:
7318
+ resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
7319
+ engines: {node: '>= 6.13.0'}
7320
+ dev: true
7321
+
7322
+ /node-int64@0.4.0:
7323
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
7324
+ dev: true
7325
+
7326
+ /node-releases@2.0.10:
7327
+ resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
7328
+ dev: true
7329
+
7330
+ /node-watch@0.7.3:
7331
+ resolution: {integrity: sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==}
7332
+ engines: {node: '>=6'}
7333
+ dev: true
7334
+
5005
- /normalize-package-data@5.0.0:
7335
+ /normalize-path@3.0.0:
5006
- resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==}
7336
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
5007
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
7337
+ engines: {node: '>=0.10.0'}
5008
- dependencies:
5009
- hosted-git-info: 6.1.1
5010
- is-core-module: 2.12.1
5011
- semver: 7.5.1
5012
- validate-npm-package-license: 3.0.4
5013
- dev: false
7338
+ dev: true
5014
7339
 
5015
7340
  /normalize-range@0.1.2:
5016
7341
  resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
5017
7342
  engines: {node: '>=0.10.0'}
5018
- dev: false
7343
+ dev: true
5019
7344
 
5020
- /normalize.css@8.0.1:
7345
+ /npm-run-path@4.0.1:
5021
- resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==}
7346
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
7347
+ engines: {node: '>=8'}
7348
+ dependencies:
7349
+ path-key: 3.1.1
5022
- dev: false
7350
+ dev: true
5023
7351
 
5024
7352
  /object-assign@4.1.1:
5025
7353
  resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
@@ -5086,12 +7414,30 @@ packages:
5086
7414
  es-abstract: 1.21.2
5087
7415
  dev: true
5088
7416
 
7417
+ /obuf@1.1.2:
7418
+ resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
7419
+ dev: false
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
+
5089
7428
  /once@1.4.0:
5090
7429
  resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
5091
7430
  dependencies:
5092
7431
  wrappy: 1.0.2
5093
7432
  dev: true
5094
7433
 
7434
+ /onetime@5.1.2:
7435
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
7436
+ engines: {node: '>=6'}
7437
+ dependencies:
7438
+ mimic-fn: 2.1.0
7439
+ dev: true
7440
+
5095
7441
  /optionator@0.9.1:
5096
7442
  resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
5097
7443
  engines: {node: '>= 0.8.0'}
@@ -5104,6 +7450,13 @@ packages:
5104
7450
  word-wrap: 1.2.3
5105
7451
  dev: true
5106
7452
 
7453
+ /p-limit@2.3.0:
7454
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
7455
+ engines: {node: '>=6'}
7456
+ dependencies:
7457
+ p-try: 2.2.0
7458
+ dev: true
7459
+
5107
7460
  /p-limit@3.1.0:
5108
7461
  resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
5109
7462
  engines: {node: '>=10'}
@@ -5111,12 +7464,12 @@ packages:
5111
7464
  yocto-queue: 0.1.0
5112
7465
  dev: true
5113
7466
 
5114
- /p-limit@4.0.0:
7467
+ /p-locate@4.1.0:
5115
- resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
7468
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
5116
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
7469
+ engines: {node: '>=8'}
5117
7470
  dependencies:
5118
- yocto-queue: 1.0.0
7471
+ p-limit: 2.3.0
5119
- dev: false
7472
+ dev: true
5120
7473
 
5121
7474
  /p-locate@5.0.0:
5122
7475
  resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
@@ -5125,12 +7478,10 @@ packages:
5125
7478
  p-limit: 3.1.0
5126
7479
  dev: true
5127
7480
 
5128
- /p-locate@6.0.0:
7481
+ /p-try@2.2.0:
5129
- resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
7482
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
5130
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
7483
+ engines: {node: '>=6'}
5131
- dependencies:
5132
- p-limit: 4.0.0
5133
- dev: false
7484
+ dev: true
5134
7485
 
5135
7486
  /parent-module@1.0.1:
5136
7487
  resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
@@ -5147,17 +7498,18 @@ packages:
5147
7498
  error-ex: 1.3.2
5148
7499
  json-parse-even-better-errors: 2.3.1
5149
7500
  lines-and-columns: 1.2.4
7501
+ dev: true
7502
+
7503
+ /parseurl@1.3.3:
7504
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
7505
+ engines: {node: '>= 0.8'}
7506
+ dev: true
5150
7507
 
5151
7508
  /path-exists@4.0.0:
5152
7509
  resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
5153
7510
  engines: {node: '>=8'}
5154
7511
  dev: true
5155
7512
 
5156
- /path-exists@5.0.0:
5157
- resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
5158
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
5159
- dev: false
5160
-
5161
7513
  /path-is-absolute@1.0.1:
5162
7514
  resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
5163
7515
  engines: {node: '>=0.10.0'}
@@ -5172,19 +7524,67 @@ packages:
5172
7524
  resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
5173
7525
  dev: true
5174
7526
 
7527
+ /path-to-regexp@0.1.7:
7528
+ resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
7529
+ dev: true
7530
+
7531
+ /path-to-regexp@6.2.1:
7532
+ resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==}
7533
+ dev: true
7534
+
5175
7535
  /path-type@4.0.0:
5176
7536
  resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
5177
7537
  engines: {node: '>=8'}
5178
7538
  dev: true
5179
7539
 
7540
+ /pg-int8@1.0.1:
7541
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
7542
+ engines: {node: '>=4.0.0'}
7543
+ dev: false
7544
+
7545
+ /pg-numeric@1.0.2:
7546
+ resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==}
7547
+ engines: {node: '>=4'}
7548
+ dev: false
7549
+
7550
+ /pg-protocol@1.6.0:
7551
+ resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==}
7552
+ dev: false
7553
+
7554
+ /pg-types@4.0.1:
7555
+ resolution: {integrity: sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==}
7556
+ engines: {node: '>=10'}
7557
+ dependencies:
7558
+ pg-int8: 1.0.1
7559
+ pg-numeric: 1.0.2
7560
+ postgres-array: 3.0.2
7561
+ postgres-bytea: 3.0.0
7562
+ postgres-date: 2.0.1
7563
+ postgres-interval: 3.0.0
7564
+ postgres-range: 1.1.3
7565
+ dev: false
7566
+
5180
7567
  /picocolors@1.0.0:
5181
7568
  resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
7569
+ dev: true
5182
7570
 
5183
7571
  /picomatch@2.3.1:
5184
7572
  resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
5185
7573
  engines: {node: '>=8.6'}
5186
7574
  dev: true
5187
7575
 
7576
+ /pirates@4.0.5:
7577
+ resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
7578
+ engines: {node: '>= 6'}
7579
+ dev: true
7580
+
7581
+ /pkg-dir@4.2.0:
7582
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
7583
+ engines: {node: '>=8'}
7584
+ dependencies:
7585
+ find-up: 4.1.0
7586
+ dev: true
7587
+
5188
7588
  /playwright-core@1.31.2:
5189
7589
  resolution: {integrity: sha512-a1dFgCNQw4vCsG7bnojZjDnPewZcw7tZUNFN0ZkcLYKj+mPmXvg4MpaaKZ5SgqPsOmqIf2YsVRkgqiRDxD+fDQ==}
5190
7590
  engines: {node: '>=14'}
@@ -5202,7 +7602,7 @@ packages:
5202
7602
  '@csstools/css-tokenizer': 2.1.1
5203
7603
  '@csstools/media-query-list-parser': 2.0.4(@csstools/css-parser-algorithms@2.1.1)(@csstools/css-tokenizer@2.1.1)
5204
7604
  postcss: 8.4.21
5205
- dev: false
7605
+ dev: true
5206
7606
 
5207
7607
  /postcss-nesting@11.2.1(postcss@8.4.21):
5208
7608
  resolution: {integrity: sha512-E6Jq74Jo/PbRAtZioON54NPhUNJYxVWhwxbweYl1vAoBYuGlDIts5yhtKiZFLvkvwT73e/9nFrW3oMqAtgG+GQ==}
@@ -5213,7 +7613,7 @@ packages:
5213
7613
  '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13)
5214
7614
  postcss: 8.4.21
5215
7615
  postcss-selector-parser: 6.0.13
5216
- dev: false
7616
+ dev: true
5217
7617
 
5218
7618
  /postcss-selector-parser@6.0.13:
5219
7619
  resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
@@ -5221,11 +7621,11 @@ packages:
5221
7621
  dependencies:
5222
7622
  cssesc: 3.0.0
5223
7623
  util-deprecate: 1.0.2
5224
- dev: false
7624
+ dev: true
5225
7625
 
5226
7626
  /postcss-value-parser@4.2.0:
5227
7627
  resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
5228
- dev: false
7628
+ dev: true
5229
7629
 
5230
7630
  /postcss@8.4.21:
5231
7631
  resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
@@ -5234,13 +7634,97 @@ packages:
5234
7634
  nanoid: 3.3.6
5235
7635
  picocolors: 1.0.0
5236
7636
  source-map-js: 1.0.2
7637
+ dev: true
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
+
7648
+ /postgres-array@3.0.2:
7649
+ resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==}
7650
+ engines: {node: '>=12'}
7651
+ dev: false
7652
+
7653
+ /postgres-bytea@3.0.0:
7654
+ resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==}
7655
+ engines: {node: '>= 6'}
7656
+ dependencies:
7657
+ obuf: 1.1.2
5237
7658
  dev: false
5238
7659
 
7660
+ /postgres-date@2.0.1:
7661
+ resolution: {integrity: sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==}
7662
+ engines: {node: '>=12'}
7663
+ dev: false
7664
+
7665
+ /postgres-interval@3.0.0:
7666
+ resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==}
7667
+ engines: {node: '>=12'}
7668
+ dev: false
7669
+
7670
+ /postgres-range@1.1.3:
7671
+ resolution: {integrity: sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==}
7672
+ dev: false
7673
+
7674
+ /postgres@3.3.4:
7675
+ resolution: {integrity: sha512-XVu0+d/Y56pl2lSaf0c7V19AhAEfpVrhID1IENWN8nf0xch6hFq6dAov5dtUX6ZD46wfr1TxvLhxLtV8WnNsOg==}
7676
+
7677
+ /prebuild-install@7.1.1:
7678
+ resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==}
7679
+ engines: {node: '>=10'}
7680
+ hasBin: true
7681
+ dependencies:
7682
+ detect-libc: 2.0.1
7683
+ expand-template: 2.0.3
7684
+ github-from-package: 0.0.0
7685
+ minimist: 1.2.8
7686
+ mkdirp-classic: 0.5.3
7687
+ napi-build-utils: 1.0.2
7688
+ node-abi: 3.40.0
7689
+ pump: 3.0.0
7690
+ rc: 1.2.8
7691
+ simple-get: 4.0.1
7692
+ tar-fs: 2.1.1
7693
+ tunnel-agent: 0.6.0
7694
+ dev: true
7695
+
5239
7696
  /prelude-ls@1.2.1:
5240
7697
  resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
5241
7698
  engines: {node: '>= 0.8.0'}
5242
7699
  dev: true
5243
7700
 
7701
+ /prettier@2.8.8:
7702
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
7703
+ engines: {node: '>=10.13.0'}
7704
+ hasBin: true
7705
+ dev: true
7706
+
7707
+ /pretty-format@29.5.0:
7708
+ resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==}
7709
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
7710
+ dependencies:
7711
+ '@jest/schemas': 29.4.3
7712
+ ansi-styles: 5.2.0
7713
+ react-is: 18.2.0
7714
+ dev: true
7715
+
7716
+ /printable-characters@1.0.42:
7717
+ resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==}
7718
+ dev: true
7719
+
7720
+ /prompts@2.4.2:
7721
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
7722
+ engines: {node: '>= 6'}
7723
+ dependencies:
7724
+ kleur: 3.0.3
7725
+ sisteransi: 1.0.5
7726
+ dev: true
7727
+
5244
7728
  /prop-types@15.8.1:
5245
7729
  resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
5246
7730
  dependencies:
@@ -5248,24 +7732,70 @@ packages:
5248
7732
  object-assign: 4.1.1
5249
7733
  react-is: 16.13.1
5250
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
+
7743
+ /pump@3.0.0:
7744
+ resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
7745
+ dependencies:
7746
+ end-of-stream: 1.4.4
7747
+ once: 1.4.0
7748
+ dev: true
7749
+
5251
7750
  /punycode@2.3.0:
5252
7751
  resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
5253
7752
  engines: {node: '>=6'}
5254
7753
  dev: true
5255
7754
 
7755
+ /pure-rand@6.0.2:
7756
+ resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==}
7757
+ dev: true
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
+
5256
7766
  /queue-microtask@1.2.3:
5257
7767
  resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
5258
7768
  dev: true
5259
7769
 
5260
- /quick-lru@6.1.1:
5261
- resolution: {integrity: sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==}
5262
- engines: {node: '>=12'}
5263
- dev: false
5264
-
5265
7770
  /radix3@1.0.0:
5266
7771
  resolution: {integrity: sha512-6n3AEXth91ASapMVKiEh2wrbFJmI+NBilrWE0AbiGgfm0xet0QXC8+a3K19r1UVYjUjctUgB053c3V/J6V0kCQ==}
5267
7772
  dev: false
5268
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
+
7789
+ /rc@1.2.8:
7790
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
7791
+ hasBin: true
7792
+ dependencies:
7793
+ deep-extend: 0.6.0
7794
+ ini: 1.3.8
7795
+ minimist: 1.2.8
7796
+ strip-json-comments: 2.0.1
7797
+ dev: true
7798
+
5269
7799
  /react-aria-components@1.0.0-alpha.3(react-dom@18.2.0)(react@18.2.0):
5270
7800
  resolution: {integrity: sha512-rhakTyOPsTwk/ylCCcK38/y3yN2SXPWN2wPknNwDQ9wE+P/PQWIrc3WxOlhTFGltLC1/KXAAIvJrkPgPBFTE1g==}
5271
7801
  peerDependencies:
@@ -5382,6 +7912,15 @@ packages:
5382
7912
  /react-is@16.13.1:
5383
7913
  resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
5384
7914
 
7915
+ /react-is@18.2.0:
7916
+ resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
7917
+ dev: true
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
+
5385
7924
  /react-stately@3.22.0(react@18.2.0):
5386
7925
  resolution: {integrity: sha512-w5itlPtjfUpxy+195LxRbaCNaGN1NVfPHelhYXuoPoKNgUvmy54uKXvP1Ek1ETZ9e55BaXuMs83yXv94wIMdpQ==}
5387
7926
  peerDependencies:
@@ -5419,32 +7958,21 @@ packages:
5419
7958
  loose-envify: 1.4.0
5420
7959
  dev: false
5421
7960
 
5422
- /read-pkg-up@9.1.0:
7961
+ /readable-stream@3.6.2:
5423
- resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==}
5424
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
5425
- dependencies:
5426
- find-up: 6.3.0
5427
- read-pkg: 7.1.0
5428
- type-fest: 2.19.0
5429
- dev: false
5430
-
5431
- /read-pkg@7.1.0:
5432
- resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==}
7962
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
5433
- engines: {node: '>=12.20'}
7963
+ engines: {node: '>= 6'}
5434
7964
  dependencies:
5435
- '@types/normalize-package-data': 2.4.1
5436
- normalize-package-data: 3.0.3
5437
- parse-json: 5.2.0
5438
- type-fest: 2.19.0
7965
+ inherits: 2.0.4
7966
+ string_decoder: 1.3.0
7967
+ util-deprecate: 1.0.2
5439
- dev: false
7968
+ dev: true
5440
7969
 
5441
- /redent@4.0.0:
7970
+ /readdirp@3.6.0:
5442
- resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==}
7971
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
5443
- engines: {node: '>=12'}
7972
+ engines: {node: '>=8.10.0'}
5444
7973
  dependencies:
5445
- indent-string: 5.0.0
5446
- strip-indent: 4.0.0
7974
+ picomatch: 2.3.1
5447
- dev: false
7975
+ dev: true
5448
7976
 
5449
7977
  /regenerate-unicode-properties@10.1.0:
5450
7978
  resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==}
@@ -5492,11 +8020,23 @@ packages:
5492
8020
  unicode-match-property-value-ecmascript: 2.1.0
5493
8021
  dev: true
5494
8022
 
5495
- /regjsparser@0.9.1:
8023
+ /regjsparser@0.9.1:
5496
- resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
8024
+ resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
5497
- hasBin: true
8025
+ hasBin: true
8026
+ dependencies:
8027
+ jsesc: 0.5.0
8028
+ dev: true
8029
+
8030
+ /require-directory@2.1.1:
8031
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
8032
+ engines: {node: '>=0.10.0'}
8033
+ dev: true
8034
+
8035
+ /resolve-cwd@3.0.0:
8036
+ resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
8037
+ engines: {node: '>=8'}
5498
8038
  dependencies:
5499
- jsesc: 0.5.0
8039
+ resolve-from: 5.0.0
5500
8040
  dev: true
5501
8041
 
5502
8042
  /resolve-from@4.0.0:
@@ -5504,6 +8044,16 @@ packages:
5504
8044
  engines: {node: '>=4'}
5505
8045
  dev: true
5506
8046
 
8047
+ /resolve-from@5.0.0:
8048
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
8049
+ engines: {node: '>=8'}
8050
+ dev: true
8051
+
8052
+ /resolve.exports@2.0.2:
8053
+ resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
8054
+ engines: {node: '>=10'}
8055
+ dev: true
8056
+
5507
8057
  /resolve@1.22.2:
5508
8058
  resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
5509
8059
  hasBin: true
@@ -5534,12 +8084,45 @@ packages:
5534
8084
  glob: 7.2.3
5535
8085
  dev: true
5536
8086
 
8087
+ /rollup-plugin-inject@3.0.2:
8088
+ resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==}
8089
+ deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.
8090
+ dependencies:
8091
+ estree-walker: 0.6.1
8092
+ magic-string: 0.25.9
8093
+ rollup-pluginutils: 2.8.2
8094
+ dev: true
8095
+
8096
+ /rollup-plugin-node-polyfills@0.2.1:
8097
+ resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==}
8098
+ dependencies:
8099
+ rollup-plugin-inject: 3.0.2
8100
+ dev: true
8101
+
8102
+ /rollup-pluginutils@2.8.2:
8103
+ resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
8104
+ dependencies:
8105
+ estree-walker: 0.6.1
8106
+ dev: true
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
+
5537
8116
  /run-parallel@1.2.0:
5538
8117
  resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
5539
8118
  dependencies:
5540
8119
  queue-microtask: 1.2.3
5541
8120
  dev: true
5542
8121
 
8122
+ /safe-buffer@5.2.1:
8123
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
8124
+ dev: true
8125
+
5543
8126
  /safe-regex-test@1.0.0:
5544
8127
  resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
5545
8128
  dependencies:
@@ -5548,12 +8131,23 @@ packages:
5548
8131
  is-regex: 1.1.4
5549
8132
  dev: true
5550
8133
 
8134
+ /safer-buffer@2.1.2:
8135
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
8136
+ dev: true
8137
+
5551
8138
  /scheduler@0.23.0:
5552
8139
  resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
5553
8140
  dependencies:
5554
8141
  loose-envify: 1.4.0
5555
8142
  dev: false
5556
8143
 
8144
+ /selfsigned@2.1.1:
8145
+ resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==}
8146
+ engines: {node: '>=10'}
8147
+ dependencies:
8148
+ node-forge: 1.3.1
8149
+ dev: true
8150
+
5557
8151
  /semver@6.3.0:
5558
8152
  resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
5559
8153
  hasBin: true
@@ -5565,6 +8159,44 @@ packages:
5565
8159
  hasBin: true
5566
8160
  dependencies:
5567
8161
  lru-cache: 6.0.0
8162
+ dev: true
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
5568
8200
 
5569
8201
  /shallowequal@1.1.0:
5570
8202
  resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
@@ -5590,6 +8222,26 @@ packages:
5590
8222
  object-inspect: 1.12.3
5591
8223
  dev: true
5592
8224
 
8225
+ /signal-exit@3.0.7:
8226
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
8227
+ dev: true
8228
+
8229
+ /simple-concat@1.0.1:
8230
+ resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
8231
+ dev: true
8232
+
8233
+ /simple-get@4.0.1:
8234
+ resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
8235
+ dependencies:
8236
+ decompress-response: 6.0.0
8237
+ once: 1.4.0
8238
+ simple-concat: 1.0.1
8239
+ dev: true
8240
+
8241
+ /sisteransi@1.0.5:
8242
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
8243
+ dev: true
8244
+
5593
8245
  /slash@3.0.0:
5594
8246
  resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
5595
8247
  engines: {node: '>=8'}
@@ -5598,35 +8250,65 @@ packages:
5598
8250
  /source-map-js@1.0.2:
5599
8251
  resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
5600
8252
  engines: {node: '>=0.10.0'}
5601
- dev: false
8253
+ dev: true
5602
8254
 
5603
- /spdx-correct@3.2.0:
8255
+ /source-map-support@0.5.13:
5604
- resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
8256
+ resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
5605
8257
  dependencies:
5606
- spdx-expression-parse: 3.0.1
8258
+ buffer-from: 1.1.2
5607
- spdx-license-ids: 3.0.13
8259
+ source-map: 0.6.1
5608
- dev: false
8260
+ dev: true
5609
-
5610
- /spdx-exceptions@2.3.0:
5611
- resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
5612
- dev: false
5613
8261
 
5614
- /spdx-expression-parse@3.0.1:
8262
+ /source-map-support@0.5.21:
5615
- resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
8263
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
5616
8264
  dependencies:
5617
- spdx-exceptions: 2.3.0
8265
+ buffer-from: 1.1.2
5618
- spdx-license-ids: 3.0.13
8266
+ source-map: 0.6.1
5619
- dev: false
8267
+ dev: true
5620
8268
 
5621
- /spdx-license-ids@3.0.13:
8269
+ /source-map@0.6.1:
5622
- resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
8270
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
8271
+ engines: {node: '>=0.10.0'}
5623
- dev: false
8272
+ dev: true
8273
+
8274
+ /source-map@0.7.4:
8275
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
8276
+ engines: {node: '>= 8'}
8277
+ dev: true
8278
+
8279
+ /sourcemap-codec@1.4.8:
8280
+ resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
8281
+ deprecated: Please use @jridgewell/sourcemap-codec instead
8282
+ dev: true
8283
+
8284
+ /sprintf-js@1.0.3:
8285
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
8286
+ dev: true
5624
8287
 
5625
8288
  /sql-highlight@4.3.2:
5626
8289
  resolution: {integrity: sha512-7r6R5QKkiyKdMPMMdoUYwHbFZWdRhjJNxb0vUsFqloSZybGgFRcnM8IDZ9ZQSV2s6MWbtwn6O130+2ySL86oOA==}
5627
8290
  engines: {node: '>=14'}
5628
8291
  dev: false
5629
8292
 
8293
+ /stack-utils@2.0.6:
8294
+ resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
8295
+ engines: {node: '>=10'}
8296
+ dependencies:
8297
+ escape-string-regexp: 2.0.0
8298
+ dev: true
8299
+
8300
+ /stacktracey@2.1.8:
8301
+ resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==}
8302
+ dependencies:
8303
+ as-table: 1.0.55
8304
+ get-source: 2.0.12
8305
+ dev: true
8306
+
8307
+ /statuses@2.0.1:
8308
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
8309
+ engines: {node: '>= 0.8'}
8310
+ dev: true
8311
+
5630
8312
  /stop-iteration-iterator@1.0.0:
5631
8313
  resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
5632
8314
  engines: {node: '>= 0.4'}
@@ -5634,10 +8316,37 @@ packages:
5634
8316
  internal-slot: 1.0.5
5635
8317
  dev: true
5636
8318
 
8319
+ /stoppable@1.1.0:
8320
+ resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==}
8321
+ engines: {node: '>=4', npm: '>=6'}
8322
+ dev: true
8323
+
8324
+ /streamsearch@1.1.0:
8325
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
8326
+ engines: {node: '>=10.0.0'}
8327
+ dev: true
8328
+
8329
+ /string-length@4.0.2:
8330
+ resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
8331
+ engines: {node: '>=10'}
8332
+ dependencies:
8333
+ char-regex: 1.0.2
8334
+ strip-ansi: 6.0.1
8335
+ dev: true
8336
+
5637
8337
  /string-natural-compare@3.0.1:
5638
8338
  resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==}
5639
8339
  dev: true
5640
8340
 
8341
+ /string-width@4.2.3:
8342
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
8343
+ engines: {node: '>=8'}
8344
+ dependencies:
8345
+ emoji-regex: 8.0.0
8346
+ is-fullwidth-code-point: 3.0.0
8347
+ strip-ansi: 6.0.1
8348
+ dev: true
8349
+
5641
8350
  /string.prototype.matchall@4.0.8:
5642
8351
  resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
5643
8352
  dependencies:
@@ -5676,6 +8385,12 @@ packages:
5676
8385
  es-abstract: 1.21.2
5677
8386
  dev: true
5678
8387
 
8388
+ /string_decoder@1.3.0:
8389
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
8390
+ dependencies:
8391
+ safe-buffer: 5.2.1
8392
+ dev: true
8393
+
5679
8394
  /strip-ansi@6.0.1:
5680
8395
  resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
5681
8396
  engines: {node: '>=8'}
@@ -5688,12 +8403,20 @@ packages:
5688
8403
  engines: {node: '>=4'}
5689
8404
  dev: true
5690
8405
 
5691
- /strip-indent@4.0.0:
8406
+ /strip-bom@4.0.0:
5692
- resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
8407
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
5693
- engines: {node: '>=12'}
8408
+ engines: {node: '>=8'}
5694
- dependencies:
5695
- min-indent: 1.0.1
5696
- dev: false
8409
+ dev: true
8410
+
8411
+ /strip-final-newline@2.0.0:
8412
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
8413
+ engines: {node: '>=6'}
8414
+ dev: true
8415
+
8416
+ /strip-json-comments@2.0.1:
8417
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
8418
+ engines: {node: '>=0.10.0'}
8419
+ dev: true
5697
8420
 
5698
8421
  /strip-json-comments@3.1.1:
5699
8422
  resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
@@ -5705,6 +8428,7 @@ packages:
5705
8428
  engines: {node: '>=4'}
5706
8429
  dependencies:
5707
8430
  has-flag: 3.0.0
8431
+ dev: true
5708
8432
 
5709
8433
  /supports-color@7.2.0:
5710
8434
  resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
@@ -5713,15 +8437,62 @@ packages:
5713
8437
  has-flag: 4.0.0
5714
8438
  dev: true
5715
8439
 
8440
+ /supports-color@8.1.1:
8441
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
8442
+ engines: {node: '>=10'}
8443
+ dependencies:
8444
+ has-flag: 4.0.0
8445
+ dev: true
8446
+
5716
8447
  /supports-preserve-symlinks-flag@1.0.0:
5717
8448
  resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
5718
8449
  engines: {node: '>= 0.4'}
5719
8450
  dev: true
5720
8451
 
8452
+ /tar-fs@2.1.1:
8453
+ resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==}
8454
+ dependencies:
8455
+ chownr: 1.1.4
8456
+ mkdirp-classic: 0.5.3
8457
+ pump: 3.0.0
8458
+ tar-stream: 2.2.0
8459
+ dev: true
8460
+
8461
+ /tar-stream@2.2.0:
8462
+ resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
8463
+ engines: {node: '>=6'}
8464
+ dependencies:
8465
+ bl: 4.1.0
8466
+ end-of-stream: 1.4.4
8467
+ fs-constants: 1.0.0
8468
+ inherits: 2.0.4
8469
+ readable-stream: 3.6.2
8470
+ dev: true
8471
+
8472
+ /test-exclude@6.0.0:
8473
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
8474
+ engines: {node: '>=8'}
8475
+ dependencies:
8476
+ '@istanbuljs/schema': 0.1.3
8477
+ glob: 7.2.3
8478
+ minimatch: 3.1.2
8479
+ dev: true
8480
+
5721
8481
  /text-table@0.2.0:
5722
8482
  resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
5723
8483
  dev: true
5724
8484
 
8485
+ /timers-ext@0.1.7:
8486
+ resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==}
8487
+ dependencies:
8488
+ es5-ext: 0.10.62
8489
+ next-tick: 1.1.0
8490
+ dev: true
8491
+
8492
+ /tmpl@1.0.5:
8493
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
8494
+ dev: true
8495
+
5725
8496
  /to-fast-properties@2.0.0:
5726
8497
  resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
5727
8498
  engines: {node: '>=4'}
@@ -5734,10 +8505,10 @@ packages:
5734
8505
  is-number: 7.0.0
5735
8506
  dev: true
5736
8507
 
5737
- /trim-newlines@5.0.0:
8508
+ /toidentifier@1.0.1:
5738
- resolution: {integrity: sha512-kstfs+hgwmdsOadN3KgA+C68wPJwnZq4DN6WMDCvZapDWEF34W2TyPKN2v2+BJnZgIz5QOfxFeldLyYvdgRAwg==}
8509
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
5739
- engines: {node: '>=14.16'}
8510
+ engines: {node: '>=0.6'}
5740
- dev: false
8511
+ dev: true
5741
8512
 
5742
8513
  /tsconfig-paths@3.14.2:
5743
8514
  resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==}
@@ -5754,7 +8525,6 @@ packages:
5754
8525
 
5755
8526
  /tslib@2.5.2:
5756
8527
  resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==}
5757
- dev: false
5758
8528
 
5759
8529
  /tsutils@3.21.0(typescript@5.0.4):
5760
8530
  resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
@@ -5766,6 +8536,12 @@ packages:
5766
8536
  typescript: 5.0.4
5767
8537
  dev: true
5768
8538
 
8539
+ /tunnel-agent@0.6.0:
8540
+ resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
8541
+ dependencies:
8542
+ safe-buffer: 5.2.1
8543
+ dev: true
8544
+
5769
8545
  /type-check@0.4.0:
5770
8546
  resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
5771
8547
  engines: {node: '>= 0.8.0'}
@@ -5773,20 +8549,36 @@ packages:
5773
8549
  prelude-ls: 1.2.1
5774
8550
  dev: true
5775
8551
 
8552
+ /type-detect@4.0.8:
8553
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
8554
+ engines: {node: '>=4'}
8555
+ dev: true
8556
+
5776
8557
  /type-fest@0.20.2:
5777
8558
  resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
5778
8559
  engines: {node: '>=10'}
5779
8560
  dev: true
5780
8561
 
5781
- /type-fest@2.19.0:
8562
+ /type-fest@0.21.3:
5782
- resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
8563
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
5783
- engines: {node: '>=12.20'}
8564
+ engines: {node: '>=10'}
5784
- dev: false
8565
+ dev: true
5785
8566
 
5786
- /type-fest@3.11.0:
8567
+ /type-is@1.6.18:
5787
- resolution: {integrity: sha512-JaPw5U9ixP0XcpUbQoVSbxSDcK/K4nww20C3kjm9yE6cDRRhptU28AH60VWf9ltXmCrIfIbtt9J+2OUk2Uqiaw==}
8568
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
5788
- engines: {node: '>=14.16'}
8569
+ engines: {node: '>= 0.6'}
8570
+ dependencies:
8571
+ media-typer: 0.3.0
8572
+ mime-types: 2.1.35
5789
- dev: false
8573
+ dev: true
8574
+
8575
+ /type@1.2.0:
8576
+ resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==}
8577
+ dev: true
8578
+
8579
+ /type@2.7.2:
8580
+ resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==}
8581
+ dev: true
5790
8582
 
5791
8583
  /typed-array-length@1.0.4:
5792
8584
  resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
@@ -5811,6 +8603,13 @@ packages:
5811
8603
  which-boxed-primitive: 1.0.2
5812
8604
  dev: true
5813
8605
 
8606
+ /undici@5.22.1:
8607
+ resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==}
8608
+ engines: {node: '>=14.0'}
8609
+ dependencies:
8610
+ busboy: 1.6.0
8611
+ dev: true
8612
+
5814
8613
  /unicode-canonical-property-names-ecmascript@2.0.0:
5815
8614
  resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
5816
8615
  engines: {node: '>=4'}
@@ -5834,6 +8633,16 @@ packages:
5834
8633
  engines: {node: '>=4'}
5835
8634
  dev: true
5836
8635
 
8636
+ /universalify@2.0.0:
8637
+ resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
8638
+ engines: {node: '>= 10.0.0'}
8639
+ dev: true
8640
+
8641
+ /unpipe@1.0.0:
8642
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
8643
+ engines: {node: '>= 0.8'}
8644
+ dev: true
8645
+
5837
8646
  /update-browserslist-db@1.0.11(browserslist@4.21.5):
5838
8647
  resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
5839
8648
  hasBin: true
@@ -5843,6 +8652,7 @@ packages:
5843
8652
  browserslist: 4.21.5
5844
8653
  escalade: 3.1.1
5845
8654
  picocolors: 1.0.0
8655
+ dev: true
5846
8656
 
5847
8657
  /uri-js@4.4.1:
5848
8658
  resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -5860,19 +8670,69 @@ packages:
5860
8670
 
5861
8671
  /util-deprecate@1.0.2:
5862
8672
  resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
5863
- dev: false
8673
+ dev: true
8674
+
8675
+ /utils-merge@1.0.1:
8676
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
8677
+ engines: {node: '>= 0.4.0'}
8678
+ dev: true
5864
8679
 
5865
- /validate-npm-package-license@3.0.4:
8680
+ /v8-to-istanbul@9.1.0:
5866
- resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
8681
+ resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==}
8682
+ engines: {node: '>=10.12.0'}
5867
8683
  dependencies:
8684
+ '@jridgewell/trace-mapping': 0.3.18
8685
+ '@types/istanbul-lib-coverage': 2.0.4
5868
- spdx-correct: 3.2.0
8686
+ convert-source-map: 1.9.0
5869
- spdx-expression-parse: 3.0.1
5870
- dev: false
8687
+ dev: true
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
5871
8725
 
5872
8726
  /walkdir@0.4.1:
5873
8727
  resolution: {integrity: sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==}
5874
8728
  engines: {node: '>=6.0.0'}
5875
- dev: false
8729
+ dev: true
8730
+
8731
+ /walker@1.0.8:
8732
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
8733
+ dependencies:
8734
+ makeerror: 1.0.12
8735
+ dev: true
5876
8736
 
5877
8737
  /which-boxed-primitive@1.0.2:
5878
8738
  resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
@@ -5918,16 +8778,98 @@ packages:
5918
8778
  engines: {node: '>=0.10.0'}
5919
8779
  dev: true
5920
8780
 
8781
+ /wordwrap@1.0.0:
8782
+ resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
8783
+ dev: true
8784
+
8785
+ /workerd@1.20230518.0:
8786
+ resolution: {integrity: sha512-VNmK0zoNZXrwEEx77O/oQDVUzzyDjf5kKKK8bty+FmKCd5EQJCpqi8NlRKWLGMyyYrKm86MFz0kAsreTEs7HHA==}
8787
+ engines: {node: '>=16'}
8788
+ hasBin: true
8789
+ requiresBuild: true
8790
+ optionalDependencies:
8791
+ '@cloudflare/workerd-darwin-64': 1.20230518.0
8792
+ '@cloudflare/workerd-darwin-arm64': 1.20230518.0
8793
+ '@cloudflare/workerd-linux-64': 1.20230518.0
8794
+ '@cloudflare/workerd-linux-arm64': 1.20230518.0
8795
+ '@cloudflare/workerd-windows-64': 1.20230518.0
8796
+ dev: true
8797
+
8798
+ /wrangler@3.0.1:
8799
+ resolution: {integrity: sha512-YamXlRjkMO/V3Fvq7IC9H9GDWIbNGc4IV3l1Z5q45XYTWxUYbkwXyiTAfpmqhyl5wx+XEPKe3k/ubqmW+r63yQ==}
8800
+ engines: {node: '>=16.13.0'}
8801
+ hasBin: true
8802
+ dependencies:
8803
+ '@cloudflare/kv-asset-handler': 0.2.0
8804
+ '@esbuild-plugins/node-globals-polyfill': 0.1.1(esbuild@0.16.3)
8805
+ '@esbuild-plugins/node-modules-polyfill': 0.1.4(esbuild@0.16.3)
8806
+ blake3-wasm: 2.1.5
8807
+ chokidar: 3.5.3
8808
+ esbuild: 0.16.3
8809
+ miniflare: 3.0.1
8810
+ nanoid: 3.3.6
8811
+ path-to-regexp: 6.2.1
8812
+ selfsigned: 2.1.1
8813
+ source-map: 0.7.4
8814
+ xxhash-wasm: 1.0.2
8815
+ optionalDependencies:
8816
+ fsevents: 2.3.2
8817
+ transitivePeerDependencies:
8818
+ - bufferutil
8819
+ - supports-color
8820
+ - utf-8-validate
8821
+ dev: true
8822
+
8823
+ /wrap-ansi@7.0.0:
8824
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
8825
+ engines: {node: '>=10'}
8826
+ dependencies:
8827
+ ansi-styles: 4.3.0
8828
+ string-width: 4.2.3
8829
+ strip-ansi: 6.0.1
8830
+ dev: true
8831
+
5921
8832
  /wrappy@1.0.2:
5922
8833
  resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
5923
8834
  dev: true
5924
8835
 
8836
+ /write-file-atomic@4.0.2:
8837
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
8838
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
8839
+ dependencies:
8840
+ imurmurhash: 0.1.4
8841
+ signal-exit: 3.0.7
8842
+ dev: true
8843
+
8844
+ /ws@8.13.0:
8845
+ resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
8846
+ engines: {node: '>=10.0.0'}
8847
+ peerDependencies:
8848
+ bufferutil: ^4.0.1
8849
+ utf-8-validate: '>=5.0.2'
8850
+ peerDependenciesMeta:
8851
+ bufferutil:
8852
+ optional: true
8853
+ utf-8-validate:
8854
+ optional: true
8855
+ dev: true
8856
+
8857
+ /xxhash-wasm@1.0.2:
8858
+ resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==}
8859
+ dev: true
8860
+
8861
+ /y18n@5.0.8:
8862
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
8863
+ engines: {node: '>=10'}
8864
+ dev: true
8865
+
5925
8866
  /yallist@3.1.1:
5926
8867
  resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
5927
8868
  dev: true
5928
8869
 
5929
8870
  /yallist@4.0.0:
5930
8871
  resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
8872
+ dev: true
5931
8873
 
5932
8874
  /yaml@1.10.2:
5933
8875
  resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
@@ -5937,18 +8879,33 @@ packages:
5937
8879
  /yargs-parser@21.1.1:
5938
8880
  resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
5939
8881
  engines: {node: '>=12'}
5940
- dev: false
8882
+ dev: true
8883
+
8884
+ /yargs@17.7.2:
8885
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
8886
+ engines: {node: '>=12'}
8887
+ dependencies:
8888
+ cliui: 8.0.1
8889
+ escalade: 3.1.1
8890
+ get-caller-file: 2.0.5
8891
+ require-directory: 2.1.1
8892
+ string-width: 4.2.3
8893
+ y18n: 5.0.8
8894
+ yargs-parser: 21.1.1
8895
+ dev: true
5941
8896
 
5942
8897
  /yocto-queue@0.1.0:
5943
8898
  resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
5944
8899
  engines: {node: '>=10'}
5945
8900
  dev: true
5946
8901
 
5947
- /yocto-queue@1.0.0:
8902
+ /youch@3.2.3:
5948
- resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
8903
+ resolution: {integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==}
8904
+ dependencies:
8905
+ cookie: 0.5.0
5949
- engines: {node: '>=12.20'}
8906
+ mustache: 4.2.0
8907
+ stacktracey: 2.1.8
5950
- dev: false
8908
+ dev: true
5951
8909
 
5952
8910
  /zod@3.21.4:
5953
8911
  resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}
5954
- dev: false
pnpm-workspace.yaml CHANGED
@@ -1,2 +1,4 @@
1
1
  packages:
2
+ - "lib"
2
- - 'packages/*'
3
+ - "example"
4
+ - "docs"
readme.md CHANGED
@@ -1,20 +1,50 @@
1
- # parotta
1
+ <img src="https://github.com/pyrossh/edge-city/assets/1687946/29f61137-d467-4730-9368-29ffb259c192" width="200px">
2
2
 
3
+ # edge-city
4
+
3
- parotta is a next level meta-framework for react that runs only on edge runtimes.
5
+ edge-city is a next level meta-framework for react that runs only on edge runtimes.
4
- It uses bun as its bundler/transpiler and development mode as its quick and fast.
5
- It uses File System routing with streaming SSR + CSR as the method to render pages.
6
+ It uses file system routing with streaming SSR + CSR to render pages.
6
7
  It is very opionated and has set of idiomatic ways of doing things.
7
8
  It has an inbuilt rpc mechanism to access server resources instead of a typical REST API.
9
+ It aims to have almost the same router api as nextjs router for ease of use.
10
+
11
+ During development each request for a page is executed in a separate edge-runtime (miniflare/vercel) vm.
12
+ During production each page is packaged to an esm function adapted to the platform of your choice.
13
+
14
+ ## Why?
15
+ * Its really hard to have a streaming SSR + CSR with automatic data rehydration setup in nextjs 13.
16
+ * There is no meta-framework which runs your code in an edge simulated environment during development.
17
+
18
+ ## Requirements
19
+ 1. `node >= v20`
20
+ 2. `wrangler` for deploying to cloudflare page functions
21
+ 3. `vercel` for deploying to vercel edge runtime
22
+
23
+ ## DB access
24
+ Since it runs only on edge runtimes which run in a constrained browser environment, you have to use database drivers
25
+ which can run in the browser, basically utilize Ajax/Fetch/Websocket. Here is a list of some of them,
8
26
 
9
- During development each request for a page is executed in a separate vercel edge-runtime vm.
27
+ * [NeonDB serverless driver](https://github.com/neondatabase/serverless) - postgres
28
+ * [Platnetscale serverless driver](https://planetscale.com/docs/tutorials/planetscale-serverless-driver) - mysql
10
- During production each page is packaged to an esm function adapted to the platform of your choice.
29
+ * [Mongo Http](https://github.com/patrick-kw-chiu/mongo-http.js) - mongodb
11
30
 
12
- ### Todo
13
- 1. Hydrate rpc cache
14
- 2. Build a docs website using parotta
15
31
 
16
32
  ### Supported platforms
17
33
  1. [Cloudflare page functions](https://developers.cloudflare.com/pages/platform/functions/routing/)
18
- 2. [Vercel edge functions](https://vercel.com/docs/concepts/functions/edge-functions)
34
+ 2. [TODO][Vercel edge functions](https://vercel.com/docs/concepts/functions/edge-functions)
19
- 3. [Netlify edge functions](https://docs.netlify.com/edge-functions/overview/)
35
+ 3. [TODO][Netlify edge functions](https://docs.netlify.com/edge-functions/overview/)
36
+
37
+ ## Developing
38
+
39
+ 1. `node >= v20.2.0`
40
+ 2. `pnpm >= v8.5.1`
41
+
42
+ ### Todo[General]
43
+ 1. Build a docs website
44
+ 2. Add tests for bot
45
+ 3. Add tests for runtime
46
+ 4. Add E2E tests for example
20
- 4. [Deno Deploy](https://deno.com/deploy)
47
+ 5. Maybe move to vite for HMR goodness
48
+
49
+ ### Todo[Cloudflare]
50
+ 1. Fix 404 pages not routing on server