๋ฌ๋ ์คํฐ๋ ํผ๋๋ฐฑ (https://feedback.dalestudy.com) โ ์คํฐ๋ยทํ๋ก์ ํธ ํ๊ณ ์ค๋ฌธ ์ฌ์ดํธ.
docs/database.mdโ ํ ์ด๋ธ, ๊ด๊ณ, ์ ์ฝ, ์์ฃผ ์ฐ๋ ์กฐํdocs/questions.mdโ ๋ฌธํญ ์ ํ,config, ๊ณตํต ๋ฌธํญ๊ณผvars, ์ ํ ์ถ๊ฐ ์ ์ฐจ
bun install
bun run dev # Dev server on port 3000
bun run build
bun run test # tsc --noEmit + bun test
bun run cf-typegen # wrangler.jsonc ๋ณ๊ฒฝ ํ worker-configuration.d.ts ์ฌ์์ฑ
bun run db:migrate:local # ๋ก์ปฌ D1 ๋ง์ด๊ทธ๋ ์ด์
bun run db:seed:local <json> # ์ค๋ฌธ JSON(ํธ์ง์ยท๋ฌธํญ)์ ๋ก์ปฌ D1 ์ ๋ฃ๊ธฐ (seed/example.json)
bunx drizzle-kit generate --name <desc> # ์คํค๋ง ๋ณ๊ฒฝ ํ ๋ง์ด๊ทธ๋ ์ด์
์์ฑ
bun run db:migrate:remote # ํ๋ก๋์
D1 ๋ง์ด๊ทธ๋ ์ด์
(์๋ Gotchas ์ ์์๋ฅผ ์งํจ๋ค)
bun run db:migrate:preview # ๋ฏธ๋ฆฌ๋ณด๊ธฐ D1 ๋ง์ด๊ทธ๋ ์ด์
bun run deploy:preview # ์ง๊ธ ๋ธ๋์น์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์๋ ๋ฐฐํฌ (๋ณดํต์ push ๋ Workers Builds ๊ฐ ํ๋ค)- ๋ก์ปฌ ์ํฌ๋ฆฟ์
.dev.vars(git ์ ์ฌ๋ผ๊ฐ์ง ์์):GITHUB_CLIENT_ID,GITHUB_CLIENT_SECRETโ DaleStudy GitHub App ์ Client IDยทsecret. ์์ผ๋ฉด ๋ก๊ทธ์ธ ๋์usersยทsessions์ ํ์ ์ง์ ๋ฃ๊ณCookie: __Host-session=<id>๋ก ์์ฒญํ๋ค. ์ค์ GitHub ๋ก๊ทธ์ธ์ PR ๋ฏธ๋ฆฌ๋ณด๊ธฐ์์ ๋๋ค. __Host-์ ๋์ฌ ์ฟ ํค๋ Secure ๊ฐ ํ์๋ผ, localhost ๋ฅผ secure context ๋ก ์ทจ๊ธํ๋ Chrome/Firefox ์์ ๊ฐ๋ฐํ๋ค.- seed JSON(
seed/*.json, ํ์์seed/example.json)์ ๋ก์ปฌ D1 ์ฉ์ด๋ค. ํ๋ก๋์ ์ค๋ฌธ์ ํ๋ฉด์์ ๋ง๋ค๊ฑฐ๋ ๋ณต์ ํ๋ค.editors๊ฐ ํธ์ง์,survey.id๋ฅผ ๋นผ๋ฉด nanoid ๋ก ๋ง๋ ๋ค. ๊ฐ์ id ๊ฐ ์์ผ๋ฉด ์คํจํ๋ค. ๋ฌธํญ์{ "common": "<key>", "required"? }(๊ณตํต ๋ฌธํญ, ๋ฌธ๊ตฌ๋vars๋ก ์ฑ์) ๋๋{ "type", "label", "required"?, "config"? }(์ด ์ค๋ฌธ๋ง์ ๋ฌธํญ). ์ ํ๋ณ ์ ์ฅ๊ฐยท๊ฒ์ฆยทconfig๋docs/questions.md.
- ๋ณ๊ฒฝ์ ๋ธ๋์น โ PR โ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์์ ํ์ธ โ squash merge.
main์ ์ง์ pushยทforce push ํ์ง ์๋๋ค โ ๋ค๋ฅธ ์ฌ๋๊ณผ ํจ๊ป ์ฐ๋ ์ ์ฅ์๊ฐ ๋๊ณ , ๋จธ์ง ๊ธฐ๋ก์ด ๊ณง ๋ฐฐํฌ ๊ธฐ๋ก์ด๋ค. main์ ๋จธ์ง๋๋ฉด Cloudflare Workers Builds ๊ฐbun run buildโnpx wrangler deploy. ๋น๋ ๊ฒฐ๊ณผ๋ ์ปค๋ฐ์ check runWorkers Builds: feedback์ผ๋ก ํ์ธํ๋ค.bun run deploy๋ ์๋ fallback.- ๋ฏธ๋ฆฌ๋ณด๊ธฐ:
main์ด ์๋ ๋ธ๋์น๋ฅผ push ํ๋ฉด Workers Builds ๊ฐbun run db:migrate:preview && bun run deploy:preview(Workers Previews,wrangler preview)๋กhttps://<๋ธ๋์น>.feedback-preview.dalestudy.com์ ๋ง๋ ๋ค. ๋ชจ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ D1feedback-preview๋ฅผ ํจ๊ป ์ด๋ค โ ํ๋ก๋์ ์๋ต์ ๊ฑด๋๋ฆฌ์ง ์๋ ๊ฒ ๋ชฉ์ ์ด๋ค.wrangler.jsonc์previews๋ธ๋ก์ D1 ์ ๋ค์ ์ ์ธํ๋ค(์์๋์ง ์๋๋ค). ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฉ ํ๊ฒฝenv.migrate-preview๋ก ํ๋ค โpreviews๋ธ๋ก์ D1 ์d1 migrations apply๊ฐ ์ฐพ์ง ๋ชปํ๊ณ ,preview_database_id๋ฅผ ์ฐ๋ฉด ๋ก์ปฌ ๊ฐ๋ฐ๊น์ง ๊ทธ id ์ ๋น DB ๋ฅผ ์ฐ๊ฒ ๋๋ค.versions upload์ ๋ฒ์ URL ์ ํ๋ก๋์ D1 ์ ์จ์ ์ฐ์ง ์๋๋ค(preview_urls๋ ๋).- ๋ธ๋์น๋ณ ํธ๋ฆฌ๊ฑฐ์ ์ํฌ๋ฆฟ์ ๋ธ๋์น๊ฐ ์ฒ์ ๋น๋๋ ๋์ base config ๋ฅผ ๋ณต์ฌํ๋ค. ๋์๋ณด๋์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ช
๋ น์ด๋
wrangler preview base-config secret put์ ๋ฐ๊พผ ๋ค์๋ ๊ธฐ์กด ๋ธ๋์น์ ๋ฐ๋ก ๋ฃ๋๋ค(wrangler preview secret put <KEY> --name <๋ธ๋์น>). ์ฆ์์ GitHub ๋กclient_id=undefined๊ฐ ๊ฐ๋ ๊ฒ.
- ์ด๋ฏธ ์ค์ ๋ ๊ฒ: D1
feedbackยทfeedback-preview(APAC, id ๋wrangler.jsonc), ์ํฌ๋ฆฟGITHUB_CLIENT_IDยทGITHUB_CLIENT_SECRET, ์ปค์คํ ๋๋ฉ์ธ(wrangler.jsonc์routes), ๋น๋ ๋ณ์BUN_VERSION=1.4.0(๋น๋ ์ด๋ฏธ์ง ๊ธฐ๋ณธ bun ์ lockfile v2 ๋ฅผ ๋ชป ์ฝ๋๋ค. ๋ก์ปฌ bun ์ ์ฌ๋ฆฌ๋ฉด ๊ฐ์ด ์ฌ๋ฆฐ๋ค). - GitHub App ์ Callback URL ์ localhost,
https://feedback.dalestudy.com/auth/callback,https://feedback-preview.dalestudy.com/auth/callback(์์ผ๋์นด๋) ์ . ์ฑ์ ๊ณต๊ฐ(public) ์ฌ์ผ ํ๋ค โ ๋น๊ณต๊ฐ ์ฑ์ ์์ ์กฐ์ง ๋ฉค๋ฒ๋ง authorize ํ ์ ์์ด์ ์กฐ์ง ๋ฐ ์ฐธ๊ฐ์๊ฐ GitHub ์ authorize ํ์ด์ง์์ 404 ๋ฅผ ๋ณธ๋ค(์ฐ๋ฆฌ ๋ก๊ทธ์๋ ์ ๋จ๋๋ค). - ์ ์ฅ์๋ฅผ ์๋ก ๋ง๋ค๋ฉด Workers Builds ์ฐ๊ฒฐ์ด ๋๊ธด๋ค(๋์๋ณด๋์๋ ์ด๋ฆ์ด ๊ทธ๋๋ก ๋ณด์ฌ๋). ๋์๋ณด๋์์ Disconnect โ Connect ๋ก ๋ค์ ์๋๋ค.
TanStack Start on Cloudflare Workers, D1 + Drizzle, daleui.
src/routes/ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ .login.tsx,auth.callback.tsx๋server.handlers๋ก ์ ์ํ ์๋ฒ ๋ผ์ฐํธ.src/routes/_authed.tsx๋ ๋ฏธ๋ก๊ทธ์ธ ์ฌ์ฉ์๋ฅผ/login์ผ๋ก ๋ณด๋ด๋ UX ๊ฐ๋์ผ ๋ฟ์ด๋ค. ๋ณด์ ๊ฒฝ๊ณ๋ ์๋ฒ ํจ์์authMiddleware(src/server/auth/middleware.ts). ๋ฐ์ดํฐ๋ฅผ ๋ง์ง๋ ์๋ฒ ํจ์์๋ ์ ๋ถ ๋ถ์ธ๋ค. ์์ธ๋getSurveyPreviewํ๋ โ ๋ก๊ทธ์ธ ์ ์๊ฐ์ SNS ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ฉ์ผ๋ก ์ ๋ชฉยท์ค๋ช ยท๋ง๊ฐ๋ง ์ค๋ค.- ์๋ฒ ํจ์๋
createServerFn+.validator()+.handler(). ๋ฐ์ธ๋ฉ์import { env } from 'cloudflare:workers'โenv.DB, ์ํฌ๋ฆฟ์env.GITHUB_CLIENT_ID๋ฑ (src/env.d.ts์์ ํ์ ๋ณด๊ฐ). - ์ธ์
์ D1
sessionsํ ์ด๋ธ์ opaque id ๋ฅผ__Host-sessionHttpOnly ์ฟ ํค์ ๋ด๋๋ค. 30์ผ. - ์๋ต์๋
responses.user_id. ์ต๋ช ๋ชจ๋๋ ์๋ค โ GitHub ๋ก ๋ก๊ทธ์ธํด ๋ตํ๋ ์ค๋ฌธ์ ์ต๋ช ์ด๋ผ ๋ฏฟ๋ ์ฌ๋์ ๋๋ฌผ๊ณ , ์ต๋ช ๋ถ๊ธฐ(HMAC ํคยท์ ๊ธยท์๋ด ๋ฌธ๊ตฌ)์ ๋น์ฉ์ด ์ปธ๋ค. ์ค๋ช ์ด ๋ถ๋ด์ค๋ฝ๋ค๋ ์๊ฒฌ์ด ๋์ค๋ฉด ๋ค์ ๋ฃ๋๋ค. ๋์ ๊ฒฐ๊ณผ ํ๋ฉด(getSurveyResults)์ ๋๊ฐ ์ฐธ์ฌํ๋์ง(์ด๋ฆ์ ๋ช ๋จ,invited์ค๋ฌธ์ ์์ง ์ ํ ์ฌ๋)๋ง ์ฃผ๊ณ ๋๊ฐ ๋ฌด์์ ๋ตํ๋์ง๋ ์์ง ์๋๋ค โ ์ฐธ์ฌ ๋ ๋ ค์๋ ๋ช ๋จ์ด ํ์ํ์ง๋ง ๋ต๊ณผ ์ด์ด์ง๋ฉด ์์งํ ํผ๋๋ฐฑ์ด ์ค์ด๋ ๋ค. ์์ธ๋questions.identified๋ฌธํญ(์ด์์ง ๋ชจ์ง์ฒ๋ผ ์ฐ๋ฝํด์ผ ํ๋ ๋ฌธํญ)๋ฟ์ด๋ค. - ๋ฌธํญ ์ ํ์
src/questions/registry.tsx์ ๋ชจ์ฌ ์๋ค. ๊ฒ์ฆ(validateAnswer)ยท์๋ต UI(QuestionInput)ยท๊ฒฐ๊ณผ UI(QuestionResult, ์ซ์ํ/์์ ํ ๊ตฌ์ญresultSection)ยท์๋ต ํ๋ฉด์ ๋์(์๋ ๋๊นยท์กฐ์ ์๋ดquestionBehavior, ์์ ์๊ฐestimateMinutes)์ ์ ๋ถ registry ๋ฅผ ๊ฑฐ์น๋ค. ์ ํ๋ณswitch๋ฅผ ๋ค๋ฅธ ๊ณณ์ ๋ง๋ค์ง ์๋๋ค. - ์๋ต ํ๋ฉด(
/$surveyId)๊ณผ ํธ์ง ํ๋ฉด(/$surveyId/edit)์staticData: { bare: true }๋ก ์ฌ์ดํธ ํค๋ ์์ด ํ๋ฉด ์ ์ฒด๋ฅผ ์ด๋ค (__root.tsx๊ฐ ์ฝ๋๋ค). - ์๋ต ํ๋ฉด(
/$surveyId)๊ณผ ๊ฒฐ๊ณผ ํ๋ฉด(/$surveyId/results)์ ๋ก๊ทธ์ธ ๊ฐ๋(_authed) ๋ฐ์ ์๋ค. ๋ก๊ทธ์ธ ์ ์๋getSurveyPreview๋ก ์๊ฐ์ ๋ก๊ทธ์ธ ๋งํฌ๋ฅผ ๋ณด์ฌ ์ฃผ๊ณ , SNS ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ด๋ ์ ๋ชฉยท์ค๋ช ์ ์ฝ๋๋ค. ๋งํฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ๋จ๋ ค๋ฉด ์ด ๋ผ์ฐํธ๋ค์ ๊ฐ๋ ์์ผ๋ก ์ฎ๊ธฐ๋ฉด ์ ๋๋ค โ ๊ฒฐ๊ณผ ๋งํฌ๋ ์ด์์ง๋ผ๋ฆฌ ์ฑํ ์ ๋๋๊ธฐ ๋๋ฌธ์ด๋ค. - ๋ฉํ ํ๊ทธ๋
src/lib/seo.ts์pageHead๋ก. OG ์ด๋ฏธ์งยทํธ์ํฐ ์นด๋ ๊ฐ์ ๊ณตํต ๊ฐ์__root.tsx, ํ์ด์ง๋ ์ ๋ชฉยท์ค๋ช ยท์ฃผ์ยทnoindex๋ง ์ ํ๋ค. ๊ฒ์์ ๋์ค๋ ๊ฑด ํ๋ฟ์ด๋ค. ์ ์ ํ์ผ(og.jpg,favicon.svg)์public/. - ํ๋ฉด์ daleui ์ปดํฌ๋ํธ๋ก ์ง ๋ค. ๋ผ์ฐํฐ ์ด๋์ด ํ์ํ ๋งํฌ๋
src/components/AppLink.tsx(daleuiLink+createLink). ์ยท๊ฐ๊ฒฉ์var(--colors-โฆ),var(--spacing-โฆ)ํ ํฐ. - ํ๋ฉด ์ฉ์ด: ๋ง๋ค๊ณ ยท์ง์ฐ๊ณ ยท๋ง๊ฐ๋๋ ์์์ ์ค๋ฌธ, ์ฐธ๊ฐ์๊ฐ ๋จ๊ธฐ๋ ๋ด์ฉ์ ํผ๋๋ฐฑ ("ํผ๋๋ฐฑ์ ๋จ๊ธฐ๋ค", ์ฌ์ดํธ ์ด๋ฆ). ์ฝ๋ยทDBยทURL ์
survey. - ๊ณตํต ๋ฌธํญ์
src/questions/common.ts.questions.key๋ก ์ค๋ฌธ์ ๊ฐ๋ก์ง๋ฌ ๊ฐ์ ๋ฌธํญ์ ์ฐพ๋๋ค. ๋ฌธ๊ตฌ ๋ณ๊ฒฝ์ ๊ณง ๋น๊ต ๋จ์ ์ด๋ค. - ์ค๋ฌธ์ ๊ธฐ์ยทํ๋ก๊ทธ๋จ ์์ด ํ๋ก ์ ๋ค โ ์ค๋ฌธ๋ผ๋ฆฌ ๋น๊ต์ ํ์ํ ๊ฑด ๊ณตํต ๋ฌธํญ
key๋ฟ์ด๊ณ , ๊ธฐ์ ํ๋ ๊ธฐ์๋ง๋ค seed ๋ก ๋ฑ๋กํด์ผ ํ๋ ๋น์ฉ๋ง ์ปธ๋ค. ์ ์ค๋ฌธ์ DaleStudymaintainerํ๋ง ๋ง๋ ๋ค (๋ก๊ทธ์ธ ๋ ํ์ธํดusers.can_create_surveys,src/server/auth/github.ts์SURVEY_CREATORS). ๊ณ ์น๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ ์ฌ๋์ ์ด์์ง ์ ์๊ณผsurvey_editors(src/server/access.ts์isEditor) โ ์ด์์ ํ์ผ๋ก ํ๋ฏ๋ก ๋ง๋ ์ฌ๋๋ง ๊ณ ์น ์ ์์ผ๋ฉด ๋งํ๋ค.survey_editors๋ ์ด์์ง์ด ์๋ ์ฌ๋(ํ๋ก๊ทธ๋จ ๋ฆฌ๋ ๋ฑ)์๊ฒ ๋งก๊ธธ ๋ ์ด๋ค. ์๋ฒ ํจ์๋src/server/functions/manage.ts, ์ ๋ ฅ ๊ฒ์ฆ์src/server/survey-input.ts์ ์์ ํจ์์ ๋ชจ์ฌ ์๊ณ seed ๋ ๊ฐ์ ํจ์๋ฅผ ์ด๋ค. - ํ
ํ๋ฆฟ์ ๋ฐ๋ก ๋์ง ์๊ณ ๊ธฐ์กด ์ค๋ฌธ์ ๊ณ ๋ฅธ๋ค (
createSurvey์from, ๊ด๋ฆฌ ๋ชฉ๋ก์ "๋ณต์ "). ๋ฌธํญยท๊ณต๊ฐ ๋ฒ์ยทvarsยท๋์์ ์ฎ๊ธฐ๊ณ ์๋ตยทํธ์ง์ยท๋ง๊ฐ์ ์ฎ๊ธฐ์ง ์๋๋ค. ๊ณตํต ๋ฌธํญ์copyQuestions๊ฐ ์ง๊ธ์ ์ ์๋ก ๋ค์ ์จ์ ์ ๋ฌธ๊ตฌ๊ฐ ํผ์ง์ง ์๋๋ค. ํ ํ๋ฆฟ ํ๋ฅผ ๋ฐ๋ก ๋๋ฉด ์ค๋ฌธ๊ณผ ๊ฐ์ ํธ์ง๊ธฐยท๊ฒ์ฆ์ ํ ๋ฒ ๋ ์ ์งํด์ผ ํ๋๋ฐ, ์ค์ ๋ก ํ์ํ ๊ฑด "์ง๋๋ฒ ๊ทธ ์ค๋ฌธ์ฒ๋ผ"์ด์๋ค. - ๊ณต๊ฐ ๋ฒ์๋
surveys.visibility.homeยทlink๋ ์๋ต ์๊ฒฉ์ด ๋ฐ๋ก ์๋ค(๋งํฌ + GitHub ๋ก๊ทธ์ธ + ์ค๋ณต ๋ฐฉ์ง).invited๋survey_invitees์ ์ฌ๋(login)ยทํ(slug)๊ณผ ํธ์ง์๋ง ํ์์ ๋ณด๊ณ ๋ตํ๋ค (src/server/access.ts์canRespond,invitedSurveyIds). ํ์ ๋ก๊ทธ์ธ ๋ ๋ฐ์users.teams๋ก ๋ง์ถฐ ๋ณด๋ฏ๋ก ํ์ด ๋ฐ๋๋ฉด ๋ค์ ๋ก๊ทธ์ธํด์ผ ํ๋ค.invited๋ ์ด์์ง์ฒ๋ผ ๋์์ด ์ ๊ณ GitHub ์ด๋ฆ์ ์๋ ์ค๋ฌธ์ ์ด๋ค. ์ฐธ์ฌ ํ๊ณ ๊ฐ์ ํฐ ์ค๋ฌธ์ ์ฐธ๊ฐ์ ๋ช ๋จ์ ๋์ง ์๋๋ค โ ๋งํฌ๋ ํ๋ก๊ทธ๋จ ์ฑ๋์๋ง ๊ณต์ ๋๊ณ , DiscordโGitHub ๋งคํ์ ์ ์งํ๋ ๋น์ฉ์ด ๋ช ๋จ์ด ์ฃผ๋ ์์ ๋ณด๋ค ํฌ๋ค(๋ธ๋ก๊ทธ 1๊ธฐ 24๋ช ์ค 7๋ช ๋งคํ ์คํจ). - ์ค๊ณ๋ฅผ ๋ฐ๊พธ๋ฉด ์ด์ ๋ฅผ PR ์ค๋ช ์ ๋จ๊ธฐ๊ณ , ์ง์ผ์ผ ํ ๊ท์น์ด ์๊ธฐ๋ฉด ์ด ๋ฌธ์์ ํด๋น ์ค์ ํ ์ค๋ก ์ด์ ๋ฅผ ๋ถ์ธ๋ค.
- D1 ํ๋ผ๋ฏธํฐ ~100๊ฐ ์ ํ: ๋ต๋ณยท๋ฌธํญ ์ผ๊ด INSERT ๋ 10ํ์ฉ ์ฒญํฌ.
submitResponse,saveQuestions์ฐธ๊ณ . - ๋ง๊ฐ๋ ์ค๋ฌธ์ ๊ณ ์น ์ ์๋ค (
manage.ts์loadOpenSurvey). ํธ์ง ํ๋ฉด์ ๊ด๋ฆฌ ๋ชฉ๋ก์ผ๋ก ๋๋ ค๋ณด๋ด๊ณ , ์์ ์๋ฒ ํจ์๋ ๊ฑฐ์ ํ๋ค. ๊ด๋ฆฌ ๋ชฉ๋ก์ ์ค์์น๋ก ๋ค์ ์ด๋ฉด ํ๋ฆฐ๋ค. - ์๋ต์ด 1๊ฑด์ด๋ผ๋ ์์ผ๋ฉด ๋ฌธํญยทvars ๋ ์ ๊ธด๋ค (
manage.ts์locked).answers๊ฐ question id ๋ฅผ ์ฐธ์กฐํด์๋ค. ๋ฌธํญ ์ ์ฅ์ ์ ์ฒด ๊ต์ฒด(delete + insert)๋ผ ์ ๊ธ ์ ์๋ง ํ์ฉํ๋ค. - ์๋ต ๊ณ ์น๊ธฐ๋ ๋ง๊ฐ ์ ๊น์ง (
submitResponse). ์๋ต ํ์ ์๋ก ๋ง๋ค์ง ์๊ณ ๋ต๋ง ๋ฐ๊ฟ์ ์๋ต ์์ ๋ฌธํญ ์ ๊ธ์ด ๊ทธ๋๋ก๋ค. ์ทจ์(์ญ์ )๋ ๋์ง ์๋๋ค โ ํธ์ง์๊ฐ ์ด๋ฏธ ๋ณธ ๊ฒฐ๊ณผ๋ ์ง์์ง์ง ์๊ณ , ๋ง์ง๋ง ์๋ต์ด ์ฌ๋ผ์ง๋ฉด ๋ฌธํญ ์ ๊ธ์ด ํ๋ฆฐ๋ค. - SQLite ๋ง์ด๊ทธ๋ ์ด์ : ๊ธฐ์กด ํ ์ด๋ธ์ NOT NULL ์ปฌ๋ผ์ DEFAULT ์์ด ์ถ๊ฐํ ์ ์๋ค.
- TypeScript 7:
baseUrl์ต์ ์ด ์ฌ๋ผ์ก๋ค.paths๋ง ์ด๋ค. - drizzle-kit ์ด ๋ง๋ SQLite rename/์ฌ์์ฑ SQL ์ D1 ์์ ๊นจ์ง ์ ์๋ค. ํธ๋์ญ์
์์
PRAGMA foreign_keys=OFF๊ฐ ๋ฌด์๋๋ค. ์์ฑ๋ SQL ์ ์ฝ๊ณ ๋ค์ดํฐ๋ธALTER TABLE โฆ RENAME์ผ๋ก ๋ฐ๊ฟ ์ด ์ ์ด ๋ ๋ฒ ์๋ค (0004,0006). rename ํ๋กฌํํธ๋ add/drop ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ผ๋ก ๋๋ ๋ ๋๋ค. - ์คํค๋ง PR ์ ๋จธ์ง โ ๋น๋ ์๋ฃ ํ์ธ โ
bun run db:migrate:remote๋ฅผ ๋ฐ๋ก. ์ปฌ๋ผ ์ถ๊ฐ๋ ์ฝ๋๋ณด๋ค ๋จผ์ ๋๋ ค๋ ๋์ง๋ง, ํ๊ดด์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ฝ๋๊ฐ ๋ฐฐํฌ๋ ๋ค์ ๋๋ฆฐ๋ค. - Tailwind ์ base ๋ ์ด์ด๊ฐ daleui ์ reset ๋ ์ด์ด๋ณด๋ค ๋ค๋ผ ๊ทธ๋๋ก ๋๋ฉด ๊ธ๊ผด์ ์์คํ
๊ธ๊ผด๋ก ๋ฎ์ด์ด๋ค.
src/styles.css์@theme์์--font-sans๋ฅผ daleui ํ ํฐ์ผ๋ก ๋ง์ถ๋ค. - daleui
Link๋className์ ๋ฐ์ผ๋ฉด ์๊ธฐ ์คํ์ผ ํด๋์ค๋ฅผ ๋ฒ๋ฆฐ๋ค. ๋ผ์ฐํฐ๊ฐ ํ์ฑ ๋งํฌ์ ๋๊ธฐ๋className: 'active'๋๋ฌธ์AppLink๋activeProps๋ฅผ ๋น์ด๋ค. daleui ์ปดํฌ๋ํธ์className์ ๋๊ธธ ์ผ์ด ์์ผ๋ฉด ๊ฐ์ ๋ฌธ์ ๋ฅผ ์์ฌํ๋ค (๊ณ ์นจ: daleui #1300). --colors-bg-neutral์ ๋ผ์ดํธ ํ ๋ง์์ ํฐ์์ด๋ค. ์ ์ ํ์ ๋ฉด์ด ์๋๋ผ ์ปดํฌ๋ํธ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ(CardยทTextInput๋ฐํ) ํ ํฐ์ด๋ค (daleui #363). ํ์ ๋ฉด์ด ํ์ํ๋ฉด ํ ๋๋ฆฌ(--colors-border-neutral)๋ก ๊ตฌ๋ถํ๋ค. ํ์ ๋ฉด ํ ํฐ์ daleui #1303.
- ์กฐ์ง ๋ฉค๋ฒ ๊ฒ์ดํธ โ ๋ก๊ทธ์ธ ์ DaleStudy ์กฐ์ง ๋ฉค๋ฒ๋ง ํต๊ณผ์ํค๋ ๊ฒ. ์ง๊ธ ์ผ๋ฉด ์ค์ ์ฐธ๊ฐ์๊ฐ ๋งํ๋ค(๋ธ๋ก๊ทธ 1๊ธฐ ์ฐธ๊ฐ์ 17๋ช
์ค 7๋ช
์ด ์กฐ์ง ๋ฉค๋ฒ๊ฐ ์๋๋ค). ์ฐธ์ฌ ์ ์ฐจ์ ์กฐ์ง ์ด๋๋ฅผ ๋ฃ์ ๋ค ์ผ ๋ค. ์ฑ์ members ๊ถํ์ด ์์ผ๋ ๋ก๊ทธ์ธ ์ฝ๋ฐฑ์์
GET /user/memberships/orgs/DaleStudy๋ก ํ์ธํ๋ฉด ๋๋ค(isTeamMember์ ๊ฐ์ ์๋ฆฌ). - daleui ๊ฐญ โ ๋ฌ๋ UI ์ ๋ค์ด์ค๋ฉด ์์ ๊ตฌํยท์ฐํ๋ฅผ ๊ฑท์ด๋ธ๋ค. ์ฌ๋ฆฐ ๊ฒ๊ณผ ๊ฑธ๋ฆฐ ๊ณณ:
- #1299 ์์ด์ฝ
calendarยทlinkยทplusโ ๊ด๋ฆฌ ๋ชฉ๋ก์ ๋งํฌ ๋ณต์ฌ๊ฐlucide-react๋ฅผ ์ง์ ์ด๋ค. ๋ฆด๋ฆฌ์ค๋๋ฉด<Icon name="link" />๋ก ๋ฐ๊พธ๊ณlucide-react์์กด์ฑ์ ๋บ๋ค. - #1300
className๋ณํฉ โAppLink์activeProps๋น์ฐ๊ธฐ (Gotchas ์ฐธ๊ณ ). - #1093
Textarea, #1098Switchโsrc/components/์ ์์ ๊ตฌํ. - #1301 ์ค๋ฌธ ๋ณด๊ธฐ์ฉ ํฐ ์ ํ ํ์ผ โ ์ง๊ธ์
Button์role="radio". - #1231
asChildโ ๋ฒํผ ๋ชจ์ ๋งํฌ(/login, ํ ์นด๋์ "ํผ๋๋ฐฑ ๋จ๊ธฐ๊ธฐ")๋ฅผ ํ ํฐ์ผ๋ก ํ๋ด ๋ธ๋ค. - #1203 ๋ณธ๋ฌธ
keep-allโ ํ๊ตญ์ด ๋ณธ๋ฌธ์ ๊ฐ์ธ๋ ๊ณณ์break-keep์ ์ค๋ค. - #1302
ghost/outline๋นํ์ฑ ๋ชจ์ โ ์ธ ์ ์๋ ๋ฒํผ์ ์จ๊ธด๋ค.
- #1299 ์์ด์ฝ