Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .env.sample
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
# Config
PUBLIC_SERVER_URL=http://localhost:4000
PUBLIC_MOCK_DATA=true
SERVER_PORT=4000 # optional, server port (alias: PORT, PUBLIC_SERVER_URL.port) (defaults to 4000 if none are specified)

# Secrets
PUBLIC_X_ANON_KEY=...
X_API_KEY=...
# 開発中 -> Vite: BASE_URL.port, Elysia: EXTERNAL_SERVER_PORT
# プロダクション -> Vite: - , Elysia: PORT ?? BASE_URL.port
BASE_URL=http://localhost:3000
EXTERNAL_SERVER_PORT=4000

NODE_ENV=development

# Database
DATABASE_URL=file:../../local.db

# Better Auth
BETTER_AUTH_SECRET=...
BETTER_AUTH_URL=http://localhost:4000

GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=

PUBLIC_WEB_URL=http://localhost:3000
5 changes: 5 additions & 0 deletions .github/workflows/static-checks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ on:
- main
pull_request:

env:
BASE_URL: http://localhost:3000
EXTERNAL_SERVER_PORT: 4000

jobs:
build:
name: Build
Expand All @@ -15,6 +19,7 @@ jobs:
- uses: oven-sh/setup-bun@v2
- run: bun install --frozen-lockfile
- run: bun run build

biome:
name: Biome Checks
runs-on: ubuntu-latest
Expand Down
18 changes: 18 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Tests

on:
push:
branches:
- main
pull_request:

jobs:
bun:
name: Bun Unit Tests
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install --frozen-lockfile
- run: bun test
1 change: 0 additions & 1 deletion TODO.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# TODOs

