├── .env ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── diesel.toml ├── migrations ├── .keep ├── 2022-11-21-101206_create_users │ ├── down.sql │ └── up.sql ├── 2022-11-21-101215_create_rooms │ ├── down.sql │ └── up.sql ├── 2022-11-21-101223_create_conversations │ ├── down.sql │ └── up.sql └── 2022-11-24-034153_generate_dummy_data │ ├── down.sql │ └── up.sql ├── screenshot.png ├── src ├── db.rs ├── main.rs ├── models.rs ├── routes.rs ├── schema.rs ├── server.rs └── session.rs └── ui ├── .gitignore ├── README.md ├── components ├── avatar.js ├── conversation.js ├── login.js └── rooms.js ├── libs ├── useConversation.js ├── useLocalStorage.js └── useWebsocket.js ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── _app.js └── index.js ├── postcss.config.js ├── public └── favicon.ico ├── styles └── globals.css ├── tailwind.config.js └── yarn.lock /.env: -------------------------------------------------------------------------------- 1 | DATABASE_URL="chat.db" 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /static 3 | chat.db 4 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "actix" 7 | version = "0.13.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f728064aca1c318585bf4bb04ffcfac9e75e508ab4e8b1bd9ba5dfe04e2cbed5" 10 | dependencies = [ 11 | "actix-rt", 12 | "actix_derive", 13 | "bitflags", 14 | "bytes", 15 | "crossbeam-channel", 16 | "futures-core", 17 | "futures-sink", 18 | "futures-task", 19 | "futures-util", 20 | "log", 21 | "once_cell", 22 | "parking_lot", 23 | "pin-project-lite", 24 | "smallvec", 25 | "tokio", 26 | "tokio-util", 27 | ] 28 | 29 | [[package]] 30 | name = "actix-codec" 31 | version = "0.5.0" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" 34 | dependencies = [ 35 | "bitflags", 36 | "bytes", 37 | "futures-core", 38 | "futures-sink", 39 | "log", 40 | "memchr", 41 | "pin-project-lite", 42 | "tokio", 43 | "tokio-util", 44 | ] 45 | 46 | [[package]] 47 | name = "actix-cors" 48 | version = "0.6.4" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "b340e9cfa5b08690aae90fb61beb44e9b06f44fe3d0f93781aaa58cfba86245e" 51 | dependencies = [ 52 | "actix-utils", 53 | "actix-web", 54 | "derive_more", 55 | "futures-util", 56 | "log", 57 | "once_cell", 58 | "smallvec", 59 | ] 60 | 61 | [[package]] 62 | name = "actix-files" 63 | version = "0.6.2" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "d832782fac6ca7369a70c9ee9a20554623c5e51c76e190ad151780ebea1cf689" 66 | dependencies = [ 67 | "actix-http", 68 | "actix-service", 69 | "actix-utils", 70 | "actix-web", 71 | "askama_escape", 72 | "bitflags", 73 | "bytes", 74 | "derive_more", 75 | "futures-core", 76 | "http-range", 77 | "log", 78 | "mime", 79 | "mime_guess", 80 | "percent-encoding", 81 | "pin-project-lite", 82 | ] 83 | 84 | [[package]] 85 | name = "actix-http" 86 | version = "3.2.2" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "0c83abf9903e1f0ad9973cc4f7b9767fd5a03a583f51a5b7a339e07987cd2724" 89 | dependencies = [ 90 | "actix-codec", 91 | "actix-rt", 92 | "actix-service", 93 | "actix-utils", 94 | "ahash", 95 | "base64", 96 | "bitflags", 97 | "brotli", 98 | "bytes", 99 | "bytestring", 100 | "derive_more", 101 | "encoding_rs", 102 | "flate2", 103 | "futures-core", 104 | "h2", 105 | "http", 106 | "httparse", 107 | "httpdate", 108 | "itoa", 109 | "language-tags", 110 | "local-channel", 111 | "mime", 112 | "percent-encoding", 113 | "pin-project-lite", 114 | "rand", 115 | "sha1", 116 | "smallvec", 117 | "tracing", 118 | "zstd", 119 | ] 120 | 121 | [[package]] 122 | name = "actix-macros" 123 | version = "0.2.3" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" 126 | dependencies = [ 127 | "quote", 128 | "syn", 129 | ] 130 | 131 | [[package]] 132 | name = "actix-router" 133 | version = "0.5.1" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" 136 | dependencies = [ 137 | "bytestring", 138 | "http", 139 | "regex", 140 | "serde", 141 | "tracing", 142 | ] 143 | 144 | [[package]] 145 | name = "actix-rt" 146 | version = "2.7.0" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "7ea16c295198e958ef31930a6ef37d0fb64e9ca3b6116e6b93a8bdae96ee1000" 149 | dependencies = [ 150 | "futures-core", 151 | "tokio", 152 | ] 153 | 154 | [[package]] 155 | name = "actix-server" 156 | version = "2.1.1" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "0da34f8e659ea1b077bb4637948b815cd3768ad5a188fdcd74ff4d84240cd824" 159 | dependencies = [ 160 | "actix-rt", 161 | "actix-service", 162 | "actix-utils", 163 | "futures-core", 164 | "futures-util", 165 | "mio", 166 | "num_cpus", 167 | "socket2", 168 | "tokio", 169 | "tracing", 170 | ] 171 | 172 | [[package]] 173 | name = "actix-service" 174 | version = "2.0.2" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" 177 | dependencies = [ 178 | "futures-core", 179 | "paste", 180 | "pin-project-lite", 181 | ] 182 | 183 | [[package]] 184 | name = "actix-utils" 185 | version = "3.0.1" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" 188 | dependencies = [ 189 | "local-waker", 190 | "pin-project-lite", 191 | ] 192 | 193 | [[package]] 194 | name = "actix-web" 195 | version = "4.2.1" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "d48f7b6534e06c7bfc72ee91db7917d4af6afe23e7d223b51e68fffbb21e96b9" 198 | dependencies = [ 199 | "actix-codec", 200 | "actix-http", 201 | "actix-macros", 202 | "actix-router", 203 | "actix-rt", 204 | "actix-server", 205 | "actix-service", 206 | "actix-utils", 207 | "actix-web-codegen", 208 | "ahash", 209 | "bytes", 210 | "bytestring", 211 | "cfg-if", 212 | "cookie", 213 | "derive_more", 214 | "encoding_rs", 215 | "futures-core", 216 | "futures-util", 217 | "http", 218 | "itoa", 219 | "language-tags", 220 | "log", 221 | "mime", 222 | "once_cell", 223 | "pin-project-lite", 224 | "regex", 225 | "serde", 226 | "serde_json", 227 | "serde_urlencoded", 228 | "smallvec", 229 | "socket2", 230 | "time 0.3.17", 231 | "url", 232 | ] 233 | 234 | [[package]] 235 | name = "actix-web-actors" 236 | version = "4.1.0" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "31efe7896f3933ce03dd4710be560254272334bb321a18fd8ff62b1a557d9d19" 239 | dependencies = [ 240 | "actix", 241 | "actix-codec", 242 | "actix-http", 243 | "actix-web", 244 | "bytes", 245 | "bytestring", 246 | "futures-core", 247 | "pin-project-lite", 248 | "tokio", 249 | ] 250 | 251 | [[package]] 252 | name = "actix-web-codegen" 253 | version = "4.1.0" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "1fa9362663c8643d67b2d5eafba49e4cb2c8a053a29ed00a0bea121f17c76b13" 256 | dependencies = [ 257 | "actix-router", 258 | "proc-macro2", 259 | "quote", 260 | "syn", 261 | ] 262 | 263 | [[package]] 264 | name = "actix_derive" 265 | version = "0.6.0" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "6d44b8fee1ced9671ba043476deddef739dd0959bf77030b26b738cc591737a7" 268 | dependencies = [ 269 | "proc-macro2", 270 | "quote", 271 | "syn", 272 | ] 273 | 274 | [[package]] 275 | name = "adler" 276 | version = "1.0.2" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 279 | 280 | [[package]] 281 | name = "ahash" 282 | version = "0.7.6" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 285 | dependencies = [ 286 | "getrandom", 287 | "once_cell", 288 | "version_check", 289 | ] 290 | 291 | [[package]] 292 | name = "aho-corasick" 293 | version = "0.7.19" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" 296 | dependencies = [ 297 | "memchr", 298 | ] 299 | 300 | [[package]] 301 | name = "alloc-no-stdlib" 302 | version = "2.0.4" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 305 | 306 | [[package]] 307 | name = "alloc-stdlib" 308 | version = "0.2.2" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 311 | dependencies = [ 312 | "alloc-no-stdlib", 313 | ] 314 | 315 | [[package]] 316 | name = "android_system_properties" 317 | version = "0.1.5" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 320 | dependencies = [ 321 | "libc", 322 | ] 323 | 324 | [[package]] 325 | name = "askama_escape" 326 | version = "0.10.3" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" 329 | 330 | [[package]] 331 | name = "autocfg" 332 | version = "1.1.0" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 335 | 336 | [[package]] 337 | name = "base64" 338 | version = "0.13.1" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 341 | 342 | [[package]] 343 | name = "bitflags" 344 | version = "1.3.2" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 347 | 348 | [[package]] 349 | name = "block-buffer" 350 | version = "0.10.3" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 353 | dependencies = [ 354 | "generic-array", 355 | ] 356 | 357 | [[package]] 358 | name = "brotli" 359 | version = "3.3.4" 360 | source = "registry+https://github.com/rust-lang/crates.io-index" 361 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 362 | dependencies = [ 363 | "alloc-no-stdlib", 364 | "alloc-stdlib", 365 | "brotli-decompressor", 366 | ] 367 | 368 | [[package]] 369 | name = "brotli-decompressor" 370 | version = "2.3.2" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" 373 | dependencies = [ 374 | "alloc-no-stdlib", 375 | "alloc-stdlib", 376 | ] 377 | 378 | [[package]] 379 | name = "bumpalo" 380 | version = "3.11.1" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" 383 | 384 | [[package]] 385 | name = "bytes" 386 | version = "1.2.1" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" 389 | 390 | [[package]] 391 | name = "bytestring" 392 | version = "1.2.0" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "f7f83e57d9154148e355404702e2694463241880b939570d7c97c014da7a69a1" 395 | dependencies = [ 396 | "bytes", 397 | ] 398 | 399 | [[package]] 400 | name = "cc" 401 | version = "1.0.76" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "76a284da2e6fe2092f2353e51713435363112dfd60030e22add80be333fb928f" 404 | dependencies = [ 405 | "jobserver", 406 | ] 407 | 408 | [[package]] 409 | name = "cfg-if" 410 | version = "1.0.0" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 413 | 414 | [[package]] 415 | name = "chrono" 416 | version = "0.4.23" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" 419 | dependencies = [ 420 | "iana-time-zone", 421 | "js-sys", 422 | "num-integer", 423 | "num-traits", 424 | "time 0.1.44", 425 | "wasm-bindgen", 426 | "winapi", 427 | ] 428 | 429 | [[package]] 430 | name = "codespan-reporting" 431 | version = "0.11.1" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 434 | dependencies = [ 435 | "termcolor", 436 | "unicode-width", 437 | ] 438 | 439 | [[package]] 440 | name = "convert_case" 441 | version = "0.4.0" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 444 | 445 | [[package]] 446 | name = "cookie" 447 | version = "0.16.1" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | checksum = "344adc371239ef32293cb1c4fe519592fcf21206c79c02854320afcdf3ab4917" 450 | dependencies = [ 451 | "percent-encoding", 452 | "time 0.3.17", 453 | "version_check", 454 | ] 455 | 456 | [[package]] 457 | name = "core-foundation-sys" 458 | version = "0.8.3" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 461 | 462 | [[package]] 463 | name = "cpufeatures" 464 | version = "0.2.5" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 467 | dependencies = [ 468 | "libc", 469 | ] 470 | 471 | [[package]] 472 | name = "crc32fast" 473 | version = "1.3.2" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 476 | dependencies = [ 477 | "cfg-if", 478 | ] 479 | 480 | [[package]] 481 | name = "crossbeam-channel" 482 | version = "0.5.6" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 485 | dependencies = [ 486 | "cfg-if", 487 | "crossbeam-utils", 488 | ] 489 | 490 | [[package]] 491 | name = "crossbeam-utils" 492 | version = "0.8.12" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" 495 | dependencies = [ 496 | "cfg-if", 497 | ] 498 | 499 | [[package]] 500 | name = "crypto-common" 501 | version = "0.1.6" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 504 | dependencies = [ 505 | "generic-array", 506 | "typenum", 507 | ] 508 | 509 | [[package]] 510 | name = "cxx" 511 | version = "1.0.82" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "d4a41a86530d0fe7f5d9ea779916b7cadd2d4f9add748b99c2c029cbbdfaf453" 514 | dependencies = [ 515 | "cc", 516 | "cxxbridge-flags", 517 | "cxxbridge-macro", 518 | "link-cplusplus", 519 | ] 520 | 521 | [[package]] 522 | name = "cxx-build" 523 | version = "1.0.82" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "06416d667ff3e3ad2df1cd8cd8afae5da26cf9cec4d0825040f88b5ca659a2f0" 526 | dependencies = [ 527 | "cc", 528 | "codespan-reporting", 529 | "once_cell", 530 | "proc-macro2", 531 | "quote", 532 | "scratch", 533 | "syn", 534 | ] 535 | 536 | [[package]] 537 | name = "cxxbridge-flags" 538 | version = "1.0.82" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "820a9a2af1669deeef27cb271f476ffd196a2c4b6731336011e0ba63e2c7cf71" 541 | 542 | [[package]] 543 | name = "cxxbridge-macro" 544 | version = "1.0.82" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "a08a6e2fcc370a089ad3b4aaf54db3b1b4cee38ddabce5896b33eb693275f470" 547 | dependencies = [ 548 | "proc-macro2", 549 | "quote", 550 | "syn", 551 | ] 552 | 553 | [[package]] 554 | name = "derive_more" 555 | version = "0.99.17" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 558 | dependencies = [ 559 | "convert_case", 560 | "proc-macro2", 561 | "quote", 562 | "rustc_version", 563 | "syn", 564 | ] 565 | 566 | [[package]] 567 | name = "diesel" 568 | version = "2.0.2" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "68c186a7418a2aac330bb76cde82f16c36b03a66fb91db32d20214311f9f6545" 571 | dependencies = [ 572 | "diesel_derives", 573 | "libsqlite3-sys", 574 | "r2d2", 575 | ] 576 | 577 | [[package]] 578 | name = "diesel_derives" 579 | version = "2.0.1" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "143b758c91dbc3fe1fdcb0dba5bd13276c6a66422f2ef5795b58488248a310aa" 582 | dependencies = [ 583 | "proc-macro-error", 584 | "proc-macro2", 585 | "quote", 586 | "syn", 587 | ] 588 | 589 | [[package]] 590 | name = "digest" 591 | version = "0.10.6" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 594 | dependencies = [ 595 | "block-buffer", 596 | "crypto-common", 597 | ] 598 | 599 | [[package]] 600 | name = "encoding_rs" 601 | version = "0.8.31" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 604 | dependencies = [ 605 | "cfg-if", 606 | ] 607 | 608 | [[package]] 609 | name = "flate2" 610 | version = "1.0.24" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" 613 | dependencies = [ 614 | "crc32fast", 615 | "miniz_oxide", 616 | ] 617 | 618 | [[package]] 619 | name = "fnv" 620 | version = "1.0.7" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 623 | 624 | [[package]] 625 | name = "form_urlencoded" 626 | version = "1.1.0" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 629 | dependencies = [ 630 | "percent-encoding", 631 | ] 632 | 633 | [[package]] 634 | name = "futures-core" 635 | version = "0.3.25" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" 638 | 639 | [[package]] 640 | name = "futures-sink" 641 | version = "0.3.25" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" 644 | 645 | [[package]] 646 | name = "futures-task" 647 | version = "0.3.25" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" 650 | 651 | [[package]] 652 | name = "futures-util" 653 | version = "0.3.25" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" 656 | dependencies = [ 657 | "futures-core", 658 | "futures-task", 659 | "pin-project-lite", 660 | "pin-utils", 661 | ] 662 | 663 | [[package]] 664 | name = "generic-array" 665 | version = "0.14.6" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 668 | dependencies = [ 669 | "typenum", 670 | "version_check", 671 | ] 672 | 673 | [[package]] 674 | name = "getrandom" 675 | version = "0.2.8" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" 678 | dependencies = [ 679 | "cfg-if", 680 | "libc", 681 | "wasi 0.11.0+wasi-snapshot-preview1", 682 | ] 683 | 684 | [[package]] 685 | name = "h2" 686 | version = "0.3.15" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" 689 | dependencies = [ 690 | "bytes", 691 | "fnv", 692 | "futures-core", 693 | "futures-sink", 694 | "futures-util", 695 | "http", 696 | "indexmap", 697 | "slab", 698 | "tokio", 699 | "tokio-util", 700 | "tracing", 701 | ] 702 | 703 | [[package]] 704 | name = "hashbrown" 705 | version = "0.12.3" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 708 | 709 | [[package]] 710 | name = "hermit-abi" 711 | version = "0.1.19" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 714 | dependencies = [ 715 | "libc", 716 | ] 717 | 718 | [[package]] 719 | name = "http" 720 | version = "0.2.8" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 723 | dependencies = [ 724 | "bytes", 725 | "fnv", 726 | "itoa", 727 | ] 728 | 729 | [[package]] 730 | name = "http-range" 731 | version = "0.1.5" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" 734 | 735 | [[package]] 736 | name = "httparse" 737 | version = "1.8.0" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 740 | 741 | [[package]] 742 | name = "httpdate" 743 | version = "1.0.2" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 746 | 747 | [[package]] 748 | name = "iana-time-zone" 749 | version = "0.1.53" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" 752 | dependencies = [ 753 | "android_system_properties", 754 | "core-foundation-sys", 755 | "iana-time-zone-haiku", 756 | "js-sys", 757 | "wasm-bindgen", 758 | "winapi", 759 | ] 760 | 761 | [[package]] 762 | name = "iana-time-zone-haiku" 763 | version = "0.1.1" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" 766 | dependencies = [ 767 | "cxx", 768 | "cxx-build", 769 | ] 770 | 771 | [[package]] 772 | name = "idna" 773 | version = "0.3.0" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 776 | dependencies = [ 777 | "unicode-bidi", 778 | "unicode-normalization", 779 | ] 780 | 781 | [[package]] 782 | name = "indexmap" 783 | version = "1.9.2" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 786 | dependencies = [ 787 | "autocfg", 788 | "hashbrown", 789 | ] 790 | 791 | [[package]] 792 | name = "itoa" 793 | version = "1.0.4" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" 796 | 797 | [[package]] 798 | name = "jobserver" 799 | version = "0.1.25" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" 802 | dependencies = [ 803 | "libc", 804 | ] 805 | 806 | [[package]] 807 | name = "js-sys" 808 | version = "0.3.60" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" 811 | dependencies = [ 812 | "wasm-bindgen", 813 | ] 814 | 815 | [[package]] 816 | name = "language-tags" 817 | version = "0.3.2" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 820 | 821 | [[package]] 822 | name = "libc" 823 | version = "0.2.137" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" 826 | 827 | [[package]] 828 | name = "libsqlite3-sys" 829 | version = "0.25.2" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "29f835d03d717946d28b1d1ed632eb6f0e24a299388ee623d0c23118d3e8a7fa" 832 | dependencies = [ 833 | "pkg-config", 834 | "vcpkg", 835 | ] 836 | 837 | [[package]] 838 | name = "link-cplusplus" 839 | version = "1.0.7" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" 842 | dependencies = [ 843 | "cc", 844 | ] 845 | 846 | [[package]] 847 | name = "local-channel" 848 | version = "0.1.3" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" 851 | dependencies = [ 852 | "futures-core", 853 | "futures-sink", 854 | "futures-util", 855 | "local-waker", 856 | ] 857 | 858 | [[package]] 859 | name = "local-waker" 860 | version = "0.1.3" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" 863 | 864 | [[package]] 865 | name = "lock_api" 866 | version = "0.4.9" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 869 | dependencies = [ 870 | "autocfg", 871 | "scopeguard", 872 | ] 873 | 874 | [[package]] 875 | name = "log" 876 | version = "0.4.17" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 879 | dependencies = [ 880 | "cfg-if", 881 | ] 882 | 883 | [[package]] 884 | name = "memchr" 885 | version = "2.5.0" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 888 | 889 | [[package]] 890 | name = "mime" 891 | version = "0.3.16" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 894 | 895 | [[package]] 896 | name = "mime_guess" 897 | version = "2.0.4" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" 900 | dependencies = [ 901 | "mime", 902 | "unicase", 903 | ] 904 | 905 | [[package]] 906 | name = "miniz_oxide" 907 | version = "0.5.4" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" 910 | dependencies = [ 911 | "adler", 912 | ] 913 | 914 | [[package]] 915 | name = "mio" 916 | version = "0.8.5" 917 | source = "registry+https://github.com/rust-lang/crates.io-index" 918 | checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" 919 | dependencies = [ 920 | "libc", 921 | "log", 922 | "wasi 0.11.0+wasi-snapshot-preview1", 923 | "windows-sys", 924 | ] 925 | 926 | [[package]] 927 | name = "num-integer" 928 | version = "0.1.45" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 931 | dependencies = [ 932 | "autocfg", 933 | "num-traits", 934 | ] 935 | 936 | [[package]] 937 | name = "num-traits" 938 | version = "0.2.15" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 941 | dependencies = [ 942 | "autocfg", 943 | ] 944 | 945 | [[package]] 946 | name = "num_cpus" 947 | version = "1.14.0" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" 950 | dependencies = [ 951 | "hermit-abi", 952 | "libc", 953 | ] 954 | 955 | [[package]] 956 | name = "once_cell" 957 | version = "1.16.0" 958 | source = "registry+https://github.com/rust-lang/crates.io-index" 959 | checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" 960 | 961 | [[package]] 962 | name = "parking_lot" 963 | version = "0.12.1" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 966 | dependencies = [ 967 | "lock_api", 968 | "parking_lot_core", 969 | ] 970 | 971 | [[package]] 972 | name = "parking_lot_core" 973 | version = "0.9.4" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" 976 | dependencies = [ 977 | "cfg-if", 978 | "libc", 979 | "redox_syscall", 980 | "smallvec", 981 | "windows-sys", 982 | ] 983 | 984 | [[package]] 985 | name = "paste" 986 | version = "1.0.9" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" 989 | 990 | [[package]] 991 | name = "percent-encoding" 992 | version = "2.2.0" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 995 | 996 | [[package]] 997 | name = "pin-project-lite" 998 | version = "0.2.9" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1001 | 1002 | [[package]] 1003 | name = "pin-utils" 1004 | version = "0.1.0" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1007 | 1008 | [[package]] 1009 | name = "pkg-config" 1010 | version = "0.3.26" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 1013 | 1014 | [[package]] 1015 | name = "ppv-lite86" 1016 | version = "0.2.17" 1017 | source = "registry+https://github.com/rust-lang/crates.io-index" 1018 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1019 | 1020 | [[package]] 1021 | name = "proc-macro-error" 1022 | version = "1.0.4" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1025 | dependencies = [ 1026 | "proc-macro-error-attr", 1027 | "proc-macro2", 1028 | "quote", 1029 | "syn", 1030 | "version_check", 1031 | ] 1032 | 1033 | [[package]] 1034 | name = "proc-macro-error-attr" 1035 | version = "1.0.4" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1038 | dependencies = [ 1039 | "proc-macro2", 1040 | "quote", 1041 | "version_check", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "proc-macro2" 1046 | version = "1.0.47" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" 1049 | dependencies = [ 1050 | "unicode-ident", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "quote" 1055 | version = "1.0.21" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 1058 | dependencies = [ 1059 | "proc-macro2", 1060 | ] 1061 | 1062 | [[package]] 1063 | name = "r2d2" 1064 | version = "0.8.10" 1065 | source = "registry+https://github.com/rust-lang/crates.io-index" 1066 | checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" 1067 | dependencies = [ 1068 | "log", 1069 | "parking_lot", 1070 | "scheduled-thread-pool", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "rand" 1075 | version = "0.8.5" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1078 | dependencies = [ 1079 | "libc", 1080 | "rand_chacha", 1081 | "rand_core", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "rand_chacha" 1086 | version = "0.3.1" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1089 | dependencies = [ 1090 | "ppv-lite86", 1091 | "rand_core", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "rand_core" 1096 | version = "0.6.4" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1099 | dependencies = [ 1100 | "getrandom", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "redox_syscall" 1105 | version = "0.2.16" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1108 | dependencies = [ 1109 | "bitflags", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "regex" 1114 | version = "1.7.0" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" 1117 | dependencies = [ 1118 | "aho-corasick", 1119 | "memchr", 1120 | "regex-syntax", 1121 | ] 1122 | 1123 | [[package]] 1124 | name = "regex-syntax" 1125 | version = "0.6.28" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" 1128 | 1129 | [[package]] 1130 | name = "rust-react-chat" 1131 | version = "0.1.0" 1132 | dependencies = [ 1133 | "actix", 1134 | "actix-cors", 1135 | "actix-files", 1136 | "actix-web", 1137 | "actix-web-actors", 1138 | "chrono", 1139 | "diesel", 1140 | "rand", 1141 | "serde", 1142 | "serde_json", 1143 | "uuid", 1144 | ] 1145 | 1146 | [[package]] 1147 | name = "rustc_version" 1148 | version = "0.4.0" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1151 | dependencies = [ 1152 | "semver", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "ryu" 1157 | version = "1.0.11" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 1160 | 1161 | [[package]] 1162 | name = "scheduled-thread-pool" 1163 | version = "0.2.6" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "977a7519bff143a44f842fd07e80ad1329295bd71686457f18e496736f4bf9bf" 1166 | dependencies = [ 1167 | "parking_lot", 1168 | ] 1169 | 1170 | [[package]] 1171 | name = "scopeguard" 1172 | version = "1.1.0" 1173 | source = "registry+https://github.com/rust-lang/crates.io-index" 1174 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1175 | 1176 | [[package]] 1177 | name = "scratch" 1178 | version = "1.0.2" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" 1181 | 1182 | [[package]] 1183 | name = "semver" 1184 | version = "1.0.14" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" 1187 | 1188 | [[package]] 1189 | name = "serde" 1190 | version = "1.0.147" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" 1193 | dependencies = [ 1194 | "serde_derive", 1195 | ] 1196 | 1197 | [[package]] 1198 | name = "serde_derive" 1199 | version = "1.0.147" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" 1202 | dependencies = [ 1203 | "proc-macro2", 1204 | "quote", 1205 | "syn", 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "serde_json" 1210 | version = "1.0.88" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "8e8b3801309262e8184d9687fb697586833e939767aea0dda89f5a8e650e8bd7" 1213 | dependencies = [ 1214 | "itoa", 1215 | "ryu", 1216 | "serde", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "serde_urlencoded" 1221 | version = "0.7.1" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1224 | dependencies = [ 1225 | "form_urlencoded", 1226 | "itoa", 1227 | "ryu", 1228 | "serde", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "sha1" 1233 | version = "0.10.5" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" 1236 | dependencies = [ 1237 | "cfg-if", 1238 | "cpufeatures", 1239 | "digest", 1240 | ] 1241 | 1242 | [[package]] 1243 | name = "signal-hook-registry" 1244 | version = "1.4.0" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 1247 | dependencies = [ 1248 | "libc", 1249 | ] 1250 | 1251 | [[package]] 1252 | name = "slab" 1253 | version = "0.4.7" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 1256 | dependencies = [ 1257 | "autocfg", 1258 | ] 1259 | 1260 | [[package]] 1261 | name = "smallvec" 1262 | version = "1.10.0" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 1265 | 1266 | [[package]] 1267 | name = "socket2" 1268 | version = "0.4.7" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 1271 | dependencies = [ 1272 | "libc", 1273 | "winapi", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "syn" 1278 | version = "1.0.103" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" 1281 | dependencies = [ 1282 | "proc-macro2", 1283 | "quote", 1284 | "unicode-ident", 1285 | ] 1286 | 1287 | [[package]] 1288 | name = "termcolor" 1289 | version = "1.1.3" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 1292 | dependencies = [ 1293 | "winapi-util", 1294 | ] 1295 | 1296 | [[package]] 1297 | name = "time" 1298 | version = "0.1.44" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" 1301 | dependencies = [ 1302 | "libc", 1303 | "wasi 0.10.0+wasi-snapshot-preview1", 1304 | "winapi", 1305 | ] 1306 | 1307 | [[package]] 1308 | name = "time" 1309 | version = "0.3.17" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" 1312 | dependencies = [ 1313 | "itoa", 1314 | "serde", 1315 | "time-core", 1316 | "time-macros", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "time-core" 1321 | version = "0.1.0" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" 1324 | 1325 | [[package]] 1326 | name = "time-macros" 1327 | version = "0.2.6" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" 1330 | dependencies = [ 1331 | "time-core", 1332 | ] 1333 | 1334 | [[package]] 1335 | name = "tinyvec" 1336 | version = "1.6.0" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1339 | dependencies = [ 1340 | "tinyvec_macros", 1341 | ] 1342 | 1343 | [[package]] 1344 | name = "tinyvec_macros" 1345 | version = "0.1.0" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1348 | 1349 | [[package]] 1350 | name = "tokio" 1351 | version = "1.22.0" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "d76ce4a75fb488c605c54bf610f221cea8b0dafb53333c1a67e8ee199dcd2ae3" 1354 | dependencies = [ 1355 | "autocfg", 1356 | "bytes", 1357 | "libc", 1358 | "memchr", 1359 | "mio", 1360 | "parking_lot", 1361 | "pin-project-lite", 1362 | "signal-hook-registry", 1363 | "socket2", 1364 | "winapi", 1365 | ] 1366 | 1367 | [[package]] 1368 | name = "tokio-util" 1369 | version = "0.7.4" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" 1372 | dependencies = [ 1373 | "bytes", 1374 | "futures-core", 1375 | "futures-sink", 1376 | "pin-project-lite", 1377 | "tokio", 1378 | "tracing", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "tracing" 1383 | version = "0.1.37" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 1386 | dependencies = [ 1387 | "cfg-if", 1388 | "log", 1389 | "pin-project-lite", 1390 | "tracing-core", 1391 | ] 1392 | 1393 | [[package]] 1394 | name = "tracing-core" 1395 | version = "0.1.30" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 1398 | dependencies = [ 1399 | "once_cell", 1400 | ] 1401 | 1402 | [[package]] 1403 | name = "typenum" 1404 | version = "1.15.0" 1405 | source = "registry+https://github.com/rust-lang/crates.io-index" 1406 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 1407 | 1408 | [[package]] 1409 | name = "unicase" 1410 | version = "2.6.0" 1411 | source = "registry+https://github.com/rust-lang/crates.io-index" 1412 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 1413 | dependencies = [ 1414 | "version_check", 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "unicode-bidi" 1419 | version = "0.3.8" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 1422 | 1423 | [[package]] 1424 | name = "unicode-ident" 1425 | version = "1.0.5" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" 1428 | 1429 | [[package]] 1430 | name = "unicode-normalization" 1431 | version = "0.1.22" 1432 | source = "registry+https://github.com/rust-lang/crates.io-index" 1433 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1434 | dependencies = [ 1435 | "tinyvec", 1436 | ] 1437 | 1438 | [[package]] 1439 | name = "unicode-width" 1440 | version = "0.1.10" 1441 | source = "registry+https://github.com/rust-lang/crates.io-index" 1442 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 1443 | 1444 | [[package]] 1445 | name = "url" 1446 | version = "2.3.1" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 1449 | dependencies = [ 1450 | "form_urlencoded", 1451 | "idna", 1452 | "percent-encoding", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "uuid" 1457 | version = "1.2.2" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" 1460 | dependencies = [ 1461 | "getrandom", 1462 | "serde", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "vcpkg" 1467 | version = "0.2.15" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1470 | 1471 | [[package]] 1472 | name = "version_check" 1473 | version = "0.9.4" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1476 | 1477 | [[package]] 1478 | name = "wasi" 1479 | version = "0.10.0+wasi-snapshot-preview1" 1480 | source = "registry+https://github.com/rust-lang/crates.io-index" 1481 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 1482 | 1483 | [[package]] 1484 | name = "wasi" 1485 | version = "0.11.0+wasi-snapshot-preview1" 1486 | source = "registry+https://github.com/rust-lang/crates.io-index" 1487 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1488 | 1489 | [[package]] 1490 | name = "wasm-bindgen" 1491 | version = "0.2.83" 1492 | source = "registry+https://github.com/rust-lang/crates.io-index" 1493 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" 1494 | dependencies = [ 1495 | "cfg-if", 1496 | "wasm-bindgen-macro", 1497 | ] 1498 | 1499 | [[package]] 1500 | name = "wasm-bindgen-backend" 1501 | version = "0.2.83" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" 1504 | dependencies = [ 1505 | "bumpalo", 1506 | "log", 1507 | "once_cell", 1508 | "proc-macro2", 1509 | "quote", 1510 | "syn", 1511 | "wasm-bindgen-shared", 1512 | ] 1513 | 1514 | [[package]] 1515 | name = "wasm-bindgen-macro" 1516 | version = "0.2.83" 1517 | source = "registry+https://github.com/rust-lang/crates.io-index" 1518 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" 1519 | dependencies = [ 1520 | "quote", 1521 | "wasm-bindgen-macro-support", 1522 | ] 1523 | 1524 | [[package]] 1525 | name = "wasm-bindgen-macro-support" 1526 | version = "0.2.83" 1527 | source = "registry+https://github.com/rust-lang/crates.io-index" 1528 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" 1529 | dependencies = [ 1530 | "proc-macro2", 1531 | "quote", 1532 | "syn", 1533 | "wasm-bindgen-backend", 1534 | "wasm-bindgen-shared", 1535 | ] 1536 | 1537 | [[package]] 1538 | name = "wasm-bindgen-shared" 1539 | version = "0.2.83" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" 1542 | 1543 | [[package]] 1544 | name = "winapi" 1545 | version = "0.3.9" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1548 | dependencies = [ 1549 | "winapi-i686-pc-windows-gnu", 1550 | "winapi-x86_64-pc-windows-gnu", 1551 | ] 1552 | 1553 | [[package]] 1554 | name = "winapi-i686-pc-windows-gnu" 1555 | version = "0.4.0" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1558 | 1559 | [[package]] 1560 | name = "winapi-util" 1561 | version = "0.1.5" 1562 | source = "registry+https://github.com/rust-lang/crates.io-index" 1563 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1564 | dependencies = [ 1565 | "winapi", 1566 | ] 1567 | 1568 | [[package]] 1569 | name = "winapi-x86_64-pc-windows-gnu" 1570 | version = "0.4.0" 1571 | source = "registry+https://github.com/rust-lang/crates.io-index" 1572 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1573 | 1574 | [[package]] 1575 | name = "windows-sys" 1576 | version = "0.42.0" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 1579 | dependencies = [ 1580 | "windows_aarch64_gnullvm", 1581 | "windows_aarch64_msvc", 1582 | "windows_i686_gnu", 1583 | "windows_i686_msvc", 1584 | "windows_x86_64_gnu", 1585 | "windows_x86_64_gnullvm", 1586 | "windows_x86_64_msvc", 1587 | ] 1588 | 1589 | [[package]] 1590 | name = "windows_aarch64_gnullvm" 1591 | version = "0.42.0" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" 1594 | 1595 | [[package]] 1596 | name = "windows_aarch64_msvc" 1597 | version = "0.42.0" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" 1600 | 1601 | [[package]] 1602 | name = "windows_i686_gnu" 1603 | version = "0.42.0" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" 1606 | 1607 | [[package]] 1608 | name = "windows_i686_msvc" 1609 | version = "0.42.0" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" 1612 | 1613 | [[package]] 1614 | name = "windows_x86_64_gnu" 1615 | version = "0.42.0" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" 1618 | 1619 | [[package]] 1620 | name = "windows_x86_64_gnullvm" 1621 | version = "0.42.0" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" 1624 | 1625 | [[package]] 1626 | name = "windows_x86_64_msvc" 1627 | version = "0.42.0" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" 1630 | 1631 | [[package]] 1632 | name = "zstd" 1633 | version = "0.11.2+zstd.1.5.2" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" 1636 | dependencies = [ 1637 | "zstd-safe", 1638 | ] 1639 | 1640 | [[package]] 1641 | name = "zstd-safe" 1642 | version = "5.0.2+zstd.1.5.2" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" 1645 | dependencies = [ 1646 | "libc", 1647 | "zstd-sys", 1648 | ] 1649 | 1650 | [[package]] 1651 | name = "zstd-sys" 1652 | version = "2.0.1+zstd.1.5.2" 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" 1654 | checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" 1655 | dependencies = [ 1656 | "cc", 1657 | "libc", 1658 | ] 1659 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-react-chat" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | actix = "0.13.0" 8 | actix-files = "0.6.2" 9 | actix-web = "4.2.1" 10 | actix-web-actors = "4.1.0" 11 | rand = "0.8.5" 12 | serde = {version = "1.0.147", features = ["derive"]} 13 | serde_json = "1.0.88" 14 | diesel = { version = "2", features = ["sqlite", "r2d2"] } 15 | uuid = { version = "1", features = ["v4", "serde"] } 16 | chrono = "0.4.23" 17 | actix-cors = "0.6.4" 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rust React Chat App 2 | 3 | ![img](screenshot.png) -------------------------------------------------------------------------------- /diesel.toml: -------------------------------------------------------------------------------- 1 | # For documentation on how to configure this file, 2 | # see https://diesel.rs/guides/configuring-diesel-cli 3 | 4 | [print_schema] 5 | file = "src/schema.rs" 6 | 7 | [migrations_directory] 8 | dir = "migrations" 9 | -------------------------------------------------------------------------------- /migrations/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmadrosid/rust-react-chat/f156e843b5070c67bd57977b5c50c5dd22ebc5a4/migrations/.keep -------------------------------------------------------------------------------- /migrations/2022-11-21-101206_create_users/down.sql: -------------------------------------------------------------------------------- 1 | -- This file should undo anything in `up.sql` 2 | DROP TABLE users; 3 | -------------------------------------------------------------------------------- /migrations/2022-11-21-101206_create_users/up.sql: -------------------------------------------------------------------------------- 1 | -- Your SQL goes here 2 | CREATE TABLE users ( 3 | id TEXT PRIMARY KEY NOT NULL, 4 | username VARCHAR NOT NULL, 5 | phone VARCHAR NOT NULL, 6 | created_at TEXT NOT NULL, 7 | unique(phone) 8 | ) 9 | -------------------------------------------------------------------------------- /migrations/2022-11-21-101215_create_rooms/down.sql: -------------------------------------------------------------------------------- 1 | -- This file should undo anything in `up.sql` 2 | DROP TABLE rooms; -------------------------------------------------------------------------------- /migrations/2022-11-21-101215_create_rooms/up.sql: -------------------------------------------------------------------------------- 1 | -- Your SQL goes here 2 | CREATE TABLE rooms ( 3 | id TEXT PRIMARY KEY NOT NULL, 4 | name VARCHAR NOT NULL, 5 | last_message TEXT NOT NULL, 6 | participant_ids TEXT NOT NULL, 7 | created_at TEXT NOT NULL 8 | ) 9 | -------------------------------------------------------------------------------- /migrations/2022-11-21-101223_create_conversations/down.sql: -------------------------------------------------------------------------------- 1 | -- This file should undo anything in `up.sql` 2 | DROP TABLE conversations; -------------------------------------------------------------------------------- /migrations/2022-11-21-101223_create_conversations/up.sql: -------------------------------------------------------------------------------- 1 | -- Your SQL goes here 2 | CREATE TABLE conversations ( 3 | id TEXT PRIMARY KEY NOT NULL, 4 | room_id TEXT NOT NULL, 5 | user_id TEXT NOT NULL, 6 | content VARCHAR NOT NULL, 7 | created_at TEXT NOT NULL 8 | ) 9 | -------------------------------------------------------------------------------- /migrations/2022-11-24-034153_generate_dummy_data/down.sql: -------------------------------------------------------------------------------- 1 | -- This file should undo anything in `up.sql` -------------------------------------------------------------------------------- /migrations/2022-11-24-034153_generate_dummy_data/up.sql: -------------------------------------------------------------------------------- 1 | -- Your SQL goes here 2 | INSERT INTO users(id, username, phone, created_at) 3 | VALUES 4 | ("4fbd288c-d3b2-4f78-adcf-def976902d50","Ahmad Rosid","123","2022-11-23T07:56:30.214162+00:00"), 5 | ("1e9a12c1-e98c-4a83-a55a-32cc548a169d","Ashley Young","345","2022-11-23T07:56:30.214162+00:00"), 6 | ("1bc833808-05ed-455a-9d26-64fe1d96d62d","Charles Edward","678","2022-12-23T07:56:30.214162+00:00"); 7 | 8 | INSERT INTO rooms(id, name, last_message, participant_ids, created_at) 9 | VALUES 10 | ("f061383b-0393-4ce8-9a85-f31d03762263", "Charles Edward", "Hi, how are you?", "1e9a12c1-e98c-4a83-a55a-32cc548a169d,1bc833808-05ed-455a-9d26-64fe1d96d62d", "2022-12-23T07:56:30.214162+00:00"), 11 | ("008e9dc4-f01d-4429-ba31-986d7e63cce8", "Ahmad Rosid", "Hi... are free today?", "1e9a12c1-e98c-4a83-a55a-32cc548a169d,1bc833808-05ed-455a-9d26-64fe1d96d62d", "2022-12-23T07:56:30.214162+00:00"); 12 | 13 | INSERT INTO conversations(id, user_id, room_id, content, created_at) 14 | VALUES 15 | ("9aeab1a7-e063-40d1-a120-1f7585fa47d6", "1bc833808-05ed-455a-9d26-64fe1d96d62d", "f061383b-0393-4ce8-9a85-f31d03762263", "Hello", "2022-12-23T07:56:30.214162+00:00"), 16 | ("f4e54e70-736b-4a79-a622-3659b0b555e8", "1e9a12c1-e98c-4a83-a55a-32cc548a169d", "f061383b-0393-4ce8-9a85-f31d03762263", "Hi, how are you?", "2022-12-23T07:56:30.214162+00:00"), 17 | ("d3ea6e39-ed58-4613-8922-b78f14a2676a", "1bc833808-05ed-455a-9d26-64fe1d96d62d", "008e9dc4-f01d-4429-ba31-986d7e63cce8", "Hi... are free today?", "2022-12-23T07:56:30.214162+00:00"); 18 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmadrosid/rust-react-chat/f156e843b5070c67bd57977b5c50c5dd22ebc5a4/screenshot.png -------------------------------------------------------------------------------- /src/db.rs: -------------------------------------------------------------------------------- 1 | use chrono::{DateTime, Utc}; 2 | use diesel::prelude::*; 3 | use std::{ 4 | collections::{HashMap, HashSet}, 5 | time::SystemTime, 6 | }; 7 | use uuid::Uuid; 8 | 9 | use crate::models::{Conversation, NewConversation, Room, RoomResponse, User}; 10 | 11 | type DbError = Box; 12 | 13 | pub fn find_user_by_uid(conn: &mut SqliteConnection, uid: Uuid) -> Result, DbError> { 14 | use crate::schema::users::dsl::*; 15 | 16 | let user = users 17 | .filter(id.eq(uid.to_string())) 18 | .first::(conn) 19 | .optional()?; 20 | 21 | Ok(user) 22 | } 23 | 24 | pub fn get_conversation_by_room_uid( 25 | conn: &mut SqliteConnection, 26 | uid: Uuid, 27 | ) -> Result>, DbError> { 28 | use crate::schema::conversations; 29 | 30 | let convo = conversations::table 31 | .filter(conversations::room_id.eq(uid.to_string())) 32 | .load(conn) 33 | .optional()?; 34 | 35 | Ok(convo) 36 | } 37 | 38 | pub fn find_user_by_phone( 39 | conn: &mut SqliteConnection, 40 | user_phone: String, 41 | ) -> Result, DbError> { 42 | use crate::schema::users::dsl::*; 43 | 44 | let user = users 45 | .filter(phone.eq(user_phone)) 46 | .first::(conn) 47 | .optional()?; 48 | 49 | Ok(user) 50 | } 51 | 52 | pub fn get_all_rooms(conn: &mut SqliteConnection) -> Result, DbError> { 53 | use crate::schema::rooms; 54 | use crate::schema::users; 55 | 56 | let rooms_data: Vec = rooms::table.get_results(conn)?; 57 | let mut ids = HashSet::new(); 58 | let mut rooms_map = HashMap::new(); 59 | let data = rooms_data.to_vec(); 60 | for room in &data { 61 | let user_ids = room 62 | .participant_ids 63 | .split(",") 64 | .into_iter() 65 | .collect::>(); 66 | for id in user_ids.to_vec() { 67 | ids.insert(id.to_string()); 68 | } 69 | rooms_map.insert(room.id.to_string(), user_ids.to_vec()); 70 | } 71 | 72 | let ids = ids.into_iter().collect::>(); 73 | let users_data: Vec = users::table 74 | .filter(users::id.eq_any(ids)) 75 | .get_results(conn)?; 76 | let users_map: HashMap = HashMap::from_iter( 77 | users_data 78 | .into_iter() 79 | .map(|item| (item.id.to_string(), item)), 80 | ); 81 | 82 | let response_rooms = rooms_data.into_iter().map(|room| { 83 | let users = rooms_map 84 | .get(&room.id.to_string()) 85 | .unwrap() 86 | .into_iter() 87 | .map(|id| users_map.get(id.to_owned()).unwrap().clone()) 88 | .collect::>(); 89 | return RoomResponse{ room, users }; 90 | }).collect::>(); 91 | Ok(response_rooms) 92 | } 93 | 94 | fn iso_date() -> String { 95 | let now = SystemTime::now(); 96 | let now: DateTime = now.into(); 97 | return now.to_rfc3339(); 98 | } 99 | 100 | pub fn insert_new_user(conn: &mut SqliteConnection, nm: &str, pn: &str) -> Result { 101 | use crate::schema::users::dsl::*; 102 | 103 | let new_user = User { 104 | id: Uuid::new_v4().to_string(), 105 | username: nm.to_owned(), 106 | phone: pn.to_owned(), 107 | created_at: iso_date(), 108 | }; 109 | 110 | diesel::insert_into(users).values(&new_user).execute(conn)?; 111 | 112 | Ok(new_user) 113 | } 114 | 115 | pub fn insert_new_conversation( 116 | conn: &mut SqliteConnection, 117 | new: NewConversation, 118 | ) -> Result { 119 | use crate::schema::conversations::dsl::*; 120 | 121 | let new_conversation = Conversation { 122 | id: Uuid::new_v4().to_string(), 123 | user_id: new.user_id, 124 | room_id: new.room_id, 125 | content: new.message, 126 | created_at: iso_date(), 127 | }; 128 | 129 | diesel::insert_into(conversations) 130 | .values(&new_conversation) 131 | .execute(conn)?; 132 | 133 | Ok(new_conversation) 134 | } 135 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate diesel; 3 | 4 | use actix::*; 5 | use actix_cors::Cors; 6 | use actix_files::Files; 7 | use actix_web::{web, http, App, HttpServer}; 8 | 9 | use diesel::{ 10 | prelude::*, 11 | r2d2::{self, ConnectionManager}, 12 | }; 13 | 14 | mod db; 15 | mod models; 16 | mod routes; 17 | mod schema; 18 | mod server; 19 | mod session; 20 | 21 | #[actix_web::main] 22 | async fn main() -> std::io::Result<()> { 23 | let server = server::ChatServer::new().start(); 24 | 25 | let conn_spec = "chat.db"; 26 | let manager = ConnectionManager::::new(conn_spec); 27 | let pool = r2d2::Pool::builder().build(manager).expect("Failed to create pool."); 28 | 29 | let server_addr = "127.0.0.1"; 30 | let server_port = 8080; 31 | 32 | let app = HttpServer::new(move || { 33 | let cors = Cors::default() 34 | .allowed_origin("http://localhost:3000") 35 | .allowed_origin("http://localhost:8080") 36 | .allowed_methods(vec!["GET", "POST"]) 37 | .allowed_headers(vec![http::header::AUTHORIZATION, http::header::ACCEPT]) 38 | .allowed_header(http::header::CONTENT_TYPE) 39 | .max_age(3600); 40 | 41 | App::new() 42 | .app_data(web::Data::new(server.clone())) 43 | .app_data(web::Data::new(pool.clone())) 44 | .wrap(cors) 45 | .service(web::resource("/").to(routes::index)) 46 | .route("/ws", web::get().to(routes::chat_server)) 47 | .service(routes::create_user) 48 | .service(routes::get_user_by_id) 49 | .service(routes::get_user_by_phone) 50 | .service(routes::get_conversation_by_id) 51 | .service(routes::get_rooms) 52 | .service(Files::new("/", "./static")) 53 | }) 54 | .workers(2) 55 | .bind((server_addr, server_port))? 56 | .run(); 57 | 58 | println!("Server running at http://{server_addr}:{server_port}/"); 59 | app.await 60 | } 61 | -------------------------------------------------------------------------------- /src/models.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | use crate::schema::*; 3 | 4 | #[derive(Debug, Clone, Serialize, Deserialize, Queryable, Insertable)] 5 | pub struct User { 6 | pub id: String, 7 | pub username: String, 8 | pub phone: String, 9 | pub created_at: String 10 | } 11 | 12 | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Queryable, Insertable)] 13 | pub struct Conversation { 14 | pub id: String, 15 | pub room_id: String, 16 | pub user_id: String, 17 | pub content: String, 18 | pub created_at: String 19 | } 20 | 21 | #[derive(Debug, Clone, Serialize, Deserialize, Queryable, Insertable)] 22 | pub struct Room { 23 | pub id: String, 24 | pub name: String, 25 | pub last_message: String, 26 | pub participant_ids: String, 27 | pub created_at: String, 28 | } 29 | 30 | #[derive(Debug, Clone, Serialize, Deserialize)] 31 | pub struct NewUser { 32 | pub username: String, 33 | pub phone: String, 34 | } 35 | 36 | #[derive(Debug, Clone, Serialize, Deserialize)] 37 | pub struct NewConversation { 38 | pub user_id: String, 39 | pub room_id: String, 40 | pub message: String, 41 | } 42 | 43 | #[derive(Debug, Clone, Serialize, Deserialize)] 44 | pub struct RoomResponse { 45 | pub room: Room, 46 | pub users: Vec, 47 | } 48 | -------------------------------------------------------------------------------- /src/routes.rs: -------------------------------------------------------------------------------- 1 | use std::time::Instant; 2 | 3 | use actix::*; 4 | use actix_files::NamedFile; 5 | use actix_web::{get, post, web, Error, HttpRequest, HttpResponse, Responder}; 6 | use actix_web_actors::ws; 7 | 8 | use diesel::{ 9 | prelude::*, 10 | r2d2::{self, ConnectionManager}, 11 | }; 12 | use serde_json::json; 13 | use uuid::Uuid; 14 | 15 | use crate::db; 16 | use crate::models; 17 | use crate::server; 18 | use crate::session; 19 | 20 | type DbPool = r2d2::Pool>; 21 | 22 | pub async fn index() -> impl Responder { 23 | NamedFile::open_async("./static/index.html").await.unwrap() 24 | } 25 | 26 | pub async fn chat_server( 27 | req: HttpRequest, 28 | stream: web::Payload, 29 | pool: web::Data, 30 | srv: web::Data>, 31 | ) -> Result { 32 | ws::start( 33 | session::WsChatSession { 34 | id: 0, 35 | hb: Instant::now(), 36 | room: "main".to_string(), 37 | name: None, 38 | addr: srv.get_ref().clone(), 39 | db_pool: pool, 40 | }, 41 | &req, 42 | stream 43 | ) 44 | } 45 | 46 | #[post("/users/create")] 47 | pub async fn create_user( 48 | pool: web::Data, 49 | form: web::Json, 50 | ) -> Result { 51 | let user = web::block(move || { 52 | let mut conn = pool.get()?; 53 | db::insert_new_user(&mut conn, &form.username, &form.phone) 54 | }) 55 | .await? 56 | .map_err(actix_web::error::ErrorUnprocessableEntity)?; 57 | 58 | Ok(HttpResponse::Ok().json(user)) 59 | } 60 | 61 | #[get("/users/{user_id}")] 62 | pub async fn get_user_by_id( 63 | pool: web::Data, 64 | id: web::Path, 65 | ) -> Result { 66 | let user_id = id.to_owned(); 67 | let user = web::block(move || { 68 | let mut conn = pool.get()?; 69 | db::find_user_by_uid(&mut conn, user_id) 70 | }) 71 | .await? 72 | .map_err(actix_web::error::ErrorInternalServerError)?; 73 | 74 | if let Some(user) = user { 75 | Ok(HttpResponse::Ok().json(user)) 76 | } else { 77 | let res = HttpResponse::NotFound().body( 78 | json!({ 79 | "error": 404, 80 | "message": format!("No user found with phone: {id}") 81 | }) 82 | .to_string(), 83 | ); 84 | Ok(res) 85 | } 86 | } 87 | 88 | #[get("/conversations/{uid}")] 89 | pub async fn get_conversation_by_id( 90 | pool: web::Data, 91 | uid: web::Path, 92 | ) -> Result { 93 | let room_id = uid.to_owned(); 94 | let conversations = web::block(move || { 95 | let mut conn = pool.get()?; 96 | db::get_conversation_by_room_uid(&mut conn, room_id) 97 | }) 98 | .await? 99 | .map_err(actix_web::error::ErrorInternalServerError)?; 100 | 101 | if let Some(data) = conversations { 102 | Ok(HttpResponse::Ok().json(data)) 103 | } else { 104 | let res = HttpResponse::NotFound().body( 105 | json!({ 106 | "error": 404, 107 | "message": format!("No conversation with room_id: {room_id}") 108 | }) 109 | .to_string(), 110 | ); 111 | Ok(res) 112 | } 113 | } 114 | 115 | #[get("/users/phone/{user_phone}")] 116 | pub async fn get_user_by_phone( 117 | pool: web::Data, 118 | phone: web::Path, 119 | ) -> Result { 120 | let user_phone = phone.to_string(); 121 | let user = web::block(move || { 122 | let mut conn = pool.get()?; 123 | db::find_user_by_phone(&mut conn, user_phone) 124 | }) 125 | .await? 126 | .map_err(actix_web::error::ErrorInternalServerError)?; 127 | 128 | if let Some(user) = user { 129 | Ok(HttpResponse::Ok().json(user)) 130 | } else { 131 | let res = HttpResponse::NotFound().body( 132 | json!({ 133 | "error": 404, 134 | "message": format!("No user found with phone: {}", phone.to_string()) 135 | }) 136 | .to_string(), 137 | ); 138 | Ok(res) 139 | } 140 | } 141 | 142 | #[get("/rooms")] 143 | pub async fn get_rooms( 144 | pool: web::Data, 145 | ) -> Result { 146 | let rooms = web::block(move || { 147 | let mut conn = pool.get()?; 148 | db::get_all_rooms(&mut conn) 149 | }) 150 | .await? 151 | .map_err(actix_web::error::ErrorInternalServerError)?; 152 | 153 | if !rooms.is_empty() { 154 | Ok(HttpResponse::Ok().json(rooms)) 155 | } else { 156 | let res = HttpResponse::NotFound().body( 157 | json!({ 158 | "error": 404, 159 | "message": "No rooms available at the moment.", 160 | }) 161 | .to_string(), 162 | ); 163 | Ok(res) 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /src/schema.rs: -------------------------------------------------------------------------------- 1 | // @generated automatically by Diesel CLI. 2 | 3 | diesel::table! { 4 | conversations (id) { 5 | id -> Text, 6 | room_id -> Text, 7 | user_id -> Text, 8 | content -> Text, 9 | created_at -> Text, 10 | } 11 | } 12 | 13 | diesel::table! { 14 | rooms (id) { 15 | id -> Text, 16 | name -> Text, 17 | last_message -> Text, 18 | participant_ids -> Text, 19 | created_at -> Text, 20 | } 21 | } 22 | 23 | diesel::table! { 24 | users (id) { 25 | id -> Text, 26 | username -> Text, 27 | phone -> Text, 28 | created_at -> Text, 29 | } 30 | } 31 | 32 | diesel::allow_tables_to_appear_in_same_query!( 33 | conversations, 34 | rooms, 35 | users, 36 | ); 37 | -------------------------------------------------------------------------------- /src/server.rs: -------------------------------------------------------------------------------- 1 | use std::collections::{HashMap, HashSet}; 2 | 3 | use serde_json::json; 4 | 5 | use actix::prelude::*; 6 | use rand::{self, rngs::ThreadRng, Rng}; 7 | 8 | use crate::session; 9 | 10 | #[derive(Message)] 11 | #[rtype(result = "()")] 12 | pub struct Message(pub String); 13 | 14 | #[derive(Message)] 15 | #[rtype(usize)] 16 | pub struct Connect { 17 | pub addr: Recipient, 18 | } 19 | 20 | #[derive(Message)] 21 | #[rtype(result = "()")] 22 | pub struct Disconnect { 23 | pub id: usize, 24 | } 25 | 26 | #[derive(Message)] 27 | #[rtype(result = "()")] 28 | pub struct ClientMessage { 29 | pub id: usize, 30 | pub msg: String, 31 | pub room: String, 32 | } 33 | 34 | pub struct ListRooms; 35 | 36 | impl actix::Message for ListRooms { 37 | type Result = Vec; 38 | } 39 | 40 | #[derive(Message)] 41 | #[rtype(result = "()")] 42 | pub struct Join { 43 | pub id: usize, 44 | pub name: String, 45 | } 46 | 47 | #[derive(Debug)] 48 | pub struct ChatServer { 49 | sessions: HashMap>, 50 | rooms: HashMap>, 51 | rng: ThreadRng, 52 | } 53 | 54 | impl ChatServer { 55 | pub fn new() -> ChatServer { 56 | let mut rooms = HashMap::new(); 57 | rooms.insert("main".to_string(), HashSet::new()); 58 | 59 | Self { 60 | sessions: HashMap::new(), 61 | rooms, 62 | rng: rand::thread_rng() 63 | } 64 | } 65 | 66 | fn send_message(&self, room: &str, message: &str, skip_id: usize) { 67 | if let Some(sessions) = self.rooms.get(room) { 68 | for id in sessions { 69 | if *id != skip_id { 70 | if let Some(addr) = self.sessions.get(id) { 71 | addr.do_send(Message(message.to_owned())); 72 | } 73 | } 74 | } 75 | } 76 | } 77 | } 78 | 79 | impl Actor for ChatServer { 80 | type Context = Context; 81 | } 82 | 83 | impl Handler for ChatServer { 84 | type Result = usize; 85 | 86 | fn handle(&mut self, msg: Connect, _: &mut Context) -> Self::Result { 87 | let id = self.rng.gen::(); 88 | self.sessions.insert(id, msg.addr); 89 | self.rooms 90 | .entry("main".to_string()) 91 | .or_insert_with(HashSet::new) 92 | .insert(id); 93 | self.send_message("main", &json!({ 94 | "value": vec![format!("{}", id)], 95 | "chat_type": session::ChatType::CONNECT 96 | }).to_string(), 0); 97 | id 98 | } 99 | } 100 | 101 | impl Handler for ChatServer { 102 | type Result = (); 103 | 104 | fn handle(&mut self, msg: Disconnect, _: &mut Self::Context) -> Self::Result { 105 | let mut rooms: Vec = vec![]; 106 | if self.sessions.remove(&msg.id).is_some() { 107 | for (name, sessions) in &mut self.rooms { 108 | if sessions.remove(&msg.id) { 109 | rooms.push(name.to_owned()); 110 | } 111 | } 112 | } 113 | 114 | for room in rooms { 115 | self.send_message("main", &json!({ 116 | "room": room, 117 | "value": vec![format!("Someone disconnect!")], 118 | "chat_type": session::ChatType::DISCONNECT 119 | }).to_string(), 0); 120 | } 121 | } 122 | } 123 | 124 | impl Handler for ChatServer { 125 | type Result = (); 126 | 127 | fn handle(&mut self, msg: ClientMessage, _: &mut Self::Context) -> Self::Result { 128 | self.send_message(&msg.room, &msg.msg, msg.id); 129 | } 130 | } 131 | 132 | impl Handler for ChatServer { 133 | type Result = MessageResult; 134 | 135 | fn handle(&mut self, _: ListRooms, _: &mut Self::Context) -> Self::Result { 136 | let mut rooms = vec![]; 137 | for key in self.rooms.keys() { 138 | rooms.push(key.to_owned()); 139 | } 140 | MessageResult(rooms) 141 | } 142 | } 143 | 144 | impl Handler for ChatServer { 145 | type Result = (); 146 | 147 | fn handle(&mut self, msg: Join, _: &mut Self::Context) -> Self::Result { 148 | let Join {id, name} = msg; 149 | let mut rooms = vec![]; 150 | 151 | for (n, sessions) in &mut self.rooms { 152 | if sessions.remove(&id) { 153 | rooms.push(n.to_owned()); 154 | } 155 | } 156 | 157 | for room in rooms { 158 | self.send_message(&room, &json!({ 159 | "room": room, 160 | "value": vec![format!("Someone disconnect!")], 161 | "chat_type": session::ChatType::DISCONNECT 162 | }).to_string(), 0); 163 | } 164 | 165 | self.rooms 166 | .entry(name.clone()) 167 | .or_insert_with(HashSet::new) 168 | .insert(id); 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /src/session.rs: -------------------------------------------------------------------------------- 1 | use std::time::{Duration, Instant}; 2 | 3 | use actix::prelude::*; 4 | use actix_web::web; 5 | use actix_web_actors::ws; 6 | use serde::{Deserialize, Serialize}; 7 | 8 | use diesel::{ 9 | prelude::*, 10 | r2d2::{self, ConnectionManager}, 11 | }; 12 | 13 | use crate::db; 14 | use crate::models::NewConversation; 15 | use crate::server; 16 | 17 | const HEARBEET: Duration = Duration::from_secs(5); 18 | const CLIENT_TIMEOUT: Duration = Duration::from_secs(10); 19 | type DbPool = r2d2::Pool>; 20 | 21 | #[derive(Debug)] 22 | pub struct WsChatSession { 23 | pub id: usize, 24 | pub hb: Instant, 25 | pub room: String, 26 | pub name: Option, 27 | pub addr: Addr, 28 | pub db_pool: web::Data, 29 | } 30 | 31 | #[derive(PartialEq, Serialize, Deserialize)] 32 | pub enum ChatType { 33 | STATUS, 34 | TYPING, 35 | TEXT, 36 | CONNECT, 37 | DISCONNECT, 38 | } 39 | 40 | #[derive(Serialize, Deserialize)] 41 | struct ChatMessage { 42 | pub chat_type: ChatType, 43 | pub value: Vec, 44 | pub room_id: String, 45 | pub user_id: String, 46 | pub id: usize, 47 | } 48 | 49 | impl Actor for WsChatSession { 50 | type Context = ws::WebsocketContext; 51 | 52 | fn started(&mut self, ctx: &mut Self::Context) { 53 | self.hb(ctx); 54 | 55 | let addr = ctx.address(); 56 | 57 | self.addr 58 | .send(server::Connect { 59 | addr: addr.recipient(), 60 | }) 61 | .into_actor(self) 62 | .then(|res, act, ctx| { 63 | match res { 64 | Ok(res) => act.id = res, 65 | _ => ctx.stop(), 66 | } 67 | fut::ready(()) 68 | }) 69 | .wait(ctx); 70 | } 71 | 72 | fn stopping(&mut self, _: &mut Self::Context) -> Running { 73 | self.addr.do_send(server::Disconnect { id: self.id }); 74 | Running::Stop 75 | } 76 | } 77 | 78 | impl Handler for WsChatSession { 79 | type Result = (); 80 | fn handle(&mut self, msg: server::Message, ctx: &mut Self::Context) -> Self::Result { 81 | ctx.text(msg.0); 82 | } 83 | } 84 | 85 | impl StreamHandler> for WsChatSession { 86 | fn handle(&mut self, item: Result, ctx: &mut Self::Context) { 87 | let msg = match item { 88 | Err(_) => { 89 | ctx.stop(); 90 | return; 91 | } 92 | Ok(msg) => msg, 93 | }; 94 | 95 | match msg { 96 | ws::Message::Ping(msg) => { 97 | self.hb = Instant::now(); 98 | ctx.pong(&msg); 99 | } 100 | ws::Message::Pong(_) => { 101 | self.hb = Instant::now(); 102 | } 103 | ws::Message::Text(text) => { 104 | let data_json = serde_json::from_str::(&text.to_string()); 105 | if let Err(err) = data_json { 106 | println!("{err}"); 107 | println!("Failed to parse message: {text}"); 108 | return; 109 | } 110 | 111 | let input = data_json.as_ref().unwrap(); 112 | match &input.chat_type { 113 | ChatType::TYPING => { 114 | let chat_msg = ChatMessage { 115 | chat_type: ChatType::TYPING, 116 | value: input.value.to_vec(), 117 | id: self.id, 118 | room_id: input.room_id.to_string(), 119 | user_id: input.user_id.to_string(), 120 | }; 121 | let msg = serde_json::to_string(&chat_msg).unwrap(); 122 | self.addr.do_send(server::ClientMessage { 123 | id: self.id, 124 | msg, 125 | room: self.room.clone(), 126 | }) 127 | } 128 | ChatType::TEXT => { 129 | let input = data_json.as_ref().unwrap(); 130 | let chat_msg = ChatMessage { 131 | chat_type: ChatType::TEXT, 132 | value: input.value.to_vec(), 133 | id: self.id, 134 | room_id: input.room_id.to_string(), 135 | user_id: input.user_id.to_string(), 136 | }; 137 | 138 | let mut conn = self.db_pool.get().unwrap(); 139 | let new_conversation = NewConversation { 140 | user_id: input.user_id.to_string(), 141 | room_id: input.room_id.to_string(), 142 | message: input.value.join(""), 143 | }; 144 | let _ = db::insert_new_conversation(&mut conn, new_conversation); 145 | let msg = serde_json::to_string(&chat_msg).unwrap(); 146 | self.addr.do_send(server::ClientMessage { 147 | id: self.id, 148 | msg, 149 | room: self.room.clone(), 150 | }) 151 | } 152 | _ => {} 153 | } 154 | } 155 | ws::Message::Binary(_) => println!("Unsupported binary"), 156 | ws::Message::Close(reason) => { 157 | ctx.close(reason); 158 | ctx.stop(); 159 | } 160 | ws::Message::Continuation(_) => { 161 | ctx.stop(); 162 | } 163 | ws::Message::Nop => (), 164 | } 165 | } 166 | } 167 | 168 | impl WsChatSession { 169 | fn hb(&self, ctx: &mut ws::WebsocketContext) { 170 | ctx.run_interval(HEARBEET, |act, ctx| { 171 | if Instant::now().duration_since(act.hb) > CLIENT_TIMEOUT { 172 | act.addr.do_send(server::Disconnect { id: act.id }); 173 | ctx.stop(); 174 | return; 175 | } 176 | ctx.ping(b""); 177 | }); 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /ui/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /ui/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | ``` 12 | 13 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 14 | 15 | You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file. 16 | 17 | [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`. 18 | 19 | The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. 20 | 21 | ## Learn More 22 | 23 | To learn more about Next.js, take a look at the following resources: 24 | 25 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 26 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 27 | 28 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 29 | 30 | ## Deploy on Vercel 31 | 32 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 33 | 34 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 35 | -------------------------------------------------------------------------------- /ui/components/avatar.js: -------------------------------------------------------------------------------- 1 | function getShortName(full_name = '') { 2 | if (full_name.includes(" ")) { 3 | const names = full_name.split(" "); 4 | return `${names[0].charAt(0)}${names[1].charAt(0)}`.toUpperCase() 5 | } 6 | return `${full_name.slice(0,2)}`.toUpperCase() 7 | } 8 | 9 | export default function Avatar({ children, color = 'rgb(59 130 246)' }) { 10 | return ( 11 |
12 | {getShortName(children)} 13 |
14 | ) 15 | } -------------------------------------------------------------------------------- /ui/components/conversation.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef } from "react"; 2 | import Avatar from "./avatar" 3 | 4 | function ConversationItem({ right, content, username }) { 5 | if (right) { 6 | return ( 7 |
8 |
9 |
10 |

{content}

11 |
12 |
13 | {username} 14 |
15 |
16 |
17 | ) 18 | } 19 | 20 | return ( 21 |
22 |
23 | {username} 24 |
25 |
26 |

{content}

27 |
28 |
29 | ) 30 | } 31 | 32 | export default function Conversation({ data, auth, users }) { 33 | const ref = useRef(null); 34 | 35 | useEffect(() => { 36 | ref.current?.scrollTo(0, ref.current.scrollHeight) 37 | }, [data]); 38 | 39 | return ( 40 |
41 | { 42 | data.map(item => { 43 | return 48 | }) 49 | } 50 |
51 | ) 52 | } 53 | -------------------------------------------------------------------------------- /ui/components/login.js: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | 3 | async function createAccount({ username, phone }) { 4 | try { 5 | const url = "http://localhost:8080/users/create"; 6 | let result = await fetch(url, { 7 | method: "POST", 8 | headers: { 9 | "Content-Type": "application/json" 10 | }, 11 | body: JSON.stringify({ username, phone }) 12 | }); 13 | return result.json(); 14 | } catch (e) { 15 | return Promise.reject(e); 16 | } 17 | } 18 | 19 | async function signIn({ phone }) { 20 | try { 21 | const url = "http://localhost:8080/users/phone/" + phone; 22 | let result = await fetch(url); 23 | return result.json(); 24 | } catch (e) { 25 | return Promise.reject(e); 26 | } 27 | } 28 | 29 | export default function Login({ show, setAuth }) { 30 | const [isShowSigIn, setShowSignIn] = useState(false); 31 | 32 | const showSignIn = () => { 33 | setShowSignIn(prev => !prev) 34 | } 35 | 36 | const FormCreateUsername = ({ setAuth }) => { 37 | const onCreateUsername = async (e) => { 38 | e.preventDefault(); 39 | let username = e.target.username.value; 40 | let phone = e.target.phone.value; 41 | if (username === "" || phone === "") { 42 | return; 43 | } 44 | 45 | let res = await createAccount({ username, phone }); 46 | if (res === null) { 47 | alert("Failed to create account"); 48 | return; 49 | } 50 | 51 | setAuth(res) 52 | } 53 | 54 | return ( 55 |
56 |
57 | 58 | 60 |
61 | 62 |
63 | 64 | 66 |
67 | 68 |
69 | 71 |
72 | 73 |
74 |

Already have a username?

75 |
76 |
77 | ) 78 | } 79 | 80 | const FormSignIn = ({ setAuth }) => { 81 | const onSignIn = async (e) => { 82 | e.preventDefault(); 83 | let phone = e.target.phone.value; 84 | if (phone === "") { 85 | return; 86 | } 87 | 88 | let res = await signIn({ phone }); 89 | if (res === null) { 90 | alert("Failed to create account"); 91 | return; 92 | } 93 | 94 | if (!res.id) { 95 | alert(`Phone number not found ${phone}`); 96 | return; 97 | } 98 | 99 | setAuth(res) 100 | } 101 | 102 | return ( 103 |
104 |
105 | 106 | 108 |
109 | 110 |
111 | 113 |
114 | 115 |
116 |

Don't have username?

117 |
118 |
119 | ) 120 | } 121 | 122 | return ( 123 |
124 |
125 |
126 |

{isShowSigIn ? 'Log in with your phone.' : 'Create your account.'}

127 | {isShowSigIn ? : } 128 |
129 |
130 |
131 | ) 132 | } 133 | -------------------------------------------------------------------------------- /ui/components/rooms.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import Avatar from "./avatar"; 3 | 4 | async function getRooms() { 5 | try { 6 | const url = "http://localhost:8080/rooms"; 7 | let result = await fetch(url); 8 | return result.json(); 9 | } catch (e) { 10 | console.log(e); 11 | return Promise.resolve(null); 12 | } 13 | } 14 | 15 | function ChatListItem({ onSelect, room, userId, index, selectedItem }) { 16 | const { users, created_at, last_message } = room; 17 | const active = index == selectedItem; 18 | const date = new Date(created_at); 19 | const ampm = date.getHours() >= 12 ? 'PM' : 'AM'; 20 | const time = `${date.getHours()}:${date.getMinutes()} ${ampm}` 21 | const name = users?.filter(user => user.id != userId).map(user => user.username)[0]; 22 | 23 | return ( 24 |
onSelect(index, {})} 26 | className={`${active ? 'bg-[#FDF9F0] border border-[#DEAB6C]' : 'bg-[#FAF9FE] border border-[#FAF9FE]'} p-2 rounded-[10px] shadow-sm cursor-pointer`} > 27 |
28 |
29 | {name} 30 |
31 |

{name}

32 |

{last_message}

33 |
34 |
35 |
36 | {time} 37 |
38 |
39 |
40 | ) 41 | } 42 | 43 | export default function ChatList({ onChatChange, userId }) { 44 | const [data, setData] = useState([]) 45 | const [isLoading, setLoading] = useState(false) 46 | const [selectedItem, setSelectedItem] = useState(-1); 47 | 48 | useEffect(() => { 49 | setLoading(true) 50 | getRooms() 51 | .then((data) => { 52 | setData(data) 53 | setLoading(false) 54 | }) 55 | }, []) 56 | 57 | const onSelectedChat = (idx, item) => { 58 | setSelectedItem(idx) 59 | let mapUsers = new Map(); 60 | item.users.forEach(el => { 61 | mapUsers.set(el.id, el); 62 | }); 63 | const users = { 64 | get: (id) => { 65 | return mapUsers.get(id).username; 66 | }, 67 | get_target_user: (id) => { 68 | return item.users.filter(el => el.id != id).map(el => el.username).join("") 69 | } 70 | } 71 | onChatChange({ ...item.room, users }) 72 | } 73 | 74 | return ( 75 |
76 | {isLoading &&

Loading chat lists.

} 77 | { 78 | data.map((item, index) => { 79 | return onSelectedChat(idx, item)} 81 | room={{ ...item.room, users: item.users }} 82 | index={index} 83 | key={item.room.id} 84 | userId={userId} 85 | selectedItem={selectedItem} /> 86 | }) 87 | } 88 |
89 | ) 90 | } -------------------------------------------------------------------------------- /ui/libs/useConversation.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | const fetchRoomData = async (room_id) => { 4 | if (!room_id) return; 5 | const url = `http://localhost:8080/conversations/${room_id}`; 6 | try { 7 | let resp = await fetch(url).then(res => res.json()); 8 | return resp; 9 | } catch (e) { 10 | console.log(e); 11 | } 12 | } 13 | 14 | export default function useConversations(room_id) { 15 | const [isLoading, setIsLoading] = useState(true); 16 | const [messages, setMessages] = useState([]); 17 | 18 | const updateMessages = (resp = []) => { 19 | setIsLoading(false); 20 | setMessages(resp) 21 | } 22 | 23 | const fetchConversations = (id) => { 24 | setIsLoading(true) 25 | fetchRoomData(id).then(updateMessages) 26 | } 27 | 28 | useEffect(() => fetchConversations(room_id), []); 29 | 30 | return [isLoading, messages, setMessages, fetchConversations]; 31 | } 32 | -------------------------------------------------------------------------------- /ui/libs/useLocalStorage.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | export default function useLocalStorage(key, defaultValue) { 4 | const [storedValue, setStoredValue] = useState(defaultValue); 5 | 6 | const setValue = (value) => { 7 | try { 8 | const valueToStore = value instanceof Function ? value(storedValue) : value; 9 | setStoredValue(valueToStore); 10 | if (typeof window !== "undefined") { 11 | window.localStorage.setItem(key, JSON.stringify(valueToStore)); 12 | } 13 | } catch (error) { 14 | } 15 | }; 16 | 17 | useEffect(() => { 18 | try { 19 | const item = window.localStorage.getItem(key); 20 | let data = item ? JSON.parse(item) : defaultValue; 21 | setStoredValue(data) 22 | } catch (error) {} 23 | }, []) 24 | 25 | return [storedValue, setValue]; 26 | } 27 | -------------------------------------------------------------------------------- /ui/libs/useWebsocket.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from "react"; 2 | 3 | export default function useWebsocket(onMessage) { 4 | const ws = useRef(null); 5 | 6 | useEffect(() => { 7 | if (ws.current !== null) return; 8 | const wsUri = 'ws://localhost:8080/ws'; 9 | ws.current = new WebSocket(wsUri); 10 | ws.current.onopen = () => console.log("ws opened"); 11 | ws.current.onclose = () => console.log("ws closed"); 12 | 13 | const wsCurrent = ws.current; 14 | return () => { 15 | wsCurrent.close(); 16 | }; 17 | }, []); 18 | 19 | useEffect(() => { 20 | if (!ws.current) return; 21 | ws.current.onmessage = e => { 22 | onMessage(e.data) 23 | }; 24 | }, []); 25 | 26 | const sendMessage = (msg) => { 27 | if (!ws.current) return; 28 | ws.current.send(msg); 29 | } 30 | 31 | return sendMessage; 32 | } 33 | -------------------------------------------------------------------------------- /ui/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | } 5 | 6 | module.exports = nextConfig 7 | -------------------------------------------------------------------------------- /ui/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui", 3 | "version": "0.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "ui", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "@headlessui/react": "^1.7.4", 12 | "next": "13.0.4", 13 | "react": "18.2.0", 14 | "react-dom": "18.2.0" 15 | }, 16 | "devDependencies": { 17 | "autoprefixer": "^10.4.13", 18 | "postcss": "^8.4.19", 19 | "tailwindcss": "^3.2.4" 20 | } 21 | }, 22 | "node_modules/@headlessui/react": { 23 | "version": "1.7.4", 24 | "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.4.tgz", 25 | "integrity": "sha512-D8n5yGCF3WIkPsjEYeM8knn9jQ70bigGGb5aUvN6y4BGxcT3OcOQOKcM3zRGllRCZCFxCZyQvYJF6ZE7bQUOyQ==", 26 | "dependencies": { 27 | "client-only": "^0.0.1" 28 | }, 29 | "engines": { 30 | "node": ">=10" 31 | }, 32 | "peerDependencies": { 33 | "react": "^16 || ^17 || ^18", 34 | "react-dom": "^16 || ^17 || ^18" 35 | } 36 | }, 37 | "node_modules/@next/env": { 38 | "version": "13.0.4", 39 | "resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.4.tgz", 40 | "integrity": "sha512-N5Z3bdxBzoxrC5bwykDFITzdWuwDteOdZ+7nxixY+I1XpRX8/iQYbw2wuXMdqdfBGm2NNUpAqg8YF2e4oAC2UQ==", 41 | "license": "MIT" 42 | }, 43 | "node_modules/@next/swc-android-arm-eabi": { 44 | "version": "13.0.4", 45 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.4.tgz", 46 | "integrity": "sha512-SD9H+/zuV3L0oHIhsDdFkDqFtg6pIHtqRUPlsrNdOsmWXgMlSzxBmwt2ta4kyrazS62BQu7XRUG++ZyODS7AWg==", 47 | "cpu": [ 48 | "arm" 49 | ], 50 | "optional": true, 51 | "os": [ 52 | "android" 53 | ], 54 | "engines": { 55 | "node": ">= 10" 56 | } 57 | }, 58 | "node_modules/@next/swc-android-arm64": { 59 | "version": "13.0.4", 60 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.4.tgz", 61 | "integrity": "sha512-F8W5WcBbdn/zBoy32/mQiefs9DNsT12CTSSVCsO8GvQR7GjJU+uduQ4drKcSDoDLuAFULc2jDN06Circq4vuQg==", 62 | "cpu": [ 63 | "arm64" 64 | ], 65 | "optional": true, 66 | "os": [ 67 | "android" 68 | ], 69 | "engines": { 70 | "node": ">= 10" 71 | } 72 | }, 73 | "node_modules/@next/swc-darwin-arm64": { 74 | "version": "13.0.4", 75 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.4.tgz", 76 | "integrity": "sha512-/lajev+9GSie+rRTl5z8skW9RJwZ+TwMKLzzM24TbDk8lUjqPTyJZ/cU0NDj8J7VQAZ6EehACSh9rcJeBRtLuA==", 77 | "cpu": [ 78 | "arm64" 79 | ], 80 | "license": "MIT", 81 | "optional": true, 82 | "os": [ 83 | "darwin" 84 | ], 85 | "engines": { 86 | "node": ">= 10" 87 | } 88 | }, 89 | "node_modules/@next/swc-darwin-x64": { 90 | "version": "13.0.4", 91 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.4.tgz", 92 | "integrity": "sha512-HK4b2rFiju8d40GTL/jH9U6OQ7BYA2MeEHs7Dm7Rp7kwQtLzP3z6osdQS8er20tIFHDE4b+oVBy03ZUQkHf0Pg==", 93 | "cpu": [ 94 | "x64" 95 | ], 96 | "optional": true, 97 | "os": [ 98 | "darwin" 99 | ], 100 | "engines": { 101 | "node": ">= 10" 102 | } 103 | }, 104 | "node_modules/@next/swc-freebsd-x64": { 105 | "version": "13.0.4", 106 | "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.4.tgz", 107 | "integrity": "sha512-xBvIGLaGzZtgJfRRJ2DBN82DQCJ/O7jkXyBp8X/vHefPWyVXVqF6C68Rv8ADp11thPpf8WpjkvDDLb9AuWHQUA==", 108 | "cpu": [ 109 | "x64" 110 | ], 111 | "optional": true, 112 | "os": [ 113 | "freebsd" 114 | ], 115 | "engines": { 116 | "node": ">= 10" 117 | } 118 | }, 119 | "node_modules/@next/swc-linux-arm-gnueabihf": { 120 | "version": "13.0.4", 121 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.4.tgz", 122 | "integrity": "sha512-s13pxNp9deKmmxEGTp1MoL1e4nf4wbEymEaHgFxUlhoR1OD9tK8oTNrQphQePJgVjzcWmRGH/dX7O9mVkHbU/g==", 123 | "cpu": [ 124 | "arm" 125 | ], 126 | "optional": true, 127 | "os": [ 128 | "linux" 129 | ], 130 | "engines": { 131 | "node": ">= 10" 132 | } 133 | }, 134 | "node_modules/@next/swc-linux-arm64-gnu": { 135 | "version": "13.0.4", 136 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.4.tgz", 137 | "integrity": "sha512-Lklo65usNzoYwjX51CpDKOepWVZBdwO49/Jz3djxiYUr2lRtpDVnlfwCvzN+47j3BMVMWtC2ndIi8Q4s3J0v4g==", 138 | "cpu": [ 139 | "arm64" 140 | ], 141 | "optional": true, 142 | "os": [ 143 | "linux" 144 | ], 145 | "engines": { 146 | "node": ">= 10" 147 | } 148 | }, 149 | "node_modules/@next/swc-linux-arm64-musl": { 150 | "version": "13.0.4", 151 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.4.tgz", 152 | "integrity": "sha512-+3BXtXBwjVhd5lahDe5nKZ7EwD6hE/oLFQkITCvgxymU5qYHGlLFyF52/lyw8qhyxoCr7mMVsUFhlCzVwCfNjg==", 153 | "cpu": [ 154 | "arm64" 155 | ], 156 | "optional": true, 157 | "os": [ 158 | "linux" 159 | ], 160 | "engines": { 161 | "node": ">= 10" 162 | } 163 | }, 164 | "node_modules/@next/swc-linux-x64-gnu": { 165 | "version": "13.0.4", 166 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.4.tgz", 167 | "integrity": "sha512-QB8qoZrvHhZsz62nUrTKlp5IiZ8I7KZsaa6437H/W/NOZHLGJjCxROnhUjLvKVe/T5P86pjya2SUOUqWAjz4Pg==", 168 | "cpu": [ 169 | "x64" 170 | ], 171 | "optional": true, 172 | "os": [ 173 | "linux" 174 | ], 175 | "engines": { 176 | "node": ">= 10" 177 | } 178 | }, 179 | "node_modules/@next/swc-linux-x64-musl": { 180 | "version": "13.0.4", 181 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.4.tgz", 182 | "integrity": "sha512-WaahF6DYUQRg1QqIMcuOu2ZsFhS3aC5iWeQyeptMHklP9wb4FfTNmBArKHknX/GXD8P9gI38WTAHJ25cc0zVwg==", 183 | "cpu": [ 184 | "x64" 185 | ], 186 | "optional": true, 187 | "os": [ 188 | "linux" 189 | ], 190 | "engines": { 191 | "node": ">= 10" 192 | } 193 | }, 194 | "node_modules/@next/swc-win32-arm64-msvc": { 195 | "version": "13.0.4", 196 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.4.tgz", 197 | "integrity": "sha512-FD+k1j2jeY0aKcqcpzFKfTsv55PPmIZ5GKDyPjjV5AO6XvQ4nALwWl4JwizjH2426TfLXObb+C3MH0bl9Ok1Kw==", 198 | "cpu": [ 199 | "arm64" 200 | ], 201 | "optional": true, 202 | "os": [ 203 | "win32" 204 | ], 205 | "engines": { 206 | "node": ">= 10" 207 | } 208 | }, 209 | "node_modules/@next/swc-win32-ia32-msvc": { 210 | "version": "13.0.4", 211 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.4.tgz", 212 | "integrity": "sha512-+Q/Q8Ydvz3X3U84CyZdNv1HC7fE43k+xB8C6b3IFmWGa5Tu2tfskQ2FsUNBrYreZjhFC/894J3rVQ6Vj6Auugg==", 213 | "cpu": [ 214 | "ia32" 215 | ], 216 | "optional": true, 217 | "os": [ 218 | "win32" 219 | ], 220 | "engines": { 221 | "node": ">= 10" 222 | } 223 | }, 224 | "node_modules/@next/swc-win32-x64-msvc": { 225 | "version": "13.0.4", 226 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.4.tgz", 227 | "integrity": "sha512-vXtbo9N1FdtZZRcv4BliU28tTYrkb1EnVpUiiFFe88I6kS9aZVTMY9Z/OtDR52rl1JF1hgs9sL/59D/TQqSATQ==", 228 | "cpu": [ 229 | "x64" 230 | ], 231 | "optional": true, 232 | "os": [ 233 | "win32" 234 | ], 235 | "engines": { 236 | "node": ">= 10" 237 | } 238 | }, 239 | "node_modules/@nodelib/fs.scandir": { 240 | "version": "2.1.5", 241 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 242 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 243 | "dev": true, 244 | "dependencies": { 245 | "@nodelib/fs.stat": "2.0.5", 246 | "run-parallel": "^1.1.9" 247 | }, 248 | "engines": { 249 | "node": ">= 8" 250 | } 251 | }, 252 | "node_modules/@nodelib/fs.stat": { 253 | "version": "2.0.5", 254 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 255 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 256 | "dev": true, 257 | "engines": { 258 | "node": ">= 8" 259 | } 260 | }, 261 | "node_modules/@nodelib/fs.walk": { 262 | "version": "1.2.8", 263 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 264 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 265 | "dev": true, 266 | "dependencies": { 267 | "@nodelib/fs.scandir": "2.1.5", 268 | "fastq": "^1.6.0" 269 | }, 270 | "engines": { 271 | "node": ">= 8" 272 | } 273 | }, 274 | "node_modules/@swc/helpers": { 275 | "version": "0.4.11", 276 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", 277 | "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", 278 | "license": "MIT", 279 | "dependencies": { 280 | "tslib": "^2.4.0" 281 | } 282 | }, 283 | "node_modules/acorn": { 284 | "version": "7.4.1", 285 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 286 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 287 | "dev": true, 288 | "bin": { 289 | "acorn": "bin/acorn" 290 | }, 291 | "engines": { 292 | "node": ">=0.4.0" 293 | } 294 | }, 295 | "node_modules/acorn-node": { 296 | "version": "1.8.2", 297 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 298 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 299 | "dev": true, 300 | "dependencies": { 301 | "acorn": "^7.0.0", 302 | "acorn-walk": "^7.0.0", 303 | "xtend": "^4.0.2" 304 | } 305 | }, 306 | "node_modules/acorn-walk": { 307 | "version": "7.2.0", 308 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 309 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 310 | "dev": true, 311 | "engines": { 312 | "node": ">=0.4.0" 313 | } 314 | }, 315 | "node_modules/anymatch": { 316 | "version": "3.1.2", 317 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 318 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 319 | "dev": true, 320 | "dependencies": { 321 | "normalize-path": "^3.0.0", 322 | "picomatch": "^2.0.4" 323 | }, 324 | "engines": { 325 | "node": ">= 8" 326 | } 327 | }, 328 | "node_modules/arg": { 329 | "version": "5.0.2", 330 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 331 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 332 | "dev": true 333 | }, 334 | "node_modules/autoprefixer": { 335 | "version": "10.4.13", 336 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", 337 | "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", 338 | "dev": true, 339 | "funding": [ 340 | { 341 | "type": "opencollective", 342 | "url": "https://opencollective.com/postcss/" 343 | }, 344 | { 345 | "type": "tidelift", 346 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 347 | } 348 | ], 349 | "dependencies": { 350 | "browserslist": "^4.21.4", 351 | "caniuse-lite": "^1.0.30001426", 352 | "fraction.js": "^4.2.0", 353 | "normalize-range": "^0.1.2", 354 | "picocolors": "^1.0.0", 355 | "postcss-value-parser": "^4.2.0" 356 | }, 357 | "bin": { 358 | "autoprefixer": "bin/autoprefixer" 359 | }, 360 | "engines": { 361 | "node": "^10 || ^12 || >=14" 362 | }, 363 | "peerDependencies": { 364 | "postcss": "^8.1.0" 365 | } 366 | }, 367 | "node_modules/binary-extensions": { 368 | "version": "2.2.0", 369 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 370 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 371 | "dev": true, 372 | "engines": { 373 | "node": ">=8" 374 | } 375 | }, 376 | "node_modules/braces": { 377 | "version": "3.0.2", 378 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 379 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 380 | "dev": true, 381 | "dependencies": { 382 | "fill-range": "^7.0.1" 383 | }, 384 | "engines": { 385 | "node": ">=8" 386 | } 387 | }, 388 | "node_modules/browserslist": { 389 | "version": "4.21.4", 390 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 391 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 392 | "dev": true, 393 | "funding": [ 394 | { 395 | "type": "opencollective", 396 | "url": "https://opencollective.com/browserslist" 397 | }, 398 | { 399 | "type": "tidelift", 400 | "url": "https://tidelift.com/funding/github/npm/browserslist" 401 | } 402 | ], 403 | "dependencies": { 404 | "caniuse-lite": "^1.0.30001400", 405 | "electron-to-chromium": "^1.4.251", 406 | "node-releases": "^2.0.6", 407 | "update-browserslist-db": "^1.0.9" 408 | }, 409 | "bin": { 410 | "browserslist": "cli.js" 411 | }, 412 | "engines": { 413 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 414 | } 415 | }, 416 | "node_modules/camelcase-css": { 417 | "version": "2.0.1", 418 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 419 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 420 | "dev": true, 421 | "engines": { 422 | "node": ">= 6" 423 | } 424 | }, 425 | "node_modules/caniuse-lite": { 426 | "version": "1.0.30001431", 427 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", 428 | "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", 429 | "funding": [ 430 | { 431 | "type": "opencollective", 432 | "url": "https://opencollective.com/browserslist" 433 | }, 434 | { 435 | "type": "tidelift", 436 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 437 | } 438 | ], 439 | "license": "CC-BY-4.0" 440 | }, 441 | "node_modules/chokidar": { 442 | "version": "3.5.3", 443 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 444 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 445 | "dev": true, 446 | "funding": [ 447 | { 448 | "type": "individual", 449 | "url": "https://paulmillr.com/funding/" 450 | } 451 | ], 452 | "dependencies": { 453 | "anymatch": "~3.1.2", 454 | "braces": "~3.0.2", 455 | "glob-parent": "~5.1.2", 456 | "is-binary-path": "~2.1.0", 457 | "is-glob": "~4.0.1", 458 | "normalize-path": "~3.0.0", 459 | "readdirp": "~3.6.0" 460 | }, 461 | "engines": { 462 | "node": ">= 8.10.0" 463 | }, 464 | "optionalDependencies": { 465 | "fsevents": "~2.3.2" 466 | } 467 | }, 468 | "node_modules/chokidar/node_modules/glob-parent": { 469 | "version": "5.1.2", 470 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 471 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 472 | "dev": true, 473 | "dependencies": { 474 | "is-glob": "^4.0.1" 475 | }, 476 | "engines": { 477 | "node": ">= 6" 478 | } 479 | }, 480 | "node_modules/client-only": { 481 | "version": "0.0.1", 482 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 483 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", 484 | "license": "MIT" 485 | }, 486 | "node_modules/color-name": { 487 | "version": "1.1.4", 488 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 489 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 490 | "dev": true 491 | }, 492 | "node_modules/cssesc": { 493 | "version": "3.0.0", 494 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 495 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 496 | "dev": true, 497 | "bin": { 498 | "cssesc": "bin/cssesc" 499 | }, 500 | "engines": { 501 | "node": ">=4" 502 | } 503 | }, 504 | "node_modules/defined": { 505 | "version": "1.0.1", 506 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 507 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 508 | "dev": true, 509 | "funding": { 510 | "url": "https://github.com/sponsors/ljharb" 511 | } 512 | }, 513 | "node_modules/detective": { 514 | "version": "5.2.1", 515 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 516 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 517 | "dev": true, 518 | "dependencies": { 519 | "acorn-node": "^1.8.2", 520 | "defined": "^1.0.0", 521 | "minimist": "^1.2.6" 522 | }, 523 | "bin": { 524 | "detective": "bin/detective.js" 525 | }, 526 | "engines": { 527 | "node": ">=0.8.0" 528 | } 529 | }, 530 | "node_modules/didyoumean": { 531 | "version": "1.2.2", 532 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 533 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 534 | "dev": true 535 | }, 536 | "node_modules/dlv": { 537 | "version": "1.1.3", 538 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 539 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 540 | "dev": true 541 | }, 542 | "node_modules/electron-to-chromium": { 543 | "version": "1.4.284", 544 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 545 | "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", 546 | "dev": true 547 | }, 548 | "node_modules/escalade": { 549 | "version": "3.1.1", 550 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 551 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 552 | "dev": true, 553 | "engines": { 554 | "node": ">=6" 555 | } 556 | }, 557 | "node_modules/fast-glob": { 558 | "version": "3.2.12", 559 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 560 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 561 | "dev": true, 562 | "dependencies": { 563 | "@nodelib/fs.stat": "^2.0.2", 564 | "@nodelib/fs.walk": "^1.2.3", 565 | "glob-parent": "^5.1.2", 566 | "merge2": "^1.3.0", 567 | "micromatch": "^4.0.4" 568 | }, 569 | "engines": { 570 | "node": ">=8.6.0" 571 | } 572 | }, 573 | "node_modules/fast-glob/node_modules/glob-parent": { 574 | "version": "5.1.2", 575 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 576 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 577 | "dev": true, 578 | "dependencies": { 579 | "is-glob": "^4.0.1" 580 | }, 581 | "engines": { 582 | "node": ">= 6" 583 | } 584 | }, 585 | "node_modules/fastq": { 586 | "version": "1.13.0", 587 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 588 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 589 | "dev": true, 590 | "dependencies": { 591 | "reusify": "^1.0.4" 592 | } 593 | }, 594 | "node_modules/fill-range": { 595 | "version": "7.0.1", 596 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 597 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 598 | "dev": true, 599 | "dependencies": { 600 | "to-regex-range": "^5.0.1" 601 | }, 602 | "engines": { 603 | "node": ">=8" 604 | } 605 | }, 606 | "node_modules/fraction.js": { 607 | "version": "4.2.0", 608 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 609 | "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 610 | "dev": true, 611 | "engines": { 612 | "node": "*" 613 | }, 614 | "funding": { 615 | "type": "patreon", 616 | "url": "https://www.patreon.com/infusion" 617 | } 618 | }, 619 | "node_modules/fsevents": { 620 | "version": "2.3.2", 621 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 622 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 623 | "dev": true, 624 | "hasInstallScript": true, 625 | "optional": true, 626 | "os": [ 627 | "darwin" 628 | ], 629 | "engines": { 630 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 631 | } 632 | }, 633 | "node_modules/function-bind": { 634 | "version": "1.1.1", 635 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 636 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 637 | "dev": true 638 | }, 639 | "node_modules/glob-parent": { 640 | "version": "6.0.2", 641 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 642 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 643 | "dev": true, 644 | "dependencies": { 645 | "is-glob": "^4.0.3" 646 | }, 647 | "engines": { 648 | "node": ">=10.13.0" 649 | } 650 | }, 651 | "node_modules/has": { 652 | "version": "1.0.3", 653 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 654 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 655 | "dev": true, 656 | "dependencies": { 657 | "function-bind": "^1.1.1" 658 | }, 659 | "engines": { 660 | "node": ">= 0.4.0" 661 | } 662 | }, 663 | "node_modules/is-binary-path": { 664 | "version": "2.1.0", 665 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 666 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 667 | "dev": true, 668 | "dependencies": { 669 | "binary-extensions": "^2.0.0" 670 | }, 671 | "engines": { 672 | "node": ">=8" 673 | } 674 | }, 675 | "node_modules/is-core-module": { 676 | "version": "2.11.0", 677 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 678 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 679 | "dev": true, 680 | "dependencies": { 681 | "has": "^1.0.3" 682 | }, 683 | "funding": { 684 | "url": "https://github.com/sponsors/ljharb" 685 | } 686 | }, 687 | "node_modules/is-extglob": { 688 | "version": "2.1.1", 689 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 690 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 691 | "dev": true, 692 | "engines": { 693 | "node": ">=0.10.0" 694 | } 695 | }, 696 | "node_modules/is-glob": { 697 | "version": "4.0.3", 698 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 699 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 700 | "dev": true, 701 | "dependencies": { 702 | "is-extglob": "^2.1.1" 703 | }, 704 | "engines": { 705 | "node": ">=0.10.0" 706 | } 707 | }, 708 | "node_modules/is-number": { 709 | "version": "7.0.0", 710 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 711 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 712 | "dev": true, 713 | "engines": { 714 | "node": ">=0.12.0" 715 | } 716 | }, 717 | "node_modules/js-tokens": { 718 | "version": "4.0.0", 719 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 720 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 721 | "license": "MIT" 722 | }, 723 | "node_modules/lilconfig": { 724 | "version": "2.0.6", 725 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 726 | "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 727 | "dev": true, 728 | "engines": { 729 | "node": ">=10" 730 | } 731 | }, 732 | "node_modules/loose-envify": { 733 | "version": "1.4.0", 734 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 735 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 736 | "license": "MIT", 737 | "dependencies": { 738 | "js-tokens": "^3.0.0 || ^4.0.0" 739 | }, 740 | "bin": { 741 | "loose-envify": "cli.js" 742 | } 743 | }, 744 | "node_modules/merge2": { 745 | "version": "1.4.1", 746 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 747 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 748 | "dev": true, 749 | "engines": { 750 | "node": ">= 8" 751 | } 752 | }, 753 | "node_modules/micromatch": { 754 | "version": "4.0.5", 755 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 756 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 757 | "dev": true, 758 | "dependencies": { 759 | "braces": "^3.0.2", 760 | "picomatch": "^2.3.1" 761 | }, 762 | "engines": { 763 | "node": ">=8.6" 764 | } 765 | }, 766 | "node_modules/minimist": { 767 | "version": "1.2.7", 768 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 769 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 770 | "dev": true, 771 | "funding": { 772 | "url": "https://github.com/sponsors/ljharb" 773 | } 774 | }, 775 | "node_modules/nanoid": { 776 | "version": "3.3.4", 777 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 778 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 779 | "license": "MIT", 780 | "bin": { 781 | "nanoid": "bin/nanoid.cjs" 782 | }, 783 | "engines": { 784 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 785 | } 786 | }, 787 | "node_modules/next": { 788 | "version": "13.0.4", 789 | "resolved": "https://registry.npmjs.org/next/-/next-13.0.4.tgz", 790 | "integrity": "sha512-4P0MvbjPCI1E/UPL1GrTXtYlgFnbBbY3JQ+AMY8jYE2SwyvCWctEJySoRjveznAHjrl6TIjuAJeB8u1c2StYUQ==", 791 | "license": "MIT", 792 | "dependencies": { 793 | "@next/env": "13.0.4", 794 | "@swc/helpers": "0.4.11", 795 | "caniuse-lite": "^1.0.30001406", 796 | "postcss": "8.4.14", 797 | "styled-jsx": "5.1.0", 798 | "use-sync-external-store": "1.2.0" 799 | }, 800 | "bin": { 801 | "next": "dist/bin/next" 802 | }, 803 | "engines": { 804 | "node": ">=14.6.0" 805 | }, 806 | "optionalDependencies": { 807 | "@next/swc-android-arm-eabi": "13.0.4", 808 | "@next/swc-android-arm64": "13.0.4", 809 | "@next/swc-darwin-arm64": "13.0.4", 810 | "@next/swc-darwin-x64": "13.0.4", 811 | "@next/swc-freebsd-x64": "13.0.4", 812 | "@next/swc-linux-arm-gnueabihf": "13.0.4", 813 | "@next/swc-linux-arm64-gnu": "13.0.4", 814 | "@next/swc-linux-arm64-musl": "13.0.4", 815 | "@next/swc-linux-x64-gnu": "13.0.4", 816 | "@next/swc-linux-x64-musl": "13.0.4", 817 | "@next/swc-win32-arm64-msvc": "13.0.4", 818 | "@next/swc-win32-ia32-msvc": "13.0.4", 819 | "@next/swc-win32-x64-msvc": "13.0.4" 820 | }, 821 | "peerDependencies": { 822 | "fibers": ">= 3.1.0", 823 | "node-sass": "^6.0.0 || ^7.0.0", 824 | "react": "^18.2.0", 825 | "react-dom": "^18.2.0", 826 | "sass": "^1.3.0" 827 | }, 828 | "peerDependenciesMeta": { 829 | "fibers": { 830 | "optional": true 831 | }, 832 | "node-sass": { 833 | "optional": true 834 | }, 835 | "sass": { 836 | "optional": true 837 | } 838 | } 839 | }, 840 | "node_modules/next/node_modules/postcss": { 841 | "version": "8.4.14", 842 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", 843 | "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", 844 | "funding": [ 845 | { 846 | "type": "opencollective", 847 | "url": "https://opencollective.com/postcss/" 848 | }, 849 | { 850 | "type": "tidelift", 851 | "url": "https://tidelift.com/funding/github/npm/postcss" 852 | } 853 | ], 854 | "dependencies": { 855 | "nanoid": "^3.3.4", 856 | "picocolors": "^1.0.0", 857 | "source-map-js": "^1.0.2" 858 | }, 859 | "engines": { 860 | "node": "^10 || ^12 || >=14" 861 | } 862 | }, 863 | "node_modules/node-releases": { 864 | "version": "2.0.6", 865 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 866 | "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", 867 | "dev": true 868 | }, 869 | "node_modules/normalize-path": { 870 | "version": "3.0.0", 871 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 872 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 873 | "dev": true, 874 | "engines": { 875 | "node": ">=0.10.0" 876 | } 877 | }, 878 | "node_modules/normalize-range": { 879 | "version": "0.1.2", 880 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 881 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 882 | "dev": true, 883 | "engines": { 884 | "node": ">=0.10.0" 885 | } 886 | }, 887 | "node_modules/object-hash": { 888 | "version": "3.0.0", 889 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 890 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 891 | "dev": true, 892 | "engines": { 893 | "node": ">= 6" 894 | } 895 | }, 896 | "node_modules/path-parse": { 897 | "version": "1.0.7", 898 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 899 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 900 | "dev": true 901 | }, 902 | "node_modules/picocolors": { 903 | "version": "1.0.0", 904 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 905 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 906 | "license": "ISC" 907 | }, 908 | "node_modules/picomatch": { 909 | "version": "2.3.1", 910 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 911 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 912 | "dev": true, 913 | "engines": { 914 | "node": ">=8.6" 915 | }, 916 | "funding": { 917 | "url": "https://github.com/sponsors/jonschlinkert" 918 | } 919 | }, 920 | "node_modules/pify": { 921 | "version": "2.3.0", 922 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 923 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 924 | "dev": true, 925 | "engines": { 926 | "node": ">=0.10.0" 927 | } 928 | }, 929 | "node_modules/postcss": { 930 | "version": "8.4.19", 931 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", 932 | "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", 933 | "dev": true, 934 | "funding": [ 935 | { 936 | "type": "opencollective", 937 | "url": "https://opencollective.com/postcss/" 938 | }, 939 | { 940 | "type": "tidelift", 941 | "url": "https://tidelift.com/funding/github/npm/postcss" 942 | } 943 | ], 944 | "dependencies": { 945 | "nanoid": "^3.3.4", 946 | "picocolors": "^1.0.0", 947 | "source-map-js": "^1.0.2" 948 | }, 949 | "engines": { 950 | "node": "^10 || ^12 || >=14" 951 | } 952 | }, 953 | "node_modules/postcss-import": { 954 | "version": "14.1.0", 955 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 956 | "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 957 | "dev": true, 958 | "dependencies": { 959 | "postcss-value-parser": "^4.0.0", 960 | "read-cache": "^1.0.0", 961 | "resolve": "^1.1.7" 962 | }, 963 | "engines": { 964 | "node": ">=10.0.0" 965 | }, 966 | "peerDependencies": { 967 | "postcss": "^8.0.0" 968 | } 969 | }, 970 | "node_modules/postcss-js": { 971 | "version": "4.0.0", 972 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 973 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 974 | "dev": true, 975 | "dependencies": { 976 | "camelcase-css": "^2.0.1" 977 | }, 978 | "engines": { 979 | "node": "^12 || ^14 || >= 16" 980 | }, 981 | "funding": { 982 | "type": "opencollective", 983 | "url": "https://opencollective.com/postcss/" 984 | }, 985 | "peerDependencies": { 986 | "postcss": "^8.3.3" 987 | } 988 | }, 989 | "node_modules/postcss-load-config": { 990 | "version": "3.1.4", 991 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 992 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 993 | "dev": true, 994 | "dependencies": { 995 | "lilconfig": "^2.0.5", 996 | "yaml": "^1.10.2" 997 | }, 998 | "engines": { 999 | "node": ">= 10" 1000 | }, 1001 | "funding": { 1002 | "type": "opencollective", 1003 | "url": "https://opencollective.com/postcss/" 1004 | }, 1005 | "peerDependencies": { 1006 | "postcss": ">=8.0.9", 1007 | "ts-node": ">=9.0.0" 1008 | }, 1009 | "peerDependenciesMeta": { 1010 | "postcss": { 1011 | "optional": true 1012 | }, 1013 | "ts-node": { 1014 | "optional": true 1015 | } 1016 | } 1017 | }, 1018 | "node_modules/postcss-nested": { 1019 | "version": "6.0.0", 1020 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", 1021 | "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", 1022 | "dev": true, 1023 | "dependencies": { 1024 | "postcss-selector-parser": "^6.0.10" 1025 | }, 1026 | "engines": { 1027 | "node": ">=12.0" 1028 | }, 1029 | "funding": { 1030 | "type": "opencollective", 1031 | "url": "https://opencollective.com/postcss/" 1032 | }, 1033 | "peerDependencies": { 1034 | "postcss": "^8.2.14" 1035 | } 1036 | }, 1037 | "node_modules/postcss-selector-parser": { 1038 | "version": "6.0.10", 1039 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 1040 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 1041 | "dev": true, 1042 | "dependencies": { 1043 | "cssesc": "^3.0.0", 1044 | "util-deprecate": "^1.0.2" 1045 | }, 1046 | "engines": { 1047 | "node": ">=4" 1048 | } 1049 | }, 1050 | "node_modules/postcss-value-parser": { 1051 | "version": "4.2.0", 1052 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1053 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1054 | "dev": true 1055 | }, 1056 | "node_modules/queue-microtask": { 1057 | "version": "1.2.3", 1058 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1059 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1060 | "dev": true, 1061 | "funding": [ 1062 | { 1063 | "type": "github", 1064 | "url": "https://github.com/sponsors/feross" 1065 | }, 1066 | { 1067 | "type": "patreon", 1068 | "url": "https://www.patreon.com/feross" 1069 | }, 1070 | { 1071 | "type": "consulting", 1072 | "url": "https://feross.org/support" 1073 | } 1074 | ] 1075 | }, 1076 | "node_modules/quick-lru": { 1077 | "version": "5.1.1", 1078 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1079 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 1080 | "dev": true, 1081 | "engines": { 1082 | "node": ">=10" 1083 | }, 1084 | "funding": { 1085 | "url": "https://github.com/sponsors/sindresorhus" 1086 | } 1087 | }, 1088 | "node_modules/react": { 1089 | "version": "18.2.0", 1090 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 1091 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 1092 | "license": "MIT", 1093 | "dependencies": { 1094 | "loose-envify": "^1.1.0" 1095 | }, 1096 | "engines": { 1097 | "node": ">=0.10.0" 1098 | } 1099 | }, 1100 | "node_modules/react-dom": { 1101 | "version": "18.2.0", 1102 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 1103 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 1104 | "license": "MIT", 1105 | "dependencies": { 1106 | "loose-envify": "^1.1.0", 1107 | "scheduler": "^0.23.0" 1108 | }, 1109 | "peerDependencies": { 1110 | "react": "^18.2.0" 1111 | } 1112 | }, 1113 | "node_modules/read-cache": { 1114 | "version": "1.0.0", 1115 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 1116 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 1117 | "dev": true, 1118 | "dependencies": { 1119 | "pify": "^2.3.0" 1120 | } 1121 | }, 1122 | "node_modules/readdirp": { 1123 | "version": "3.6.0", 1124 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1125 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1126 | "dev": true, 1127 | "dependencies": { 1128 | "picomatch": "^2.2.1" 1129 | }, 1130 | "engines": { 1131 | "node": ">=8.10.0" 1132 | } 1133 | }, 1134 | "node_modules/resolve": { 1135 | "version": "1.22.1", 1136 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1137 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1138 | "dev": true, 1139 | "dependencies": { 1140 | "is-core-module": "^2.9.0", 1141 | "path-parse": "^1.0.7", 1142 | "supports-preserve-symlinks-flag": "^1.0.0" 1143 | }, 1144 | "bin": { 1145 | "resolve": "bin/resolve" 1146 | }, 1147 | "funding": { 1148 | "url": "https://github.com/sponsors/ljharb" 1149 | } 1150 | }, 1151 | "node_modules/reusify": { 1152 | "version": "1.0.4", 1153 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1154 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1155 | "dev": true, 1156 | "engines": { 1157 | "iojs": ">=1.0.0", 1158 | "node": ">=0.10.0" 1159 | } 1160 | }, 1161 | "node_modules/run-parallel": { 1162 | "version": "1.2.0", 1163 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1164 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1165 | "dev": true, 1166 | "funding": [ 1167 | { 1168 | "type": "github", 1169 | "url": "https://github.com/sponsors/feross" 1170 | }, 1171 | { 1172 | "type": "patreon", 1173 | "url": "https://www.patreon.com/feross" 1174 | }, 1175 | { 1176 | "type": "consulting", 1177 | "url": "https://feross.org/support" 1178 | } 1179 | ], 1180 | "dependencies": { 1181 | "queue-microtask": "^1.2.2" 1182 | } 1183 | }, 1184 | "node_modules/scheduler": { 1185 | "version": "0.23.0", 1186 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 1187 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 1188 | "license": "MIT", 1189 | "dependencies": { 1190 | "loose-envify": "^1.1.0" 1191 | } 1192 | }, 1193 | "node_modules/source-map-js": { 1194 | "version": "1.0.2", 1195 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1196 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1197 | "license": "BSD-3-Clause", 1198 | "engines": { 1199 | "node": ">=0.10.0" 1200 | } 1201 | }, 1202 | "node_modules/styled-jsx": { 1203 | "version": "5.1.0", 1204 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz", 1205 | "integrity": "sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==", 1206 | "license": "MIT", 1207 | "dependencies": { 1208 | "client-only": "0.0.1" 1209 | }, 1210 | "engines": { 1211 | "node": ">= 12.0.0" 1212 | }, 1213 | "peerDependencies": { 1214 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" 1215 | }, 1216 | "peerDependenciesMeta": { 1217 | "@babel/core": { 1218 | "optional": true 1219 | }, 1220 | "babel-plugin-macros": { 1221 | "optional": true 1222 | } 1223 | } 1224 | }, 1225 | "node_modules/supports-preserve-symlinks-flag": { 1226 | "version": "1.0.0", 1227 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1228 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1229 | "dev": true, 1230 | "engines": { 1231 | "node": ">= 0.4" 1232 | }, 1233 | "funding": { 1234 | "url": "https://github.com/sponsors/ljharb" 1235 | } 1236 | }, 1237 | "node_modules/tailwindcss": { 1238 | "version": "3.2.4", 1239 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", 1240 | "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", 1241 | "dev": true, 1242 | "dependencies": { 1243 | "arg": "^5.0.2", 1244 | "chokidar": "^3.5.3", 1245 | "color-name": "^1.1.4", 1246 | "detective": "^5.2.1", 1247 | "didyoumean": "^1.2.2", 1248 | "dlv": "^1.1.3", 1249 | "fast-glob": "^3.2.12", 1250 | "glob-parent": "^6.0.2", 1251 | "is-glob": "^4.0.3", 1252 | "lilconfig": "^2.0.6", 1253 | "micromatch": "^4.0.5", 1254 | "normalize-path": "^3.0.0", 1255 | "object-hash": "^3.0.0", 1256 | "picocolors": "^1.0.0", 1257 | "postcss": "^8.4.18", 1258 | "postcss-import": "^14.1.0", 1259 | "postcss-js": "^4.0.0", 1260 | "postcss-load-config": "^3.1.4", 1261 | "postcss-nested": "6.0.0", 1262 | "postcss-selector-parser": "^6.0.10", 1263 | "postcss-value-parser": "^4.2.0", 1264 | "quick-lru": "^5.1.1", 1265 | "resolve": "^1.22.1" 1266 | }, 1267 | "bin": { 1268 | "tailwind": "lib/cli.js", 1269 | "tailwindcss": "lib/cli.js" 1270 | }, 1271 | "engines": { 1272 | "node": ">=12.13.0" 1273 | }, 1274 | "peerDependencies": { 1275 | "postcss": "^8.0.9" 1276 | } 1277 | }, 1278 | "node_modules/to-regex-range": { 1279 | "version": "5.0.1", 1280 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1281 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1282 | "dev": true, 1283 | "dependencies": { 1284 | "is-number": "^7.0.0" 1285 | }, 1286 | "engines": { 1287 | "node": ">=8.0" 1288 | } 1289 | }, 1290 | "node_modules/tslib": { 1291 | "version": "2.4.1", 1292 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", 1293 | "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", 1294 | "license": "0BSD" 1295 | }, 1296 | "node_modules/update-browserslist-db": { 1297 | "version": "1.0.10", 1298 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 1299 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 1300 | "dev": true, 1301 | "funding": [ 1302 | { 1303 | "type": "opencollective", 1304 | "url": "https://opencollective.com/browserslist" 1305 | }, 1306 | { 1307 | "type": "tidelift", 1308 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1309 | } 1310 | ], 1311 | "dependencies": { 1312 | "escalade": "^3.1.1", 1313 | "picocolors": "^1.0.0" 1314 | }, 1315 | "bin": { 1316 | "browserslist-lint": "cli.js" 1317 | }, 1318 | "peerDependencies": { 1319 | "browserslist": ">= 4.21.0" 1320 | } 1321 | }, 1322 | "node_modules/use-sync-external-store": { 1323 | "version": "1.2.0", 1324 | "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", 1325 | "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", 1326 | "license": "MIT", 1327 | "peerDependencies": { 1328 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 1329 | } 1330 | }, 1331 | "node_modules/util-deprecate": { 1332 | "version": "1.0.2", 1333 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1334 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1335 | "dev": true 1336 | }, 1337 | "node_modules/xtend": { 1338 | "version": "4.0.2", 1339 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1340 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1341 | "dev": true, 1342 | "engines": { 1343 | "node": ">=0.4" 1344 | } 1345 | }, 1346 | "node_modules/yaml": { 1347 | "version": "1.10.2", 1348 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 1349 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 1350 | "dev": true, 1351 | "engines": { 1352 | "node": ">= 6" 1353 | } 1354 | } 1355 | }, 1356 | "dependencies": { 1357 | "@headlessui/react": { 1358 | "version": "1.7.4", 1359 | "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.4.tgz", 1360 | "integrity": "sha512-D8n5yGCF3WIkPsjEYeM8knn9jQ70bigGGb5aUvN6y4BGxcT3OcOQOKcM3zRGllRCZCFxCZyQvYJF6ZE7bQUOyQ==", 1361 | "requires": { 1362 | "client-only": "^0.0.1" 1363 | } 1364 | }, 1365 | "@next/env": { 1366 | "version": "13.0.4", 1367 | "resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.4.tgz", 1368 | "integrity": "sha512-N5Z3bdxBzoxrC5bwykDFITzdWuwDteOdZ+7nxixY+I1XpRX8/iQYbw2wuXMdqdfBGm2NNUpAqg8YF2e4oAC2UQ==" 1369 | }, 1370 | "@next/swc-android-arm-eabi": { 1371 | "version": "13.0.4", 1372 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.4.tgz", 1373 | "integrity": "sha512-SD9H+/zuV3L0oHIhsDdFkDqFtg6pIHtqRUPlsrNdOsmWXgMlSzxBmwt2ta4kyrazS62BQu7XRUG++ZyODS7AWg==", 1374 | "optional": true 1375 | }, 1376 | "@next/swc-android-arm64": { 1377 | "version": "13.0.4", 1378 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.4.tgz", 1379 | "integrity": "sha512-F8W5WcBbdn/zBoy32/mQiefs9DNsT12CTSSVCsO8GvQR7GjJU+uduQ4drKcSDoDLuAFULc2jDN06Circq4vuQg==", 1380 | "optional": true 1381 | }, 1382 | "@next/swc-darwin-arm64": { 1383 | "version": "13.0.4", 1384 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.4.tgz", 1385 | "integrity": "sha512-/lajev+9GSie+rRTl5z8skW9RJwZ+TwMKLzzM24TbDk8lUjqPTyJZ/cU0NDj8J7VQAZ6EehACSh9rcJeBRtLuA==", 1386 | "optional": true 1387 | }, 1388 | "@next/swc-darwin-x64": { 1389 | "version": "13.0.4", 1390 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.4.tgz", 1391 | "integrity": "sha512-HK4b2rFiju8d40GTL/jH9U6OQ7BYA2MeEHs7Dm7Rp7kwQtLzP3z6osdQS8er20tIFHDE4b+oVBy03ZUQkHf0Pg==", 1392 | "optional": true 1393 | }, 1394 | "@next/swc-freebsd-x64": { 1395 | "version": "13.0.4", 1396 | "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.4.tgz", 1397 | "integrity": "sha512-xBvIGLaGzZtgJfRRJ2DBN82DQCJ/O7jkXyBp8X/vHefPWyVXVqF6C68Rv8ADp11thPpf8WpjkvDDLb9AuWHQUA==", 1398 | "optional": true 1399 | }, 1400 | "@next/swc-linux-arm-gnueabihf": { 1401 | "version": "13.0.4", 1402 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.4.tgz", 1403 | "integrity": "sha512-s13pxNp9deKmmxEGTp1MoL1e4nf4wbEymEaHgFxUlhoR1OD9tK8oTNrQphQePJgVjzcWmRGH/dX7O9mVkHbU/g==", 1404 | "optional": true 1405 | }, 1406 | "@next/swc-linux-arm64-gnu": { 1407 | "version": "13.0.4", 1408 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.4.tgz", 1409 | "integrity": "sha512-Lklo65usNzoYwjX51CpDKOepWVZBdwO49/Jz3djxiYUr2lRtpDVnlfwCvzN+47j3BMVMWtC2ndIi8Q4s3J0v4g==", 1410 | "optional": true 1411 | }, 1412 | "@next/swc-linux-arm64-musl": { 1413 | "version": "13.0.4", 1414 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.4.tgz", 1415 | "integrity": "sha512-+3BXtXBwjVhd5lahDe5nKZ7EwD6hE/oLFQkITCvgxymU5qYHGlLFyF52/lyw8qhyxoCr7mMVsUFhlCzVwCfNjg==", 1416 | "optional": true 1417 | }, 1418 | "@next/swc-linux-x64-gnu": { 1419 | "version": "13.0.4", 1420 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.4.tgz", 1421 | "integrity": "sha512-QB8qoZrvHhZsz62nUrTKlp5IiZ8I7KZsaa6437H/W/NOZHLGJjCxROnhUjLvKVe/T5P86pjya2SUOUqWAjz4Pg==", 1422 | "optional": true 1423 | }, 1424 | "@next/swc-linux-x64-musl": { 1425 | "version": "13.0.4", 1426 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.4.tgz", 1427 | "integrity": "sha512-WaahF6DYUQRg1QqIMcuOu2ZsFhS3aC5iWeQyeptMHklP9wb4FfTNmBArKHknX/GXD8P9gI38WTAHJ25cc0zVwg==", 1428 | "optional": true 1429 | }, 1430 | "@next/swc-win32-arm64-msvc": { 1431 | "version": "13.0.4", 1432 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.4.tgz", 1433 | "integrity": "sha512-FD+k1j2jeY0aKcqcpzFKfTsv55PPmIZ5GKDyPjjV5AO6XvQ4nALwWl4JwizjH2426TfLXObb+C3MH0bl9Ok1Kw==", 1434 | "optional": true 1435 | }, 1436 | "@next/swc-win32-ia32-msvc": { 1437 | "version": "13.0.4", 1438 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.4.tgz", 1439 | "integrity": "sha512-+Q/Q8Ydvz3X3U84CyZdNv1HC7fE43k+xB8C6b3IFmWGa5Tu2tfskQ2FsUNBrYreZjhFC/894J3rVQ6Vj6Auugg==", 1440 | "optional": true 1441 | }, 1442 | "@next/swc-win32-x64-msvc": { 1443 | "version": "13.0.4", 1444 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.4.tgz", 1445 | "integrity": "sha512-vXtbo9N1FdtZZRcv4BliU28tTYrkb1EnVpUiiFFe88I6kS9aZVTMY9Z/OtDR52rl1JF1hgs9sL/59D/TQqSATQ==", 1446 | "optional": true 1447 | }, 1448 | "@nodelib/fs.scandir": { 1449 | "version": "2.1.5", 1450 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1451 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1452 | "dev": true, 1453 | "requires": { 1454 | "@nodelib/fs.stat": "2.0.5", 1455 | "run-parallel": "^1.1.9" 1456 | } 1457 | }, 1458 | "@nodelib/fs.stat": { 1459 | "version": "2.0.5", 1460 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1461 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1462 | "dev": true 1463 | }, 1464 | "@nodelib/fs.walk": { 1465 | "version": "1.2.8", 1466 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1467 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1468 | "dev": true, 1469 | "requires": { 1470 | "@nodelib/fs.scandir": "2.1.5", 1471 | "fastq": "^1.6.0" 1472 | } 1473 | }, 1474 | "@swc/helpers": { 1475 | "version": "0.4.11", 1476 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", 1477 | "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", 1478 | "requires": { 1479 | "tslib": "^2.4.0" 1480 | } 1481 | }, 1482 | "acorn": { 1483 | "version": "7.4.1", 1484 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 1485 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 1486 | "dev": true 1487 | }, 1488 | "acorn-node": { 1489 | "version": "1.8.2", 1490 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 1491 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 1492 | "dev": true, 1493 | "requires": { 1494 | "acorn": "^7.0.0", 1495 | "acorn-walk": "^7.0.0", 1496 | "xtend": "^4.0.2" 1497 | } 1498 | }, 1499 | "acorn-walk": { 1500 | "version": "7.2.0", 1501 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 1502 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 1503 | "dev": true 1504 | }, 1505 | "anymatch": { 1506 | "version": "3.1.2", 1507 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1508 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1509 | "dev": true, 1510 | "requires": { 1511 | "normalize-path": "^3.0.0", 1512 | "picomatch": "^2.0.4" 1513 | } 1514 | }, 1515 | "arg": { 1516 | "version": "5.0.2", 1517 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 1518 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 1519 | "dev": true 1520 | }, 1521 | "autoprefixer": { 1522 | "version": "10.4.13", 1523 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", 1524 | "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", 1525 | "dev": true, 1526 | "requires": { 1527 | "browserslist": "^4.21.4", 1528 | "caniuse-lite": "^1.0.30001426", 1529 | "fraction.js": "^4.2.0", 1530 | "normalize-range": "^0.1.2", 1531 | "picocolors": "^1.0.0", 1532 | "postcss-value-parser": "^4.2.0" 1533 | } 1534 | }, 1535 | "binary-extensions": { 1536 | "version": "2.2.0", 1537 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1538 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1539 | "dev": true 1540 | }, 1541 | "braces": { 1542 | "version": "3.0.2", 1543 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1544 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1545 | "dev": true, 1546 | "requires": { 1547 | "fill-range": "^7.0.1" 1548 | } 1549 | }, 1550 | "browserslist": { 1551 | "version": "4.21.4", 1552 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 1553 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 1554 | "dev": true, 1555 | "requires": { 1556 | "caniuse-lite": "^1.0.30001400", 1557 | "electron-to-chromium": "^1.4.251", 1558 | "node-releases": "^2.0.6", 1559 | "update-browserslist-db": "^1.0.9" 1560 | } 1561 | }, 1562 | "camelcase-css": { 1563 | "version": "2.0.1", 1564 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1565 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 1566 | "dev": true 1567 | }, 1568 | "caniuse-lite": { 1569 | "version": "1.0.30001431", 1570 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", 1571 | "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==" 1572 | }, 1573 | "chokidar": { 1574 | "version": "3.5.3", 1575 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1576 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1577 | "dev": true, 1578 | "requires": { 1579 | "anymatch": "~3.1.2", 1580 | "braces": "~3.0.2", 1581 | "fsevents": "~2.3.2", 1582 | "glob-parent": "~5.1.2", 1583 | "is-binary-path": "~2.1.0", 1584 | "is-glob": "~4.0.1", 1585 | "normalize-path": "~3.0.0", 1586 | "readdirp": "~3.6.0" 1587 | }, 1588 | "dependencies": { 1589 | "glob-parent": { 1590 | "version": "5.1.2", 1591 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1592 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1593 | "dev": true, 1594 | "requires": { 1595 | "is-glob": "^4.0.1" 1596 | } 1597 | } 1598 | } 1599 | }, 1600 | "client-only": { 1601 | "version": "0.0.1", 1602 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 1603 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" 1604 | }, 1605 | "color-name": { 1606 | "version": "1.1.4", 1607 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1608 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1609 | "dev": true 1610 | }, 1611 | "cssesc": { 1612 | "version": "3.0.0", 1613 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1614 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 1615 | "dev": true 1616 | }, 1617 | "defined": { 1618 | "version": "1.0.1", 1619 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 1620 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 1621 | "dev": true 1622 | }, 1623 | "detective": { 1624 | "version": "5.2.1", 1625 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 1626 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 1627 | "dev": true, 1628 | "requires": { 1629 | "acorn-node": "^1.8.2", 1630 | "defined": "^1.0.0", 1631 | "minimist": "^1.2.6" 1632 | } 1633 | }, 1634 | "didyoumean": { 1635 | "version": "1.2.2", 1636 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 1637 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 1638 | "dev": true 1639 | }, 1640 | "dlv": { 1641 | "version": "1.1.3", 1642 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 1643 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 1644 | "dev": true 1645 | }, 1646 | "electron-to-chromium": { 1647 | "version": "1.4.284", 1648 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", 1649 | "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", 1650 | "dev": true 1651 | }, 1652 | "escalade": { 1653 | "version": "3.1.1", 1654 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1655 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1656 | "dev": true 1657 | }, 1658 | "fast-glob": { 1659 | "version": "3.2.12", 1660 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 1661 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 1662 | "dev": true, 1663 | "requires": { 1664 | "@nodelib/fs.stat": "^2.0.2", 1665 | "@nodelib/fs.walk": "^1.2.3", 1666 | "glob-parent": "^5.1.2", 1667 | "merge2": "^1.3.0", 1668 | "micromatch": "^4.0.4" 1669 | }, 1670 | "dependencies": { 1671 | "glob-parent": { 1672 | "version": "5.1.2", 1673 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1674 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1675 | "dev": true, 1676 | "requires": { 1677 | "is-glob": "^4.0.1" 1678 | } 1679 | } 1680 | } 1681 | }, 1682 | "fastq": { 1683 | "version": "1.13.0", 1684 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 1685 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 1686 | "dev": true, 1687 | "requires": { 1688 | "reusify": "^1.0.4" 1689 | } 1690 | }, 1691 | "fill-range": { 1692 | "version": "7.0.1", 1693 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1694 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1695 | "dev": true, 1696 | "requires": { 1697 | "to-regex-range": "^5.0.1" 1698 | } 1699 | }, 1700 | "fraction.js": { 1701 | "version": "4.2.0", 1702 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 1703 | "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 1704 | "dev": true 1705 | }, 1706 | "fsevents": { 1707 | "version": "2.3.2", 1708 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1709 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1710 | "dev": true, 1711 | "optional": true 1712 | }, 1713 | "function-bind": { 1714 | "version": "1.1.1", 1715 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1716 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1717 | "dev": true 1718 | }, 1719 | "glob-parent": { 1720 | "version": "6.0.2", 1721 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1722 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1723 | "dev": true, 1724 | "requires": { 1725 | "is-glob": "^4.0.3" 1726 | } 1727 | }, 1728 | "has": { 1729 | "version": "1.0.3", 1730 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1731 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1732 | "dev": true, 1733 | "requires": { 1734 | "function-bind": "^1.1.1" 1735 | } 1736 | }, 1737 | "is-binary-path": { 1738 | "version": "2.1.0", 1739 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1740 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1741 | "dev": true, 1742 | "requires": { 1743 | "binary-extensions": "^2.0.0" 1744 | } 1745 | }, 1746 | "is-core-module": { 1747 | "version": "2.11.0", 1748 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 1749 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 1750 | "dev": true, 1751 | "requires": { 1752 | "has": "^1.0.3" 1753 | } 1754 | }, 1755 | "is-extglob": { 1756 | "version": "2.1.1", 1757 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1758 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1759 | "dev": true 1760 | }, 1761 | "is-glob": { 1762 | "version": "4.0.3", 1763 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1764 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1765 | "dev": true, 1766 | "requires": { 1767 | "is-extglob": "^2.1.1" 1768 | } 1769 | }, 1770 | "is-number": { 1771 | "version": "7.0.0", 1772 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1773 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1774 | "dev": true 1775 | }, 1776 | "js-tokens": { 1777 | "version": "4.0.0", 1778 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1779 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1780 | }, 1781 | "lilconfig": { 1782 | "version": "2.0.6", 1783 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 1784 | "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 1785 | "dev": true 1786 | }, 1787 | "loose-envify": { 1788 | "version": "1.4.0", 1789 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1790 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1791 | "requires": { 1792 | "js-tokens": "^3.0.0 || ^4.0.0" 1793 | } 1794 | }, 1795 | "merge2": { 1796 | "version": "1.4.1", 1797 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1798 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1799 | "dev": true 1800 | }, 1801 | "micromatch": { 1802 | "version": "4.0.5", 1803 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1804 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1805 | "dev": true, 1806 | "requires": { 1807 | "braces": "^3.0.2", 1808 | "picomatch": "^2.3.1" 1809 | } 1810 | }, 1811 | "minimist": { 1812 | "version": "1.2.7", 1813 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 1814 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 1815 | "dev": true 1816 | }, 1817 | "nanoid": { 1818 | "version": "3.3.4", 1819 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1820 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" 1821 | }, 1822 | "next": { 1823 | "version": "13.0.4", 1824 | "resolved": "https://registry.npmjs.org/next/-/next-13.0.4.tgz", 1825 | "integrity": "sha512-4P0MvbjPCI1E/UPL1GrTXtYlgFnbBbY3JQ+AMY8jYE2SwyvCWctEJySoRjveznAHjrl6TIjuAJeB8u1c2StYUQ==", 1826 | "requires": { 1827 | "@next/env": "13.0.4", 1828 | "@next/swc-android-arm-eabi": "13.0.4", 1829 | "@next/swc-android-arm64": "13.0.4", 1830 | "@next/swc-darwin-arm64": "13.0.4", 1831 | "@next/swc-darwin-x64": "13.0.4", 1832 | "@next/swc-freebsd-x64": "13.0.4", 1833 | "@next/swc-linux-arm-gnueabihf": "13.0.4", 1834 | "@next/swc-linux-arm64-gnu": "13.0.4", 1835 | "@next/swc-linux-arm64-musl": "13.0.4", 1836 | "@next/swc-linux-x64-gnu": "13.0.4", 1837 | "@next/swc-linux-x64-musl": "13.0.4", 1838 | "@next/swc-win32-arm64-msvc": "13.0.4", 1839 | "@next/swc-win32-ia32-msvc": "13.0.4", 1840 | "@next/swc-win32-x64-msvc": "13.0.4", 1841 | "@swc/helpers": "0.4.11", 1842 | "caniuse-lite": "^1.0.30001406", 1843 | "postcss": "8.4.14", 1844 | "styled-jsx": "5.1.0", 1845 | "use-sync-external-store": "1.2.0" 1846 | }, 1847 | "dependencies": { 1848 | "postcss": { 1849 | "version": "8.4.14", 1850 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", 1851 | "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", 1852 | "requires": { 1853 | "nanoid": "^3.3.4", 1854 | "picocolors": "^1.0.0", 1855 | "source-map-js": "^1.0.2" 1856 | } 1857 | } 1858 | } 1859 | }, 1860 | "node-releases": { 1861 | "version": "2.0.6", 1862 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 1863 | "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", 1864 | "dev": true 1865 | }, 1866 | "normalize-path": { 1867 | "version": "3.0.0", 1868 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1869 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1870 | "dev": true 1871 | }, 1872 | "normalize-range": { 1873 | "version": "0.1.2", 1874 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 1875 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 1876 | "dev": true 1877 | }, 1878 | "object-hash": { 1879 | "version": "3.0.0", 1880 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 1881 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 1882 | "dev": true 1883 | }, 1884 | "path-parse": { 1885 | "version": "1.0.7", 1886 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1887 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1888 | "dev": true 1889 | }, 1890 | "picocolors": { 1891 | "version": "1.0.0", 1892 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1893 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1894 | }, 1895 | "picomatch": { 1896 | "version": "2.3.1", 1897 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1898 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1899 | "dev": true 1900 | }, 1901 | "pify": { 1902 | "version": "2.3.0", 1903 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1904 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1905 | "dev": true 1906 | }, 1907 | "postcss": { 1908 | "version": "8.4.19", 1909 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", 1910 | "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", 1911 | "dev": true, 1912 | "requires": { 1913 | "nanoid": "^3.3.4", 1914 | "picocolors": "^1.0.0", 1915 | "source-map-js": "^1.0.2" 1916 | } 1917 | }, 1918 | "postcss-import": { 1919 | "version": "14.1.0", 1920 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 1921 | "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 1922 | "dev": true, 1923 | "requires": { 1924 | "postcss-value-parser": "^4.0.0", 1925 | "read-cache": "^1.0.0", 1926 | "resolve": "^1.1.7" 1927 | } 1928 | }, 1929 | "postcss-js": { 1930 | "version": "4.0.0", 1931 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 1932 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 1933 | "dev": true, 1934 | "requires": { 1935 | "camelcase-css": "^2.0.1" 1936 | } 1937 | }, 1938 | "postcss-load-config": { 1939 | "version": "3.1.4", 1940 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 1941 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 1942 | "dev": true, 1943 | "requires": { 1944 | "lilconfig": "^2.0.5", 1945 | "yaml": "^1.10.2" 1946 | } 1947 | }, 1948 | "postcss-nested": { 1949 | "version": "6.0.0", 1950 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", 1951 | "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", 1952 | "dev": true, 1953 | "requires": { 1954 | "postcss-selector-parser": "^6.0.10" 1955 | } 1956 | }, 1957 | "postcss-selector-parser": { 1958 | "version": "6.0.10", 1959 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 1960 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 1961 | "dev": true, 1962 | "requires": { 1963 | "cssesc": "^3.0.0", 1964 | "util-deprecate": "^1.0.2" 1965 | } 1966 | }, 1967 | "postcss-value-parser": { 1968 | "version": "4.2.0", 1969 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1970 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1971 | "dev": true 1972 | }, 1973 | "queue-microtask": { 1974 | "version": "1.2.3", 1975 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1976 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1977 | "dev": true 1978 | }, 1979 | "quick-lru": { 1980 | "version": "5.1.1", 1981 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1982 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 1983 | "dev": true 1984 | }, 1985 | "react": { 1986 | "version": "18.2.0", 1987 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 1988 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 1989 | "requires": { 1990 | "loose-envify": "^1.1.0" 1991 | } 1992 | }, 1993 | "react-dom": { 1994 | "version": "18.2.0", 1995 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 1996 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 1997 | "requires": { 1998 | "loose-envify": "^1.1.0", 1999 | "scheduler": "^0.23.0" 2000 | } 2001 | }, 2002 | "read-cache": { 2003 | "version": "1.0.0", 2004 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 2005 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 2006 | "dev": true, 2007 | "requires": { 2008 | "pify": "^2.3.0" 2009 | } 2010 | }, 2011 | "readdirp": { 2012 | "version": "3.6.0", 2013 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2014 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2015 | "dev": true, 2016 | "requires": { 2017 | "picomatch": "^2.2.1" 2018 | } 2019 | }, 2020 | "resolve": { 2021 | "version": "1.22.1", 2022 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 2023 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 2024 | "dev": true, 2025 | "requires": { 2026 | "is-core-module": "^2.9.0", 2027 | "path-parse": "^1.0.7", 2028 | "supports-preserve-symlinks-flag": "^1.0.0" 2029 | } 2030 | }, 2031 | "reusify": { 2032 | "version": "1.0.4", 2033 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2034 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2035 | "dev": true 2036 | }, 2037 | "run-parallel": { 2038 | "version": "1.2.0", 2039 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2040 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2041 | "dev": true, 2042 | "requires": { 2043 | "queue-microtask": "^1.2.2" 2044 | } 2045 | }, 2046 | "scheduler": { 2047 | "version": "0.23.0", 2048 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 2049 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 2050 | "requires": { 2051 | "loose-envify": "^1.1.0" 2052 | } 2053 | }, 2054 | "source-map-js": { 2055 | "version": "1.0.2", 2056 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2057 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 2058 | }, 2059 | "styled-jsx": { 2060 | "version": "5.1.0", 2061 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz", 2062 | "integrity": "sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==", 2063 | "requires": { 2064 | "client-only": "0.0.1" 2065 | } 2066 | }, 2067 | "supports-preserve-symlinks-flag": { 2068 | "version": "1.0.0", 2069 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2070 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2071 | "dev": true 2072 | }, 2073 | "tailwindcss": { 2074 | "version": "3.2.4", 2075 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", 2076 | "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", 2077 | "dev": true, 2078 | "requires": { 2079 | "arg": "^5.0.2", 2080 | "chokidar": "^3.5.3", 2081 | "color-name": "^1.1.4", 2082 | "detective": "^5.2.1", 2083 | "didyoumean": "^1.2.2", 2084 | "dlv": "^1.1.3", 2085 | "fast-glob": "^3.2.12", 2086 | "glob-parent": "^6.0.2", 2087 | "is-glob": "^4.0.3", 2088 | "lilconfig": "^2.0.6", 2089 | "micromatch": "^4.0.5", 2090 | "normalize-path": "^3.0.0", 2091 | "object-hash": "^3.0.0", 2092 | "picocolors": "^1.0.0", 2093 | "postcss": "^8.4.18", 2094 | "postcss-import": "^14.1.0", 2095 | "postcss-js": "^4.0.0", 2096 | "postcss-load-config": "^3.1.4", 2097 | "postcss-nested": "6.0.0", 2098 | "postcss-selector-parser": "^6.0.10", 2099 | "postcss-value-parser": "^4.2.0", 2100 | "quick-lru": "^5.1.1", 2101 | "resolve": "^1.22.1" 2102 | } 2103 | }, 2104 | "to-regex-range": { 2105 | "version": "5.0.1", 2106 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2107 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2108 | "dev": true, 2109 | "requires": { 2110 | "is-number": "^7.0.0" 2111 | } 2112 | }, 2113 | "tslib": { 2114 | "version": "2.4.1", 2115 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", 2116 | "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" 2117 | }, 2118 | "update-browserslist-db": { 2119 | "version": "1.0.10", 2120 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 2121 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 2122 | "dev": true, 2123 | "requires": { 2124 | "escalade": "^3.1.1", 2125 | "picocolors": "^1.0.0" 2126 | } 2127 | }, 2128 | "use-sync-external-store": { 2129 | "version": "1.2.0", 2130 | "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", 2131 | "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", 2132 | "requires": {} 2133 | }, 2134 | "util-deprecate": { 2135 | "version": "1.0.2", 2136 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2137 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2138 | "dev": true 2139 | }, 2140 | "xtend": { 2141 | "version": "4.0.2", 2142 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2143 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2144 | "dev": true 2145 | }, 2146 | "yaml": { 2147 | "version": "1.10.2", 2148 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 2149 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 2150 | "dev": true 2151 | } 2152 | } 2153 | } 2154 | -------------------------------------------------------------------------------- /ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build && next export -o ../static", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@headlessui/react": "^1.7.4", 13 | "next": "13.0.4", 14 | "react": "18.2.0", 15 | "react-dom": "18.2.0" 16 | }, 17 | "devDependencies": { 18 | "autoprefixer": "^10.4.13", 19 | "postcss": "^8.4.19", 20 | "tailwindcss": "^3.2.4" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ui/pages/_app.js: -------------------------------------------------------------------------------- 1 | import '../styles/globals.css' 2 | 3 | function MyApp({ Component, pageProps }) { 4 | return 5 | } 6 | 7 | export default MyApp 8 | -------------------------------------------------------------------------------- /ui/pages/index.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head' 2 | import React, { useEffect, useState } from 'react' 3 | import Avatar from '../components/avatar' 4 | import ChatList from '../components/rooms' 5 | import Conversation from '../components/conversation' 6 | import Login from '../components/login' 7 | import useConversations from '../libs/useConversation' 8 | import useLocalStorage from '../libs/useLocalStorage' 9 | import useWebsocket from '../libs/useWebsocket' 10 | 11 | export default function Home() { 12 | const [room, setSelectedRoom] = useState(null); 13 | const [isTyping, setIsTyping] = useState(false); 14 | const [showLogIn, setShowLogIn] = useState(false); 15 | const [auth, setAuthUser] = useLocalStorage("user", false); 16 | const [isLoading, messages, setMessages, fetchConversations] = useConversations(""); 17 | 18 | const handleTyping = (mode) => { 19 | if (mode === "IN") { 20 | setIsTyping(true) 21 | } else { 22 | setIsTyping(false) 23 | } 24 | } 25 | 26 | const handleMessage = (msg, userId) => { 27 | setMessages(prev => { 28 | const item = { content: msg, user_id: userId }; 29 | return [...prev, item]; 30 | }) 31 | } 32 | 33 | const onMessage = (data) => { 34 | try { 35 | let messageData = JSON.parse(data); 36 | switch (messageData.chat_type) { 37 | case "TYPING": { 38 | handleTyping(messageData.value[0]); 39 | return; 40 | } 41 | case "TEXT": { 42 | handleMessage(messageData.value[0], messageData.user_id); 43 | return; 44 | } 45 | } 46 | } catch (e) { 47 | console.log(e); 48 | } 49 | } 50 | 51 | const sendMessage = useWebsocket(onMessage) 52 | const updateFocus = () => { 53 | const data = { 54 | id: 0, 55 | chat_type: "TYPING", 56 | value: ["IN"], 57 | room_id: room.id, 58 | user_id: auth.id 59 | } 60 | sendMessage(JSON.stringify(data)) 61 | } 62 | 63 | const onFocusChange = () => { 64 | const data = { 65 | id: 0, 66 | chat_type: "TYPING", 67 | value: ["OUT"], 68 | room_id: room.id, 69 | user_id: auth.id 70 | } 71 | sendMessage(JSON.stringify(data)) 72 | } 73 | 74 | const submitMessage = (e) => { 75 | e.preventDefault(); 76 | let message = e.target.message.value; 77 | if (message === "") { 78 | return; 79 | } 80 | 81 | if (!room.id) { 82 | alert("Please select chat room!") 83 | return 84 | } 85 | 86 | const data = { 87 | id: 0, 88 | chat_type: "TEXT", 89 | value: [message], 90 | room_id: room.id, 91 | user_id: auth.id 92 | } 93 | sendMessage(JSON.stringify(data)) 94 | e.target.message.value = ""; 95 | handleMessage(message, auth.id); 96 | onFocusChange(); 97 | } 98 | 99 | const updateMessages = (data) => { 100 | if (!data.id) return; 101 | fetchConversations(data.id) 102 | setSelectedRoom(data) 103 | } 104 | 105 | const signOut = () => { 106 | window.localStorage.removeItem("user"); 107 | setAuthUser(false); 108 | } 109 | 110 | useEffect(() => setShowLogIn(!auth), [auth]) 111 | 112 | return ( 113 |
114 | 115 | Rust with react chat app 116 | 117 | 118 | 119 | 120 |
121 |
122 | 126 | {room?.id && (
127 |
128 |
129 | {room.users.get_target_user(auth.id)} 130 |
131 |

{room.users.get_target_user(auth.id)}

132 |
{isTyping ? "Typing..." : "10:15 AM"}
133 |
134 |
135 |
136 |
137 | {(isLoading && room.id) &&

Loading conversation...

} 138 | 139 |
140 |
141 | 147 | 148 |
149 |
150 |
)} 151 |
152 |
153 |
154 | ) 155 | } 156 | -------------------------------------------------------------------------------- /ui/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /ui/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmadrosid/rust-react-chat/f156e843b5070c67bd57977b5c50c5dd22ebc5a4/ui/public/favicon.ico -------------------------------------------------------------------------------- /ui/styles/globals.css: -------------------------------------------------------------------------------- 1 | 2 | @tailwind base; 3 | @tailwind components; 4 | @tailwind utilities; 5 | -------------------------------------------------------------------------------- /ui/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./pages/**/*.{js,ts,jsx,tsx}", 5 | "./components/**/*.{js,ts,jsx,tsx}", 6 | ], 7 | theme: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | } 12 | -------------------------------------------------------------------------------- /ui/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@headlessui/react@^1.7.4": 6 | "integrity" "sha512-D8n5yGCF3WIkPsjEYeM8knn9jQ70bigGGb5aUvN6y4BGxcT3OcOQOKcM3zRGllRCZCFxCZyQvYJF6ZE7bQUOyQ==" 7 | "resolved" "https://registry.npmjs.org/@headlessui/react/-/react-1.7.4.tgz" 8 | "version" "1.7.4" 9 | dependencies: 10 | "client-only" "^0.0.1" 11 | 12 | "@next/env@13.0.4": 13 | "integrity" "sha512-N5Z3bdxBzoxrC5bwykDFITzdWuwDteOdZ+7nxixY+I1XpRX8/iQYbw2wuXMdqdfBGm2NNUpAqg8YF2e4oAC2UQ==" 14 | "resolved" "https://registry.npmjs.org/@next/env/-/env-13.0.4.tgz" 15 | "version" "13.0.4" 16 | 17 | "@next/swc-darwin-arm64@13.0.4": 18 | "integrity" "sha512-/lajev+9GSie+rRTl5z8skW9RJwZ+TwMKLzzM24TbDk8lUjqPTyJZ/cU0NDj8J7VQAZ6EehACSh9rcJeBRtLuA==" 19 | "resolved" "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.4.tgz" 20 | "version" "13.0.4" 21 | 22 | "@nodelib/fs.scandir@2.1.5": 23 | "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" 24 | "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" 25 | "version" "2.1.5" 26 | dependencies: 27 | "@nodelib/fs.stat" "2.0.5" 28 | "run-parallel" "^1.1.9" 29 | 30 | "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": 31 | "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 32 | "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" 33 | "version" "2.0.5" 34 | 35 | "@nodelib/fs.walk@^1.2.3": 36 | "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" 37 | "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" 38 | "version" "1.2.8" 39 | dependencies: 40 | "@nodelib/fs.scandir" "2.1.5" 41 | "fastq" "^1.6.0" 42 | 43 | "@swc/helpers@0.4.11": 44 | "integrity" "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==" 45 | "resolved" "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz" 46 | "version" "0.4.11" 47 | dependencies: 48 | "tslib" "^2.4.0" 49 | 50 | "acorn-node@^1.8.2": 51 | "integrity" "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==" 52 | "resolved" "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" 53 | "version" "1.8.2" 54 | dependencies: 55 | "acorn" "^7.0.0" 56 | "acorn-walk" "^7.0.0" 57 | "xtend" "^4.0.2" 58 | 59 | "acorn-walk@^7.0.0": 60 | "integrity" "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" 61 | "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" 62 | "version" "7.2.0" 63 | 64 | "acorn@^7.0.0": 65 | "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" 66 | "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" 67 | "version" "7.4.1" 68 | 69 | "anymatch@~3.1.2": 70 | "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==" 71 | "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" 72 | "version" "3.1.2" 73 | dependencies: 74 | "normalize-path" "^3.0.0" 75 | "picomatch" "^2.0.4" 76 | 77 | "arg@^5.0.2": 78 | "integrity" "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" 79 | "resolved" "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" 80 | "version" "5.0.2" 81 | 82 | "autoprefixer@^10.4.13": 83 | "integrity" "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==" 84 | "resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" 85 | "version" "10.4.13" 86 | dependencies: 87 | "browserslist" "^4.21.4" 88 | "caniuse-lite" "^1.0.30001426" 89 | "fraction.js" "^4.2.0" 90 | "normalize-range" "^0.1.2" 91 | "picocolors" "^1.0.0" 92 | "postcss-value-parser" "^4.2.0" 93 | 94 | "binary-extensions@^2.0.0": 95 | "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 96 | "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" 97 | "version" "2.2.0" 98 | 99 | "braces@^3.0.2", "braces@~3.0.2": 100 | "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" 101 | "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 102 | "version" "3.0.2" 103 | dependencies: 104 | "fill-range" "^7.0.1" 105 | 106 | "browserslist@^4.21.4", "browserslist@>= 4.21.0": 107 | "integrity" "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==" 108 | "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" 109 | "version" "4.21.4" 110 | dependencies: 111 | "caniuse-lite" "^1.0.30001400" 112 | "electron-to-chromium" "^1.4.251" 113 | "node-releases" "^2.0.6" 114 | "update-browserslist-db" "^1.0.9" 115 | 116 | "camelcase-css@^2.0.1": 117 | "integrity" "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" 118 | "resolved" "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" 119 | "version" "2.0.1" 120 | 121 | "caniuse-lite@^1.0.30001400", "caniuse-lite@^1.0.30001406", "caniuse-lite@^1.0.30001426": 122 | "integrity" "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==" 123 | "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz" 124 | "version" "1.0.30001431" 125 | 126 | "chokidar@^3.5.3": 127 | "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" 128 | "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" 129 | "version" "3.5.3" 130 | dependencies: 131 | "anymatch" "~3.1.2" 132 | "braces" "~3.0.2" 133 | "glob-parent" "~5.1.2" 134 | "is-binary-path" "~2.1.0" 135 | "is-glob" "~4.0.1" 136 | "normalize-path" "~3.0.0" 137 | "readdirp" "~3.6.0" 138 | optionalDependencies: 139 | "fsevents" "~2.3.2" 140 | 141 | "client-only@^0.0.1", "client-only@0.0.1": 142 | "integrity" "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" 143 | "resolved" "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" 144 | "version" "0.0.1" 145 | 146 | "color-name@^1.1.4": 147 | "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 148 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 149 | "version" "1.1.4" 150 | 151 | "cssesc@^3.0.0": 152 | "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" 153 | "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" 154 | "version" "3.0.0" 155 | 156 | "defined@^1.0.0": 157 | "integrity" "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" 158 | "resolved" "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz" 159 | "version" "1.0.1" 160 | 161 | "detective@^5.2.1": 162 | "integrity" "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==" 163 | "resolved" "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz" 164 | "version" "5.2.1" 165 | dependencies: 166 | "acorn-node" "^1.8.2" 167 | "defined" "^1.0.0" 168 | "minimist" "^1.2.6" 169 | 170 | "didyoumean@^1.2.2": 171 | "integrity" "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" 172 | "resolved" "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" 173 | "version" "1.2.2" 174 | 175 | "dlv@^1.1.3": 176 | "integrity" "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" 177 | "resolved" "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" 178 | "version" "1.1.3" 179 | 180 | "electron-to-chromium@^1.4.251": 181 | "integrity" "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" 182 | "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" 183 | "version" "1.4.284" 184 | 185 | "escalade@^3.1.1": 186 | "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 187 | "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 188 | "version" "3.1.1" 189 | 190 | "fast-glob@^3.2.12": 191 | "integrity" "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==" 192 | "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" 193 | "version" "3.2.12" 194 | dependencies: 195 | "@nodelib/fs.stat" "^2.0.2" 196 | "@nodelib/fs.walk" "^1.2.3" 197 | "glob-parent" "^5.1.2" 198 | "merge2" "^1.3.0" 199 | "micromatch" "^4.0.4" 200 | 201 | "fastq@^1.6.0": 202 | "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==" 203 | "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" 204 | "version" "1.13.0" 205 | dependencies: 206 | "reusify" "^1.0.4" 207 | 208 | "fill-range@^7.0.1": 209 | "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" 210 | "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" 211 | "version" "7.0.1" 212 | dependencies: 213 | "to-regex-range" "^5.0.1" 214 | 215 | "fraction.js@^4.2.0": 216 | "integrity" "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" 217 | "resolved" "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" 218 | "version" "4.2.0" 219 | 220 | "fsevents@~2.3.2": 221 | "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" 222 | "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" 223 | "version" "2.3.2" 224 | 225 | "function-bind@^1.1.1": 226 | "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 227 | "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 228 | "version" "1.1.1" 229 | 230 | "glob-parent@^5.1.2": 231 | "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" 232 | "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 233 | "version" "5.1.2" 234 | dependencies: 235 | "is-glob" "^4.0.1" 236 | 237 | "glob-parent@^6.0.2": 238 | "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" 239 | "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" 240 | "version" "6.0.2" 241 | dependencies: 242 | "is-glob" "^4.0.3" 243 | 244 | "glob-parent@~5.1.2": 245 | "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" 246 | "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 247 | "version" "5.1.2" 248 | dependencies: 249 | "is-glob" "^4.0.1" 250 | 251 | "has@^1.0.3": 252 | "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" 253 | "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 254 | "version" "1.0.3" 255 | dependencies: 256 | "function-bind" "^1.1.1" 257 | 258 | "is-binary-path@~2.1.0": 259 | "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" 260 | "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 261 | "version" "2.1.0" 262 | dependencies: 263 | "binary-extensions" "^2.0.0" 264 | 265 | "is-core-module@^2.9.0": 266 | "integrity" "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==" 267 | "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" 268 | "version" "2.11.0" 269 | dependencies: 270 | "has" "^1.0.3" 271 | 272 | "is-extglob@^2.1.1": 273 | "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 274 | "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 275 | "version" "2.1.1" 276 | 277 | "is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": 278 | "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" 279 | "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 280 | "version" "4.0.3" 281 | dependencies: 282 | "is-extglob" "^2.1.1" 283 | 284 | "is-number@^7.0.0": 285 | "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 286 | "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 287 | "version" "7.0.0" 288 | 289 | "js-tokens@^3.0.0 || ^4.0.0": 290 | "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 291 | "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 292 | "version" "4.0.0" 293 | 294 | "lilconfig@^2.0.5", "lilconfig@^2.0.6": 295 | "integrity" "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" 296 | "resolved" "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz" 297 | "version" "2.0.6" 298 | 299 | "loose-envify@^1.1.0": 300 | "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==" 301 | "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" 302 | "version" "1.4.0" 303 | dependencies: 304 | "js-tokens" "^3.0.0 || ^4.0.0" 305 | 306 | "merge2@^1.3.0": 307 | "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 308 | "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 309 | "version" "1.4.1" 310 | 311 | "micromatch@^4.0.4", "micromatch@^4.0.5": 312 | "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" 313 | "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" 314 | "version" "4.0.5" 315 | dependencies: 316 | "braces" "^3.0.2" 317 | "picomatch" "^2.3.1" 318 | 319 | "minimist@^1.2.6": 320 | "integrity" "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" 321 | "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" 322 | "version" "1.2.7" 323 | 324 | "nanoid@^3.3.4": 325 | "integrity" "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" 326 | "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" 327 | "version" "3.3.4" 328 | 329 | "next@13.0.4": 330 | "integrity" "sha512-4P0MvbjPCI1E/UPL1GrTXtYlgFnbBbY3JQ+AMY8jYE2SwyvCWctEJySoRjveznAHjrl6TIjuAJeB8u1c2StYUQ==" 331 | "resolved" "https://registry.npmjs.org/next/-/next-13.0.4.tgz" 332 | "version" "13.0.4" 333 | dependencies: 334 | "@next/env" "13.0.4" 335 | "@swc/helpers" "0.4.11" 336 | "caniuse-lite" "^1.0.30001406" 337 | "postcss" "8.4.14" 338 | "styled-jsx" "5.1.0" 339 | "use-sync-external-store" "1.2.0" 340 | optionalDependencies: 341 | "@next/swc-android-arm-eabi" "13.0.4" 342 | "@next/swc-android-arm64" "13.0.4" 343 | "@next/swc-darwin-arm64" "13.0.4" 344 | "@next/swc-darwin-x64" "13.0.4" 345 | "@next/swc-freebsd-x64" "13.0.4" 346 | "@next/swc-linux-arm-gnueabihf" "13.0.4" 347 | "@next/swc-linux-arm64-gnu" "13.0.4" 348 | "@next/swc-linux-arm64-musl" "13.0.4" 349 | "@next/swc-linux-x64-gnu" "13.0.4" 350 | "@next/swc-linux-x64-musl" "13.0.4" 351 | "@next/swc-win32-arm64-msvc" "13.0.4" 352 | "@next/swc-win32-ia32-msvc" "13.0.4" 353 | "@next/swc-win32-x64-msvc" "13.0.4" 354 | 355 | "node-releases@^2.0.6": 356 | "integrity" "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" 357 | "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" 358 | "version" "2.0.6" 359 | 360 | "normalize-path@^3.0.0", "normalize-path@~3.0.0": 361 | "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 362 | "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 363 | "version" "3.0.0" 364 | 365 | "normalize-range@^0.1.2": 366 | "integrity" "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" 367 | "resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" 368 | "version" "0.1.2" 369 | 370 | "object-hash@^3.0.0": 371 | "integrity" "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" 372 | "resolved" "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" 373 | "version" "3.0.0" 374 | 375 | "path-parse@^1.0.7": 376 | "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 377 | "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 378 | "version" "1.0.7" 379 | 380 | "picocolors@^1.0.0": 381 | "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 382 | "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" 383 | "version" "1.0.0" 384 | 385 | "picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": 386 | "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 387 | "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 388 | "version" "2.3.1" 389 | 390 | "pify@^2.3.0": 391 | "integrity" "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" 392 | "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" 393 | "version" "2.3.0" 394 | 395 | "postcss-import@^14.1.0": 396 | "integrity" "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==" 397 | "resolved" "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" 398 | "version" "14.1.0" 399 | dependencies: 400 | "postcss-value-parser" "^4.0.0" 401 | "read-cache" "^1.0.0" 402 | "resolve" "^1.1.7" 403 | 404 | "postcss-js@^4.0.0": 405 | "integrity" "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==" 406 | "resolved" "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz" 407 | "version" "4.0.0" 408 | dependencies: 409 | "camelcase-css" "^2.0.1" 410 | 411 | "postcss-load-config@^3.1.4": 412 | "integrity" "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==" 413 | "resolved" "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" 414 | "version" "3.1.4" 415 | dependencies: 416 | "lilconfig" "^2.0.5" 417 | "yaml" "^1.10.2" 418 | 419 | "postcss-nested@6.0.0": 420 | "integrity" "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==" 421 | "resolved" "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" 422 | "version" "6.0.0" 423 | dependencies: 424 | "postcss-selector-parser" "^6.0.10" 425 | 426 | "postcss-selector-parser@^6.0.10": 427 | "integrity" "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==" 428 | "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" 429 | "version" "6.0.10" 430 | dependencies: 431 | "cssesc" "^3.0.0" 432 | "util-deprecate" "^1.0.2" 433 | 434 | "postcss-value-parser@^4.0.0", "postcss-value-parser@^4.2.0": 435 | "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" 436 | "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" 437 | "version" "4.2.0" 438 | 439 | "postcss@^8.0.0", "postcss@^8.1.0", "postcss@^8.2.14", "postcss@^8.3.3", "postcss@^8.4.18", "postcss@^8.4.19", "postcss@>=8.0.9": 440 | "integrity" "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==" 441 | "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz" 442 | "version" "8.4.19" 443 | dependencies: 444 | "nanoid" "^3.3.4" 445 | "picocolors" "^1.0.0" 446 | "source-map-js" "^1.0.2" 447 | 448 | "postcss@8.4.14": 449 | "integrity" "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==" 450 | "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" 451 | "version" "8.4.14" 452 | dependencies: 453 | "nanoid" "^3.3.4" 454 | "picocolors" "^1.0.0" 455 | "source-map-js" "^1.0.2" 456 | 457 | "queue-microtask@^1.2.2": 458 | "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 459 | "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" 460 | "version" "1.2.3" 461 | 462 | "quick-lru@^5.1.1": 463 | "integrity" "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" 464 | "resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" 465 | "version" "5.1.1" 466 | 467 | "react-dom@^16 || ^17 || ^18", "react-dom@^18.2.0", "react-dom@18.2.0": 468 | "integrity" "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==" 469 | "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" 470 | "version" "18.2.0" 471 | dependencies: 472 | "loose-envify" "^1.1.0" 473 | "scheduler" "^0.23.0" 474 | 475 | "react@^16 || ^17 || ^18", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^18.2.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", "react@18.2.0": 476 | "integrity" "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==" 477 | "resolved" "https://registry.npmjs.org/react/-/react-18.2.0.tgz" 478 | "version" "18.2.0" 479 | dependencies: 480 | "loose-envify" "^1.1.0" 481 | 482 | "read-cache@^1.0.0": 483 | "integrity" "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==" 484 | "resolved" "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" 485 | "version" "1.0.0" 486 | dependencies: 487 | "pify" "^2.3.0" 488 | 489 | "readdirp@~3.6.0": 490 | "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" 491 | "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" 492 | "version" "3.6.0" 493 | dependencies: 494 | "picomatch" "^2.2.1" 495 | 496 | "resolve@^1.1.7", "resolve@^1.22.1": 497 | "integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==" 498 | "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" 499 | "version" "1.22.1" 500 | dependencies: 501 | "is-core-module" "^2.9.0" 502 | "path-parse" "^1.0.7" 503 | "supports-preserve-symlinks-flag" "^1.0.0" 504 | 505 | "reusify@^1.0.4": 506 | "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 507 | "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 508 | "version" "1.0.4" 509 | 510 | "run-parallel@^1.1.9": 511 | "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" 512 | "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 513 | "version" "1.2.0" 514 | dependencies: 515 | "queue-microtask" "^1.2.2" 516 | 517 | "scheduler@^0.23.0": 518 | "integrity" "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==" 519 | "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" 520 | "version" "0.23.0" 521 | dependencies: 522 | "loose-envify" "^1.1.0" 523 | 524 | "source-map-js@^1.0.2": 525 | "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 526 | "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" 527 | "version" "1.0.2" 528 | 529 | "styled-jsx@5.1.0": 530 | "integrity" "sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==" 531 | "resolved" "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz" 532 | "version" "5.1.0" 533 | dependencies: 534 | "client-only" "0.0.1" 535 | 536 | "supports-preserve-symlinks-flag@^1.0.0": 537 | "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" 538 | "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" 539 | "version" "1.0.0" 540 | 541 | "tailwindcss@^3.2.4": 542 | "integrity" "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==" 543 | "resolved" "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz" 544 | "version" "3.2.4" 545 | dependencies: 546 | "arg" "^5.0.2" 547 | "chokidar" "^3.5.3" 548 | "color-name" "^1.1.4" 549 | "detective" "^5.2.1" 550 | "didyoumean" "^1.2.2" 551 | "dlv" "^1.1.3" 552 | "fast-glob" "^3.2.12" 553 | "glob-parent" "^6.0.2" 554 | "is-glob" "^4.0.3" 555 | "lilconfig" "^2.0.6" 556 | "micromatch" "^4.0.5" 557 | "normalize-path" "^3.0.0" 558 | "object-hash" "^3.0.0" 559 | "picocolors" "^1.0.0" 560 | "postcss" "^8.4.18" 561 | "postcss-import" "^14.1.0" 562 | "postcss-js" "^4.0.0" 563 | "postcss-load-config" "^3.1.4" 564 | "postcss-nested" "6.0.0" 565 | "postcss-selector-parser" "^6.0.10" 566 | "postcss-value-parser" "^4.2.0" 567 | "quick-lru" "^5.1.1" 568 | "resolve" "^1.22.1" 569 | 570 | "to-regex-range@^5.0.1": 571 | "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" 572 | "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 573 | "version" "5.0.1" 574 | dependencies: 575 | "is-number" "^7.0.0" 576 | 577 | "tslib@^2.4.0": 578 | "integrity" "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" 579 | "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" 580 | "version" "2.4.1" 581 | 582 | "update-browserslist-db@^1.0.9": 583 | "integrity" "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==" 584 | "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" 585 | "version" "1.0.10" 586 | dependencies: 587 | "escalade" "^3.1.1" 588 | "picocolors" "^1.0.0" 589 | 590 | "use-sync-external-store@1.2.0": 591 | "integrity" "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" 592 | "resolved" "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" 593 | "version" "1.2.0" 594 | 595 | "util-deprecate@^1.0.2": 596 | "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 597 | "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 598 | "version" "1.0.2" 599 | 600 | "xtend@^4.0.2": 601 | "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 602 | "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" 603 | "version" "4.0.2" 604 | 605 | "yaml@^1.10.2": 606 | "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" 607 | "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" 608 | "version" "1.10.2" 609 | --------------------------------------------------------------------------------