├── .dockerignore ├── .eslintrc.cjs ├── .gitignore ├── .prettierrc ├── .yarnrc.yml ├── Dockerfile ├── README.md ├── dbs └── .gitkeep ├── fly.toml ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public └── vite.svg ├── server.js ├── src ├── schemas │ └── main.sql ├── todomvc-p2p │ ├── App.tsx │ ├── Peers.tsx │ ├── ctx.ts │ └── main.tsx ├── todomvc │ ├── App.tsx │ ├── SyncEndpoints.ts │ ├── base.css │ ├── id.ts │ ├── main.tsx │ ├── style.css │ └── sync-worker.ts └── vite-env.d.ts ├── todomvc-p2p.html ├── todomvc.html ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | fly.toml 2 | Dockerfile 3 | .dockerignore 4 | node_modules 5 | .git 6 | dbs -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { browser: true, es2020: true }, 3 | extends: [ 4 | 'eslint:recommended', 5 | 'plugin:@typescript-eslint/recommended', 6 | 'plugin:react-hooks/recommended', 7 | ], 8 | parser: '@typescript-eslint/parser', 9 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, 10 | plugins: ['react-refresh'], 11 | rules: { 12 | 'react-refresh/only-export-components': 'warn', 13 | }, 14 | } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | dbs/ 26 | 27 | public/assets/crsqlite-*.wasm 28 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "singleQuote": false 5 | } 6 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye as builder 2 | 3 | ENV PATH=/usr/local/node/bin:$PATH 4 | ARG NODE_VERSION=19.0.1 5 | 6 | RUN apt-get update; apt install -y curl python-is-python3 pkg-config build-essential && \ 7 | curl -sL https://github.com/nodenv/node-build/archive/master.tar.gz | tar xz -C /tmp/ && \ 8 | /tmp/node-build-master/bin/node-build "${NODE_VERSION}" /usr/local/node && \ 9 | rm -rf /tmp/node-build-master 10 | 11 | RUN mkdir /app 12 | WORKDIR /app 13 | 14 | COPY . . 15 | 16 | RUN npm install -g pnpm 17 | RUN pnpm install 18 | RUN pnpm run build 19 | 20 | 21 | FROM debian:bullseye-slim 22 | 23 | LABEL fly_launch_runtime="nodejs" 24 | 25 | COPY --from=builder /usr/local/node /usr/local/node 26 | COPY --from=builder /app /app 27 | 28 | WORKDIR /app 29 | ENV NODE_ENV production 30 | ENV PATH /usr/local/node/bin:$PATH 31 | 32 | CMD [ "pnpm", "run", "start" ] 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vlcn-live-examples 2 | 3 | ## Note: The `vite-starters` are the most up to date examples. 4 | - https://github.com/vlcn-io/vite-starter 5 | - https://github.com/vlcn-io/example-rest 6 | 7 | 8 | Example apps. Deployed to https://vlcn-live-examples.fly.dev 9 | 10 | - TodoMVC: https://vlcn-live-examples.fly.dev/todomvc.html 11 | - After opening a todo list, share the link with others to collaborate on that list. 12 | - TodoMVC p2p: https://vlcn-live-examples.fly.dev/todomvc-p2p.html 13 | - Copy a peer id from one peer, connect to it from another peer 14 | 15 | --- 16 | 17 | Running locally: 18 | 19 | ``` 20 | git clone git@github.com:vlcn-io/live-examples.git 21 | cd live-examples 22 | npm install 23 | npm run dev 24 | ``` 25 | -------------------------------------------------------------------------------- /dbs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vlcn-io/live-examples/51ea1ad409adf5602fc0d338b1b0b16bf3d6e5b2/dbs/.gitkeep -------------------------------------------------------------------------------- /fly.toml: -------------------------------------------------------------------------------- 1 | # fly.toml file generated for vite-starter on 2023-05-18T15:37:10-04:00 2 | 3 | app = "vlcn-live-examples" 4 | kill_signal = "SIGINT" 5 | kill_timeout = 5 6 | primary_region = "iad" 7 | processes = [] 8 | 9 | [env] 10 | PORT = "8080" 11 | 12 | [experimental] 13 | auto_rollback = true 14 | 15 | [mounts] 16 | destination = "/app/dbs" 17 | source = "dbs" 18 | 19 | [[services]] 20 | http_checks = [] 21 | internal_port = 8080 22 | processes = ["app"] 23 | protocol = "tcp" 24 | script_checks = [] 25 | [services.concurrency] 26 | hard_limit = 250 27 | soft_limit = 200 28 | type = "connections" 29 | 30 | [[services.ports]] 31 | force_https = true 32 | handlers = ["http"] 33 | port = 80 34 | 35 | [[services.ports]] 36 | handlers = ["tls", "http"] 37 | port = 443 38 | 39 | [[services.tcp_checks]] 40 | grace_period = "1s" 41 | interval = "15s" 42 | restart_limit = 0 43 | timeout = "2s" 44 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vlcn-vite-starter", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev:server": "node ./server.js", 8 | "dev:ui": "vite", 9 | "start": "NODE_ENV=production node ./server.js", 10 | "build": "tsc && vite build", 11 | "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0" 12 | }, 13 | "dependencies": { 14 | "@vlcn.io/crsqlite-wasm": "0.15.2", 15 | "@vlcn.io/react": "3.0.3", 16 | "@vlcn.io/rx-tbl": "0.14.1", 17 | "@vlcn.io/sync-p2p": "0.13.1", 18 | "@vlcn.io/ws-browserdb": "0.1.2", 19 | "@vlcn.io/ws-client": "0.1.2", 20 | "@vlcn.io/ws-server": "0.1.2", 21 | "@vlcn.io/xplat-api": "0.14.1", 22 | "cors": "^2.8.5", 23 | "express": "^4.18.2", 24 | "nanoid": "^4.0.2", 25 | "react": "^18.2.0", 26 | "react-dom": "^18.2.0", 27 | "uuid": "^9.0.0" 28 | }, 29 | "devDependencies": { 30 | "@types/node": "^20.5.0", 31 | "@types/react": "^18.2.20", 32 | "@types/react-dom": "^18.2.7", 33 | "@typescript-eslint/eslint-plugin": "^5.62.0", 34 | "@typescript-eslint/parser": "^5.62.0", 35 | "@vitejs/plugin-react": "^4.0.4", 36 | "eslint": "^8.47.0", 37 | "eslint-plugin-react-hooks": "^4.6.0", 38 | "eslint-plugin-react-refresh": "^0.3.5", 39 | "typescript": "^5.1.6", 40 | "vite": "^4.4.9" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@vlcn.io/crsqlite-wasm': 9 | specifier: 0.15.2 10 | version: 0.15.2 11 | '@vlcn.io/react': 12 | specifier: 3.0.3 13 | version: 3.0.3(react@18.2.0) 14 | '@vlcn.io/rx-tbl': 15 | specifier: 0.14.1 16 | version: 0.14.1 17 | '@vlcn.io/sync-p2p': 18 | specifier: 0.13.1 19 | version: 0.13.1 20 | '@vlcn.io/ws-browserdb': 21 | specifier: 0.1.2 22 | version: 0.1.2 23 | '@vlcn.io/ws-client': 24 | specifier: 0.1.2 25 | version: 0.1.2 26 | '@vlcn.io/ws-server': 27 | specifier: 0.1.2 28 | version: 0.1.2 29 | '@vlcn.io/xplat-api': 30 | specifier: 0.14.1 31 | version: 0.14.1 32 | cors: 33 | specifier: ^2.8.5 34 | version: 2.8.5 35 | express: 36 | specifier: ^4.18.2 37 | version: 4.18.2 38 | nanoid: 39 | specifier: ^4.0.2 40 | version: 4.0.2 41 | react: 42 | specifier: ^18.2.0 43 | version: 18.2.0 44 | react-dom: 45 | specifier: ^18.2.0 46 | version: 18.2.0(react@18.2.0) 47 | uuid: 48 | specifier: ^9.0.0 49 | version: 9.0.0 50 | 51 | devDependencies: 52 | '@types/node': 53 | specifier: ^20.5.0 54 | version: 20.5.0 55 | '@types/react': 56 | specifier: ^18.2.20 57 | version: 18.2.20 58 | '@types/react-dom': 59 | specifier: ^18.2.7 60 | version: 18.2.7 61 | '@typescript-eslint/eslint-plugin': 62 | specifier: ^5.62.0 63 | version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@5.1.6) 64 | '@typescript-eslint/parser': 65 | specifier: ^5.62.0 66 | version: 5.62.0(eslint@8.47.0)(typescript@5.1.6) 67 | '@vitejs/plugin-react': 68 | specifier: ^4.0.4 69 | version: 4.0.4(vite@4.4.9) 70 | eslint: 71 | specifier: ^8.47.0 72 | version: 8.47.0 73 | eslint-plugin-react-hooks: 74 | specifier: ^4.6.0 75 | version: 4.6.0(eslint@8.47.0) 76 | eslint-plugin-react-refresh: 77 | specifier: ^0.3.5 78 | version: 0.3.5(eslint@8.47.0) 79 | typescript: 80 | specifier: ^5.1.6 81 | version: 5.1.6 82 | vite: 83 | specifier: ^4.4.9 84 | version: 4.4.9(@types/node@20.5.0) 85 | 86 | packages: 87 | 88 | /@aashutoshrathi/word-wrap@1.2.6: 89 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 90 | engines: {node: '>=0.10.0'} 91 | dev: true 92 | 93 | /@ampproject/remapping@2.2.1: 94 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 95 | engines: {node: '>=6.0.0'} 96 | dependencies: 97 | '@jridgewell/gen-mapping': 0.3.3 98 | '@jridgewell/trace-mapping': 0.3.19 99 | dev: true 100 | 101 | /@babel/code-frame@7.22.10: 102 | resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} 103 | engines: {node: '>=6.9.0'} 104 | dependencies: 105 | '@babel/highlight': 7.22.10 106 | chalk: 2.4.2 107 | dev: true 108 | 109 | /@babel/compat-data@7.22.9: 110 | resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} 111 | engines: {node: '>=6.9.0'} 112 | dev: true 113 | 114 | /@babel/core@7.22.10: 115 | resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} 116 | engines: {node: '>=6.9.0'} 117 | dependencies: 118 | '@ampproject/remapping': 2.2.1 119 | '@babel/code-frame': 7.22.10 120 | '@babel/generator': 7.22.10 121 | '@babel/helper-compilation-targets': 7.22.10 122 | '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) 123 | '@babel/helpers': 7.22.10 124 | '@babel/parser': 7.22.10 125 | '@babel/template': 7.22.5 126 | '@babel/traverse': 7.22.10 127 | '@babel/types': 7.22.10 128 | convert-source-map: 1.9.0 129 | debug: 4.3.4 130 | gensync: 1.0.0-beta.2 131 | json5: 2.2.3 132 | semver: 6.3.1 133 | transitivePeerDependencies: 134 | - supports-color 135 | dev: true 136 | 137 | /@babel/generator@7.22.10: 138 | resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} 139 | engines: {node: '>=6.9.0'} 140 | dependencies: 141 | '@babel/types': 7.22.10 142 | '@jridgewell/gen-mapping': 0.3.3 143 | '@jridgewell/trace-mapping': 0.3.19 144 | jsesc: 2.5.2 145 | dev: true 146 | 147 | /@babel/helper-compilation-targets@7.22.10: 148 | resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} 149 | engines: {node: '>=6.9.0'} 150 | dependencies: 151 | '@babel/compat-data': 7.22.9 152 | '@babel/helper-validator-option': 7.22.5 153 | browserslist: 4.21.10 154 | lru-cache: 5.1.1 155 | semver: 6.3.1 156 | dev: true 157 | 158 | /@babel/helper-environment-visitor@7.22.5: 159 | resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} 160 | engines: {node: '>=6.9.0'} 161 | dev: true 162 | 163 | /@babel/helper-function-name@7.22.5: 164 | resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} 165 | engines: {node: '>=6.9.0'} 166 | dependencies: 167 | '@babel/template': 7.22.5 168 | '@babel/types': 7.22.10 169 | dev: true 170 | 171 | /@babel/helper-hoist-variables@7.22.5: 172 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 173 | engines: {node: '>=6.9.0'} 174 | dependencies: 175 | '@babel/types': 7.22.10 176 | dev: true 177 | 178 | /@babel/helper-module-imports@7.22.5: 179 | resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} 180 | engines: {node: '>=6.9.0'} 181 | dependencies: 182 | '@babel/types': 7.22.10 183 | dev: true 184 | 185 | /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10): 186 | resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} 187 | engines: {node: '>=6.9.0'} 188 | peerDependencies: 189 | '@babel/core': ^7.0.0 190 | dependencies: 191 | '@babel/core': 7.22.10 192 | '@babel/helper-environment-visitor': 7.22.5 193 | '@babel/helper-module-imports': 7.22.5 194 | '@babel/helper-simple-access': 7.22.5 195 | '@babel/helper-split-export-declaration': 7.22.6 196 | '@babel/helper-validator-identifier': 7.22.5 197 | dev: true 198 | 199 | /@babel/helper-plugin-utils@7.22.5: 200 | resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} 201 | engines: {node: '>=6.9.0'} 202 | dev: true 203 | 204 | /@babel/helper-simple-access@7.22.5: 205 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 206 | engines: {node: '>=6.9.0'} 207 | dependencies: 208 | '@babel/types': 7.22.10 209 | dev: true 210 | 211 | /@babel/helper-split-export-declaration@7.22.6: 212 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 213 | engines: {node: '>=6.9.0'} 214 | dependencies: 215 | '@babel/types': 7.22.10 216 | dev: true 217 | 218 | /@babel/helper-string-parser@7.22.5: 219 | resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} 220 | engines: {node: '>=6.9.0'} 221 | dev: true 222 | 223 | /@babel/helper-validator-identifier@7.22.5: 224 | resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} 225 | engines: {node: '>=6.9.0'} 226 | dev: true 227 | 228 | /@babel/helper-validator-option@7.22.5: 229 | resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} 230 | engines: {node: '>=6.9.0'} 231 | dev: true 232 | 233 | /@babel/helpers@7.22.10: 234 | resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} 235 | engines: {node: '>=6.9.0'} 236 | dependencies: 237 | '@babel/template': 7.22.5 238 | '@babel/traverse': 7.22.10 239 | '@babel/types': 7.22.10 240 | transitivePeerDependencies: 241 | - supports-color 242 | dev: true 243 | 244 | /@babel/highlight@7.22.10: 245 | resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} 246 | engines: {node: '>=6.9.0'} 247 | dependencies: 248 | '@babel/helper-validator-identifier': 7.22.5 249 | chalk: 2.4.2 250 | js-tokens: 4.0.0 251 | dev: true 252 | 253 | /@babel/parser@7.22.10: 254 | resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} 255 | engines: {node: '>=6.0.0'} 256 | hasBin: true 257 | dependencies: 258 | '@babel/types': 7.22.10 259 | dev: true 260 | 261 | /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.10): 262 | resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} 263 | engines: {node: '>=6.9.0'} 264 | peerDependencies: 265 | '@babel/core': ^7.0.0-0 266 | dependencies: 267 | '@babel/core': 7.22.10 268 | '@babel/helper-plugin-utils': 7.22.5 269 | dev: true 270 | 271 | /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.10): 272 | resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} 273 | engines: {node: '>=6.9.0'} 274 | peerDependencies: 275 | '@babel/core': ^7.0.0-0 276 | dependencies: 277 | '@babel/core': 7.22.10 278 | '@babel/helper-plugin-utils': 7.22.5 279 | dev: true 280 | 281 | /@babel/template@7.22.5: 282 | resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} 283 | engines: {node: '>=6.9.0'} 284 | dependencies: 285 | '@babel/code-frame': 7.22.10 286 | '@babel/parser': 7.22.10 287 | '@babel/types': 7.22.10 288 | dev: true 289 | 290 | /@babel/traverse@7.22.10: 291 | resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} 292 | engines: {node: '>=6.9.0'} 293 | dependencies: 294 | '@babel/code-frame': 7.22.10 295 | '@babel/generator': 7.22.10 296 | '@babel/helper-environment-visitor': 7.22.5 297 | '@babel/helper-function-name': 7.22.5 298 | '@babel/helper-hoist-variables': 7.22.5 299 | '@babel/helper-split-export-declaration': 7.22.6 300 | '@babel/parser': 7.22.10 301 | '@babel/types': 7.22.10 302 | debug: 4.3.4 303 | globals: 11.12.0 304 | transitivePeerDependencies: 305 | - supports-color 306 | dev: true 307 | 308 | /@babel/types@7.22.10: 309 | resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} 310 | engines: {node: '>=6.9.0'} 311 | dependencies: 312 | '@babel/helper-string-parser': 7.22.5 313 | '@babel/helper-validator-identifier': 7.22.5 314 | to-fast-properties: 2.0.0 315 | dev: true 316 | 317 | /@cbor-extract/cbor-extract-darwin-arm64@2.1.1: 318 | resolution: {integrity: sha512-blVBy5MXz6m36Vx0DfLd7PChOQKEs8lK2bD1WJn/vVgG4FXZiZmZb2GECHFvVPA5T7OnODd9xZiL3nMCv6QUhA==} 319 | cpu: [arm64] 320 | os: [darwin] 321 | requiresBuild: true 322 | dev: false 323 | optional: true 324 | 325 | /@cbor-extract/cbor-extract-darwin-x64@2.1.1: 326 | resolution: {integrity: sha512-h6KFOzqk8jXTvkOftyRIWGrd7sKQzQv2jVdTL9nKSf3D2drCvQB/LHUxAOpPXo3pv2clDtKs3xnHalpEh3rDsw==} 327 | cpu: [x64] 328 | os: [darwin] 329 | requiresBuild: true 330 | dev: false 331 | optional: true 332 | 333 | /@cbor-extract/cbor-extract-linux-arm64@2.1.1: 334 | resolution: {integrity: sha512-SxAaRcYf8S0QHaMc7gvRSiTSr7nUYMqbUdErBEu+HYA4Q6UNydx1VwFE68hGcp1qvxcy9yT5U7gA+a5XikfwSQ==} 335 | cpu: [arm64] 336 | os: [linux] 337 | requiresBuild: true 338 | dev: false 339 | optional: true 340 | 341 | /@cbor-extract/cbor-extract-linux-arm@2.1.1: 342 | resolution: {integrity: sha512-ds0uikdcIGUjPyraV4oJqyVE5gl/qYBpa/Wnh6l6xLE2lj/hwnjT2XcZCChdXwW/YFZ1LUHs6waoYN8PmK0nKQ==} 343 | cpu: [arm] 344 | os: [linux] 345 | requiresBuild: true 346 | dev: false 347 | optional: true 348 | 349 | /@cbor-extract/cbor-extract-linux-x64@2.1.1: 350 | resolution: {integrity: sha512-GVK+8fNIE9lJQHAlhOROYiI0Yd4bAZ4u++C2ZjlkS3YmO6hi+FUxe6Dqm+OKWTcMpL/l71N6CQAmaRcb4zyJuA==} 351 | cpu: [x64] 352 | os: [linux] 353 | requiresBuild: true 354 | dev: false 355 | optional: true 356 | 357 | /@cbor-extract/cbor-extract-win32-x64@2.1.1: 358 | resolution: {integrity: sha512-2Niq1C41dCRIDeD8LddiH+mxGlO7HJ612Ll3D/E73ZWBmycued+8ghTr/Ho3CMOWPUEr08XtyBMVXAjqF+TcKw==} 359 | cpu: [x64] 360 | os: [win32] 361 | requiresBuild: true 362 | dev: false 363 | optional: true 364 | 365 | /@colors/colors@1.5.0: 366 | resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} 367 | engines: {node: '>=0.1.90'} 368 | dev: false 369 | 370 | /@dabh/diagnostics@2.0.3: 371 | resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} 372 | dependencies: 373 | colorspace: 1.1.4 374 | enabled: 2.0.0 375 | kuler: 2.0.0 376 | dev: false 377 | 378 | /@esbuild/android-arm64@0.18.20: 379 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 380 | engines: {node: '>=12'} 381 | cpu: [arm64] 382 | os: [android] 383 | requiresBuild: true 384 | dev: true 385 | optional: true 386 | 387 | /@esbuild/android-arm@0.18.20: 388 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 389 | engines: {node: '>=12'} 390 | cpu: [arm] 391 | os: [android] 392 | requiresBuild: true 393 | dev: true 394 | optional: true 395 | 396 | /@esbuild/android-x64@0.18.20: 397 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 398 | engines: {node: '>=12'} 399 | cpu: [x64] 400 | os: [android] 401 | requiresBuild: true 402 | dev: true 403 | optional: true 404 | 405 | /@esbuild/darwin-arm64@0.18.20: 406 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 407 | engines: {node: '>=12'} 408 | cpu: [arm64] 409 | os: [darwin] 410 | requiresBuild: true 411 | dev: true 412 | optional: true 413 | 414 | /@esbuild/darwin-x64@0.18.20: 415 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 416 | engines: {node: '>=12'} 417 | cpu: [x64] 418 | os: [darwin] 419 | requiresBuild: true 420 | dev: true 421 | optional: true 422 | 423 | /@esbuild/freebsd-arm64@0.18.20: 424 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 425 | engines: {node: '>=12'} 426 | cpu: [arm64] 427 | os: [freebsd] 428 | requiresBuild: true 429 | dev: true 430 | optional: true 431 | 432 | /@esbuild/freebsd-x64@0.18.20: 433 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 434 | engines: {node: '>=12'} 435 | cpu: [x64] 436 | os: [freebsd] 437 | requiresBuild: true 438 | dev: true 439 | optional: true 440 | 441 | /@esbuild/linux-arm64@0.18.20: 442 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 443 | engines: {node: '>=12'} 444 | cpu: [arm64] 445 | os: [linux] 446 | requiresBuild: true 447 | dev: true 448 | optional: true 449 | 450 | /@esbuild/linux-arm@0.18.20: 451 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 452 | engines: {node: '>=12'} 453 | cpu: [arm] 454 | os: [linux] 455 | requiresBuild: true 456 | dev: true 457 | optional: true 458 | 459 | /@esbuild/linux-ia32@0.18.20: 460 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 461 | engines: {node: '>=12'} 462 | cpu: [ia32] 463 | os: [linux] 464 | requiresBuild: true 465 | dev: true 466 | optional: true 467 | 468 | /@esbuild/linux-loong64@0.18.20: 469 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 470 | engines: {node: '>=12'} 471 | cpu: [loong64] 472 | os: [linux] 473 | requiresBuild: true 474 | dev: true 475 | optional: true 476 | 477 | /@esbuild/linux-mips64el@0.18.20: 478 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 479 | engines: {node: '>=12'} 480 | cpu: [mips64el] 481 | os: [linux] 482 | requiresBuild: true 483 | dev: true 484 | optional: true 485 | 486 | /@esbuild/linux-ppc64@0.18.20: 487 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 488 | engines: {node: '>=12'} 489 | cpu: [ppc64] 490 | os: [linux] 491 | requiresBuild: true 492 | dev: true 493 | optional: true 494 | 495 | /@esbuild/linux-riscv64@0.18.20: 496 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 497 | engines: {node: '>=12'} 498 | cpu: [riscv64] 499 | os: [linux] 500 | requiresBuild: true 501 | dev: true 502 | optional: true 503 | 504 | /@esbuild/linux-s390x@0.18.20: 505 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 506 | engines: {node: '>=12'} 507 | cpu: [s390x] 508 | os: [linux] 509 | requiresBuild: true 510 | dev: true 511 | optional: true 512 | 513 | /@esbuild/linux-x64@0.18.20: 514 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 515 | engines: {node: '>=12'} 516 | cpu: [x64] 517 | os: [linux] 518 | requiresBuild: true 519 | dev: true 520 | optional: true 521 | 522 | /@esbuild/netbsd-x64@0.18.20: 523 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 524 | engines: {node: '>=12'} 525 | cpu: [x64] 526 | os: [netbsd] 527 | requiresBuild: true 528 | dev: true 529 | optional: true 530 | 531 | /@esbuild/openbsd-x64@0.18.20: 532 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 533 | engines: {node: '>=12'} 534 | cpu: [x64] 535 | os: [openbsd] 536 | requiresBuild: true 537 | dev: true 538 | optional: true 539 | 540 | /@esbuild/sunos-x64@0.18.20: 541 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 542 | engines: {node: '>=12'} 543 | cpu: [x64] 544 | os: [sunos] 545 | requiresBuild: true 546 | dev: true 547 | optional: true 548 | 549 | /@esbuild/win32-arm64@0.18.20: 550 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 551 | engines: {node: '>=12'} 552 | cpu: [arm64] 553 | os: [win32] 554 | requiresBuild: true 555 | dev: true 556 | optional: true 557 | 558 | /@esbuild/win32-ia32@0.18.20: 559 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 560 | engines: {node: '>=12'} 561 | cpu: [ia32] 562 | os: [win32] 563 | requiresBuild: true 564 | dev: true 565 | optional: true 566 | 567 | /@esbuild/win32-x64@0.18.20: 568 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 569 | engines: {node: '>=12'} 570 | cpu: [x64] 571 | os: [win32] 572 | requiresBuild: true 573 | dev: true 574 | optional: true 575 | 576 | /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): 577 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 578 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 579 | peerDependencies: 580 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 581 | dependencies: 582 | eslint: 8.47.0 583 | eslint-visitor-keys: 3.4.3 584 | dev: true 585 | 586 | /@eslint-community/regexpp@4.6.2: 587 | resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} 588 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 589 | dev: true 590 | 591 | /@eslint/eslintrc@2.1.2: 592 | resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} 593 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 594 | dependencies: 595 | ajv: 6.12.6 596 | debug: 4.3.4 597 | espree: 9.6.1 598 | globals: 13.21.0 599 | ignore: 5.2.4 600 | import-fresh: 3.3.0 601 | js-yaml: 4.1.0 602 | minimatch: 3.1.2 603 | strip-json-comments: 3.1.1 604 | transitivePeerDependencies: 605 | - supports-color 606 | dev: true 607 | 608 | /@eslint/js@8.47.0: 609 | resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} 610 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 611 | dev: true 612 | 613 | /@humanwhocodes/config-array@0.11.10: 614 | resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} 615 | engines: {node: '>=10.10.0'} 616 | dependencies: 617 | '@humanwhocodes/object-schema': 1.2.1 618 | debug: 4.3.4 619 | minimatch: 3.1.2 620 | transitivePeerDependencies: 621 | - supports-color 622 | dev: true 623 | 624 | /@humanwhocodes/module-importer@1.0.1: 625 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 626 | engines: {node: '>=12.22'} 627 | dev: true 628 | 629 | /@humanwhocodes/object-schema@1.2.1: 630 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 631 | dev: true 632 | 633 | /@jridgewell/gen-mapping@0.3.3: 634 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 635 | engines: {node: '>=6.0.0'} 636 | dependencies: 637 | '@jridgewell/set-array': 1.1.2 638 | '@jridgewell/sourcemap-codec': 1.4.15 639 | '@jridgewell/trace-mapping': 0.3.19 640 | dev: true 641 | 642 | /@jridgewell/resolve-uri@3.1.1: 643 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 644 | engines: {node: '>=6.0.0'} 645 | dev: true 646 | 647 | /@jridgewell/set-array@1.1.2: 648 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 649 | engines: {node: '>=6.0.0'} 650 | dev: true 651 | 652 | /@jridgewell/sourcemap-codec@1.4.15: 653 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 654 | dev: true 655 | 656 | /@jridgewell/trace-mapping@0.3.19: 657 | resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} 658 | dependencies: 659 | '@jridgewell/resolve-uri': 3.1.1 660 | '@jridgewell/sourcemap-codec': 1.4.15 661 | dev: true 662 | 663 | /@msgpack/msgpack@2.8.0: 664 | resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} 665 | engines: {node: '>= 10'} 666 | dev: false 667 | 668 | /@nodelib/fs.scandir@2.1.5: 669 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 670 | engines: {node: '>= 8'} 671 | dependencies: 672 | '@nodelib/fs.stat': 2.0.5 673 | run-parallel: 1.2.0 674 | dev: true 675 | 676 | /@nodelib/fs.stat@2.0.5: 677 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 678 | engines: {node: '>= 8'} 679 | dev: true 680 | 681 | /@nodelib/fs.walk@1.2.8: 682 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 683 | engines: {node: '>= 8'} 684 | dependencies: 685 | '@nodelib/fs.scandir': 2.1.5 686 | fastq: 1.15.0 687 | dev: true 688 | 689 | /@types/json-schema@7.0.12: 690 | resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} 691 | dev: true 692 | 693 | /@types/node@20.5.0: 694 | resolution: {integrity: sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==} 695 | dev: true 696 | 697 | /@types/prop-types@15.7.5: 698 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} 699 | dev: true 700 | 701 | /@types/react-dom@18.2.7: 702 | resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} 703 | dependencies: 704 | '@types/react': 18.2.20 705 | dev: true 706 | 707 | /@types/react@18.2.20: 708 | resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} 709 | dependencies: 710 | '@types/prop-types': 15.7.5 711 | '@types/scheduler': 0.16.3 712 | csstype: 3.1.2 713 | dev: true 714 | 715 | /@types/scheduler@0.16.3: 716 | resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} 717 | dev: true 718 | 719 | /@types/semver@7.5.0: 720 | resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} 721 | dev: true 722 | 723 | /@types/throttle-debounce@5.0.0: 724 | resolution: {integrity: sha512-Pb7k35iCGFcGPECoNE4DYp3Oyf2xcTd3FbFQxXUI9hEYKUl6YX+KLf7HrBmgVcD05nl50LIH6i+80js4iYmWbw==} 725 | dev: false 726 | 727 | /@types/triple-beam@1.3.3: 728 | resolution: {integrity: sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==} 729 | dev: false 730 | 731 | /@types/uuid@9.0.4: 732 | resolution: {integrity: sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==} 733 | dev: false 734 | 735 | /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@5.1.6): 736 | resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} 737 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 738 | peerDependencies: 739 | '@typescript-eslint/parser': ^5.0.0 740 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 741 | typescript: '*' 742 | peerDependenciesMeta: 743 | typescript: 744 | optional: true 745 | dependencies: 746 | '@eslint-community/regexpp': 4.6.2 747 | '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 748 | '@typescript-eslint/scope-manager': 5.62.0 749 | '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 750 | '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 751 | debug: 4.3.4 752 | eslint: 8.47.0 753 | graphemer: 1.4.0 754 | ignore: 5.2.4 755 | natural-compare-lite: 1.4.0 756 | semver: 7.5.4 757 | tsutils: 3.21.0(typescript@5.1.6) 758 | typescript: 5.1.6 759 | transitivePeerDependencies: 760 | - supports-color 761 | dev: true 762 | 763 | /@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.1.6): 764 | resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} 765 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 766 | peerDependencies: 767 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 768 | typescript: '*' 769 | peerDependenciesMeta: 770 | typescript: 771 | optional: true 772 | dependencies: 773 | '@typescript-eslint/scope-manager': 5.62.0 774 | '@typescript-eslint/types': 5.62.0 775 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) 776 | debug: 4.3.4 777 | eslint: 8.47.0 778 | typescript: 5.1.6 779 | transitivePeerDependencies: 780 | - supports-color 781 | dev: true 782 | 783 | /@typescript-eslint/scope-manager@5.62.0: 784 | resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} 785 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 786 | dependencies: 787 | '@typescript-eslint/types': 5.62.0 788 | '@typescript-eslint/visitor-keys': 5.62.0 789 | dev: true 790 | 791 | /@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@5.1.6): 792 | resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} 793 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 794 | peerDependencies: 795 | eslint: '*' 796 | typescript: '*' 797 | peerDependenciesMeta: 798 | typescript: 799 | optional: true 800 | dependencies: 801 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) 802 | '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.1.6) 803 | debug: 4.3.4 804 | eslint: 8.47.0 805 | tsutils: 3.21.0(typescript@5.1.6) 806 | typescript: 5.1.6 807 | transitivePeerDependencies: 808 | - supports-color 809 | dev: true 810 | 811 | /@typescript-eslint/types@5.62.0: 812 | resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} 813 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 814 | dev: true 815 | 816 | /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): 817 | resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} 818 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 819 | peerDependencies: 820 | typescript: '*' 821 | peerDependenciesMeta: 822 | typescript: 823 | optional: true 824 | dependencies: 825 | '@typescript-eslint/types': 5.62.0 826 | '@typescript-eslint/visitor-keys': 5.62.0 827 | debug: 4.3.4 828 | globby: 11.1.0 829 | is-glob: 4.0.3 830 | semver: 7.5.4 831 | tsutils: 3.21.0(typescript@5.1.6) 832 | typescript: 5.1.6 833 | transitivePeerDependencies: 834 | - supports-color 835 | dev: true 836 | 837 | /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@5.1.6): 838 | resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} 839 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 840 | peerDependencies: 841 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 842 | dependencies: 843 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) 844 | '@types/json-schema': 7.0.12 845 | '@types/semver': 7.5.0 846 | '@typescript-eslint/scope-manager': 5.62.0 847 | '@typescript-eslint/types': 5.62.0 848 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) 849 | eslint: 8.47.0 850 | eslint-scope: 5.1.1 851 | semver: 7.5.4 852 | transitivePeerDependencies: 853 | - supports-color 854 | - typescript 855 | dev: true 856 | 857 | /@typescript-eslint/visitor-keys@5.62.0: 858 | resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} 859 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 860 | dependencies: 861 | '@typescript-eslint/types': 5.62.0 862 | eslint-visitor-keys: 3.4.3 863 | dev: true 864 | 865 | /@vitejs/plugin-react@4.0.4(vite@4.4.9): 866 | resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==} 867 | engines: {node: ^14.18.0 || >=16.0.0} 868 | peerDependencies: 869 | vite: ^4.2.0 870 | dependencies: 871 | '@babel/core': 7.22.10 872 | '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.10) 873 | '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.10) 874 | react-refresh: 0.14.0 875 | vite: 4.4.9(@types/node@20.5.0) 876 | transitivePeerDependencies: 877 | - supports-color 878 | dev: true 879 | 880 | /@vlcn.io/crsqlite-wasm@0.15.2: 881 | resolution: {integrity: sha512-yftBNDo6oMUJmEpUYFeh5iftJVoYiXpECvjvAFVXaWX7FPaV+kTKtWK3I4x4mB9rXXu1gk1+12E78HNZO1a55w==} 882 | dependencies: 883 | '@vlcn.io/wa-sqlite': 0.21.0 884 | '@vlcn.io/xplat-api': 0.14.1 885 | async-mutex: 0.4.0 886 | dev: false 887 | 888 | /@vlcn.io/crsqlite@0.15.1: 889 | resolution: {integrity: sha512-TE5Vks7/aOqfhSZ1BPV0+C+X4Mz6aTZ7SqwDUNAMTrxdkC3wgzaXB+8MbsEpfFyd7dcAMjdE1bBnFXNFANGNeQ==} 890 | requiresBuild: true 891 | dev: false 892 | 893 | /@vlcn.io/logger-provider@0.1.2: 894 | resolution: {integrity: sha512-vLYcd3bR97rG8ePEvMDd0xgOinTWaF8quxdSQ939Fa9oIYbcUtLZw5dJ9KsJD6H7Axz8xfltQmgayqdXwiqBsQ==} 895 | dependencies: 896 | winston: 3.10.0 897 | dev: false 898 | 899 | /@vlcn.io/react@3.0.3(react@18.2.0): 900 | resolution: {integrity: sha512-fodFg+/XtGJdeO3q/agfl30MXmoBs/xC4653Cuzys+WlQjL5tfzJlEPW9hOByVNa+SWffzbPm+RIeBKksoTlMg==} 901 | peerDependencies: 902 | react: ^18 903 | dependencies: 904 | '@vlcn.io/crsqlite-wasm': 0.15.2 905 | '@vlcn.io/rx-tbl': 0.14.1 906 | '@vlcn.io/typed-sql': 0.2.13 907 | '@vlcn.io/ws-client': 0.1.2 908 | '@vlcn.io/xplat-api': 0.14.1 909 | async-mutex: 0.4.0 910 | react: 18.2.0 911 | dev: false 912 | 913 | /@vlcn.io/rx-tbl@0.14.1: 914 | resolution: {integrity: sha512-sUDMzZR0SWSUOSUOZ+raTSVTQXlN/z0Gk4A0Kol6gMfhnZCJW5hu5wMOjGu2EMR+wWdDVJTfvRsw47Nz10Kb8A==} 915 | dependencies: 916 | '@vlcn.io/xplat-api': 0.14.1 917 | dev: false 918 | 919 | /@vlcn.io/sync-p2p@0.13.1: 920 | resolution: {integrity: sha512-MXWjm9uYVshpaDfgFJLiZVTftnDQYgy/mUmdSm8Ro/57poks01YmyLvmoe82vJd19s1iVXDy4GkY70YwZPyiCQ==} 921 | dependencies: 922 | '@types/uuid': 9.0.4 923 | '@vlcn.io/xplat-api': 0.14.1 924 | peerjs: 1.5.0 925 | uuid: 9.0.0 926 | dev: false 927 | 928 | /@vlcn.io/typed-sql@0.2.13: 929 | resolution: {integrity: sha512-gPwhZ4nmkA9+S5gUGJ5DH/O9EKDXroSB0LiF7nBXtAluISwrb/h+VI6FQY8Pc8TBQcLYbCKHDIF2rWXaFWPrig==} 930 | dev: false 931 | 932 | /@vlcn.io/wa-sqlite@0.21.0: 933 | resolution: {integrity: sha512-aCeTGIGyi+HOv8wzJQ8n4lG9XqjjBEKVAPLXq/dekW6AM/x0ITA5vAQ7YUhpn9xNq3U1cp5DPIX+vzMkpsRNww==} 934 | dev: false 935 | 936 | /@vlcn.io/ws-browserdb@0.1.2: 937 | resolution: {integrity: sha512-5LqRH0UpoWIzjCYzr4tyd9NRwenKea3nI1+cerhOIIvpCgcw2QqmW2a5PKr/lh8I9FIV1VgXSfBibOOIFkCaYg==} 938 | dependencies: 939 | '@types/throttle-debounce': 5.0.0 940 | '@vlcn.io/crsqlite-wasm': 0.15.2 941 | '@vlcn.io/rx-tbl': 0.14.1 942 | '@vlcn.io/ws-client': 0.1.2 943 | '@vlcn.io/ws-common': 0.1.2 944 | '@vlcn.io/xplat-api': 0.14.1 945 | dev: false 946 | 947 | /@vlcn.io/ws-client@0.1.2: 948 | resolution: {integrity: sha512-DFrb4rocRVEoYk/Fwm68+bzZaUkAlOo8Eu3J2W20C01IvNM2LS69BgAQv5A2DhBv5DuKSvbuFNwxRAzYpZkxUA==} 949 | dependencies: 950 | '@types/throttle-debounce': 5.0.0 951 | '@vlcn.io/ws-common': 0.1.2 952 | dev: false 953 | 954 | /@vlcn.io/ws-common@0.1.2: 955 | resolution: {integrity: sha512-rUx/1HsVZB1AMS2eldXljbF+P72DtVvUip+qybavJuho57LVtcJQfqJSfyXaMgVVuvvtqlECssS7e9SF41CMWA==} 956 | dependencies: 957 | lib0: 0.2.85 958 | dev: false 959 | 960 | /@vlcn.io/ws-server@0.1.2: 961 | resolution: {integrity: sha512-ZJg1Q6JEQsIIp6zP7PidKx8GWZfcHs8T4YPGzxHNgOAR79Zcitd0BmjZWrbsFwrKd6I7GrJ9srEt0+Br+tTMfw==} 962 | dependencies: 963 | '@vlcn.io/crsqlite': 0.15.1 964 | '@vlcn.io/logger-provider': 0.1.2 965 | '@vlcn.io/ws-common': 0.1.2 966 | better-sqlite3: 8.6.0 967 | chokidar: 3.5.3 968 | throttle-debounce: 5.0.0 969 | winston: 3.10.0 970 | ws: 8.14.1 971 | transitivePeerDependencies: 972 | - bufferutil 973 | - utf-8-validate 974 | dev: false 975 | 976 | /@vlcn.io/xplat-api@0.14.1: 977 | resolution: {integrity: sha512-Y63WDk0kkt6i1WzlD6StiFXXHP+YJaDO/SW0S9+dyoEZDvkDLHr1HrKsfBn1JreBnbCd5fOhm/gRP49m1Ksfhg==} 978 | dependencies: 979 | comlink: 4.4.1 980 | dev: false 981 | 982 | /accepts@1.3.8: 983 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 984 | engines: {node: '>= 0.6'} 985 | dependencies: 986 | mime-types: 2.1.35 987 | negotiator: 0.6.3 988 | dev: false 989 | 990 | /acorn-jsx@5.3.2(acorn@8.10.0): 991 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 992 | peerDependencies: 993 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 994 | dependencies: 995 | acorn: 8.10.0 996 | dev: true 997 | 998 | /acorn@8.10.0: 999 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 1000 | engines: {node: '>=0.4.0'} 1001 | hasBin: true 1002 | dev: true 1003 | 1004 | /ajv@6.12.6: 1005 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 1006 | dependencies: 1007 | fast-deep-equal: 3.1.3 1008 | fast-json-stable-stringify: 2.1.0 1009 | json-schema-traverse: 0.4.1 1010 | uri-js: 4.4.1 1011 | dev: true 1012 | 1013 | /ansi-regex@5.0.1: 1014 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1015 | engines: {node: '>=8'} 1016 | dev: true 1017 | 1018 | /ansi-styles@3.2.1: 1019 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 1020 | engines: {node: '>=4'} 1021 | dependencies: 1022 | color-convert: 1.9.3 1023 | dev: true 1024 | 1025 | /ansi-styles@4.3.0: 1026 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1027 | engines: {node: '>=8'} 1028 | dependencies: 1029 | color-convert: 2.0.1 1030 | dev: true 1031 | 1032 | /anymatch@3.1.3: 1033 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 1034 | engines: {node: '>= 8'} 1035 | dependencies: 1036 | normalize-path: 3.0.0 1037 | picomatch: 2.3.1 1038 | dev: false 1039 | 1040 | /argparse@2.0.1: 1041 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1042 | dev: true 1043 | 1044 | /array-flatten@1.1.1: 1045 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 1046 | dev: false 1047 | 1048 | /array-union@2.1.0: 1049 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 1050 | engines: {node: '>=8'} 1051 | dev: true 1052 | 1053 | /async-mutex@0.4.0: 1054 | resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} 1055 | dependencies: 1056 | tslib: 2.6.2 1057 | dev: false 1058 | 1059 | /async@3.2.4: 1060 | resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} 1061 | dev: false 1062 | 1063 | /balanced-match@1.0.2: 1064 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1065 | dev: true 1066 | 1067 | /base64-js@1.5.1: 1068 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 1069 | dev: false 1070 | 1071 | /better-sqlite3@8.6.0: 1072 | resolution: {integrity: sha512-jwAudeiTMTSyby+/SfbHDebShbmC2MCH8mU2+DXi0WJfv13ypEJm47cd3kljmy/H130CazEvkf2Li//ewcMJ1g==} 1073 | requiresBuild: true 1074 | dependencies: 1075 | bindings: 1.5.0 1076 | prebuild-install: 7.1.1 1077 | dev: false 1078 | 1079 | /binary-extensions@2.2.0: 1080 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 1081 | engines: {node: '>=8'} 1082 | dev: false 1083 | 1084 | /bindings@1.5.0: 1085 | resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 1086 | dependencies: 1087 | file-uri-to-path: 1.0.0 1088 | dev: false 1089 | 1090 | /bl@4.1.0: 1091 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 1092 | dependencies: 1093 | buffer: 5.7.1 1094 | inherits: 2.0.4 1095 | readable-stream: 3.6.2 1096 | dev: false 1097 | 1098 | /body-parser@1.20.1: 1099 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} 1100 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 1101 | dependencies: 1102 | bytes: 3.1.2 1103 | content-type: 1.0.5 1104 | debug: 2.6.9 1105 | depd: 2.0.0 1106 | destroy: 1.2.0 1107 | http-errors: 2.0.0 1108 | iconv-lite: 0.4.24 1109 | on-finished: 2.4.1 1110 | qs: 6.11.0 1111 | raw-body: 2.5.1 1112 | type-is: 1.6.18 1113 | unpipe: 1.0.0 1114 | transitivePeerDependencies: 1115 | - supports-color 1116 | dev: false 1117 | 1118 | /brace-expansion@1.1.11: 1119 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1120 | dependencies: 1121 | balanced-match: 1.0.2 1122 | concat-map: 0.0.1 1123 | dev: true 1124 | 1125 | /braces@3.0.2: 1126 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1127 | engines: {node: '>=8'} 1128 | dependencies: 1129 | fill-range: 7.0.1 1130 | 1131 | /browserslist@4.21.10: 1132 | resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} 1133 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1134 | hasBin: true 1135 | dependencies: 1136 | caniuse-lite: 1.0.30001521 1137 | electron-to-chromium: 1.4.494 1138 | node-releases: 2.0.13 1139 | update-browserslist-db: 1.0.11(browserslist@4.21.10) 1140 | dev: true 1141 | 1142 | /buffer@5.7.1: 1143 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 1144 | dependencies: 1145 | base64-js: 1.5.1 1146 | ieee754: 1.2.1 1147 | dev: false 1148 | 1149 | /bytes@3.1.2: 1150 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 1151 | engines: {node: '>= 0.8'} 1152 | dev: false 1153 | 1154 | /call-bind@1.0.2: 1155 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 1156 | dependencies: 1157 | function-bind: 1.1.1 1158 | get-intrinsic: 1.2.1 1159 | dev: false 1160 | 1161 | /callsites@3.1.0: 1162 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1163 | engines: {node: '>=6'} 1164 | dev: true 1165 | 1166 | /caniuse-lite@1.0.30001521: 1167 | resolution: {integrity: sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==} 1168 | dev: true 1169 | 1170 | /cbor-extract@2.1.1: 1171 | resolution: {integrity: sha512-1UX977+L+zOJHsp0mWFG13GLwO6ucKgSmSW6JTl8B9GUvACvHeIVpFqhU92299Z6PfD09aTXDell5p+lp1rUFA==} 1172 | hasBin: true 1173 | requiresBuild: true 1174 | dependencies: 1175 | node-gyp-build-optional-packages: 5.0.3 1176 | optionalDependencies: 1177 | '@cbor-extract/cbor-extract-darwin-arm64': 2.1.1 1178 | '@cbor-extract/cbor-extract-darwin-x64': 2.1.1 1179 | '@cbor-extract/cbor-extract-linux-arm': 2.1.1 1180 | '@cbor-extract/cbor-extract-linux-arm64': 2.1.1 1181 | '@cbor-extract/cbor-extract-linux-x64': 2.1.1 1182 | '@cbor-extract/cbor-extract-win32-x64': 2.1.1 1183 | dev: false 1184 | optional: true 1185 | 1186 | /cbor-x@1.5.4: 1187 | resolution: {integrity: sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw==} 1188 | optionalDependencies: 1189 | cbor-extract: 2.1.1 1190 | dev: false 1191 | 1192 | /chalk@2.4.2: 1193 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1194 | engines: {node: '>=4'} 1195 | dependencies: 1196 | ansi-styles: 3.2.1 1197 | escape-string-regexp: 1.0.5 1198 | supports-color: 5.5.0 1199 | dev: true 1200 | 1201 | /chalk@4.1.2: 1202 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1203 | engines: {node: '>=10'} 1204 | dependencies: 1205 | ansi-styles: 4.3.0 1206 | supports-color: 7.2.0 1207 | dev: true 1208 | 1209 | /chokidar@3.5.3: 1210 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 1211 | engines: {node: '>= 8.10.0'} 1212 | dependencies: 1213 | anymatch: 3.1.3 1214 | braces: 3.0.2 1215 | glob-parent: 5.1.2 1216 | is-binary-path: 2.1.0 1217 | is-glob: 4.0.3 1218 | normalize-path: 3.0.0 1219 | readdirp: 3.6.0 1220 | optionalDependencies: 1221 | fsevents: 2.3.2 1222 | dev: false 1223 | 1224 | /chownr@1.1.4: 1225 | resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 1226 | dev: false 1227 | 1228 | /color-convert@1.9.3: 1229 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1230 | dependencies: 1231 | color-name: 1.1.3 1232 | 1233 | /color-convert@2.0.1: 1234 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1235 | engines: {node: '>=7.0.0'} 1236 | dependencies: 1237 | color-name: 1.1.4 1238 | dev: true 1239 | 1240 | /color-name@1.1.3: 1241 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1242 | 1243 | /color-name@1.1.4: 1244 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1245 | 1246 | /color-string@1.9.1: 1247 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 1248 | dependencies: 1249 | color-name: 1.1.4 1250 | simple-swizzle: 0.2.2 1251 | dev: false 1252 | 1253 | /color@3.2.1: 1254 | resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} 1255 | dependencies: 1256 | color-convert: 1.9.3 1257 | color-string: 1.9.1 1258 | dev: false 1259 | 1260 | /colorspace@1.1.4: 1261 | resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} 1262 | dependencies: 1263 | color: 3.2.1 1264 | text-hex: 1.0.0 1265 | dev: false 1266 | 1267 | /comlink@4.4.1: 1268 | resolution: {integrity: sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==} 1269 | dev: false 1270 | 1271 | /concat-map@0.0.1: 1272 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 1273 | dev: true 1274 | 1275 | /content-disposition@0.5.4: 1276 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 1277 | engines: {node: '>= 0.6'} 1278 | dependencies: 1279 | safe-buffer: 5.2.1 1280 | dev: false 1281 | 1282 | /content-type@1.0.5: 1283 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 1284 | engines: {node: '>= 0.6'} 1285 | dev: false 1286 | 1287 | /convert-source-map@1.9.0: 1288 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 1289 | dev: true 1290 | 1291 | /cookie-signature@1.0.6: 1292 | resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} 1293 | dev: false 1294 | 1295 | /cookie@0.5.0: 1296 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1297 | engines: {node: '>= 0.6'} 1298 | dev: false 1299 | 1300 | /cors@2.8.5: 1301 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 1302 | engines: {node: '>= 0.10'} 1303 | dependencies: 1304 | object-assign: 4.1.1 1305 | vary: 1.1.2 1306 | dev: false 1307 | 1308 | /cross-spawn@7.0.3: 1309 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1310 | engines: {node: '>= 8'} 1311 | dependencies: 1312 | path-key: 3.1.1 1313 | shebang-command: 2.0.0 1314 | which: 2.0.2 1315 | dev: true 1316 | 1317 | /csstype@3.1.2: 1318 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 1319 | dev: true 1320 | 1321 | /debug@2.6.9: 1322 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 1323 | peerDependencies: 1324 | supports-color: '*' 1325 | peerDependenciesMeta: 1326 | supports-color: 1327 | optional: true 1328 | dependencies: 1329 | ms: 2.0.0 1330 | dev: false 1331 | 1332 | /debug@4.3.4: 1333 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1334 | engines: {node: '>=6.0'} 1335 | peerDependencies: 1336 | supports-color: '*' 1337 | peerDependenciesMeta: 1338 | supports-color: 1339 | optional: true 1340 | dependencies: 1341 | ms: 2.1.2 1342 | dev: true 1343 | 1344 | /decompress-response@6.0.0: 1345 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 1346 | engines: {node: '>=10'} 1347 | dependencies: 1348 | mimic-response: 3.1.0 1349 | dev: false 1350 | 1351 | /deep-extend@0.6.0: 1352 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 1353 | engines: {node: '>=4.0.0'} 1354 | dev: false 1355 | 1356 | /deep-is@0.1.4: 1357 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1358 | dev: true 1359 | 1360 | /depd@2.0.0: 1361 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 1362 | engines: {node: '>= 0.8'} 1363 | dev: false 1364 | 1365 | /destroy@1.2.0: 1366 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 1367 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 1368 | dev: false 1369 | 1370 | /detect-libc@2.0.2: 1371 | resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} 1372 | engines: {node: '>=8'} 1373 | dev: false 1374 | 1375 | /dir-glob@3.0.1: 1376 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1377 | engines: {node: '>=8'} 1378 | dependencies: 1379 | path-type: 4.0.0 1380 | dev: true 1381 | 1382 | /doctrine@3.0.0: 1383 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1384 | engines: {node: '>=6.0.0'} 1385 | dependencies: 1386 | esutils: 2.0.3 1387 | dev: true 1388 | 1389 | /ee-first@1.1.1: 1390 | resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} 1391 | dev: false 1392 | 1393 | /electron-to-chromium@1.4.494: 1394 | resolution: {integrity: sha512-KF7wtsFFDu4ws1ZsSOt4pdmO1yWVNWCFtijVYZPUeW4SV7/hy/AESjLn/+qIWgq7mHscNOKAwN5AIM1+YAy+Ww==} 1395 | dev: true 1396 | 1397 | /enabled@2.0.0: 1398 | resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} 1399 | dev: false 1400 | 1401 | /encodeurl@1.0.2: 1402 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 1403 | engines: {node: '>= 0.8'} 1404 | dev: false 1405 | 1406 | /end-of-stream@1.4.4: 1407 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 1408 | dependencies: 1409 | once: 1.4.0 1410 | dev: false 1411 | 1412 | /esbuild@0.18.20: 1413 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 1414 | engines: {node: '>=12'} 1415 | hasBin: true 1416 | requiresBuild: true 1417 | optionalDependencies: 1418 | '@esbuild/android-arm': 0.18.20 1419 | '@esbuild/android-arm64': 0.18.20 1420 | '@esbuild/android-x64': 0.18.20 1421 | '@esbuild/darwin-arm64': 0.18.20 1422 | '@esbuild/darwin-x64': 0.18.20 1423 | '@esbuild/freebsd-arm64': 0.18.20 1424 | '@esbuild/freebsd-x64': 0.18.20 1425 | '@esbuild/linux-arm': 0.18.20 1426 | '@esbuild/linux-arm64': 0.18.20 1427 | '@esbuild/linux-ia32': 0.18.20 1428 | '@esbuild/linux-loong64': 0.18.20 1429 | '@esbuild/linux-mips64el': 0.18.20 1430 | '@esbuild/linux-ppc64': 0.18.20 1431 | '@esbuild/linux-riscv64': 0.18.20 1432 | '@esbuild/linux-s390x': 0.18.20 1433 | '@esbuild/linux-x64': 0.18.20 1434 | '@esbuild/netbsd-x64': 0.18.20 1435 | '@esbuild/openbsd-x64': 0.18.20 1436 | '@esbuild/sunos-x64': 0.18.20 1437 | '@esbuild/win32-arm64': 0.18.20 1438 | '@esbuild/win32-ia32': 0.18.20 1439 | '@esbuild/win32-x64': 0.18.20 1440 | dev: true 1441 | 1442 | /escalade@3.1.1: 1443 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1444 | engines: {node: '>=6'} 1445 | dev: true 1446 | 1447 | /escape-html@1.0.3: 1448 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 1449 | dev: false 1450 | 1451 | /escape-string-regexp@1.0.5: 1452 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1453 | engines: {node: '>=0.8.0'} 1454 | dev: true 1455 | 1456 | /escape-string-regexp@4.0.0: 1457 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1458 | engines: {node: '>=10'} 1459 | dev: true 1460 | 1461 | /eslint-plugin-react-hooks@4.6.0(eslint@8.47.0): 1462 | resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} 1463 | engines: {node: '>=10'} 1464 | peerDependencies: 1465 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 1466 | dependencies: 1467 | eslint: 8.47.0 1468 | dev: true 1469 | 1470 | /eslint-plugin-react-refresh@0.3.5(eslint@8.47.0): 1471 | resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==} 1472 | peerDependencies: 1473 | eslint: '>=7' 1474 | dependencies: 1475 | eslint: 8.47.0 1476 | dev: true 1477 | 1478 | /eslint-scope@5.1.1: 1479 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1480 | engines: {node: '>=8.0.0'} 1481 | dependencies: 1482 | esrecurse: 4.3.0 1483 | estraverse: 4.3.0 1484 | dev: true 1485 | 1486 | /eslint-scope@7.2.2: 1487 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1488 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1489 | dependencies: 1490 | esrecurse: 4.3.0 1491 | estraverse: 5.3.0 1492 | dev: true 1493 | 1494 | /eslint-visitor-keys@3.4.3: 1495 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1496 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1497 | dev: true 1498 | 1499 | /eslint@8.47.0: 1500 | resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} 1501 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1502 | hasBin: true 1503 | dependencies: 1504 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) 1505 | '@eslint-community/regexpp': 4.6.2 1506 | '@eslint/eslintrc': 2.1.2 1507 | '@eslint/js': 8.47.0 1508 | '@humanwhocodes/config-array': 0.11.10 1509 | '@humanwhocodes/module-importer': 1.0.1 1510 | '@nodelib/fs.walk': 1.2.8 1511 | ajv: 6.12.6 1512 | chalk: 4.1.2 1513 | cross-spawn: 7.0.3 1514 | debug: 4.3.4 1515 | doctrine: 3.0.0 1516 | escape-string-regexp: 4.0.0 1517 | eslint-scope: 7.2.2 1518 | eslint-visitor-keys: 3.4.3 1519 | espree: 9.6.1 1520 | esquery: 1.5.0 1521 | esutils: 2.0.3 1522 | fast-deep-equal: 3.1.3 1523 | file-entry-cache: 6.0.1 1524 | find-up: 5.0.0 1525 | glob-parent: 6.0.2 1526 | globals: 13.21.0 1527 | graphemer: 1.4.0 1528 | ignore: 5.2.4 1529 | imurmurhash: 0.1.4 1530 | is-glob: 4.0.3 1531 | is-path-inside: 3.0.3 1532 | js-yaml: 4.1.0 1533 | json-stable-stringify-without-jsonify: 1.0.1 1534 | levn: 0.4.1 1535 | lodash.merge: 4.6.2 1536 | minimatch: 3.1.2 1537 | natural-compare: 1.4.0 1538 | optionator: 0.9.3 1539 | strip-ansi: 6.0.1 1540 | text-table: 0.2.0 1541 | transitivePeerDependencies: 1542 | - supports-color 1543 | dev: true 1544 | 1545 | /espree@9.6.1: 1546 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1547 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1548 | dependencies: 1549 | acorn: 8.10.0 1550 | acorn-jsx: 5.3.2(acorn@8.10.0) 1551 | eslint-visitor-keys: 3.4.3 1552 | dev: true 1553 | 1554 | /esquery@1.5.0: 1555 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1556 | engines: {node: '>=0.10'} 1557 | dependencies: 1558 | estraverse: 5.3.0 1559 | dev: true 1560 | 1561 | /esrecurse@4.3.0: 1562 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1563 | engines: {node: '>=4.0'} 1564 | dependencies: 1565 | estraverse: 5.3.0 1566 | dev: true 1567 | 1568 | /estraverse@4.3.0: 1569 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1570 | engines: {node: '>=4.0'} 1571 | dev: true 1572 | 1573 | /estraverse@5.3.0: 1574 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1575 | engines: {node: '>=4.0'} 1576 | dev: true 1577 | 1578 | /esutils@2.0.3: 1579 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1580 | engines: {node: '>=0.10.0'} 1581 | dev: true 1582 | 1583 | /etag@1.8.1: 1584 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 1585 | engines: {node: '>= 0.6'} 1586 | dev: false 1587 | 1588 | /eventemitter3@4.0.7: 1589 | resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 1590 | dev: false 1591 | 1592 | /expand-template@2.0.3: 1593 | resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} 1594 | engines: {node: '>=6'} 1595 | dev: false 1596 | 1597 | /express@4.18.2: 1598 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} 1599 | engines: {node: '>= 0.10.0'} 1600 | dependencies: 1601 | accepts: 1.3.8 1602 | array-flatten: 1.1.1 1603 | body-parser: 1.20.1 1604 | content-disposition: 0.5.4 1605 | content-type: 1.0.5 1606 | cookie: 0.5.0 1607 | cookie-signature: 1.0.6 1608 | debug: 2.6.9 1609 | depd: 2.0.0 1610 | encodeurl: 1.0.2 1611 | escape-html: 1.0.3 1612 | etag: 1.8.1 1613 | finalhandler: 1.2.0 1614 | fresh: 0.5.2 1615 | http-errors: 2.0.0 1616 | merge-descriptors: 1.0.1 1617 | methods: 1.1.2 1618 | on-finished: 2.4.1 1619 | parseurl: 1.3.3 1620 | path-to-regexp: 0.1.7 1621 | proxy-addr: 2.0.7 1622 | qs: 6.11.0 1623 | range-parser: 1.2.1 1624 | safe-buffer: 5.2.1 1625 | send: 0.18.0 1626 | serve-static: 1.15.0 1627 | setprototypeof: 1.2.0 1628 | statuses: 2.0.1 1629 | type-is: 1.6.18 1630 | utils-merge: 1.0.1 1631 | vary: 1.1.2 1632 | transitivePeerDependencies: 1633 | - supports-color 1634 | dev: false 1635 | 1636 | /fast-deep-equal@3.1.3: 1637 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1638 | dev: true 1639 | 1640 | /fast-glob@3.3.1: 1641 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 1642 | engines: {node: '>=8.6.0'} 1643 | dependencies: 1644 | '@nodelib/fs.stat': 2.0.5 1645 | '@nodelib/fs.walk': 1.2.8 1646 | glob-parent: 5.1.2 1647 | merge2: 1.4.1 1648 | micromatch: 4.0.5 1649 | dev: true 1650 | 1651 | /fast-json-stable-stringify@2.1.0: 1652 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1653 | dev: true 1654 | 1655 | /fast-levenshtein@2.0.6: 1656 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1657 | dev: true 1658 | 1659 | /fastq@1.15.0: 1660 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1661 | dependencies: 1662 | reusify: 1.0.4 1663 | dev: true 1664 | 1665 | /fecha@4.2.3: 1666 | resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} 1667 | dev: false 1668 | 1669 | /file-entry-cache@6.0.1: 1670 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1671 | engines: {node: ^10.12.0 || >=12.0.0} 1672 | dependencies: 1673 | flat-cache: 3.0.4 1674 | dev: true 1675 | 1676 | /file-uri-to-path@1.0.0: 1677 | resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 1678 | dev: false 1679 | 1680 | /fill-range@7.0.1: 1681 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1682 | engines: {node: '>=8'} 1683 | dependencies: 1684 | to-regex-range: 5.0.1 1685 | 1686 | /finalhandler@1.2.0: 1687 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 1688 | engines: {node: '>= 0.8'} 1689 | dependencies: 1690 | debug: 2.6.9 1691 | encodeurl: 1.0.2 1692 | escape-html: 1.0.3 1693 | on-finished: 2.4.1 1694 | parseurl: 1.3.3 1695 | statuses: 2.0.1 1696 | unpipe: 1.0.0 1697 | transitivePeerDependencies: 1698 | - supports-color 1699 | dev: false 1700 | 1701 | /find-up@5.0.0: 1702 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1703 | engines: {node: '>=10'} 1704 | dependencies: 1705 | locate-path: 6.0.0 1706 | path-exists: 4.0.0 1707 | dev: true 1708 | 1709 | /flat-cache@3.0.4: 1710 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1711 | engines: {node: ^10.12.0 || >=12.0.0} 1712 | dependencies: 1713 | flatted: 3.2.7 1714 | rimraf: 3.0.2 1715 | dev: true 1716 | 1717 | /flatted@3.2.7: 1718 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1719 | dev: true 1720 | 1721 | /fn.name@1.1.0: 1722 | resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} 1723 | dev: false 1724 | 1725 | /forwarded@0.2.0: 1726 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 1727 | engines: {node: '>= 0.6'} 1728 | dev: false 1729 | 1730 | /fresh@0.5.2: 1731 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 1732 | engines: {node: '>= 0.6'} 1733 | dev: false 1734 | 1735 | /fs-constants@1.0.0: 1736 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 1737 | dev: false 1738 | 1739 | /fs.realpath@1.0.0: 1740 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1741 | dev: true 1742 | 1743 | /fsevents@2.3.2: 1744 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1745 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1746 | os: [darwin] 1747 | requiresBuild: true 1748 | optional: true 1749 | 1750 | /function-bind@1.1.1: 1751 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1752 | dev: false 1753 | 1754 | /gensync@1.0.0-beta.2: 1755 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1756 | engines: {node: '>=6.9.0'} 1757 | dev: true 1758 | 1759 | /get-intrinsic@1.2.1: 1760 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 1761 | dependencies: 1762 | function-bind: 1.1.1 1763 | has: 1.0.3 1764 | has-proto: 1.0.1 1765 | has-symbols: 1.0.3 1766 | dev: false 1767 | 1768 | /github-from-package@0.0.0: 1769 | resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} 1770 | dev: false 1771 | 1772 | /glob-parent@5.1.2: 1773 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1774 | engines: {node: '>= 6'} 1775 | dependencies: 1776 | is-glob: 4.0.3 1777 | 1778 | /glob-parent@6.0.2: 1779 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1780 | engines: {node: '>=10.13.0'} 1781 | dependencies: 1782 | is-glob: 4.0.3 1783 | dev: true 1784 | 1785 | /glob@7.2.3: 1786 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1787 | dependencies: 1788 | fs.realpath: 1.0.0 1789 | inflight: 1.0.6 1790 | inherits: 2.0.4 1791 | minimatch: 3.1.2 1792 | once: 1.4.0 1793 | path-is-absolute: 1.0.1 1794 | dev: true 1795 | 1796 | /globals@11.12.0: 1797 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1798 | engines: {node: '>=4'} 1799 | dev: true 1800 | 1801 | /globals@13.21.0: 1802 | resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} 1803 | engines: {node: '>=8'} 1804 | dependencies: 1805 | type-fest: 0.20.2 1806 | dev: true 1807 | 1808 | /globby@11.1.0: 1809 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1810 | engines: {node: '>=10'} 1811 | dependencies: 1812 | array-union: 2.1.0 1813 | dir-glob: 3.0.1 1814 | fast-glob: 3.3.1 1815 | ignore: 5.2.4 1816 | merge2: 1.4.1 1817 | slash: 3.0.0 1818 | dev: true 1819 | 1820 | /graphemer@1.4.0: 1821 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1822 | dev: true 1823 | 1824 | /has-flag@3.0.0: 1825 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1826 | engines: {node: '>=4'} 1827 | dev: true 1828 | 1829 | /has-flag@4.0.0: 1830 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1831 | engines: {node: '>=8'} 1832 | dev: true 1833 | 1834 | /has-proto@1.0.1: 1835 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1836 | engines: {node: '>= 0.4'} 1837 | dev: false 1838 | 1839 | /has-symbols@1.0.3: 1840 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1841 | engines: {node: '>= 0.4'} 1842 | dev: false 1843 | 1844 | /has@1.0.3: 1845 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1846 | engines: {node: '>= 0.4.0'} 1847 | dependencies: 1848 | function-bind: 1.1.1 1849 | dev: false 1850 | 1851 | /http-errors@2.0.0: 1852 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 1853 | engines: {node: '>= 0.8'} 1854 | dependencies: 1855 | depd: 2.0.0 1856 | inherits: 2.0.4 1857 | setprototypeof: 1.2.0 1858 | statuses: 2.0.1 1859 | toidentifier: 1.0.1 1860 | dev: false 1861 | 1862 | /iconv-lite@0.4.24: 1863 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1864 | engines: {node: '>=0.10.0'} 1865 | dependencies: 1866 | safer-buffer: 2.1.2 1867 | dev: false 1868 | 1869 | /ieee754@1.2.1: 1870 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1871 | dev: false 1872 | 1873 | /ignore@5.2.4: 1874 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1875 | engines: {node: '>= 4'} 1876 | dev: true 1877 | 1878 | /import-fresh@3.3.0: 1879 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1880 | engines: {node: '>=6'} 1881 | dependencies: 1882 | parent-module: 1.0.1 1883 | resolve-from: 4.0.0 1884 | dev: true 1885 | 1886 | /imurmurhash@0.1.4: 1887 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1888 | engines: {node: '>=0.8.19'} 1889 | dev: true 1890 | 1891 | /inflight@1.0.6: 1892 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1893 | dependencies: 1894 | once: 1.4.0 1895 | wrappy: 1.0.2 1896 | dev: true 1897 | 1898 | /inherits@2.0.4: 1899 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1900 | 1901 | /ini@1.3.8: 1902 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1903 | dev: false 1904 | 1905 | /ipaddr.js@1.9.1: 1906 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 1907 | engines: {node: '>= 0.10'} 1908 | dev: false 1909 | 1910 | /is-arrayish@0.3.2: 1911 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 1912 | dev: false 1913 | 1914 | /is-binary-path@2.1.0: 1915 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1916 | engines: {node: '>=8'} 1917 | dependencies: 1918 | binary-extensions: 2.2.0 1919 | dev: false 1920 | 1921 | /is-extglob@2.1.1: 1922 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1923 | engines: {node: '>=0.10.0'} 1924 | 1925 | /is-glob@4.0.3: 1926 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1927 | engines: {node: '>=0.10.0'} 1928 | dependencies: 1929 | is-extglob: 2.1.1 1930 | 1931 | /is-number@7.0.0: 1932 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1933 | engines: {node: '>=0.12.0'} 1934 | 1935 | /is-path-inside@3.0.3: 1936 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1937 | engines: {node: '>=8'} 1938 | dev: true 1939 | 1940 | /is-stream@2.0.1: 1941 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1942 | engines: {node: '>=8'} 1943 | dev: false 1944 | 1945 | /isexe@2.0.0: 1946 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1947 | dev: true 1948 | 1949 | /isomorphic.js@0.2.5: 1950 | resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} 1951 | dev: false 1952 | 1953 | /js-tokens@4.0.0: 1954 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1955 | 1956 | /js-yaml@4.1.0: 1957 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1958 | hasBin: true 1959 | dependencies: 1960 | argparse: 2.0.1 1961 | dev: true 1962 | 1963 | /jsesc@2.5.2: 1964 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1965 | engines: {node: '>=4'} 1966 | hasBin: true 1967 | dev: true 1968 | 1969 | /json-schema-traverse@0.4.1: 1970 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1971 | dev: true 1972 | 1973 | /json-stable-stringify-without-jsonify@1.0.1: 1974 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1975 | dev: true 1976 | 1977 | /json5@2.2.3: 1978 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1979 | engines: {node: '>=6'} 1980 | hasBin: true 1981 | dev: true 1982 | 1983 | /kuler@2.0.0: 1984 | resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} 1985 | dev: false 1986 | 1987 | /levn@0.4.1: 1988 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1989 | engines: {node: '>= 0.8.0'} 1990 | dependencies: 1991 | prelude-ls: 1.2.1 1992 | type-check: 0.4.0 1993 | dev: true 1994 | 1995 | /lib0@0.2.85: 1996 | resolution: {integrity: sha512-vtAhVttLXCu3ps2OIsTz8CdKYKdcMo7ds1MNBIcSXz6vrY8sxASqpTi4vmsAIn7xjWvyT7haKcWW6woP6jebjQ==} 1997 | engines: {node: '>=16'} 1998 | hasBin: true 1999 | dependencies: 2000 | isomorphic.js: 0.2.5 2001 | dev: false 2002 | 2003 | /locate-path@6.0.0: 2004 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 2005 | engines: {node: '>=10'} 2006 | dependencies: 2007 | p-locate: 5.0.0 2008 | dev: true 2009 | 2010 | /lodash.merge@4.6.2: 2011 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 2012 | dev: true 2013 | 2014 | /logform@2.5.1: 2015 | resolution: {integrity: sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==} 2016 | dependencies: 2017 | '@colors/colors': 1.5.0 2018 | '@types/triple-beam': 1.3.3 2019 | fecha: 4.2.3 2020 | ms: 2.1.3 2021 | safe-stable-stringify: 2.4.3 2022 | triple-beam: 1.4.1 2023 | dev: false 2024 | 2025 | /loose-envify@1.4.0: 2026 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 2027 | hasBin: true 2028 | dependencies: 2029 | js-tokens: 4.0.0 2030 | dev: false 2031 | 2032 | /lru-cache@5.1.1: 2033 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2034 | dependencies: 2035 | yallist: 3.1.1 2036 | dev: true 2037 | 2038 | /lru-cache@6.0.0: 2039 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2040 | engines: {node: '>=10'} 2041 | dependencies: 2042 | yallist: 4.0.0 2043 | 2044 | /media-typer@0.3.0: 2045 | resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} 2046 | engines: {node: '>= 0.6'} 2047 | dev: false 2048 | 2049 | /merge-descriptors@1.0.1: 2050 | resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} 2051 | dev: false 2052 | 2053 | /merge2@1.4.1: 2054 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2055 | engines: {node: '>= 8'} 2056 | dev: true 2057 | 2058 | /methods@1.1.2: 2059 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 2060 | engines: {node: '>= 0.6'} 2061 | dev: false 2062 | 2063 | /micromatch@4.0.5: 2064 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2065 | engines: {node: '>=8.6'} 2066 | dependencies: 2067 | braces: 3.0.2 2068 | picomatch: 2.3.1 2069 | dev: true 2070 | 2071 | /mime-db@1.52.0: 2072 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 2073 | engines: {node: '>= 0.6'} 2074 | dev: false 2075 | 2076 | /mime-types@2.1.35: 2077 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 2078 | engines: {node: '>= 0.6'} 2079 | dependencies: 2080 | mime-db: 1.52.0 2081 | dev: false 2082 | 2083 | /mime@1.6.0: 2084 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 2085 | engines: {node: '>=4'} 2086 | hasBin: true 2087 | dev: false 2088 | 2089 | /mimic-response@3.1.0: 2090 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 2091 | engines: {node: '>=10'} 2092 | dev: false 2093 | 2094 | /minimatch@3.1.2: 2095 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2096 | dependencies: 2097 | brace-expansion: 1.1.11 2098 | dev: true 2099 | 2100 | /minimist@1.2.8: 2101 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 2102 | dev: false 2103 | 2104 | /mkdirp-classic@0.5.3: 2105 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 2106 | dev: false 2107 | 2108 | /ms@2.0.0: 2109 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 2110 | dev: false 2111 | 2112 | /ms@2.1.2: 2113 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2114 | dev: true 2115 | 2116 | /ms@2.1.3: 2117 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2118 | dev: false 2119 | 2120 | /nanoid@3.3.6: 2121 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 2122 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2123 | hasBin: true 2124 | dev: true 2125 | 2126 | /nanoid@4.0.2: 2127 | resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} 2128 | engines: {node: ^14 || ^16 || >=18} 2129 | hasBin: true 2130 | dev: false 2131 | 2132 | /napi-build-utils@1.0.2: 2133 | resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} 2134 | dev: false 2135 | 2136 | /natural-compare-lite@1.4.0: 2137 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 2138 | dev: true 2139 | 2140 | /natural-compare@1.4.0: 2141 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2142 | dev: true 2143 | 2144 | /negotiator@0.6.3: 2145 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 2146 | engines: {node: '>= 0.6'} 2147 | dev: false 2148 | 2149 | /node-abi@3.47.0: 2150 | resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} 2151 | engines: {node: '>=10'} 2152 | dependencies: 2153 | semver: 7.5.4 2154 | dev: false 2155 | 2156 | /node-gyp-build-optional-packages@5.0.3: 2157 | resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} 2158 | hasBin: true 2159 | dev: false 2160 | optional: true 2161 | 2162 | /node-releases@2.0.13: 2163 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 2164 | dev: true 2165 | 2166 | /normalize-path@3.0.0: 2167 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2168 | engines: {node: '>=0.10.0'} 2169 | dev: false 2170 | 2171 | /object-assign@4.1.1: 2172 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 2173 | engines: {node: '>=0.10.0'} 2174 | dev: false 2175 | 2176 | /object-inspect@1.12.3: 2177 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 2178 | dev: false 2179 | 2180 | /on-finished@2.4.1: 2181 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 2182 | engines: {node: '>= 0.8'} 2183 | dependencies: 2184 | ee-first: 1.1.1 2185 | dev: false 2186 | 2187 | /once@1.4.0: 2188 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2189 | dependencies: 2190 | wrappy: 1.0.2 2191 | 2192 | /one-time@1.0.0: 2193 | resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} 2194 | dependencies: 2195 | fn.name: 1.1.0 2196 | dev: false 2197 | 2198 | /optionator@0.9.3: 2199 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 2200 | engines: {node: '>= 0.8.0'} 2201 | dependencies: 2202 | '@aashutoshrathi/word-wrap': 1.2.6 2203 | deep-is: 0.1.4 2204 | fast-levenshtein: 2.0.6 2205 | levn: 0.4.1 2206 | prelude-ls: 1.2.1 2207 | type-check: 0.4.0 2208 | dev: true 2209 | 2210 | /p-limit@3.1.0: 2211 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2212 | engines: {node: '>=10'} 2213 | dependencies: 2214 | yocto-queue: 0.1.0 2215 | dev: true 2216 | 2217 | /p-locate@5.0.0: 2218 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2219 | engines: {node: '>=10'} 2220 | dependencies: 2221 | p-limit: 3.1.0 2222 | dev: true 2223 | 2224 | /parent-module@1.0.1: 2225 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2226 | engines: {node: '>=6'} 2227 | dependencies: 2228 | callsites: 3.1.0 2229 | dev: true 2230 | 2231 | /parseurl@1.3.3: 2232 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 2233 | engines: {node: '>= 0.8'} 2234 | dev: false 2235 | 2236 | /path-exists@4.0.0: 2237 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2238 | engines: {node: '>=8'} 2239 | dev: true 2240 | 2241 | /path-is-absolute@1.0.1: 2242 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2243 | engines: {node: '>=0.10.0'} 2244 | dev: true 2245 | 2246 | /path-key@3.1.1: 2247 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2248 | engines: {node: '>=8'} 2249 | dev: true 2250 | 2251 | /path-to-regexp@0.1.7: 2252 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 2253 | dev: false 2254 | 2255 | /path-type@4.0.0: 2256 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2257 | engines: {node: '>=8'} 2258 | dev: true 2259 | 2260 | /peerjs-js-binarypack@2.0.0: 2261 | resolution: {integrity: sha512-wu+L0Qeg4IH2DXm3B6xKP5ODeCIovwEEO/Fu3MVqApPQeVLzSdZpFzQzPobh+sdhUWMQGEO7YxHeiwpPngLjqQ==} 2262 | engines: {node: '>= 14.0.0'} 2263 | dev: false 2264 | 2265 | /peerjs@1.5.0: 2266 | resolution: {integrity: sha512-NLZ73jRNE4aLq2pmVTiSkWmwf6cvt9cH72qJHnzaLH+I2CtoWVvY42U9/O0/tYE6UYwRYJ1ktKRs2DdZ1Jrgcg==} 2267 | engines: {node: '>= 14'} 2268 | dependencies: 2269 | '@msgpack/msgpack': 2.8.0 2270 | cbor-x: 1.5.4 2271 | eventemitter3: 4.0.7 2272 | peerjs-js-binarypack: 2.0.0 2273 | webrtc-adapter: 8.2.3 2274 | dev: false 2275 | 2276 | /picocolors@1.0.0: 2277 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2278 | dev: true 2279 | 2280 | /picomatch@2.3.1: 2281 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2282 | engines: {node: '>=8.6'} 2283 | 2284 | /postcss@8.4.28: 2285 | resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} 2286 | engines: {node: ^10 || ^12 || >=14} 2287 | dependencies: 2288 | nanoid: 3.3.6 2289 | picocolors: 1.0.0 2290 | source-map-js: 1.0.2 2291 | dev: true 2292 | 2293 | /prebuild-install@7.1.1: 2294 | resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} 2295 | engines: {node: '>=10'} 2296 | hasBin: true 2297 | dependencies: 2298 | detect-libc: 2.0.2 2299 | expand-template: 2.0.3 2300 | github-from-package: 0.0.0 2301 | minimist: 1.2.8 2302 | mkdirp-classic: 0.5.3 2303 | napi-build-utils: 1.0.2 2304 | node-abi: 3.47.0 2305 | pump: 3.0.0 2306 | rc: 1.2.8 2307 | simple-get: 4.0.1 2308 | tar-fs: 2.1.1 2309 | tunnel-agent: 0.6.0 2310 | dev: false 2311 | 2312 | /prelude-ls@1.2.1: 2313 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2314 | engines: {node: '>= 0.8.0'} 2315 | dev: true 2316 | 2317 | /proxy-addr@2.0.7: 2318 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 2319 | engines: {node: '>= 0.10'} 2320 | dependencies: 2321 | forwarded: 0.2.0 2322 | ipaddr.js: 1.9.1 2323 | dev: false 2324 | 2325 | /pump@3.0.0: 2326 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 2327 | dependencies: 2328 | end-of-stream: 1.4.4 2329 | once: 1.4.0 2330 | dev: false 2331 | 2332 | /punycode@2.3.0: 2333 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 2334 | engines: {node: '>=6'} 2335 | dev: true 2336 | 2337 | /qs@6.11.0: 2338 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 2339 | engines: {node: '>=0.6'} 2340 | dependencies: 2341 | side-channel: 1.0.4 2342 | dev: false 2343 | 2344 | /queue-microtask@1.2.3: 2345 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2346 | dev: true 2347 | 2348 | /range-parser@1.2.1: 2349 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 2350 | engines: {node: '>= 0.6'} 2351 | dev: false 2352 | 2353 | /raw-body@2.5.1: 2354 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} 2355 | engines: {node: '>= 0.8'} 2356 | dependencies: 2357 | bytes: 3.1.2 2358 | http-errors: 2.0.0 2359 | iconv-lite: 0.4.24 2360 | unpipe: 1.0.0 2361 | dev: false 2362 | 2363 | /rc@1.2.8: 2364 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 2365 | hasBin: true 2366 | dependencies: 2367 | deep-extend: 0.6.0 2368 | ini: 1.3.8 2369 | minimist: 1.2.8 2370 | strip-json-comments: 2.0.1 2371 | dev: false 2372 | 2373 | /react-dom@18.2.0(react@18.2.0): 2374 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 2375 | peerDependencies: 2376 | react: ^18.2.0 2377 | dependencies: 2378 | loose-envify: 1.4.0 2379 | react: 18.2.0 2380 | scheduler: 0.23.0 2381 | dev: false 2382 | 2383 | /react-refresh@0.14.0: 2384 | resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} 2385 | engines: {node: '>=0.10.0'} 2386 | dev: true 2387 | 2388 | /react@18.2.0: 2389 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 2390 | engines: {node: '>=0.10.0'} 2391 | dependencies: 2392 | loose-envify: 1.4.0 2393 | dev: false 2394 | 2395 | /readable-stream@3.6.2: 2396 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 2397 | engines: {node: '>= 6'} 2398 | dependencies: 2399 | inherits: 2.0.4 2400 | string_decoder: 1.3.0 2401 | util-deprecate: 1.0.2 2402 | dev: false 2403 | 2404 | /readdirp@3.6.0: 2405 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2406 | engines: {node: '>=8.10.0'} 2407 | dependencies: 2408 | picomatch: 2.3.1 2409 | dev: false 2410 | 2411 | /resolve-from@4.0.0: 2412 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2413 | engines: {node: '>=4'} 2414 | dev: true 2415 | 2416 | /reusify@1.0.4: 2417 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2418 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2419 | dev: true 2420 | 2421 | /rimraf@3.0.2: 2422 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2423 | hasBin: true 2424 | dependencies: 2425 | glob: 7.2.3 2426 | dev: true 2427 | 2428 | /rollup@3.28.0: 2429 | resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} 2430 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 2431 | hasBin: true 2432 | optionalDependencies: 2433 | fsevents: 2.3.2 2434 | dev: true 2435 | 2436 | /run-parallel@1.2.0: 2437 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2438 | dependencies: 2439 | queue-microtask: 1.2.3 2440 | dev: true 2441 | 2442 | /safe-buffer@5.2.1: 2443 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2444 | dev: false 2445 | 2446 | /safe-stable-stringify@2.4.3: 2447 | resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} 2448 | engines: {node: '>=10'} 2449 | dev: false 2450 | 2451 | /safer-buffer@2.1.2: 2452 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2453 | dev: false 2454 | 2455 | /scheduler@0.23.0: 2456 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 2457 | dependencies: 2458 | loose-envify: 1.4.0 2459 | dev: false 2460 | 2461 | /sdp@3.2.0: 2462 | resolution: {integrity: sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==} 2463 | dev: false 2464 | 2465 | /semver@6.3.1: 2466 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2467 | hasBin: true 2468 | dev: true 2469 | 2470 | /semver@7.5.4: 2471 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 2472 | engines: {node: '>=10'} 2473 | hasBin: true 2474 | dependencies: 2475 | lru-cache: 6.0.0 2476 | 2477 | /send@0.18.0: 2478 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 2479 | engines: {node: '>= 0.8.0'} 2480 | dependencies: 2481 | debug: 2.6.9 2482 | depd: 2.0.0 2483 | destroy: 1.2.0 2484 | encodeurl: 1.0.2 2485 | escape-html: 1.0.3 2486 | etag: 1.8.1 2487 | fresh: 0.5.2 2488 | http-errors: 2.0.0 2489 | mime: 1.6.0 2490 | ms: 2.1.3 2491 | on-finished: 2.4.1 2492 | range-parser: 1.2.1 2493 | statuses: 2.0.1 2494 | transitivePeerDependencies: 2495 | - supports-color 2496 | dev: false 2497 | 2498 | /serve-static@1.15.0: 2499 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 2500 | engines: {node: '>= 0.8.0'} 2501 | dependencies: 2502 | encodeurl: 1.0.2 2503 | escape-html: 1.0.3 2504 | parseurl: 1.3.3 2505 | send: 0.18.0 2506 | transitivePeerDependencies: 2507 | - supports-color 2508 | dev: false 2509 | 2510 | /setprototypeof@1.2.0: 2511 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 2512 | dev: false 2513 | 2514 | /shebang-command@2.0.0: 2515 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2516 | engines: {node: '>=8'} 2517 | dependencies: 2518 | shebang-regex: 3.0.0 2519 | dev: true 2520 | 2521 | /shebang-regex@3.0.0: 2522 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2523 | engines: {node: '>=8'} 2524 | dev: true 2525 | 2526 | /side-channel@1.0.4: 2527 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2528 | dependencies: 2529 | call-bind: 1.0.2 2530 | get-intrinsic: 1.2.1 2531 | object-inspect: 1.12.3 2532 | dev: false 2533 | 2534 | /simple-concat@1.0.1: 2535 | resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 2536 | dev: false 2537 | 2538 | /simple-get@4.0.1: 2539 | resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} 2540 | dependencies: 2541 | decompress-response: 6.0.0 2542 | once: 1.4.0 2543 | simple-concat: 1.0.1 2544 | dev: false 2545 | 2546 | /simple-swizzle@0.2.2: 2547 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 2548 | dependencies: 2549 | is-arrayish: 0.3.2 2550 | dev: false 2551 | 2552 | /slash@3.0.0: 2553 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2554 | engines: {node: '>=8'} 2555 | dev: true 2556 | 2557 | /source-map-js@1.0.2: 2558 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2559 | engines: {node: '>=0.10.0'} 2560 | dev: true 2561 | 2562 | /stack-trace@0.0.10: 2563 | resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 2564 | dev: false 2565 | 2566 | /statuses@2.0.1: 2567 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 2568 | engines: {node: '>= 0.8'} 2569 | dev: false 2570 | 2571 | /string_decoder@1.3.0: 2572 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 2573 | dependencies: 2574 | safe-buffer: 5.2.1 2575 | dev: false 2576 | 2577 | /strip-ansi@6.0.1: 2578 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2579 | engines: {node: '>=8'} 2580 | dependencies: 2581 | ansi-regex: 5.0.1 2582 | dev: true 2583 | 2584 | /strip-json-comments@2.0.1: 2585 | resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} 2586 | engines: {node: '>=0.10.0'} 2587 | dev: false 2588 | 2589 | /strip-json-comments@3.1.1: 2590 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2591 | engines: {node: '>=8'} 2592 | dev: true 2593 | 2594 | /supports-color@5.5.0: 2595 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2596 | engines: {node: '>=4'} 2597 | dependencies: 2598 | has-flag: 3.0.0 2599 | dev: true 2600 | 2601 | /supports-color@7.2.0: 2602 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2603 | engines: {node: '>=8'} 2604 | dependencies: 2605 | has-flag: 4.0.0 2606 | dev: true 2607 | 2608 | /tar-fs@2.1.1: 2609 | resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} 2610 | dependencies: 2611 | chownr: 1.1.4 2612 | mkdirp-classic: 0.5.3 2613 | pump: 3.0.0 2614 | tar-stream: 2.2.0 2615 | dev: false 2616 | 2617 | /tar-stream@2.2.0: 2618 | resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 2619 | engines: {node: '>=6'} 2620 | dependencies: 2621 | bl: 4.1.0 2622 | end-of-stream: 1.4.4 2623 | fs-constants: 1.0.0 2624 | inherits: 2.0.4 2625 | readable-stream: 3.6.2 2626 | dev: false 2627 | 2628 | /text-hex@1.0.0: 2629 | resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} 2630 | dev: false 2631 | 2632 | /text-table@0.2.0: 2633 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2634 | dev: true 2635 | 2636 | /throttle-debounce@5.0.0: 2637 | resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} 2638 | engines: {node: '>=12.22'} 2639 | dev: false 2640 | 2641 | /to-fast-properties@2.0.0: 2642 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 2643 | engines: {node: '>=4'} 2644 | dev: true 2645 | 2646 | /to-regex-range@5.0.1: 2647 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2648 | engines: {node: '>=8.0'} 2649 | dependencies: 2650 | is-number: 7.0.0 2651 | 2652 | /toidentifier@1.0.1: 2653 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 2654 | engines: {node: '>=0.6'} 2655 | dev: false 2656 | 2657 | /triple-beam@1.4.1: 2658 | resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} 2659 | engines: {node: '>= 14.0.0'} 2660 | dev: false 2661 | 2662 | /tslib@1.14.1: 2663 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2664 | dev: true 2665 | 2666 | /tslib@2.6.2: 2667 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 2668 | dev: false 2669 | 2670 | /tsutils@3.21.0(typescript@5.1.6): 2671 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2672 | engines: {node: '>= 6'} 2673 | peerDependencies: 2674 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 2675 | dependencies: 2676 | tslib: 1.14.1 2677 | typescript: 5.1.6 2678 | dev: true 2679 | 2680 | /tunnel-agent@0.6.0: 2681 | resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} 2682 | dependencies: 2683 | safe-buffer: 5.2.1 2684 | dev: false 2685 | 2686 | /type-check@0.4.0: 2687 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2688 | engines: {node: '>= 0.8.0'} 2689 | dependencies: 2690 | prelude-ls: 1.2.1 2691 | dev: true 2692 | 2693 | /type-fest@0.20.2: 2694 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2695 | engines: {node: '>=10'} 2696 | dev: true 2697 | 2698 | /type-is@1.6.18: 2699 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 2700 | engines: {node: '>= 0.6'} 2701 | dependencies: 2702 | media-typer: 0.3.0 2703 | mime-types: 2.1.35 2704 | dev: false 2705 | 2706 | /typescript@5.1.6: 2707 | resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} 2708 | engines: {node: '>=14.17'} 2709 | hasBin: true 2710 | dev: true 2711 | 2712 | /unpipe@1.0.0: 2713 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 2714 | engines: {node: '>= 0.8'} 2715 | dev: false 2716 | 2717 | /update-browserslist-db@1.0.11(browserslist@4.21.10): 2718 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} 2719 | hasBin: true 2720 | peerDependencies: 2721 | browserslist: '>= 4.21.0' 2722 | dependencies: 2723 | browserslist: 4.21.10 2724 | escalade: 3.1.1 2725 | picocolors: 1.0.0 2726 | dev: true 2727 | 2728 | /uri-js@4.4.1: 2729 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2730 | dependencies: 2731 | punycode: 2.3.0 2732 | dev: true 2733 | 2734 | /util-deprecate@1.0.2: 2735 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2736 | dev: false 2737 | 2738 | /utils-merge@1.0.1: 2739 | resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} 2740 | engines: {node: '>= 0.4.0'} 2741 | dev: false 2742 | 2743 | /uuid@9.0.0: 2744 | resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} 2745 | hasBin: true 2746 | dev: false 2747 | 2748 | /vary@1.1.2: 2749 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 2750 | engines: {node: '>= 0.8'} 2751 | dev: false 2752 | 2753 | /vite@4.4.9(@types/node@20.5.0): 2754 | resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} 2755 | engines: {node: ^14.18.0 || >=16.0.0} 2756 | hasBin: true 2757 | peerDependencies: 2758 | '@types/node': '>= 14' 2759 | less: '*' 2760 | lightningcss: ^1.21.0 2761 | sass: '*' 2762 | stylus: '*' 2763 | sugarss: '*' 2764 | terser: ^5.4.0 2765 | peerDependenciesMeta: 2766 | '@types/node': 2767 | optional: true 2768 | less: 2769 | optional: true 2770 | lightningcss: 2771 | optional: true 2772 | sass: 2773 | optional: true 2774 | stylus: 2775 | optional: true 2776 | sugarss: 2777 | optional: true 2778 | terser: 2779 | optional: true 2780 | dependencies: 2781 | '@types/node': 20.5.0 2782 | esbuild: 0.18.20 2783 | postcss: 8.4.28 2784 | rollup: 3.28.0 2785 | optionalDependencies: 2786 | fsevents: 2.3.2 2787 | dev: true 2788 | 2789 | /webrtc-adapter@8.2.3: 2790 | resolution: {integrity: sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==} 2791 | engines: {node: '>=6.0.0', npm: '>=3.10.0'} 2792 | dependencies: 2793 | sdp: 3.2.0 2794 | dev: false 2795 | 2796 | /which@2.0.2: 2797 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2798 | engines: {node: '>= 8'} 2799 | hasBin: true 2800 | dependencies: 2801 | isexe: 2.0.0 2802 | dev: true 2803 | 2804 | /winston-transport@4.5.0: 2805 | resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} 2806 | engines: {node: '>= 6.4.0'} 2807 | dependencies: 2808 | logform: 2.5.1 2809 | readable-stream: 3.6.2 2810 | triple-beam: 1.4.1 2811 | dev: false 2812 | 2813 | /winston@3.10.0: 2814 | resolution: {integrity: sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==} 2815 | engines: {node: '>= 12.0.0'} 2816 | dependencies: 2817 | '@colors/colors': 1.5.0 2818 | '@dabh/diagnostics': 2.0.3 2819 | async: 3.2.4 2820 | is-stream: 2.0.1 2821 | logform: 2.5.1 2822 | one-time: 1.0.0 2823 | readable-stream: 3.6.2 2824 | safe-stable-stringify: 2.4.3 2825 | stack-trace: 0.0.10 2826 | triple-beam: 1.4.1 2827 | winston-transport: 4.5.0 2828 | dev: false 2829 | 2830 | /wrappy@1.0.2: 2831 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2832 | 2833 | /ws@8.14.1: 2834 | resolution: {integrity: sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==} 2835 | engines: {node: '>=10.0.0'} 2836 | peerDependencies: 2837 | bufferutil: ^4.0.1 2838 | utf-8-validate: '>=5.0.2' 2839 | peerDependenciesMeta: 2840 | bufferutil: 2841 | optional: true 2842 | utf-8-validate: 2843 | optional: true 2844 | dev: false 2845 | 2846 | /yallist@3.1.1: 2847 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2848 | dev: true 2849 | 2850 | /yallist@4.0.0: 2851 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2852 | 2853 | /yocto-queue@0.1.0: 2854 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2855 | engines: {node: '>=10'} 2856 | dev: true 2857 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import { attachWebsocketServer } from "@vlcn.io/ws-server"; 3 | import * as http from "http"; 4 | 5 | const PORT = parseInt(process.env.PORT || "8080"); 6 | 7 | const app = express(); 8 | const server = http.createServer(app); 9 | 10 | const wsConfig = { 11 | dbFolder: "./dbs", 12 | schemaFolder: "./src/schemas", 13 | pathPattern: /\/sync/, 14 | }; 15 | 16 | attachWebsocketServer(server, wsConfig); 17 | 18 | if (process.env.NODE_ENV === "production") { 19 | express.static("dist"); 20 | } 21 | 22 | server.listen(PORT, () => 23 | console.log("info", `listening on http://localhost:${PORT}!`) 24 | ); 25 | -------------------------------------------------------------------------------- /src/schemas/main.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS "todo" ("id" PRIMARY KEY, "text", "completed"); 2 | CREATE TABLE IF NOT EXISTS "presence" (id primary key, name, x, y); 3 | 4 | SELECT crsql_as_crr('todo'); 5 | SELECT crsql_as_crr('presence'); -------------------------------------------------------------------------------- /src/todomvc-p2p/App.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import { useQuery } from "@vlcn.io/react"; 3 | import { Ctx } from "./ctx.js"; 4 | import { useState, useCallback } from "react"; 5 | import { nanoid } from "nanoid"; 6 | import Peers from "./Peers"; 7 | 8 | type Todo = { 9 | id: string; 10 | text: string; 11 | completed: boolean; 12 | }; 13 | 14 | type Filter = "all" | "active" | "completed"; 15 | type TodoList = { 16 | filter: Filter; 17 | editing: string | null; 18 | }; 19 | 20 | function Header({ ctx }: { ctx: Ctx }) { 21 | const [newText, setNewText] = React.useState(""); 22 | return ( 23 |
24 |

