From c04ba898a2cb2750ab274462252e1ee68f1f21fa Mon Sep 17 00:00:00 2001 From: Patryk Zdunowski Date: Thu, 12 Mar 2026 15:18:36 +0100 Subject: [PATCH] chore(contrib): few tweaks to make grida runnable easier - scripts, mise, some fixes to first run success --- README.md | 7 +- .../insiders/auth/basic/sign-in/route.ts | 7 +- mise.toml | 7 + package.json | 2 + scripts/dev/init.sh | 88 ++++++++++++ scripts/dev/services.sh | 128 ++++++++++++++++++ supabase/migrations/20250503123355_pgmq.sql | 4 + 7 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 mise.toml create mode 100755 scripts/dev/init.sh create mode 100755 scripts/dev/services.sh diff --git a/README.md b/README.md index e22f7d592d..9cd30c5d49 100644 --- a/README.md +++ b/README.md @@ -180,12 +180,15 @@ Docs: [@grida/refig](https://grida.co/docs/packages/@grida/refig) ## Quickstart (monorepo) -**Requirements:** Node.js **22+**, pnpm **10+** +**Requirements:** mise, Node.js **22+**, pnpm **10+** ```bash -pnpm install +mise install +pnpm dev:init +pnpm dev:services pnpm dev ``` +now editor is running on `http://localhost:3000`. Common tasks: diff --git a/editor/app/(insiders)/insiders/auth/basic/sign-in/route.ts b/editor/app/(insiders)/insiders/auth/basic/sign-in/route.ts index 367f381078..43a3fe06bf 100644 --- a/editor/app/(insiders)/insiders/auth/basic/sign-in/route.ts +++ b/editor/app/(insiders)/insiders/auth/basic/sign-in/route.ts @@ -28,9 +28,10 @@ export async function POST(req: NextRequest) { console.log("[INSIDER] Sign in successful"); if (redirect_uri) { - return NextResponse.redirect(redirect_uri, { - status: 302, - }); + return NextResponse.redirect( + new URL(redirect_uri, requestUrl.origin), + { status: 302 } + ); } if (next) { diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000000..39d2bf27ae --- /dev/null +++ b/mise.toml @@ -0,0 +1,7 @@ +[tools] +node = "22" +pnpm = "10" +rust = "1.92.0" +supabase = "2" +deno = "2" +python = "3.12" diff --git a/package.json b/package.json index def55690a1..8c15d80960 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,8 @@ "build": "turbo run build", "build:packages": "turbo run build --filter=./packages/*", "dev": "turbo run dev", + "dev:init": " ./scripts/dev/init.sh", + "dev:services": "./scripts/dev/services.sh", "dev:editor": "turbo run dev --filter=./editor", "dev:packages": "turbo run dev --filter=./packages/*", "generate": "turbo run generate", diff --git a/scripts/dev/init.sh b/scripts/dev/init.sh new file mode 100755 index 0000000000..2c87a0fd98 --- /dev/null +++ b/scripts/dev/init.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +BOLD='\033[1m' +DIM='\033[2m' +NC='\033[0m' + +REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" + +echo "" +echo -e "${CYAN}${BOLD}" +echo " ____ _ _ " +echo " / ___|_ __(_) __| | __ _ " +echo " | | _| '__| |/ _\` |/ _\` |" +echo " | |_| | | | | (_| | (_| |" +echo " \____|_| |_|\__,_|\__,_|" +echo -e "${NC}" +echo -e "${DIM} Development Environment Init${NC}" +echo "" + +# 1. Check prerequisites +echo -e "${BLUE}${BOLD}[1/3]${NC} Checking prerequisites..." + +if command -v node &>/dev/null; then + NODE_V=$(node --version) + echo -e " ${GREEN}+${NC} node ${DIM}${NODE_V}${NC}" +else + echo -e " ${RED}x${NC} node not found - install Node.js 22+" + exit 1 +fi + +if command -v pnpm &>/dev/null; then + PNPM_V=$(pnpm --version) + echo -e " ${GREEN}+${NC} pnpm ${DIM}v${PNPM_V}${NC}" +else + echo -e " ${RED}x${NC} pnpm not found - install pnpm 10+" + exit 1 +fi + +if command -v docker &>/dev/null; then + echo -e " ${GREEN}+${NC} docker" +else + echo -e " ${YELLOW}~${NC} docker not found ${DIM}(needed for pnpm dev:services)${NC}" +fi + +if command -v supabase &>/dev/null; then + SB_V=$(supabase --version 2>/dev/null || echo "unknown") + echo -e " ${GREEN}+${NC} supabase ${DIM}${SB_V}${NC}" +else + echo -e " ${YELLOW}~${NC} supabase CLI not found ${DIM}(needed for pnpm dev:services)${NC}" +fi + +echo "" + +# 2. Create .env.local +echo -e "${BLUE}${BOLD}[2/3]${NC} Setting up environment..." + +ENV_FILE="$REPO_ROOT/editor/.env.local" +ENV_EXAMPLE="$REPO_ROOT/editor/.env.example" + +if [ -f "$ENV_FILE" ]; then + echo -e " ${YELLOW}~${NC} editor/.env.local already exists, skipping" +else + cp "$ENV_EXAMPLE" "$ENV_FILE" + echo -e " ${GREEN}+${NC} Created editor/.env.local from .env.example" +fi + +echo "" + +# 3. Install dependencies +echo -e "${BLUE}${BOLD}[3/3]${NC} Installing dependencies..." +echo "" +pnpm install +echo "" + +# Done +echo -e "${GREEN}${BOLD}Init complete!${NC}" +echo "" +echo -e " Next steps:" +echo -e " ${DIM}1.${NC} pnpm dev:services ${DIM}# start Supabase${NC}" +echo -e " ${DIM}2.${NC} pnpm dev ${DIM}# start the editor${NC}" +echo "" diff --git a/scripts/dev/services.sh b/scripts/dev/services.sh new file mode 100755 index 0000000000..6951d94568 --- /dev/null +++ b/scripts/dev/services.sh @@ -0,0 +1,128 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +BOLD='\033[1m' +DIM='\033[2m' +NC='\033[0m' + +REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +ENV_FILE="$REPO_ROOT/editor/.env.local" + +echo "" +echo -e "${CYAN}${BOLD}" +echo " ____ _ _ " +echo " / ___|_ __(_) __| | __ _ " +echo " | | _| '__| |/ _\` |/ _\` |" +echo " | |_| | | | | (_| | (_| |" +echo " \____|_| |_|\__,_|\__,_|" +echo -e "${NC}" +echo -e "${DIM} Development Services${NC}" +echo "" + +# 1. Check prerequisites +echo -e "${BLUE}${BOLD}[1/4]${NC} Checking prerequisites..." + +if ! command -v docker &>/dev/null; then + echo -e " ${RED}x${NC} Docker is not installed" + exit 1 +fi + +if ! docker info &>/dev/null 2>&1; then + echo -e " ${RED}x${NC} Docker is not running - please start Docker Desktop" + exit 1 +fi +echo -e " ${GREEN}+${NC} Docker is running" + +if ! command -v supabase &>/dev/null; then + echo -e " ${RED}x${NC} Supabase CLI not found" + echo -e " ${DIM} Install: brew install supabase/tap/supabase${NC}" + echo -e " ${DIM} Or: mise install${NC}" + exit 1 +fi +echo -e " ${GREEN}+${NC} Supabase CLI" + +if [ ! -f "$ENV_FILE" ]; then + echo -e " ${RED}x${NC} editor/.env.local not found - run ${BOLD}pnpm dev:init${NC} first" + exit 1 +fi +echo -e " ${GREEN}+${NC} editor/.env.local" + +echo "" + +# 2. Generate signing keys if missing +SIGNING_KEYS="$REPO_ROOT/supabase/signing_keys.json" +if [ ! -f "$SIGNING_KEYS" ] || [ "$(cat "$SIGNING_KEYS")" = "[]" ]; then + echo -e "${BLUE}${BOLD}[2/4]${NC} Generating Supabase signing keys..." + node -e " + const crypto = require('crypto'); + const { privateKey } = crypto.generateKeyPairSync('ec', { namedCurve: 'P-256' }); + const jwk = privateKey.export({ format: 'jwk' }); + jwk.kid = crypto.randomUUID(); + jwk.use = 'sig'; + jwk.key_ops = ['sign', 'verify']; + jwk.alg = 'ES256'; + jwk.ext = true; + console.log(JSON.stringify([jwk], null, 2)); + " > "$SIGNING_KEYS" + echo -e " ${GREEN}+${NC} Created supabase/signing_keys.json" +else + echo -e "${BLUE}${BOLD}[2/4]${NC} Signing keys exist, skipping" +fi + +echo "" + +# 3. Start Supabase +echo -e "${BLUE}${BOLD}[3/4]${NC} Starting Supabase..." +echo "" +cd "$REPO_ROOT" +supabase start || true +echo "" + +# 4. Inject local Supabase keys into .env.local +echo -e "${BLUE}${BOLD}[4/4]${NC} Configuring environment..." + +SUPABASE_OUTPUT=$(supabase status -o env 2>/dev/null || true) + +API_URL=$(echo "$SUPABASE_OUTPUT" | grep '^API_URL=' | cut -d= -f2- | tr -d '"' || true) +PUBLISHABLE_KEY=$(echo "$SUPABASE_OUTPUT" | grep '^PUBLISHABLE_KEY=' | cut -d= -f2- | tr -d '"' || true) +SECRET_KEY=$(echo "$SUPABASE_OUTPUT" | grep '^SECRET_KEY=' | cut -d= -f2- | tr -d '"' || true) + +UPDATED=0 + +if [ -n "$API_URL" ]; then + sed -i.bak "s|^SUPABASE_URL=.*|SUPABASE_URL=\"$API_URL\"|" "$ENV_FILE" + sed -i.bak "s|^NEXT_PUBLIC_SUPABASE_URL=.*|NEXT_PUBLIC_SUPABASE_URL=\"$API_URL\"|" "$ENV_FILE" + echo -e " ${GREEN}+${NC} SUPABASE_URL ${DIM}${API_URL}${NC}" + UPDATED=1 +fi + +if [ -n "$PUBLISHABLE_KEY" ]; then + sed -i.bak "s|^NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=.*|NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=\"$PUBLISHABLE_KEY\"|" "$ENV_FILE" + echo -e " ${GREEN}+${NC} NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY ${DIM}${PUBLISHABLE_KEY:0:20}...${NC}" + UPDATED=1 +fi + +if [ -n "$SECRET_KEY" ]; then + sed -i.bak "s|^SUPABASE_SECRET_KEY=.*|SUPABASE_SECRET_KEY=\"$SECRET_KEY\"|" "$ENV_FILE" + echo -e " ${GREEN}+${NC} SUPABASE_SECRET_KEY ${DIM}${SECRET_KEY:0:20}...${NC}" + UPDATED=1 +fi + +rm -f "$ENV_FILE.bak" + +if [ "$UPDATED" -eq 0 ]; then + echo -e " ${YELLOW}~${NC} Could not read Supabase keys - update .env.local manually" +fi + +echo "" +echo -e "${GREEN}${BOLD}Services running!${NC}" +echo "" +echo -e " Next step:" +echo -e " ${DIM}$${NC} pnpm dev ${DIM}# start the editor${NC}" +echo "" diff --git a/supabase/migrations/20250503123355_pgmq.sql b/supabase/migrations/20250503123355_pgmq.sql index 82e2d2617a..79741d4000 100644 --- a/supabase/migrations/20250503123355_pgmq.sql +++ b/supabase/migrations/20250503123355_pgmq.sql @@ -1,9 +1,13 @@ -- generated from supabase ui - enable supabase queue via ui. create schema if not exists "pgmq"; +create schema if not exists "pgmq_public"; create extension if not exists "pgmq" with schema "pgmq" version '1.4.4'; +grant usage on schema "pgmq" to "service_role"; +grant usage on schema "pgmq_public" to "service_role"; + grant select on table "pgmq"."meta" to "pg_monitor"; grant delete on table "pgmq"."meta" to "service_role"; grant insert on table "pgmq"."meta" to "service_role";