Skip to content

Commit 01c8814

Browse files
committed
resolve merge
2 parents d94408b + cf3c028 commit 01c8814

470 files changed

Lines changed: 56185 additions & 7953 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,42 @@
1212
# Base for OAuth Redirect URLs
1313
BASE_URL="http://localhost:3000"
1414

15+
# Your dev machine's VPN IP, for testing on a phone connected over VPN.
16+
# Allows the phone's origin to load HMR/dev assets. Leave empty otherwise.
17+
DEV_VPN_HOST=""
18+
1519
# Discord
1620
DISCORD_CLIENT_ID=""
1721
DISCORD_CLIENT_SECRET=""
1822
DISCORD_GUILD_ID="1231994798165069987"
1923
DISCORD_PUBLIC_KEY=""
2024
DISCORD_TOKEN=""
2125

22-
# Docs: GitHub API cache TTL in seconds (default: 0 locally, 300 on Vercel)
23-
# DOCS_CACHE_TTL=300
26+
# Vercel Edge Config connection string (set automatically on Vercel; optional locally)
27+
# EDGE_CONFIG=https://edge-config.vercel.com/<id>?token=<token>
2428

2529
# GitHub
2630
GITHUB_CLIENT_ID=""
2731
GITHUB_CLIENT_SECRET=""
2832
GITHUB_ORG="DevDogs-UGA"
2933
GITHUB_TOKEN="ghp_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
34+
# Secret for verifying GitHub push webhook signatures (min 20 chars)
35+
GITHUB_WEBHOOK_SECRET=""
3036

3137
# Google
3238
GOOGLE_CLIENT_ID="000000000000-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.apps.googleusercontent.com"
3339
GOOGLE_CLIENT_SECRET="aaaaaa-aa-aaaaaaaaaaaaaaaaaaaaaaaaa"
3440

41+
# Supabase Ports (required)
42+
SB_API_PORT="54321"
43+
SB_DB_PORT="54322"
44+
SB_DB_SHADOW_PORT="54320"
45+
SB_DB_POOLER_PORT="54329"
46+
SB_STUDIO_PORT="54323"
47+
SB_INBUCKET_PORT="54324"
48+
3549
# Expose Specific Auto-generated Supabase Credentials to the Client (don't change these!)
3650
NEXT_PUBLIC_SUPABASE_URL=$API_URL
3751
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=$PUBLISHABLE_KEY
38-
NEXT_PUBLIC_AVATARS_BUCKET="avatars"
52+
NEXT_PUBLIC_AVATARS_BUCKET="avatars"
53+
NEXT_PUBLIC_FEEDBACK_BUCKET="feedback-attachments"

.env.remote.example

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# This file documents the variables needed in ".env.remote" to connect your
2+
# local dev environment to a REMOTE/CLOUD Supabase project instead of the
3+
# default local CLI (Docker) instance.
4+
#
5+
# This is OPTIONAL — only needed for `pnpm dev:remote` / `pnpm db:push:remote`
6+
# against a hosted Supabase project (e.g. a shared staging project). Most
7+
# contributors should just use `pnpm dev` (local).
8+
#
9+
# To use:
10+
# 1. Copy this file to ".env.remote" (gitignored — never commit it).
11+
# 2. Fill in each value from https://supabase.com/dashboard/project/$PROJECT_REF
12+
# 3. Run `pnpm dev:remote` (read-only) or `pnpm db:push:remote` (pushes
13+
# schema — see the warning in docs/contributing.md before running this).
14+
#
15+
# NOTE: NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY don't
16+
# need to be set here — ".env" derives them from API_URL / PUBLISHABLE_KEY.
17+
18+
# --- Project Settings > API ---
19+
PROJECT_REF=""
20+
API_URL="https://$PROJECT_REF.supabase.co"
21+
PUBLISHABLE_KEY=""
22+
SECRET_KEY=""
23+
REST_URL="https://$PROJECT_REF.supabase.co/rest/v1"
24+
25+
# --- Project Settings > Database (Connection string) ---
26+
# Use the "Session pooler" connection string, NOT "Transaction pooler".
27+
# drizzle-kit (via `pnpm db:push:remote`) relies on prepared statements and
28+
# pipelined queries, which the transaction pooler (port 6543) does not
29+
# support — it will hang indefinitely ("0 tables fetching") instead of
30+
# erroring. The session pooler uses the same host but port 5432.
31+
DB_URL="postgresql://postgres.$PROJECT_REF:<password>@<host>:5432/postgres"
32+
33+
# --- Project Settings > Storage > S3 Connection ---
34+
STORAGE_S3_URL="https://$PROJECT_REF.storage.supabase.co/storage/v1/s3"
35+
S3_PROTOCOL_REGION="us-east-1"
36+
S3_PROTOCOL_ACCESS_KEY_ID=""
37+
S3_PROTOCOL_ACCESS_KEY_SECRET=""