todos

25 | setNewText(e.target.value)} 32 | onKeyUp={(e) => { 33 | const target = e.target as HTMLInputElement; 34 | if (e.key === "Enter" && target.value.trim() !== "") { 35 | ctx.db.exec("INSERT INTO todo VALUES (?, ?, ?)", [ 36 | nanoid(), 37 | target.value, 38 | 0, 39 | ]); 40 | setNewText(""); 41 | } 42 | }} 43 | /> 44 |
45 | ); 46 | } 47 | 48 | const TodoView = ({ 49 | todo, 50 | editing, 51 | startEditing, 52 | saveTodo, 53 | ctx, 54 | }: { 55 | key?: any; 56 | todo: Todo; 57 | editing: boolean; 58 | startEditing: (t: Todo) => void; 59 | saveTodo: (todo: Todo, text: string) => void; 60 | ctx: Ctx; 61 | }) => { 62 | let body; 63 | 64 | const [text, setText] = useState(todo.text); 65 | const deleteTodo = () => { 66 | ctx.db.exec(`DELETE FROM todo WHERE id = ?`, [todo.id]); 67 | }; 68 | const toggleTodo = () => { 69 | ctx.db.exec(`UPDATE todo SET completed = ? WHERE id = ?`, [ 70 | todo.completed ? 0 : 1, 71 | todo.id, 72 | ]); 73 | }; 74 | 75 | if (editing) { 76 | body = ( 77 | saveTodo(todo, text)} 83 | onKeyUp={(e) => e.key === "Enter" && saveTodo(todo, text)} 84 | onChange={(e) => setText(e.target.value)} 85 | /> 86 | ); 87 | } else { 88 | body = ( 89 |
90 | 96 | 104 |
106 | ); 107 | } 108 | return ( 109 |
  • 114 | {body} 115 |
  • 116 | ); 117 | }; 118 | 119 | function Footer({ 120 | remaining, 121 | todos, 122 | clearCompleted, 123 | todoList, 124 | setFilter, 125 | }: { 126 | remaining: number; 127 | todos: readonly Todo[]; 128 | clearCompleted: () => void; 129 | todoList: TodoList; 130 | setFilter: (f: Filter) => void; 131 | }) { 132 | let clearCompletedButton; 133 | if (remaining !== todos.length) { 134 | clearCompletedButton = ( 135 | 138 | ); 139 | } 140 | 141 | const updateFilter = (filter: Filter) => { 142 | setFilter(filter); 143 | }; 144 | 145 | return ( 146 | 180 | ); 181 | } 182 | 183 | export default function App({ ctx }: { ctx: Ctx }) { 184 | const [list, setList] = useState({ 185 | editing: null, 186 | filter: "all", 187 | }); 188 | const clearCompleted = () => { 189 | ctx.db.exec(`DELETE FROM todo WHERE completed = true`); 190 | }; 191 | const startEditing = useCallback( 192 | (todo: Todo) => { 193 | setList((old) => ({ 194 | ...old, 195 | editing: todo.id, 196 | })); 197 | }, 198 | [list] 199 | ); 200 | const saveTodo = useCallback( 201 | (todo: Todo, text: string) => { 202 | ctx.db.exec(`UPDATE todo SET text = ? WHERE id = ?`, [text, todo.id]); 203 | setList((old) => ({ 204 | ...old, 205 | editing: null, 206 | })); 207 | }, 208 | [list] 209 | ); 210 | const toggleAll = () => { 211 | if (remaining === 0) { 212 | // uncomplete all 213 | ctx.db.exec(`UPDATE todo SET completed = false WHERE completed = true`); 214 | } else { 215 | // complete all 216 | ctx.db.exec(`UPDATE todo SET completed = true WHERE completed = false`); 217 | } 218 | }; 219 | let toggleAllCheck; 220 | 221 | const allTodos: readonly Todo[] = useQuery( 222 | ctx, 223 | "SELECT * FROM todo ORDER BY id DESC" 224 | ).data; 225 | const completeTodos = allTodos.filter((t) => t.completed); 226 | const activeTodos = allTodos.filter((t) => !t.completed); 227 | 228 | const remaining = activeTodos.length; 229 | let todos = 230 | list.filter === "active" 231 | ? activeTodos 232 | : list.filter === "completed" 233 | ? completeTodos 234 | : allTodos; 235 | 236 | if (allTodos.length) { 237 | toggleAllCheck = ( 238 | <> 239 | 246 | 247 | 248 | ); 249 | } 250 | 251 | return ( 252 |
    253 | 254 |
    { 257 | navigator.clipboard.writeText(ctx.siteid); 258 | }} 259 | > 260 | PeerID: {ctx.siteid} 261 |
    262 |
    263 |
    0 ? {} : { display: "none" }} 266 | > 267 | {toggleAllCheck} 268 |
      269 | {todos.map((t) => ( 270 | 278 | ))} 279 |
    280 |
    { 286 | setList((l) => ({ 287 | ...l, 288 | filter: f, 289 | })); 290 | }} 291 | /> 292 |
    293 |
    294 | ); 295 | } 296 | -------------------------------------------------------------------------------- /src/todomvc-p2p/Peers.tsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import { Ctx } from "./ctx.js"; 3 | 4 | export default function Peers({ ctx }: { ctx: Ctx }) { 5 | const [peerId, setPeerId] = useState(""); 6 | const [pending, setPending] = useState([]); 7 | const [established, setEstablished] = useState([]); 8 | 9 | useEffect(() => { 10 | const cleanup = ctx.rtc.onConnectionsChanged((pending, established) => { 11 | console.log("conns changes"); 12 | setPending(pending); 13 | setEstablished(established); 14 | }); 15 | return () => { 16 | cleanup(); 17 | }; 18 | }, [ctx.rtc]); 19 | return ( 20 |
    21 | setPeerId(e.target.value)} 24 | value={peerId} 25 | > 26 | { 29 | ctx.rtc.connectTo(peerId); 30 | }} 31 | > 32 | Connect 33 | 34 |
      35 | {pending.map((p) => ( 36 |
    • {p.substring(0, 8)}
    • 37 | ))} 38 |
    39 |
      40 | {established.map((p) => ( 41 |
    • {p.substring(0, 8)}
    • 42 | ))} 43 |
    44 |
    45 | ); 46 | } 47 | -------------------------------------------------------------------------------- /src/todomvc-p2p/ctx.ts: -------------------------------------------------------------------------------- 1 | import { wdbRtc } from "@vlcn.io/sync-p2p"; 2 | import tblrx from "@vlcn.io/rx-tbl"; 3 | import { DB } from "@vlcn.io/crsqlite-wasm"; 4 | 5 | export type Ctx = { 6 | db: DB; 7 | siteid: string; 8 | rtc: Awaited>; 9 | rx: Awaited>; 10 | }; 11 | -------------------------------------------------------------------------------- /src/todomvc-p2p/main.tsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from "react-dom/client"; 2 | // @ts-ignore 3 | import { stringify as uuidStringify } from "uuid"; 4 | 5 | import "../todomvc/base.css"; 6 | import "../todomvc/style.css"; 7 | 8 | import App from "./App"; 9 | import { Ctx } from "./ctx.js"; 10 | import sqliteWasm from "@vlcn.io/crsqlite-wasm"; 11 | import tblrx from "@vlcn.io/rx-tbl"; 12 | import { wdbRtc } from "@vlcn.io/sync-p2p"; 13 | 14 | import wasmUrl from "@vlcn.io/crsqlite-wasm/crsqlite.wasm?url"; 15 | 16 | async function main() { 17 | const sqlite = await sqliteWasm(() => wasmUrl); 18 | 19 | const db = await sqlite.open("p2p-wdb-todomvc-11"); 20 | (window as any).db = db; 21 | 22 | await db.exec( 23 | "CREATE TABLE IF NOT EXISTS todo (id primary key, text, completed)" 24 | ); 25 | await db.exec("SELECT crsql_as_crr('todo')"); 26 | const r = await db.execA("SELECT crsql_site_id()"); 27 | const siteid = uuidStringify(r[0][0]); 28 | 29 | const rx = await tblrx(db); 30 | const rtc = await wdbRtc( 31 | db, 32 | // window.location.hostname === "localhost" 33 | // ? { 34 | // host: "localhost", 35 | // port: 9000, 36 | // path: "/examples", 37 | // } 38 | // : undefined 39 | undefined 40 | ); 41 | 42 | window.onbeforeunload = () => { 43 | db.close(); 44 | }; 45 | 46 | startApp({ 47 | db, 48 | siteid, 49 | rtc, 50 | rx, 51 | }); 52 | } 53 | 54 | function startApp(ctx: Ctx) { 55 | (window as any).ctx = ctx; 56 | const root = createRoot(document.getElementById("container")!); 57 | root.render(); 58 | } 59 | 60 | main(); 61 | -------------------------------------------------------------------------------- /src/todomvc/App.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useCallback } from "react"; 2 | import { useDB, useQuery, useSync } from "@vlcn.io/react"; 3 | import { newId } from "./id"; 4 | import { DBAsync } from "@vlcn.io/xplat-api"; 5 | import SyncWorker from "./sync-worker.js?worker"; 6 | 7 | type Todo = { 8 | id: string; 9 | text: string; 10 | completed: boolean; 11 | }; 12 | 13 | type Filter = "all" | "active" | "completed"; 14 | type TodoList = { 15 | filter: Filter; 16 | editing: string | null; 17 | }; 18 | 19 | function Header({ db }: { db: DBAsync }) { 20 | const [newText, setNewText] = React.useState(""); 21 | return ( 22 |
    23 |

    todos

    24 | setNewText(e.target.value)} 31 | onKeyUp={(e) => { 32 | const target = e.target as HTMLInputElement; 33 | if (e.key === "Enter" && target.value.trim() !== "") { 34 | db.exec("INSERT INTO todo VALUES (?, ?, ?)", [ 35 | // todo: id as sid given sorted and small 36 | newId(db.siteid.replaceAll("-", "")), 37 | target.value, 38 | 0, 39 | ]); 40 | setNewText(""); 41 | } 42 | }} 43 | /> 44 |
    45 | ); 46 | } 47 | 48 | const TodoView = ({ 49 | todo, 50 | editing, 51 | startEditing, 52 | saveTodo, 53 | db, 54 | }: { 55 | key?: string; 56 | todo: Todo; 57 | editing: boolean; 58 | startEditing: (t: Todo) => void; 59 | saveTodo: (todo: Todo, text: string) => void; 60 | db: DBAsync; 61 | }) => { 62 | let body; 63 | 64 | const [text, setText] = useState(todo.text); 65 | const deleteTodo = () => { 66 | db.exec(`DELETE FROM todo WHERE id = ?`, [todo.id]); 67 | }; 68 | const toggleTodo = () => { 69 | db.exec(`UPDATE todo SET completed = ? WHERE id = ?`, [ 70 | todo.completed ? 0 : 1, 71 | todo.id, 72 | ]); 73 | }; 74 | 75 | if (editing) { 76 | body = ( 77 | saveTodo(todo, text)} 83 | onKeyUp={(e) => e.key === "Enter" && saveTodo(todo, text)} 84 | onChange={(e) => setText(e.target.value)} 85 | /> 86 | ); 87 | } else { 88 | body = ( 89 |
    90 | 96 | 104 |
    106 | ); 107 | } 108 | return ( 109 |
  • 114 | {body} 115 |
  • 116 | ); 117 | }; 118 | 119 | function Footer({ 120 | remaining, 121 | todos, 122 | clearCompleted, 123 | todoList, 124 | setFilter, 125 | }: { 126 | remaining: number; 127 | todos: readonly Todo[]; 128 | clearCompleted: () => void; 129 | todoList: TodoList; 130 | setFilter: (f: Filter) => void; 131 | }) { 132 | let clearCompletedButton; 133 | if (remaining !== todos.length) { 134 | clearCompletedButton = ( 135 | 138 | ); 139 | } 140 | 141 | const updateFilter = (filter: Filter) => { 142 | setFilter(filter); 143 | }; 144 | 145 | return ( 146 | 180 | ); 181 | } 182 | 183 | const worker = new SyncWorker(); 184 | function getEndpoint() { 185 | let proto = "ws:"; 186 | const hostname = window.location.hostname; 187 | if (window.location.protocol === "https:") { 188 | proto = "wss:"; 189 | } 190 | let port = ""; 191 | if (hostname == "localhost") { 192 | port = ":8080"; 193 | } 194 | 195 | return `${proto}//${hostname}${port}/sync`; 196 | } 197 | const syncEndpoint = getEndpoint(); 198 | export default function TodoList({ dbid }: { dbid: string }) { 199 | const ctx = useDB(dbid); 200 | const db = ctx.db; 201 | useSync({ 202 | dbname: dbid, 203 | endpoint: syncEndpoint, 204 | room: dbid, 205 | worker, 206 | }); 207 | const [list, setList] = useState({ 208 | editing: null, 209 | filter: "all", 210 | }); 211 | const startEditing = useCallback((todo: Todo) => { 212 | setList((old) => ({ 213 | ...old, 214 | editing: todo.id, 215 | })); 216 | }, []); 217 | const saveTodo = useCallback((todo: Todo, text: string) => { 218 | db.exec(`UPDATE todo SET text = ? WHERE id = ?`, [text, todo.id]); 219 | setList((old) => ({ 220 | ...old, 221 | editing: null, 222 | })); 223 | }, []); 224 | 225 | const clearCompleted = () => { 226 | db.exec(`DELETE FROM todo WHERE completed = true`); 227 | }; 228 | 229 | const toggleAll = () => { 230 | if (remaining === 0) { 231 | // uncomplete all 232 | db.exec(`UPDATE todo SET completed = false WHERE completed = true`); 233 | } else { 234 | // complete all 235 | db.exec(`UPDATE todo SET completed = true WHERE completed = false`); 236 | } 237 | }; 238 | let toggleAllCheck; 239 | 240 | const allTodos: readonly Todo[] = useQuery( 241 | ctx, 242 | "SELECT * FROM todo ORDER BY id DESC" 243 | ).data; 244 | const completeTodos = allTodos.filter((t) => t.completed); 245 | const activeTodos = allTodos.filter((t) => !t.completed); 246 | 247 | const remaining = activeTodos.length; 248 | const todos = 249 | list.filter === "active" 250 | ? activeTodos 251 | : list.filter === "completed" 252 | ? completeTodos 253 | : allTodos; 254 | 255 | if (allTodos.length) { 256 | toggleAllCheck = ( 257 | <> 258 | 265 | 266 | 267 | ); 268 | } 269 | 270 | return ( 271 | <> 272 | 273 | Share the current URL with others to collaborate on this list. 274 | 275 |
    276 |
    0 ? {} : { display: "none" }} 279 | > 280 | {toggleAllCheck} 281 |
      282 | {todos.map((t) => ( 283 | 291 | ))} 292 |
    293 |
    { 299 | setList((l) => ({ 300 | ...l, 301 | filter: f, 302 | })); 303 | }} 304 | /> 305 |
    306 | 307 | ); 308 | } 309 | -------------------------------------------------------------------------------- /src/todomvc/SyncEndpoints.ts: -------------------------------------------------------------------------------- 1 | import worker from "@vlcn.io/direct-connect-browser/dedicated.worker.js?url"; 2 | import wasm from "@vlcn.io/crsqlite-wasm/crsqlite.wasm?url"; 3 | 4 | export const endpoints = { 5 | createOrMigrate: updatePort( 6 | new URL("/sync/create-or-migrate", window.location.origin) 7 | ), 8 | applyChanges: updatePort(new URL("/sync/changes", window.location.origin)), 9 | startOutboundStream: updatePort( 10 | new URL("/sync/start-outbound-stream", window.location.origin) 11 | ), 12 | // this conditional on dev mode is to work around a bug in Vite. 13 | worker: import.meta.env.DEV ? worker : undefined, 14 | wasm, 15 | }; 16 | 17 | function updatePort(u: URL) { 18 | if (import.meta.env.DEV) { 19 | u.port = "8080"; 20 | } 21 | return u; 22 | } 23 | -------------------------------------------------------------------------------- /src/todomvc/base.css: -------------------------------------------------------------------------------- 1 | hr { 2 | margin: 20px 0; 3 | border: 0; 4 | border-top: 1px dashed #c5c5c5; 5 | border-bottom: 1px dashed #f7f7f7; 6 | } 7 | 8 | .learn a { 9 | font-weight: normal; 10 | text-decoration: none; 11 | color: #b83f45; 12 | } 13 | 14 | .learn a:hover { 15 | text-decoration: underline; 16 | color: #787e7e; 17 | } 18 | 19 | .learn h3, 20 | .learn h4, 21 | .learn h5 { 22 | margin: 10px 0; 23 | font-weight: 500; 24 | line-height: 1.2; 25 | color: #000; 26 | } 27 | 28 | .learn h3 { 29 | font-size: 24px; 30 | } 31 | 32 | .learn h4 { 33 | font-size: 18px; 34 | } 35 | 36 | .learn h5 { 37 | margin-bottom: 0; 38 | font-size: 14px; 39 | } 40 | 41 | .learn ul { 42 | padding: 0; 43 | margin: 0 0 30px 25px; 44 | } 45 | 46 | .learn li { 47 | line-height: 20px; 48 | } 49 | 50 | .learn p { 51 | font-size: 15px; 52 | font-weight: 300; 53 | line-height: 1.3; 54 | margin-top: 0; 55 | margin-bottom: 0; 56 | } 57 | 58 | #issue-count { 59 | display: none; 60 | } 61 | 62 | .quote { 63 | border: none; 64 | margin: 20px 0 60px 0; 65 | } 66 | 67 | .quote p { 68 | font-style: italic; 69 | } 70 | 71 | .quote p:before { 72 | content: "“"; 73 | font-size: 50px; 74 | opacity: 0.15; 75 | position: absolute; 76 | top: -20px; 77 | left: 3px; 78 | } 79 | 80 | .quote p:after { 81 | content: "”"; 82 | font-size: 50px; 83 | opacity: 0.15; 84 | position: absolute; 85 | bottom: -42px; 86 | right: 3px; 87 | } 88 | 89 | .quote footer { 90 | position: absolute; 91 | bottom: -40px; 92 | right: 0; 93 | } 94 | 95 | .quote footer img { 96 | border-radius: 3px; 97 | } 98 | 99 | .quote footer a { 100 | margin-left: 5px; 101 | vertical-align: middle; 102 | } 103 | 104 | .speech-bubble { 105 | position: relative; 106 | padding: 10px; 107 | background: rgba(0, 0, 0, 0.04); 108 | border-radius: 5px; 109 | } 110 | 111 | .speech-bubble:after { 112 | content: ""; 113 | position: absolute; 114 | top: 100%; 115 | right: 30px; 116 | border: 13px solid transparent; 117 | border-top-color: rgba(0, 0, 0, 0.04); 118 | } 119 | 120 | .learn-bar > .learn { 121 | position: absolute; 122 | width: 272px; 123 | top: 8px; 124 | left: -300px; 125 | padding: 10px; 126 | border-radius: 5px; 127 | background-color: rgba(255, 255, 255, 0.6); 128 | transition-property: left; 129 | transition-duration: 500ms; 130 | } 131 | 132 | @media (min-width: 899px) { 133 | .learn-bar { 134 | width: auto; 135 | padding-left: 300px; 136 | } 137 | 138 | .learn-bar > .learn { 139 | left: 8px; 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /src/todomvc/id.ts: -------------------------------------------------------------------------------- 1 | export type DeviceId = string; 2 | 3 | // 32 bit random var in decimal 4 | let randomVariable = Math.floor(Number.MAX_SAFE_INTEGER * Math.random()); 5 | 6 | export function newId( 7 | deviceId: DeviceId, 8 | base: "hex" | "decimal" = "hex" 9 | ): ID_of { 10 | invariant(isHex(deviceId), "Device ID must be a hex string"); 11 | invariant(deviceId.length >= 4, "Device ids must be at least 2 bytes"); 12 | 13 | // 32 bits, hex 14 | const hi32 = Math.floor(Date.now() / 1000).toString(16); 15 | 16 | // low 16 bits of device, in hex 17 | const partialDevice = deviceId.substring(deviceId.length - 4); 18 | // low 16 bits of the random variable, in hex 19 | const random = (++randomVariable & 0xffff).toString(16); 20 | 21 | const low32 = partialDevice + random; 22 | const hex = (hi32 + low32) as ID_of; 23 | 24 | if (base === "hex") { 25 | return hex; 26 | } 27 | 28 | if (base === "decimal") { 29 | return BigInt("0x" + hex).toString() as ID_of; 30 | } 31 | 32 | throw new Error("unreachable"); 33 | } 34 | 35 | export function asId(id: string): ID_of { 36 | return id as ID_of; 37 | } 38 | 39 | export function truncateForDisplay(id: string) { 40 | return id.substring(id.length - 6); 41 | } 42 | 43 | const hexReg = /^[0-9A-Fa-f]+$/; 44 | function isHex(h: string) { 45 | return hexReg.exec(h) != null; 46 | } 47 | 48 | export type Opaque = BaseType & { 49 | readonly [Symbols.base]: BaseType; 50 | readonly [Symbols.brand]: BrandType; 51 | }; 52 | 53 | namespace Symbols { 54 | export declare const base: unique symbol; 55 | export declare const brand: unique symbol; 56 | } 57 | 58 | export type ID_of = Opaque; 59 | 60 | function invariant(condition: boolean, msg: string) { 61 | if (!condition) { 62 | throw new Error(msg); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/todomvc/main.tsx: -------------------------------------------------------------------------------- 1 | import ReactDOM from "react-dom/client"; 2 | import "./base.css"; 3 | import "./style.css"; 4 | 5 | import schemaContent from "../schemas/main.sql?raw"; 6 | import { DBProvider } from "@vlcn.io/react"; 7 | import TodoList from "./App.tsx"; 8 | 9 | /** 10 | * Returns the ID of a remote database to sync with or creates a new one 11 | * if none exists. 12 | * 13 | * This ID should be a 16 byte hex string. 14 | * 15 | * Ways you can get a remote db: 16 | * - Harcode the id in your app (not recommended) 17 | * - Return a DBID for the user after they log in 18 | * - Get it through link sharing, qr code, etc. 19 | * 20 | * Here we look at the URL for a DBID. If one does not exist we check localStorage if the user 21 | * ever opened one. If not, we randomly generate one and return it. 22 | * 23 | * Randomly generating a DBID will cause new databases to be created on both the client 24 | * and server. 25 | */ 26 | function getRemoteDbid(hash: HashBag): string { 27 | return hash.dbid || localStorage.getItem("todoRoom") || newDbid(); 28 | } 29 | 30 | const hash = parseHash(); 31 | const dbid = getRemoteDbid(hash); 32 | if (dbid != hash.dbid) { 33 | hash.dbid = dbid; 34 | window.location.hash = writeHash(hash); 35 | } 36 | localStorage.setItem("todoRoom", dbid); 37 | 38 | // Launch our app. 39 | ReactDOM.createRoot(document.getElementById("container") as HTMLElement).render( 40 | } 47 | > 48 | ); 49 | 50 | type HashBag = { [key: string]: string }; 51 | function parseHash(): HashBag { 52 | const hash = window.location.hash; 53 | const ret: { [key: string]: string } = {}; 54 | if (hash.length > 1) { 55 | const substr = hash.substring(1); 56 | const parts = substr.split(","); 57 | for (const part of parts) { 58 | const [key, value] = part.split("="); 59 | ret[key] = value; 60 | } 61 | } 62 | 63 | return ret; 64 | } 65 | 66 | function writeHash(hash: HashBag) { 67 | const parts = []; 68 | for (const key in hash) { 69 | parts.push(`${key}=${hash[key]}`); 70 | } 71 | return parts.join(","); 72 | } 73 | 74 | function newDbid() { 75 | return crypto.randomUUID().replaceAll("-", ""); 76 | } 77 | -------------------------------------------------------------------------------- /src/todomvc/style.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | button { 8 | margin: 0; 9 | padding: 0; 10 | border: 0; 11 | background: none; 12 | font-size: 100%; 13 | vertical-align: baseline; 14 | font-family: inherit; 15 | font-weight: inherit; 16 | color: inherit; 17 | -webkit-appearance: none; 18 | appearance: none; 19 | -webkit-font-smoothing: antialiased; 20 | -moz-osx-font-smoothing: grayscale; 21 | cursor: pointer; 22 | } 23 | 24 | body { 25 | font: 14px "Helvetica Neue", Helvetica, Arial, sans-serif; 26 | line-height: 1.4em; 27 | background: #f5f5f5; 28 | color: #111111; 29 | min-width: 230px; 30 | max-width: 550px; 31 | margin: 0 auto; 32 | -webkit-font-smoothing: antialiased; 33 | -moz-osx-font-smoothing: grayscale; 34 | font-weight: 300; 35 | } 36 | 37 | :focus { 38 | outline: 0; 39 | } 40 | 41 | .hidden { 42 | display: none; 43 | } 44 | 45 | .todoapp { 46 | background: #fff; 47 | margin: 130px 0 40px 0; 48 | position: relative; 49 | box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1); 50 | } 51 | 52 | .todoapp input::-webkit-input-placeholder { 53 | font-style: italic; 54 | font-weight: 300; 55 | color: rgba(0, 0, 0, 0.4); 56 | } 57 | 58 | .todoapp input::-moz-placeholder { 59 | font-style: italic; 60 | font-weight: 300; 61 | color: rgba(0, 0, 0, 0.4); 62 | } 63 | 64 | .todoapp input::input-placeholder { 65 | font-style: italic; 66 | font-weight: 300; 67 | color: rgba(0, 0, 0, 0.4); 68 | } 69 | 70 | .todoapp h1 { 71 | position: absolute; 72 | top: -140px; 73 | width: 100%; 74 | font-size: 80px; 75 | font-weight: 200; 76 | text-align: center; 77 | color: #b83f45; 78 | -webkit-text-rendering: optimizeLegibility; 79 | -moz-text-rendering: optimizeLegibility; 80 | text-rendering: optimizeLegibility; 81 | } 82 | 83 | .new-todo, 84 | .edit { 85 | position: relative; 86 | margin: 0; 87 | width: 100%; 88 | font-size: 24px; 89 | font-family: inherit; 90 | font-weight: inherit; 91 | line-height: 1.4em; 92 | color: inherit; 93 | padding: 6px; 94 | border: 1px solid #999; 95 | box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2); 96 | box-sizing: border-box; 97 | -webkit-font-smoothing: antialiased; 98 | -moz-osx-font-smoothing: grayscale; 99 | } 100 | 101 | .new-todo { 102 | padding: 16px 16px 16px 60px; 103 | border: none; 104 | background: rgba(0, 0, 0, 0.003); 105 | box-shadow: inset 0 -2px 1px rgba(0, 0, 0, 0.03); 106 | } 107 | 108 | .main { 109 | position: relative; 110 | z-index: 2; 111 | border-top: 1px solid #e6e6e6; 112 | } 113 | 114 | .toggle-all { 115 | width: 1px; 116 | height: 1px; 117 | border: none; /* Mobile Safari */ 118 | opacity: 0; 119 | position: absolute; 120 | right: 100%; 121 | bottom: 100%; 122 | } 123 | 124 | .toggle-all + label { 125 | width: 60px; 126 | height: 34px; 127 | font-size: 0; 128 | position: absolute; 129 | top: -52px; 130 | left: -13px; 131 | -webkit-transform: rotate(90deg); 132 | transform: rotate(90deg); 133 | } 134 | 135 | .toggle-all + label:before { 136 | content: "❯"; 137 | font-size: 22px; 138 | color: #e6e6e6; 139 | padding: 10px 27px 10px 27px; 140 | } 141 | 142 | .toggle-all:checked + label:before { 143 | color: #737373; 144 | } 145 | 146 | .todo-list { 147 | margin: 0; 148 | padding: 0; 149 | list-style: none; 150 | } 151 | 152 | .todo-list li { 153 | position: relative; 154 | font-size: 24px; 155 | border-bottom: 1px solid #ededed; 156 | } 157 | 158 | .todo-list li:last-child { 159 | border-bottom: none; 160 | } 161 | 162 | .todo-list li.editing { 163 | border-bottom: none; 164 | padding: 0; 165 | } 166 | 167 | .todo-list li.editing .edit { 168 | display: block; 169 | width: calc(100% - 43px); 170 | padding: 12px 16px; 171 | margin: 0 0 0 43px; 172 | } 173 | 174 | .todo-list li.editing .view { 175 | display: none; 176 | } 177 | 178 | .todo-list li .toggle { 179 | text-align: center; 180 | width: 40px; 181 | /* auto, since non-WebKit browsers doesn't support input styling */ 182 | height: auto; 183 | position: absolute; 184 | top: 0; 185 | bottom: 0; 186 | margin: auto 0; 187 | border: none; /* Mobile Safari */ 188 | -webkit-appearance: none; 189 | appearance: none; 190 | } 191 | 192 | .todo-list li .toggle { 193 | opacity: 0; 194 | } 195 | 196 | .todo-list li .toggle + label { 197 | /* 198 | Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433 199 | IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/ 200 | */ 201 | background-image: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E"); 202 | background-repeat: no-repeat; 203 | background-position: center left; 204 | } 205 | 206 | .todo-list li .toggle:checked + label { 207 | background-image: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E"); 208 | } 209 | 210 | .todo-list li label { 211 | word-break: break-all; 212 | padding: 15px 15px 15px 60px; 213 | display: block; 214 | line-height: 1.2; 215 | transition: color 0.4s; 216 | font-weight: 400; 217 | color: #4d4d4d; 218 | } 219 | 220 | .todo-list li.completed label { 221 | color: #cdcdcd; 222 | text-decoration: line-through; 223 | } 224 | 225 | .todo-list li .destroy { 226 | display: none; 227 | position: absolute; 228 | top: 0; 229 | right: 10px; 230 | bottom: 0; 231 | width: 40px; 232 | height: 40px; 233 | margin: auto 0; 234 | font-size: 30px; 235 | color: #cc9a9a; 236 | margin-bottom: 11px; 237 | transition: color 0.2s ease-out; 238 | } 239 | 240 | .todo-list li .destroy:hover { 241 | color: #af5b5e; 242 | } 243 | 244 | .todo-list li .destroy:after { 245 | content: "×"; 246 | } 247 | 248 | .todo-list li:hover .destroy { 249 | display: block; 250 | } 251 | 252 | .todo-list li .edit { 253 | display: none; 254 | } 255 | 256 | .todo-list li.editing:last-child { 257 | margin-bottom: -1px; 258 | } 259 | 260 | .footer { 261 | padding: 10px 15px; 262 | height: 20px; 263 | text-align: center; 264 | font-size: 15px; 265 | border-top: 1px solid #e6e6e6; 266 | } 267 | 268 | .footer:before { 269 | content: ""; 270 | position: absolute; 271 | right: 0; 272 | bottom: 0; 273 | left: 0; 274 | height: 50px; 275 | overflow: hidden; 276 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 8px 0 -3px #f6f6f6, 277 | 0 9px 1px -3px rgba(0, 0, 0, 0.2), 0 16px 0 -6px #f6f6f6, 278 | 0 17px 2px -6px rgba(0, 0, 0, 0.2); 279 | } 280 | 281 | .todo-count { 282 | float: left; 283 | text-align: left; 284 | } 285 | 286 | .todo-count strong { 287 | font-weight: 300; 288 | } 289 | 290 | .filters { 291 | margin: 0; 292 | padding: 0; 293 | list-style: none; 294 | position: absolute; 295 | right: 0; 296 | left: 0; 297 | } 298 | 299 | .filters li { 300 | display: inline; 301 | } 302 | 303 | .filters li a { 304 | color: inherit; 305 | margin: 3px; 306 | padding: 3px 7px; 307 | text-decoration: none; 308 | border: 1px solid transparent; 309 | border-radius: 3px; 310 | cursor: pointer; 311 | } 312 | 313 | .filters li a:hover { 314 | border-color: rgba(175, 47, 47, 0.1); 315 | } 316 | 317 | .filters li a.selected { 318 | border-color: rgba(175, 47, 47, 0.2); 319 | } 320 | 321 | .clear-completed, 322 | html .clear-completed:active { 323 | float: right; 324 | position: relative; 325 | line-height: 20px; 326 | text-decoration: none; 327 | cursor: pointer; 328 | } 329 | 330 | .clear-completed:hover { 331 | text-decoration: underline; 332 | } 333 | 334 | /* 335 | Hack to remove background from Mobile Safari. 336 | Can't use it globally since it destroys checkboxes in Firefox 337 | */ 338 | @media screen and (-webkit-min-device-pixel-ratio: 0) { 339 | .toggle-all, 340 | .todo-list li .toggle { 341 | background: none; 342 | } 343 | 344 | .todo-list li .toggle { 345 | height: 40px; 346 | } 347 | } 348 | 349 | @media (max-width: 430px) { 350 | .footer { 351 | height: 50px; 352 | } 353 | 354 | .filters { 355 | bottom: 10px; 356 | } 357 | } 358 | 359 | .peers { 360 | position: absolute; 361 | right: 0px; 362 | top: -100px; 363 | width: 150px; 364 | height: 100px; 365 | text-align: right; 366 | z-index: 100; 367 | } 368 | 369 | .siteid { 370 | position: absolute; 371 | top: -100px; 372 | left: 0px; 373 | z-index: 100; 374 | width: 150px; 375 | cursor: pointer; 376 | } 377 | 378 | .pending { 379 | color: #af5f13; 380 | list-style: none; 381 | } 382 | 383 | .established { 384 | color: green; 385 | list-style: none; 386 | } 387 | -------------------------------------------------------------------------------- /src/todomvc/sync-worker.ts: -------------------------------------------------------------------------------- 1 | import { Config, defaultConfig } from "@vlcn.io/ws-client"; 2 | import { start } from "@vlcn.io/ws-client/worker.js"; 3 | import { createDbProvider } from "@vlcn.io/ws-browserdb"; 4 | 5 | export const config: Config = { 6 | dbProvider: createDbProvider(), 7 | transportProvider: defaultConfig.transportProvider, 8 | }; 9 | 10 | start(config); 11 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /todomvc-p2p.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | vlcn • TodoMVC P2P 9 | 10 | 11 | 12 |
    13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /todomvc.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | vlcn • TodoMVC 9 | 10 | 11 | 12 |
    13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | "allowJs": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import { resolve } from "node:path"; 3 | import react from "@vitejs/plugin-react"; 4 | import * as url from "url"; 5 | const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | build: { 10 | target: "esnext", 11 | rollupOptions: { 12 | input: { 13 | index: resolve(__dirname, "index.html"), 14 | todomvc: resolve(__dirname, "todomvc.html"), 15 | todomvcp2p: resolve(__dirname, "todomvc-p2p.html"), 16 | }, 17 | }, 18 | }, 19 | optimizeDeps: { 20 | exclude: ["@vite/client", "@vite/env", "@vlcn.io/crsqlite-wasm"], 21 | esbuildOptions: { 22 | target: "esnext", 23 | }, 24 | }, 25 | plugins: [react()], 26 | server: { 27 | fs: { 28 | strict: false, 29 | }, 30 | }, 31 | }); 32 | --------------------------------------------------------------------------------