- setup elysia server and RPC
- implement build script
45 changes: 41 additions & 4 deletions bun.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
"workspaces": {
"": {
"name": "syllabus",
"dependencies": {
"@elysiajs/eden": "^1.3.2",
"elysia": "^1.3.6",
},
"devDependencies": {
"@biomejs/biome": "^2.1.1",
"concurrently": "^9.2.0",
Expand All @@ -29,7 +33,8 @@
"dependencies": {
"@elysiajs/cors": "^1.3.3",
"@libsql/client": "^0.15.10",
"@sinclair/typebox": "^0.34.37",
"@packages/class_data": "workspace:*",
"@sinclair/typebox": "^0.34.38",
"better-auth": "^1.3.1",
"drizzle-orm": "^0.44.3",
"elysia": "^1.3.5",
Expand All @@ -43,20 +48,30 @@
"typescript": "^5.8.3",
},
},
"packages/tests": {
"name": "tests",
"dependencies": {
"@packages/class_data": "workspace:*",
"@packages/models": "workspace:*",
"@sinclair/typebox": "^0.34.38",
},
},
"packages/web": {
"name": "@packages/web",
"version": "0.1.0",
"dependencies": {
"@elysiajs/eden": "^1.3.2",
"@headlessui/react": "^2.2.4",
"@packages/class_data": "workspace:*",
"@packages/models": "workspace:models",
"@packages/server": "workspace:*",
"@sinclair/typebox": "^0.34.38",
"@tanstack/react-query": "^5.83.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-hook-form": "^7.60.0",
"react-icons": "^5.5.0",
"react-router-dom": "^7.1.1",
"svelte": "^5.37.0",
},
"devDependencies": {
"@storybook/addon-essentials": "^8.6.14",
Expand Down Expand Up @@ -417,6 +432,8 @@

"@storybook/theming": ["@storybook/theming@8.6.14", "", { "peerDependencies": { "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg=="],

"@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.5", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ=="],

"@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="],

"@tailwindcss/node": ["@tailwindcss/node@4.1.11", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="],
Expand Down Expand Up @@ -513,7 +530,7 @@

"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],

"aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],
"aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],

"asn1js": ["asn1js@3.0.6", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA=="],

Expand All @@ -523,6 +540,8 @@

"available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],

"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],

"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],

"better-auth": ["better-auth@1.3.3", "", { "dependencies": { "@better-auth/utils": "0.2.5", "@better-fetch/fetch": "^1.1.18", "@noble/ciphers": "^0.6.0", "@noble/hashes": "^1.8.0", "@simplewebauthn/browser": "^13.0.0", "@simplewebauthn/server": "^13.0.0", "better-call": "^1.0.12", "defu": "^6.1.4", "jose": "^5.9.6", "kysely": "^0.28.1", "nanostores": "^0.11.3", "zod": "^4.0.5" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-q1aD2nNpGfEI2ckYu+pBjN+23CIRctOpmREkWyJDJdoYW1q9EPs1Xdb+KhFztg2rMmsoUN8I9Xm5mUWMxiWuLw=="],
Expand Down Expand Up @@ -609,7 +628,7 @@

"electron-to-chromium": ["electron-to-chromium@1.5.190", "", {}, "sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw=="],

"elysia": ["elysia@1.3.5", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-XVIKXlKFwUT7Sta8GY+wO5reD9I0rqAEtaz1Z71UgJb61csYt8Q3W9al8rtL5RgumuRR8e3DNdzlUN9GkC4KDw=="],
"elysia": ["elysia@1.3.6", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-NPjbt42KlLzf98JN/3Uvzg3oVFCzEle9gJnRtwUxYGQd61Bm7sE1h8FMqQVdXRCoxmz1T+jhhoB+p1YjDdwEzQ=="],

"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],

Expand All @@ -627,8 +646,12 @@

"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],

"esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],

"esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],

"esrap": ["esrap@2.1.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA=="],

"estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],

"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
Expand Down Expand Up @@ -701,6 +724,8 @@

"is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="],

"is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],

"is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],

"is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
Expand Down Expand Up @@ -751,6 +776,8 @@

"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="],

"locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="],

"locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],

"lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
Expand Down Expand Up @@ -913,6 +940,8 @@

"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],

"svelte": ["svelte@5.37.0", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-BAHgWdKncZ4F1DVBrkKAvelx2Nv3mR032ca8/yj9Gxf5s9zzK1uGXiZTjCFDvmO2e9KQfcR2lEkVjw+ZxExJow=="],

"tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="],

"tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="],
Expand All @@ -921,6 +950,8 @@

"tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],

"tests": ["tests@workspace:packages/tests"],

"tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],

"tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="],
Expand Down Expand Up @@ -985,6 +1016,8 @@

"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],

"zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="],

"zod": ["zod@4.0.8", "", {}, "sha512-+MSh9cZU9r3QKlHqrgHMTSr3QwMGv4PLfR0M4N/sYWV5/x67HgXEhIGObdBkpnX8G78pTgWnIrBL2lZcNJOtfg=="],

"@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="],
Expand Down Expand Up @@ -1013,6 +1046,10 @@

"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],

"@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],

"@testing-library/jest-dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],

"@testing-library/jest-dom/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="],

"@testing-library/jest-dom/dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="],
Expand Down
30 changes: 14 additions & 16 deletions docs/developer_readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ bun db push

```bash
# 開発モードを実行するには、以下のコマンドを実行してください。
# localhost:5173 に Vite サーバーが立ち上がるので、そこで確認してください。
# $BASE_URL に Vite サーバーが立ち上がるので、そこで確認してください。
bun dev

# Storybookの使用
# localhost:6006にStorybookが立ち上がるので、そこでUIを確認してください。
# localhost:6006 にStorybookが立ち上がるので、そこでUIを確認してください。
bun run storybook
```

Expand All @@ -36,28 +36,26 @@ bun check
bun fix
```

## モックモード
## サーバー構成

モックモードを実行するには、以下のコマンドを実行してください。
### 1. 開発中

```bash
bun dev:mock
```
- Vite 開発サーバー (localhost:3000) -> すべてのリクエストはこのサーバーがプロキシ (ログインのリダイレクトを除く)
- Elysia サーバー (localhost:4000) -> /api 以下のリクエストをプロキシされて受け取る

このコマンドを実行すると、モックデータを使用してアプリケーションが実行されます。
### 2. プロダクション

## 関数やクラスの説明
- Elysia サーバー (localhost:${PORT}) -> /api 以外は public/index.html を返す

### 1. Userのデータを扱う場合 (src/app/utils/user.ts)
## モックモード

Userのデータは`User`クラスを使用して扱います。Userのデータは以下の場合があります
モックモードを実行するには、以下のコマンドを実行してください

- `bun dev:mock`を実行した場合
- Userはモックのデータが使用されます。
- `bun dev`を実行した場合
- UserはlocalStorageに保存されたデータが使用されます。
```bash
PUBLIC_MOCK_DATA=true bun dev
```

ただ、まだユーザを登録する機能がないので、mockでユーザを作成する必要があります
このコマンドを実行すると、モックデータを使用してアプリケーションが実行されます

## 推奨 VS Code 設定

Expand Down
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,9 @@
"devDependencies": {
"@biomejs/biome": "^2.1.1",
"concurrently": "^9.2.0"
},
"dependencies": {
"@elysiajs/eden": "^1.3.2",
"elysia": "^1.3.6"
}
}
89 changes: 89 additions & 0 deletions packages/models/atoms.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { t } from "elysia";

// Stream って何? 教えて有識者
// Course.importance に使われているよう?
export type Stream = typeof Stream.static;
export const Stream = t.UnionEnum(["s1", "s2", "s3", "l1", "l2", "l3"]);

/**
* 授業コード
* 例: 30003
*/
export type CourseCode = typeof CourseCode.static;
export const CourseCode = t.RegExp("^\\d{5}$");

/**
* 共通科目コード
* 例:
* - XAB-CD1001L2
* - CAS-FC1871L1
* - CAS-GC1L37S4
* - CASPG1F40L3 // 絶対入力ミスだが、データにあるので対応しなければならない
* 仕様: https://www.u-tokyo.ac.jp/ja/students/classes/course-numbering.html
* 本当は CommonSubjectCode になるはずだが、公式が勝手に CommonCourseCode と読んでいる
*/
export type CommonCourseCode = typeof CommonCourseCode.static;
export const CommonCourseCode = t.RegExp(
`
^[CFG] ${/* [1] 課程コード */ ""}
(?:LA|ME|EN|LE|SC|AG|EC|AS|ED|PH|GL) ${/* [2] 開講学部・研究科(教育部)コード */ ""}
-?
[A-Z]{2} ${/* [3] 開講学科・専攻等コード */ ""}
[1-7] ${/* [4] レベルコード */ ""}
[0-9a-zA-Z]{3} ${/* [5] 整理番号 */ ""}
[LSEPTZ] ${/* [6] 授業形態コード */ ""}
[123459] ${/* [7] 使用言語コード */ ""}
$`.replaceAll(/\s/g, ""),
);

/**
* 曜日。
*/
export type Day = typeof Day.static;
export const Day = t.UnionEnum(["mon", "tue", "wed", "thu", "fri", "sat"]);

export type Period = typeof Period.static;
export const Period = t.UnionEnum([1, 2, 3, 4, 5, 6]);

/**
* 曜限。
*/
export type DayPeriod = typeof DayPeriod.static;
export const DayPeriod = t.Object({
day: Day,
period: Period,
});

/**
* セメスターまたはターム。
*/
export type Semester = typeof Semester.static;
export const Semester = t.UnionEnum(["S", "S1", "S2", "A", "A1", "A2"]);

// 使われていない。
/**
* 評価方法。
*/
export type Evaluation = typeof Evaluation.static;
export const Evaluation = t.UnionEnum(["試験", "レポート", "出席", "平常"]);

/**
* 単位の種類。
*/
export type ClassType = typeof ClassType.static;
export const ClassType = t.UnionEnum(["基礎", "要求", "主題", "総合", "展開"]);

export type ClassSeries = typeof ClassSeries.static;
export const ClassSeries = t.UnionEnum([
"基礎",
"要求",
"主題",
"展開",
"総合L",
"総合A",
"総合B",
"総合C",
"総合D",
"総合E",
"総合F",
]);
10 changes: 10 additions & 0 deletions packages/models/mappings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { Day } from "./atoms.ts";

export const dayMapping: { [key in Day]: string } = {
mon: "月",
tue: "火",
wed: "水",
thu: "木",
fri: "金",
sat: "土",
};
Loading