.gitignore

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,13 @@ supabase/.*
5252
.vscode
5353
.claude
5454
.idea
55-
.mcp.json
55+
.mcp.json
56+
57+
# eslint
58+
/.eslintcache
59+
.idea/inspectionProfiles/Project_Default.xml
60+
.idea/vcs.xml
61+
62+
branch_structure.json
63+
temp_auto_push.bat
64+
temp_interactive_push.bat

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Notice
1+
# Notice!
22

33
As of 10/2/24, public development of the DevDogs Website has been discontinued to streamline development efforts and enforce greater quality control. Points awarded from completed contributions will not disappear.
44

components.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"$schema": "https://ui.shadcn.com/schema.json",
3+
"style": "radix-nova",
4+
"rsc": true,
5+
"tsx": true,
6+
"tailwind": {
7+
"config": "",
8+
"css": "src/styles/globals.css",
9+
"baseColor": "neutral",
10+
"cssVariables": true,
11+
"prefix": ""
12+
},
13+
"iconLibrary": "phosphor",
14+
"rtl": false,
15+
"aliases": {
16+
"components": "~/components",
17+
"utils": "~/lib/cn",
18+
"ui": "~/ui",
19+
"lib": "~/lib",
20+
"hooks": "~/hooks"
21+
},
22+
"menuColor": "default",
23+
"menuAccent": "subtle",
24+
"registries": {}
25+
}

drizzle-introspection.config.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ loadEnvConfig(process.cwd());
66
export default {
77
out: "./src/supabase/drizzle",
88
dialect: "postgresql",
9-
casing: "camelCase",
109
schemaFilter: ["*", "!public", "!_*"],
1110
dbCredentials: {
1211
url: process.env.DB_URL!,
1312
},
1413
introspect: {
1514
casing: "camel",
16-
}
15+
},
1716
} satisfies Config;
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import { loadEnvConfig } from "@next/env";
44
loadEnvConfig(process.cwd());
55

66
export default {
7-
schema: "./src/server/db/schema/index.ts",
7+
out: "./src/server/db/schema/generated",
88
dialect: "postgresql",
9-
casing: "camelCase",
109
schemaFilter: ["public"],
1110
dbCredentials: {
1211
url: process.env.DB_URL!,
1312
},
13+
introspect: {
14+
casing: "camel",
15+
},
1416
} satisfies Config;

eslint.config.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
1-
import { FlatCompat } from "@eslint/eslintrc";
21
import tseslint from "typescript-eslint";
2+
import nextConfig from "eslint-config-next/core-web-vitals";
33
// @ts-ignore -- no types for this plugin
44
import drizzle from "eslint-plugin-drizzle";
55

