From f6bb894841cdbc21973924c48da36bfefaa5d125 Mon Sep 17 00:00:00 2001 From: naka-12 <104970808+naka-12@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:59:39 +0900 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20SSG=20=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/components}/MessageInput.tsx | 2 +- .../chat => app/chat/components}/Room.tsx | 2 +- .../chat/components}/RoomHeader.tsx | 2 +- web/app/chat/components/RoomList.tsx | 134 ++++++++++++++++++ .../page.tsx => components/RoomPage.tsx} | 5 +- .../chat/components}/RoomWindow.tsx | 4 +- web/app/chat/page.tsx | 9 +- web/components/chat/RoomList.tsx | 111 --------------- web/next.config.mjs | 4 +- 9 files changed, 146 insertions(+), 127 deletions(-) rename web/{components/chat => app/chat/components}/MessageInput.tsx (98%) rename web/{components/chat => app/chat/components}/Room.tsx (92%) rename web/{components/chat => app/chat/components}/RoomHeader.tsx (94%) create mode 100644 web/app/chat/components/RoomList.tsx rename web/app/chat/{[id]/page.tsx => components/RoomPage.tsx} (81%) rename web/{components/chat => app/chat/components}/RoomWindow.tsx (98%) delete mode 100644 web/components/chat/RoomList.tsx diff --git a/web/components/chat/MessageInput.tsx b/web/app/chat/components/MessageInput.tsx similarity index 98% rename from web/components/chat/MessageInput.tsx rename to web/app/chat/components/MessageInput.tsx index c6656418..693f28dd 100644 --- a/web/components/chat/MessageInput.tsx +++ b/web/app/chat/components/MessageInput.tsx @@ -1,5 +1,5 @@ import ImageIcon from "@mui/icons-material/Image"; -import { sendImageTo } from "../../api/image"; +import { sendImageTo } from "~/api/image"; import type { DMOverview, SendMessage, UserID } from "common/types"; import { parseContent } from "common/zod/methods"; diff --git a/web/components/chat/Room.tsx b/web/app/chat/components/Room.tsx similarity index 92% rename from web/components/chat/Room.tsx rename to web/app/chat/components/Room.tsx index 71e5d075..96bc44bd 100644 --- a/web/components/chat/Room.tsx +++ b/web/app/chat/components/Room.tsx @@ -1,5 +1,5 @@ import type { DMOverview } from "common/types"; -import UserAvatar from "../human/avatar"; +import UserAvatar from "~/components/human/avatar"; type Props = { room: DMOverview; diff --git a/web/components/chat/RoomHeader.tsx b/web/app/chat/components/RoomHeader.tsx similarity index 94% rename from web/components/chat/RoomHeader.tsx rename to web/app/chat/components/RoomHeader.tsx index bff1fdc2..b580eb17 100644 --- a/web/components/chat/RoomHeader.tsx +++ b/web/app/chat/components/RoomHeader.tsx @@ -1,6 +1,6 @@ import Link from "next/link"; import { MdArrowBack } from "react-icons/md"; -import UserAvatar from "../human/avatar"; +import UserAvatar from "~/components/human/avatar"; type Props = { room: { diff --git a/web/app/chat/components/RoomList.tsx b/web/app/chat/components/RoomList.tsx new file mode 100644 index 00000000..bd562eda --- /dev/null +++ b/web/app/chat/components/RoomList.tsx @@ -0,0 +1,134 @@ +"use client"; + +import { Box, List, Typography } from "@mui/material"; +import type { RoomOverview } from "common/types"; +import { useState } from "react"; +// import { useRouter } from "next/navigation"; +import { HumanListItem } from "~/components/human/humanListItem"; +import RoomPage from "./RoomPage"; + +type RoomListProps = { + roomsData: RoomOverview[] | null; +}; + +export function RoomList(props: RoomListProps) { + const { roomsData } = props; + // const router = useRouter(); + + const [friendId, setFriendId] = useState(null); + + const openRoom = (room: Extract) => { + // TODO: room いらん + setFriendId(room.friendId); + // router.push(`/chat/${room.friendId}`); + }; + + return ( + <> + {!friendId ? ( + +

+ {roomsData && roomsData.length === 0 && ( + <> + 誰ともマッチングしていません。 +
+ リクエストを送りましょう! + + )} +

+ {roomsData?.map((room) => { + if (room.isDM) { + if (room.matchingStatus === "otherRequest") { + return ( + { + e.stopPropagation(); + openRoom(room); + }} + > + + + ); + } + if (room.matchingStatus === "myRequest") { + return ( + { + e.stopPropagation(); + openRoom(room); + }} + > + + + ); + } + // if (room.matchingStatus === "matched") + return ( + { + openRoom(room); + }} + > + + + ); + } + return ( + + グループチャット: {room.name} + + ); + })} +
+ ) : ( +
+ + +
+ )} + + ); +} + +export default RoomList; diff --git a/web/app/chat/[id]/page.tsx b/web/app/chat/components/RoomPage.tsx similarity index 81% rename from web/app/chat/[id]/page.tsx rename to web/app/chat/components/RoomPage.tsx index 86858436..f44adaf3 100644 --- a/web/app/chat/[id]/page.tsx +++ b/web/app/chat/components/RoomPage.tsx @@ -3,10 +3,9 @@ import type { DMRoom, PersonalizedDMRoom } from "common/types"; import Link from "next/link"; import { useEffect, useState } from "react"; import * as chat from "~/api/chat/chat"; -import { RoomWindow } from "~/components/chat/RoomWindow"; +import { RoomWindow } from "./RoomWindow"; -export default function Page({ params }: { params: { id: string } }) { - const id = Number.parseInt(params.id); +export default function RoomPage({ id }: { id: number }) { const [room, setRoom] = useState<(DMRoom & PersonalizedDMRoom) | null>(null); useEffect(() => { (async () => { diff --git a/web/components/chat/RoomWindow.tsx b/web/app/chat/components/RoomWindow.tsx similarity index 98% rename from web/components/chat/RoomWindow.tsx rename to web/app/chat/components/RoomWindow.tsx index ecbfa406..ee8639cd 100644 --- a/web/components/chat/RoomWindow.tsx +++ b/web/app/chat/components/RoomWindow.tsx @@ -8,8 +8,8 @@ import { useMessages } from "~/api/chat/hooks"; import { API_ENDPOINT } from "~/api/internal/endpoints"; import request from "~/api/request"; import { useMyID } from "~/api/user"; -import Dots from "../common/Dots"; -import { handlers } from "../data/socket"; +import Dots from "~/components/common/Dots"; +import { handlers } from "~/components/data/socket"; import { MessageInput } from "./MessageInput"; import { RoomHeader } from "./RoomHeader"; diff --git a/web/app/chat/page.tsx b/web/app/chat/page.tsx index 6a9e3cb2..c9c087b5 100644 --- a/web/app/chat/page.tsx +++ b/web/app/chat/page.tsx @@ -1,16 +1,11 @@ "use client"; -import { Suspense } from "react"; import { useRoomsOverview } from "~/api/chat/hooks"; -import RoomList from "~/components/chat/RoomList"; import FullScreenCircularProgress from "~/components/common/FullScreenCircularProgress"; +import RoomList from "./components/RoomList"; export default function Chat() { - return ( - }> - - - ); + return ; } function ChatListContent() { diff --git a/web/components/chat/RoomList.tsx b/web/components/chat/RoomList.tsx deleted file mode 100644 index 42c9e7cf..00000000 --- a/web/components/chat/RoomList.tsx +++ /dev/null @@ -1,111 +0,0 @@ -"use client"; - -import { Box, List, Typography } from "@mui/material"; -import type { RoomOverview } from "common/types"; -import { useRouter } from "next/navigation"; -import { HumanListItem } from "../human/humanListItem"; - -type RoomListProps = { - roomsData: RoomOverview[] | null; -}; - -export function RoomList(props: RoomListProps) { - const { roomsData } = props; - const router = useRouter(); - const navigateToRoom = (room: Extract) => { - router.push(`/chat/${room.friendId}`); - }; - - return ( - -

- {roomsData && roomsData.length === 0 && ( - <> - 誰ともマッチングしていません。 -
- リクエストを送りましょう! - - )} -

- {roomsData?.map((room) => { - if (room.isDM) { - if (room.matchingStatus === "otherRequest") { - return ( - { - e.stopPropagation(); - navigateToRoom(room); - }} - > - - - ); - } - if (room.matchingStatus === "myRequest") { - return ( - { - e.stopPropagation(); - navigateToRoom(room); - }} - > - - - ); - } - // if (room.matchingStatus === "matched") - return ( - { - navigateToRoom(room); - }} - > - - - ); - } - return ( - - グループチャット: {room.name} - - ); - })} -
- ); -} - -export default RoomList; diff --git a/web/next.config.mjs b/web/next.config.mjs index 4678774e..4350313c 100644 --- a/web/next.config.mjs +++ b/web/next.config.mjs @@ -1,4 +1,6 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +const nextConfig = { + output: "export", +}; export default nextConfig; From 0147f81684f0847db873844b872c2d01a486f6bd Mon Sep 17 00:00:00 2001 From: naka-12 <104970808+naka-12@users.noreply.github.com> Date: Fri, 14 Feb 2025 20:47:03 +0900 Subject: [PATCH 2/9] fix --- server/package.json | 2 +- web/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/package.json b/server/package.json index c3a1cbf1..543f505c 100644 --- a/server/package.json +++ b/server/package.json @@ -16,7 +16,7 @@ "author": "", "license": "ISC", "dependencies": { - "common": "workspace:common", + "common": "workspace:*", "@prisma/client": "^5.20.0", "cookie-parser": "^1.4.6", "cors": "^2.8.5", diff --git a/web/package.json b/web/package.json index ceebb6de..d9dfda98 100644 --- a/web/package.json +++ b/web/package.json @@ -9,7 +9,7 @@ "preview": "next start" }, "dependencies": { - "common": "workspace:common", + "common": "workspace:*", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@fontsource/roboto": "^5.0.13", From 83c0daaaea161578780bae80d95857280dfbc460 Mon Sep 17 00:00:00 2001 From: naka-12 <104970808+naka-12@users.noreply.github.com> Date: Sat, 15 Feb 2025 20:28:01 +0900 Subject: [PATCH 3/9] fix dependency loop --- bun.lock | 49 ++++++++++++++++++++++++++------------------- common/package.json | 2 ++ package.json | 1 + server/package.json | 3 ++- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/bun.lock b/bun.lock index 96ec5f46..1bd81350 100644 --- a/bun.lock +++ b/bun.lock @@ -11,6 +11,7 @@ }, "common": { "name": "common", + "version": "1.0.0", "devDependencies": { "@types/bun": "latest", }, @@ -20,11 +21,11 @@ }, }, "server": { - "name": "course-mate", + "name": "server", "version": "1.0.0", "dependencies": { "@prisma/client": "^5.20.0", - "common": "workspace:common", + "common": "workspace:*", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "dotenv": "^16.4.5", @@ -55,7 +56,7 @@ "@hookform/resolvers": "^3.9.1", "@mui/icons-material": "^5.16.7", "@mui/material": "^5.15.20", - "common": "workspace:common", + "common": "workspace:*", "devalue": "^5.1.1", "firebase": "^10.12.2", "framer-motion": "^11.3.23", @@ -92,7 +93,7 @@ "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], - "@babel/generator": ["@babel/generator@7.26.8", "", { "dependencies": { "@babel/parser": "^7.26.8", "@babel/types": "^7.26.8", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA=="], + "@babel/generator": ["@babel/generator@7.26.9", "", { "dependencies": { "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg=="], "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], @@ -100,15 +101,15 @@ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], - "@babel/parser": ["@babel/parser@7.26.8", "", { "dependencies": { "@babel/types": "^7.26.8" }, "bin": "./bin/babel-parser.js" }, "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw=="], + "@babel/parser": ["@babel/parser@7.26.9", "", { "dependencies": { "@babel/types": "^7.26.9" }, "bin": "./bin/babel-parser.js" }, "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A=="], - "@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + "@babel/runtime": ["@babel/runtime@7.26.9", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg=="], - "@babel/template": ["@babel/template@7.26.8", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.8", "@babel/types": "^7.26.8" } }, "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q=="], + "@babel/template": ["@babel/template@7.26.9", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9" } }, "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA=="], - "@babel/traverse": ["@babel/traverse@7.26.8", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "@babel/template": "^7.26.8", "@babel/types": "^7.26.8", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA=="], + "@babel/traverse": ["@babel/traverse@7.26.9", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.9", "@babel/parser": "^7.26.9", "@babel/template": "^7.26.9", "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg=="], - "@babel/types": ["@babel/types@7.26.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA=="], + "@babel/types": ["@babel/types@7.26.9", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw=="], "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], @@ -272,7 +273,7 @@ "@google-cloud/promisify": ["@google-cloud/promisify@4.0.0", "", {}, "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g=="], - "@google-cloud/storage": ["@google-cloud/storage@7.15.0", "", { "dependencies": { "@google-cloud/paginator": "^5.0.0", "@google-cloud/projectify": "^4.0.0", "@google-cloud/promisify": "^4.0.0", "abort-controller": "^3.0.0", "async-retry": "^1.3.3", "duplexify": "^4.1.3", "fast-xml-parser": "^4.4.1", "gaxios": "^6.0.2", "google-auth-library": "^9.6.3", "html-entities": "^2.5.2", "mime": "^3.0.0", "p-limit": "^3.0.1", "retry-request": "^7.0.0", "teeny-request": "^9.0.0", "uuid": "^8.0.0" } }, "sha512-/j/+8DFuEOo33fbdX0V5wjooOoFahEaMEdImHBmM2tH9MPHJYNtmXOf2sGUmZmiufSukmBEvdlzYgDkkgeBiVQ=="], + "@google-cloud/storage": ["@google-cloud/storage@7.15.1", "", { "dependencies": { "@google-cloud/paginator": "^5.0.0", "@google-cloud/projectify": "^4.0.0", "@google-cloud/promisify": "^4.0.0", "abort-controller": "^3.0.0", "async-retry": "^1.3.3", "duplexify": "^4.1.3", "fast-xml-parser": "^4.4.1", "gaxios": "^6.0.2", "google-auth-library": "^9.6.3", "html-entities": "^2.5.2", "mime": "^3.0.0", "p-limit": "^3.0.1", "retry-request": "^7.0.0", "teeny-request": "^9.0.0", "uuid": "^8.0.0" } }, "sha512-2bOD6d2D8b0FCV/By/VVRSvtagTllXFcRAv6F/9XUDY3r54VMQ0gM/B1emMdqnuVDX5mWJrrxlelHBZ9u6r6CA=="], "@grpc/grpc-js": ["@grpc/grpc-js@1.9.15", "", { "dependencies": { "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" } }, "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ=="], @@ -460,7 +461,7 @@ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@22.13.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA=="], + "@types/node": ["@types/node@22.13.4", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg=="], "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], @@ -550,7 +551,7 @@ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g=="], + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], "call-bound": ["call-bound@1.0.3", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" } }, "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA=="], @@ -608,8 +609,6 @@ "cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], - "course-mate": ["course-mate@workspace:server"], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "css-selector-tokenizer": ["css-selector-tokenizer@0.8.0", "", { "dependencies": { "cssesc": "^3.0.0", "fastparse": "^1.1.2" } }, "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg=="], @@ -660,7 +659,7 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "electron-to-chromium": ["electron-to-chromium@1.5.97", "", {}, "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ=="], + "electron-to-chromium": ["electron-to-chromium@1.5.101", "", {}, "sha512-L0ISiQrP/56Acgu4/i/kfPwWSgrzYZUnQrC0+QPFuhqlLP1Ir7qzPPDVS9BcKIyWTRU8+o6CC8dKw38tSWhYIA=="], "emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="], @@ -684,13 +683,15 @@ "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.20.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.11.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "9.20.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA=="], + "eslint": ["eslint@9.20.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.11.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "9.20.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g=="], "eslint-scope": ["eslint-scope@8.2.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A=="], @@ -756,7 +757,7 @@ "foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="], - "form-data": ["form-data@2.5.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12", "safe-buffer": "^5.2.1" } }, "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q=="], + "form-data": ["form-data@2.5.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ=="], "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], @@ -792,7 +793,7 @@ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - "globals": ["globals@15.14.0", "", {}, "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig=="], + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], "goober": ["goober@2.1.16", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g=="], @@ -812,6 +813,8 @@ "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], @@ -834,7 +837,7 @@ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], @@ -1160,12 +1163,14 @@ "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], - "semver": ["semver@7.7.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ=="], + "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + "server": ["server@workspace:server"], + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], @@ -1318,7 +1323,7 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="], + "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], @@ -1358,6 +1363,8 @@ "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "eslint/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + "express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], diff --git a/common/package.json b/common/package.json index 61eba218..46c6de25 100644 --- a/common/package.json +++ b/common/package.json @@ -1,5 +1,7 @@ { "name": "common", + "private": true, + "version": "1.0.0", "type": "module", "devDependencies": { "@types/bun": "latest" diff --git a/package.json b/package.json index cbab030d..b7320a2e 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "course-mate", + "private": true, "version": "1.0.0", "description": "", "main": "index.js", diff --git a/server/package.json b/server/package.json index fd4c0274..242f44f6 100644 --- a/server/package.json +++ b/server/package.json @@ -1,5 +1,6 @@ { - "name": "course-mate", + "name": "server", + "private": true, "version": "1.0.0", "description": "", "main": "index.js", From 806f1b4e09f71d665d3ee6be35990c53a91423e4 Mon Sep 17 00:00:00 2001 From: naka-12 <104970808+naka-12@users.noreply.github.com> Date: Sat, 15 Feb 2025 20:54:00 +0900 Subject: [PATCH 4/9] add render.yaml --- render.yaml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 render.yaml diff --git a/render.yaml b/render.yaml new file mode 100644 index 00000000..750f305e --- /dev/null +++ b/render.yaml @@ -0,0 +1,33 @@ +# Exported from Render on 2025-02-15T11:38:48Z +services: +- type: web + name: CourseMate + runtime: static + repo: https://github.com/ut-code/CourseMate + branch: make-it-ssg + envVars: + - key: BUN_VERSION + sync: false # Render Dashboard https://render.com/docs/blueprint-spec#prompting-for-secret-values + - key: SKIP_INSTALL_DEPS + sync: false + - key: NEXT_PUBLIC_ALLOW_ANY_MAIL_ADDR + sync: false + - key: NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID + sync: false + - key: NEXT_PUBLIC_FIREBASE_APP_ID + sync: false + - key: NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID + sync: false + - key: NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET + sync: false + - key: NEXT_PUBLIC_FIREBASE_PROJECT_ID + sync: false + - key: NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN + sync: false + - key: NEXT_PUBLIC_FIREBASE_API_KEY + sync: false + - key: NEXT_PUBLIC_API_ENDPOINT + sync: false + buildCommand: bun install --filter "web" && cd web && bun run build + staticPublishPath: web/out +version: "1" From 2303fdad14494f30462f5c717287632820d7cf0c Mon Sep 17 00:00:00 2001 From: naka-12 <104970808+naka-12@users.noreply.github.com> Date: Sun, 16 Feb 2025 01:39:37 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=83=8F?= =?UTF-8?q?=E3=83=B3=E3=83=89=E3=83=AA=E3=83=B3=E3=82=B0=E3=82=92=E4=B8=80?= =?UTF-8?q?=E7=95=AA=E4=B8=8B=E3=81=AB=E8=A8=98=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/index.ts | 62 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/server/src/index.ts b/server/src/index.ts index 6739a6f1..5c1882e0 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -20,37 +20,6 @@ const app = express(); // https://expressjs.com/ja/api.html#app.settings.table の query parser を参照。 app.set("query parser", "simple"); -// I don't understand any of those -// https://expressjs.com/en/guide/error-handling.html -// https://qiita.com/nyandora/items/cd4f12eb62295c10269c -// https://note.shiftinc.jp/n/n42b96d36f0cf -// エラーハンドラを Express に管理させる。 -// TEMPORARY: will be replaced by hono's `onError`. -app.use(async (err: unknown, _: unknown, res: unknown, next: unknown) => { - try { - if (typeof (err as Error)?.cause === "number") { - (res as Response) - .status((err as Error).cause as number) - .send((err as Error).message); - } else { - console.error(err); - (res as Response).status(500).send("Internal Error"); - } - await (next as () => Promise)(); - } catch (err) { - console.log("[ERR] failed to handle error:", err); - try { - (res as Response).status(500).send("Internal error"); - } catch (err) { - console.log("[ERR] failed to handle error twice:", err); - } - } finally { - try { - (res as Response).end("\n"); - } catch {} - } -}); - const port = process.env.PORT || 3000; const allowedOrigins = ( process.env.CORS_ALLOW_ORIGINS || panic("env CORS_ALLOW_ORIGINS is missing") @@ -91,6 +60,37 @@ app.use("/requests", requestsRoutes); app.use("/matches", matchesRoutes); app.use("/chat", chatRoutes); +// I don't understand any of those +// https://expressjs.com/en/guide/error-handling.html +// https://qiita.com/nyandora/items/cd4f12eb62295c10269c +// https://note.shiftinc.jp/n/n42b96d36f0cf +// エラーハンドラを Express に管理させる。 +// TEMPORARY: will be replaced by hono's `onError`. +app.use(async (err: unknown, _: unknown, res: unknown, next: unknown) => { + try { + if (typeof (err as Error)?.cause === "number") { + (res as Response) + .status((err as Error).cause as number) + .send((err as Error).message); + } else { + console.error(err); + (res as Response).status(500).send("Internal Error"); + } + await (next as () => Promise)(); + } catch (err) { + console.log("[ERR] failed to handle error:", err); + try { + (res as Response).status(500).send("Internal error"); + } catch (err) { + console.log("[ERR] failed to handle error twice:", err); + } + } finally { + try { + (res as Response).end("\n"); + } catch {} + } +}); + export function main() { // サーバーの起動 const server = app.listen(port, () => { From 3e5d8ae4c6c629451eca35c149e777e2e4f71c27 Mon Sep 17 00:00:00 2001 From: naka-12 <104970808+naka-12@users.noreply.github.com> Date: Sun, 16 Feb 2025 03:33:16 +0900 Subject: [PATCH 6/9] experimental: browser cache --- server/src/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/index.ts b/server/src/index.ts index 5c1882e0..e1557682 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -16,6 +16,11 @@ import "express-async-errors"; const app = express(); +app.use((req, res, next) => { + res.set("Cache-Control", "public, max-age=300, stale-while-revalidate=600"); + next(); +}); + // 高度なクエリパーサーを使わないよう設定。これによりクエリパラメータが配列やオブジェクトではなく string になるようにしている。 // https://expressjs.com/ja/api.html#app.settings.table の query parser を参照。 app.set("query parser", "simple"); From 9e393acbde439405b614781b1010fd95078d218e Mon Sep 17 00:00:00 2001 From: naka-12 <104970808+naka-12@users.noreply.github.com> Date: Sun, 16 Feb 2025 03:40:15 +0900 Subject: [PATCH 7/9] Revert "experimental: browser cache" This reverts commit 3e5d8ae4c6c629451eca35c149e777e2e4f71c27. --- server/src/index.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/server/src/index.ts b/server/src/index.ts index e1557682..5c1882e0 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -16,11 +16,6 @@ import "express-async-errors"; const app = express(); -app.use((req, res, next) => { - res.set("Cache-Control", "public, max-age=300, stale-while-revalidate=600"); - next(); -}); - // 高度なクエリパーサーを使わないよう設定。これによりクエリパラメータが配列やオブジェクトではなく string になるようにしている。 // https://expressjs.com/ja/api.html#app.settings.table の query parser を参照。 app.set("query parser", "simple"); From 25795842199e95304df401da18baf93e88d3e13b Mon Sep 17 00:00:00 2001 From: naka-12 <104970808+naka-12@users.noreply.github.com> Date: Thu, 6 Mar 2025 14:51:50 +0900 Subject: [PATCH 8/9] fix: style --- web/app/chat/components/RoomWindow.tsx | 2 +- web/app/signup/steps/step3_confirmation.tsx | 14 +++++++------- .../course/components/SelectCourseDialog.tsx | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/web/app/chat/components/RoomWindow.tsx b/web/app/chat/components/RoomWindow.tsx index 2fcf52c1..7eda36a7 100644 --- a/web/app/chat/components/RoomWindow.tsx +++ b/web/app/chat/components/RoomWindow.tsx @@ -9,7 +9,7 @@ import { API_ENDPOINT } from "~/api/internal/endpoints"; import request from "~/api/request"; import { useMyID } from "~/api/user"; import Dots from "~/components/common/Dots"; -import { handlers } from "../SSEProvider"; +import { handlers } from "../../../components/SSEProvider"; import { MessageInput } from "./MessageInput"; import { RoomHeader } from "./RoomHeader"; diff --git a/web/app/signup/steps/step3_confirmation.tsx b/web/app/signup/steps/step3_confirmation.tsx index e7ac8fac..dbd5ba0b 100644 --- a/web/app/signup/steps/step3_confirmation.tsx +++ b/web/app/signup/steps/step3_confirmation.tsx @@ -22,9 +22,9 @@ export default function Confirmation({

確認(3/5)

以下の内容で登録する場合は「次へ」を押してください。

-
-
-

プロフィール画像

+
+
+

プロフィール画像

-
-

基本情報

+
+

基本情報

名前:  {Step1Data.name}

学年:  {Step1Data.grade}

@@ -44,8 +44,8 @@ export default function Confirmation({

-
-

自己紹介

+
+

自己紹介

{Step1Data.intro}

diff --git a/web/components/course/components/SelectCourseDialog.tsx b/web/components/course/components/SelectCourseDialog.tsx index 857f6baf..eafd7fbc 100644 --- a/web/components/course/components/SelectCourseDialog.tsx +++ b/web/components/course/components/SelectCourseDialog.tsx @@ -114,7 +114,7 @@ export default function SelectCourseDialog({ 条件に当てはまる授業はありません。

) : ( -
    +
      {filteredAvailableCourses.map((course) => (
    • - -
+ )} );