6-
const compat = new FlatCompat({
7-
baseDirectory: import.meta.dirname,
8-
});
9-
106
export default tseslint.config(
117
{
12-
ignores: [".next"],
8+
ignores: [
9+
".next",
10+
"packages/*/dist/**",
11+
// Generated Supabase files — index signatures and unused imports are intentional
12+
"src/supabase/drizzle/schema.ts",
13+
"src/supabase/types.d.ts",
14+
],
1315
},
14-
...compat.extends("next/core-web-vitals"),
16+
...nextConfig,
1517
{
1618
files: ["**/*.ts", "**/*.tsx"],
1719
plugins: {

next.config.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,19 @@ const config = {
2424
},
2525
resolveExtensions: [".graphql", ".gql", ".js", ".jsx", ".ts", ".tsx"],
2626
},
27+
cacheComponents: true,
2728
experimental: {
2829
authInterrupts: true,
2930
},
3031
images: {
3132
remotePatterns: [
3233
new URL("/storage/v1/object/public/**", env.NEXT_PUBLIC_SUPABASE_URL),
3334
],
34-
dangerouslyAllowLocalIP: env.NODE_ENV !== "production"
35+
dangerouslyAllowLocalIP: env.NODE_ENV !== "production",
3536
},
37+
...(env.NODE_ENV !== "production" && process.env.DEV_VPN_HOST
38+
? { allowedDevOrigins: [process.env.DEV_VPN_HOST] }
39+
: {}),
3640
} satisfies NextConfig;
3741

3842
export default config;

package.json

Lines changed: 85 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@
66
"scripts": {
77
"build": "next build",
88
"check": "pnpm run lint:fix && pnpm run typecheck && pnpm run prettier",
9-
"db:push": "drizzle-kit pull --config drizzle-introspection.config.ts && drizzle-kit push --config drizzle-migrations.config.ts && supabase gen types --local > src/supabase/types.d.ts",
10-
"sb:seed": "dotenv -v next_public_avatars_bucket=$NEXT_PUBLIC_AVATARS_BUCKET -- supabase seed buckets --yes",
11-
"sb:start": "dotenv -- supabase start && supabase status -o env > .env.local && dotenv -- pnpm sb:seed",
9+
"db:pull": "drizzle-kit pull --config drizzle-introspection.config.ts && drizzle-kit pull --config drizzle.config.ts && rm -f src/server/db/schema/generated/relations.ts && sed -i '2a // Cross-schema FK targets — re-injected after each `drizzle-kit pull` (see db:pull in package.json)\\nimport { usersInAuth as users, oauthClientsInAuth as oauthClients } from \"~/supabase/drizzle/schema\"' src/server/db/schema/generated/schema.ts && supabase gen types --local > src/supabase/types.d.ts",
10+
"db:migrate": "supabase migration up && pnpm db:pull && pnpm db:seed-roles",
11+
"db:reset": "supabase db reset && pnpm db:pull && pnpm db:seed-roles",
12+
"db:migration:new": "supabase migration new",
13+
"db:push:remote": "dotenv -e .env.remote -- supabase db push",
14+
"db:seed-roles": "tsx scripts/seed-builtin-roles.ts",
15+
"sb:seed-buckets": "dotenv -v next_public_avatars_bucket=$NEXT_PUBLIC_AVATARS_BUCKET -- supabase seed buckets --yes",
16+
"sb:start": "dotenv -- supabase start && supabase status -o env > .env.local && dotenv -- pnpm sb:seed-buckets",
1217
"sb:stop": "supabase stop",
1318
"sb:restart": "pnpm sb:stop && pnpm sb:start",
14-
"dev": "pnpm sb:start && pnpm db:push && pnpm next dev",
19+
"dev": "pnpm sb:start && pnpm db:migrate && pnpm next dev",
20+
"dev:remote": "dotenv -e .env.remote -- pnpm next dev",
1521
"docs:preview": "docs-preview",
1622
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,mdx}\" --cache",
1723
"format:write": "prettier --write \"**/*.{ts,tsx,js,jsx,mdx}\" --cache",
@@ -25,70 +31,104 @@
2531
"typecheck": "tsc --noEmit"
2632
},
2733
"dependencies": {
28-
"@date-fns/tz": "^1.4.1",
34+
"@date-fns/tz": "^1.5.0",
35+
"@devdogsuga/feedback-client": "workspace:*",
2936
"@discordjs/builders": "^1.14.1",
3037
"@discordjs/rest": "^2.6.1",
38+
"@dnd-kit/core": "^6.3.1",
39+
"@dnd-kit/sortable": "^10.0.0",
40+
"@dnd-kit/utilities": "^3.2.2",
41+
"@floating-ui/react": "^0.27.19",
3142
"@octokit/graphql": "^9.0.3",
3243
"@paralleldrive/cuid2": "^3.3.0",
33-
"@radix-ui/react-alert-dialog": "^1.1.15",
34-
"@radix-ui/react-avatar": "^1.1.11",
35-
"@radix-ui/react-collapsible": "^1.1.12",
36-
"@radix-ui/react-dialog": "^1.1.15",
37-
"@radix-ui/react-dropdown-menu": "^2.1.16",
38-
"@supabase/ssr": "^0.10.0",
39-
"@supabase/supabase-js": "^2.101.1",
44+
"@phosphor-icons/react": "^2.1.10",
45+
"@radix-ui/react-alert-dialog": "^1.1.17",
46+
"@radix-ui/react-avatar": "^1.2.0",
47+
"@radix-ui/react-collapsible": "^1.1.14",
48+
"@radix-ui/react-dialog": "^1.1.17",
49+
"@radix-ui/react-dropdown-menu": "^2.1.18",
50+
"@radix-ui/react-hover-card": "^1.1.17",
51+
"@radix-ui/react-popover": "^1.1.17",
52+
"@radix-ui/react-select": "^2.3.1",
53+
"@radix-ui/react-tooltip": "^1.2.10",
54+
"@shikijs/twoslash": "^4.2.0",
55+
"@supabase/ssr": "^0.12.0",
56+
"@supabase/supabase-js": "^2.108.2",
4057
"@t3-oss/env-nextjs": "^0.13.11",
4158
"@tailwindcss/forms": "^0.5.11",
42-
"@tailwindcss/typography": "^0.5.19",
43-
"@tanstack/react-query": "^5.96.2",
59+
"@tailwindcss/typography": "^0.5.20",
60+
"@tanstack/react-query": "^5.101.0",
61+
"@vercel/edge-config": "^1.4.3",
62+
"argon2": "^0.44.0",
4463
"bcrypt": "^6.0.0",
45-
"date-fns": "^4.1.0",
46-
"discord-api-types": "^0.38.44",
64+
"class-variance-authority": "^0.7.1",
65+
"clsx": "^2.1.1",
66+
"cmdk": "^1.1.1",
67+
"date-fns": "^4.4.0",
68+
"discord-api-types": "^0.38.49",
4769
"discord-interactions": "^4.4.0",
48-
"drizzle-orm": "1.0.0-beta.21",
49-
"fumadocs-core": "^16.7.11",
50-
"fumadocs-ui": "^16.7.11",
70+
"drizzle-orm": "1.0.0-rc.3",
5171
"gray-matter": "^4.0.3",
52-
"next": "^16.2.2",
72+
"lucide-react": "^1.21.0",
73+
"motion": "^12.40.0",
74+
"next": "^16.2.9",
5375
"next-mdx-remote": "^6.0.0",
76+
"next-themes": "^0.4.6",
5477
"open-graph-scraper": "^6.11.0",
55-
"postgres": "^3.4.8",
56-
"react": "^19.2.4",
57-
"react-dom": "^19.2.4",
78+
"otplib": "^13.4.1",
79+
"papaparse": "^5.5.3",
80+
"postgres": "^3.4.9",
81+
"radix-ui": "^1.6.0",
82+
"react": "^19.2.7",
83+
"react-dom": "^19.2.7",
5884
"react-fast-marquee": "^1.6.5",
59-
"react-icons": "^5.6.0",
6085
"react-image-crop": "^11.0.10",
6186
"react-markdown": "^10.1.0",
87+
"react-remove-scroll": "^2.7.2",
88+
"rehype-slug": "^6.0.0",
6289
"remark-frontmatter": "^5.0.0",
6390
"remark-gfm": "^4.0.1",
64-
"zod": "4.1.8",
65-
"zod-form-data": "^3.0.1"
91+
"shiki": "^4.2.0",
92+
"sonner": "^2.0.7",
93+
"tailwind-merge": "^3.6.0",
94+
"tw-animate-css": "^1.4.0",
95+
"unified": "^11.0.5",
96+
"zod": "4.4.3",
97+
"zod-form-data": "^3.0.2"
6698
},
6799
"devDependencies": {
68100
"@devdogsuga/docs-preview": "workspace:*",
69101
"@eslint/eslintrc": "^3.3.5",
70-
"@next/env": "^16.2.2",
71-
"@supabase/auth-js": "^2.101.1",
72-
"@tailwindcss/postcss": "^4.2.2",
102+
"@next/env": "^16.2.9",
103+
"@supabase/auth-js": "^2.108.2",
104+
"@tailwindcss/postcss": "^4.3.1",
73105
"@types/bcrypt": "^6.0.0",
74-
"@types/node": "^25.5.0",
75-
"@types/react": "^19.2.14",
106+
"@types/hast": "^3.0.4",
107+
"@types/mdast": "^4.0.4",
108+
"@types/mdx": "^2.0.14",
109+
"@types/node": "^25.9.3",
110+
"@types/papaparse": "^5.5.2",
111+
"@types/react": "^19.2.17",
76112
"@types/react-dom": "^19.2.3",
77-
"dotenv-cli": "^10.0.0",
78-
"drizzle-kit": "1.0.0-beta.21",
79-
"eslint": "^9.39.4",
80-
"eslint-config-next": "^15.5.14",
113+
"@types/unist": "^3.0.3",
114+
"dotenv-cli": "^11.0.0",
115+
"drizzle-kit": "1.0.0-rc.3",
116+
"eslint": "^10.5.0",
117+
"eslint-config-next": "^16.2.9",
81118
"eslint-plugin-drizzle": "^0.2.3",
82-
"postcss": "^8.5.8",
83-
"prettier": "^3.8.1",
84-
"prettier-plugin-tailwindcss": "^0.7.2",
119+
"postcss": "^8.5.15",
120+
"prettier": "^3.8.4",
121+
"prettier-plugin-tailwindcss": "^0.8.0",
85122
"raw-loader": "^4.0.2",
86-
"supabase": "^2.84.7",
87-
"tailwindcss": "^4.2.2",
88-
"turbo": "^2.9.3",
89-
"typescript": "^5.9.3",
90-
"typescript-eslint": "^8.58.0",
91-
"vercel": "^50.38.3"
123+
"shadcn": "^4.11.0",
124+
"supabase": "^2.107.0",
125+
"tailwindcss": "^4.3.1",
126+
"tsx": "^4.22.4",
127+
"turbo": "^2.9.18",
128+
"typescript": "^6.0.3",
129+
"typescript-eslint": "^8.61.1",
130+
"unist-util-visit": "^5.1.0",
131+
"vercel": "^54.14.2"
92132
},
93-
"packageManager": "pnpm@10.28.1"
133+
"packageManager": "pnpm@11.8.0"
94134
}

0 commit comments

Comments
 (0)