From b92557707ddf88de75a01ca9be98dedfd66e4d26 Mon Sep 17 00:00:00 2001 From: Wojtek Majewski Date: Tue, 11 Nov 2025 12:52:12 +0100 Subject: [PATCH] chore: remove examples/playground altogether --- .changeset/config.json | 2 +- .github/actions/deployment-comment/action.yml | 2 +- .github/workflows/ci.yml | 48 +- .nxignore | 3 +- RELEASES.md | 2 +- examples/playground/.env.example | 6 - examples/playground/.gitignore | 46 - examples/playground/.npmrc | 4 - examples/playground/.nvmrc | 1 - examples/playground/CLAUDE.md | 58 - examples/playground/DEPLOYMENT.md | 179 --- examples/playground/LICENSE | 202 --- examples/playground/README.md | 159 -- .../app/(auth-pages)/forgot-password/page.tsx | 39 - .../playground/app/(auth-pages)/layout.tsx | 9 - .../app/(auth-pages)/sign-in/page.tsx | 109 -- .../app/(auth-pages)/sign-up/page.tsx | 85 -- .../app/(auth-pages)/smtp-message.tsx | 25 - examples/playground/app/actions.ts | 148 -- .../playground/app/auth/callback/route.ts | 30 - examples/playground/app/globals.css | 90 -- examples/playground/app/layout.tsx | 157 -- examples/playground/app/page.tsx | 31 - examples/playground/app/protected/page.tsx | 38 - .../app/protected/reset-password/page.tsx | 37 - examples/playground/app/websites/page.tsx | 132 -- .../app/websites/runs/[run_id]/page.tsx | 153 -- .../playground/app/websites/runs/layout.tsx | 7 - .../playground/app/websites/runs/page.tsx | 120 -- examples/playground/components.json | 17 - .../playground/components/deploy-button.tsx | 25 - .../playground/components/env-var-warning.tsx | 33 - .../playground/components/example-links.tsx | 44 - .../components/flow-run-details.tsx | 182 --- .../components/flow-run-provider.tsx | 121 -- .../playground/components/form-message.tsx | 26 - .../playground/components/github-button.tsx | 67 - .../playground/components/header-auth.tsx | 103 -- examples/playground/components/hero.tsx | 44 - .../components/json-highlighter.tsx | 33 - .../components/loading-state-provider.tsx | 36 - .../playground/components/mobile-links.tsx | 83 -- examples/playground/components/next-logo.tsx | 46 - .../playground/components/skeleton-table.tsx | 40 - .../playground/components/spinner-wrapper.tsx | 7 - examples/playground/components/spinner.tsx | 19 - .../playground/components/submit-button.tsx | 35 - .../playground/components/supabase-logo.tsx | 102 -- .../playground/components/theme-switcher.tsx | 78 - .../components/tutorial/code-block.tsx | 61 - .../tutorial/connect-supabase-steps.tsx | 62 - .../components/tutorial/fetch-data-steps.tsx | 96 -- .../tutorial/sign-up-user-steps.tsx | 88 -- .../components/tutorial/tutorial-step.tsx | 30 - .../components/typography/inline-code.tsx | 7 - examples/playground/components/ui/badge.tsx | 36 - examples/playground/components/ui/button.tsx | 56 - .../playground/components/ui/checkbox.tsx | 30 - .../playground/components/ui/collapsible.tsx | 11 - .../components/ui/dropdown-menu.tsx | 200 --- examples/playground/components/ui/input.tsx | 24 - examples/playground/components/ui/label.tsx | 26 - .../playground/components/ui/skeleton.tsx | 15 - .../components/website-analysis-ui.tsx | 236 --- .../components/website-analyzer-form.tsx | 72 - examples/playground/eslint.config.cjs | 8 - examples/playground/lib/db.ts | 9 - examples/playground/lib/example-links.ts | 37 - .../playground/lib/hooks/use-elapsed-time.ts | 97 -- .../lib/hooks/use-start-analysis.ts | 38 - .../playground/lib/pgflow-client-provider.tsx | 31 - .../playground/lib/services/start-analysis.ts | 54 - examples/playground/lib/utils.ts | 6 - examples/playground/middleware.ts | 20 - examples/playground/next.config.ts | 33 - examples/playground/package.json | 43 - examples/playground/postcss.config.js | 6 - examples/playground/project.json | 71 - examples/playground/public/.gitkeep | 0 examples/playground/public/favicon.ico | Bin 25931 -> 0 bytes .../playground/public/opengraph-image.png | Bin 289886 -> 0 bytes examples/playground/public/twitter-image.png | Bin 289886 -> 0 bytes examples/playground/scripts/run_sql.sh | 30 - examples/playground/scripts/supabase | 11 - examples/playground/scripts/sync-edge-deps.sh | 73 - examples/playground/supabase/.gitignore | 8 - examples/playground/supabase/config.toml | 342 ----- .../supabase/functions/.env.example | 1 - .../supabase/functions/LOCAL_DEV_README.md | 195 --- .../playground/supabase/functions/README.md | 57 - .../functions/_flows/analyze_website.ts | 46 - .../_tasks/convertToCleanMarkdown.ts | 19 - .../supabase/functions/_tasks/extractTags.ts | 52 - .../supabase/functions/_tasks/saveWebsite.ts | 25 - .../functions/_tasks/scrapeWebsite.ts | 57 - .../functions/_tasks/summarizeWithAI.ts | 30 - .../analyze_website_worker_0/index.ts | 4 - .../analyze_website_worker_1/index.ts | 4 - .../analyze_website_worker_2/index.ts | 4 - .../analyze_website_worker_3/index.ts | 4 - .../supabase/functions/database-types.d.ts | 657 --------- .../playground/supabase/functions/deno.json | 15 - .../playground/supabase/functions/deno.lock | 623 -------- .../supabase/functions/import_map.local.json | 18 - .../functions/pgflow-cron-worker/DEPLOY.md | 149 -- .../functions/pgflow-cron-worker/README.md | 167 --- .../functions/pgflow-cron-worker/index.ts | 271 ---- .../pgflow-cron-worker/setup-cron-local.sql | 52 - .../pgflow-cron-worker/setup-cron.sql | 92 -- .../pgflow-cron-worker/start-cron.sh | 34 - .../functions/pgflow-cron-worker/stop-cron.sh | 25 - .../pgflow-cron-worker/test-local.sh | 30 - .../playground/supabase/functions/utils.ts | 23 - .../20250429064909_fix_db_reset.sql | 31 - .../20250429164909_pgflow_initial.sql | 766 ---------- .../20250429164919_add_websites.sql | 44 - ...9164929_add_start_analyze_website_flow.sql | 35 - .../migrations/20250429164939_permissions.sql | 57 - ...0430140439_create_analyze_website_flow.sql | 5 - ..._to_use_separate_statement_for_polling.sql | 101 -- ...low_add_start_tasks_and_started_status.sql | 371 ----- ...set_vt_batch_and_use_it_in_start_tasks.sql | 127 -- ...434_20250614124241_pgflow_add_realtime.sql | 501 ------- ...w_fix_fail_task_missing_realtime_event.sql | 185 --- ...90700_pgflow_fix_function_search_paths.sql | 6 - ...50707210212_pgflow_add_opt_start_delay.sql | 103 -- ...250719205006_pgflow_worker_deprecation.sql | 2 - ...0251006073122_pgflow_add_map_step_type.sql | 1246 ---------------- examples/playground/tailwind.config.ts | 80 - examples/playground/tsconfig.json | 49 - examples/playground/types/deno/index.d.ts | 11 - .../utils/supabase/check-env-vars.ts | 6 - examples/playground/utils/supabase/client.ts | 8 - .../playground/utils/supabase/middleware.ts | 65 - examples/playground/utils/supabase/server.ts | 29 - examples/playground/utils/utils.ts | 16 - netlify.toml | 7 - package.json | 4 +- pnpm-lock.yaml | 1295 +---------------- pnpm-workspace.yaml | 1 - scripts/snapshot-release.sh | 2 +- tsconfig.json | 3 - 142 files changed, 15 insertions(+), 12825 deletions(-) delete mode 100644 examples/playground/.env.example delete mode 100644 examples/playground/.gitignore delete mode 100644 examples/playground/.npmrc delete mode 100644 examples/playground/.nvmrc delete mode 100644 examples/playground/CLAUDE.md delete mode 100644 examples/playground/DEPLOYMENT.md delete mode 100644 examples/playground/LICENSE delete mode 100644 examples/playground/README.md delete mode 100644 examples/playground/app/(auth-pages)/forgot-password/page.tsx delete mode 100644 examples/playground/app/(auth-pages)/layout.tsx delete mode 100644 examples/playground/app/(auth-pages)/sign-in/page.tsx delete mode 100644 examples/playground/app/(auth-pages)/sign-up/page.tsx delete mode 100644 examples/playground/app/(auth-pages)/smtp-message.tsx delete mode 100644 examples/playground/app/actions.ts delete mode 100644 examples/playground/app/auth/callback/route.ts delete mode 100644 examples/playground/app/globals.css delete mode 100644 examples/playground/app/layout.tsx delete mode 100644 examples/playground/app/page.tsx delete mode 100644 examples/playground/app/protected/page.tsx delete mode 100644 examples/playground/app/protected/reset-password/page.tsx delete mode 100644 examples/playground/app/websites/page.tsx delete mode 100644 examples/playground/app/websites/runs/[run_id]/page.tsx delete mode 100644 examples/playground/app/websites/runs/layout.tsx delete mode 100644 examples/playground/app/websites/runs/page.tsx delete mode 100644 examples/playground/components.json delete mode 100644 examples/playground/components/deploy-button.tsx delete mode 100644 examples/playground/components/env-var-warning.tsx delete mode 100644 examples/playground/components/example-links.tsx delete mode 100644 examples/playground/components/flow-run-details.tsx delete mode 100644 examples/playground/components/flow-run-provider.tsx delete mode 100644 examples/playground/components/form-message.tsx delete mode 100644 examples/playground/components/github-button.tsx delete mode 100644 examples/playground/components/header-auth.tsx delete mode 100644 examples/playground/components/hero.tsx delete mode 100644 examples/playground/components/json-highlighter.tsx delete mode 100644 examples/playground/components/loading-state-provider.tsx delete mode 100644 examples/playground/components/mobile-links.tsx delete mode 100644 examples/playground/components/next-logo.tsx delete mode 100644 examples/playground/components/skeleton-table.tsx delete mode 100644 examples/playground/components/spinner-wrapper.tsx delete mode 100644 examples/playground/components/spinner.tsx delete mode 100644 examples/playground/components/submit-button.tsx delete mode 100644 examples/playground/components/supabase-logo.tsx delete mode 100644 examples/playground/components/theme-switcher.tsx delete mode 100644 examples/playground/components/tutorial/code-block.tsx delete mode 100644 examples/playground/components/tutorial/connect-supabase-steps.tsx delete mode 100644 examples/playground/components/tutorial/fetch-data-steps.tsx delete mode 100644 examples/playground/components/tutorial/sign-up-user-steps.tsx delete mode 100644 examples/playground/components/tutorial/tutorial-step.tsx delete mode 100644 examples/playground/components/typography/inline-code.tsx delete mode 100644 examples/playground/components/ui/badge.tsx delete mode 100644 examples/playground/components/ui/button.tsx delete mode 100644 examples/playground/components/ui/checkbox.tsx delete mode 100644 examples/playground/components/ui/collapsible.tsx delete mode 100644 examples/playground/components/ui/dropdown-menu.tsx delete mode 100644 examples/playground/components/ui/input.tsx delete mode 100644 examples/playground/components/ui/label.tsx delete mode 100644 examples/playground/components/ui/skeleton.tsx delete mode 100644 examples/playground/components/website-analysis-ui.tsx delete mode 100644 examples/playground/components/website-analyzer-form.tsx delete mode 100644 examples/playground/eslint.config.cjs delete mode 100644 examples/playground/lib/db.ts delete mode 100644 examples/playground/lib/example-links.ts delete mode 100644 examples/playground/lib/hooks/use-elapsed-time.ts delete mode 100644 examples/playground/lib/hooks/use-start-analysis.ts delete mode 100644 examples/playground/lib/pgflow-client-provider.tsx delete mode 100644 examples/playground/lib/services/start-analysis.ts delete mode 100644 examples/playground/lib/utils.ts delete mode 100644 examples/playground/middleware.ts delete mode 100644 examples/playground/next.config.ts delete mode 100644 examples/playground/package.json delete mode 100644 examples/playground/postcss.config.js delete mode 100644 examples/playground/project.json delete mode 100644 examples/playground/public/.gitkeep delete mode 100644 examples/playground/public/favicon.ico delete mode 100644 examples/playground/public/opengraph-image.png delete mode 100644 examples/playground/public/twitter-image.png delete mode 100755 examples/playground/scripts/run_sql.sh delete mode 100755 examples/playground/scripts/supabase delete mode 100755 examples/playground/scripts/sync-edge-deps.sh delete mode 100644 examples/playground/supabase/.gitignore delete mode 100644 examples/playground/supabase/config.toml delete mode 100644 examples/playground/supabase/functions/.env.example delete mode 100644 examples/playground/supabase/functions/LOCAL_DEV_README.md delete mode 100644 examples/playground/supabase/functions/README.md delete mode 100644 examples/playground/supabase/functions/_flows/analyze_website.ts delete mode 100644 examples/playground/supabase/functions/_tasks/convertToCleanMarkdown.ts delete mode 100644 examples/playground/supabase/functions/_tasks/extractTags.ts delete mode 100644 examples/playground/supabase/functions/_tasks/saveWebsite.ts delete mode 100644 examples/playground/supabase/functions/_tasks/scrapeWebsite.ts delete mode 100644 examples/playground/supabase/functions/_tasks/summarizeWithAI.ts delete mode 100644 examples/playground/supabase/functions/analyze_website_worker_0/index.ts delete mode 100644 examples/playground/supabase/functions/analyze_website_worker_1/index.ts delete mode 100644 examples/playground/supabase/functions/analyze_website_worker_2/index.ts delete mode 100644 examples/playground/supabase/functions/analyze_website_worker_3/index.ts delete mode 100644 examples/playground/supabase/functions/database-types.d.ts delete mode 100644 examples/playground/supabase/functions/deno.json delete mode 100644 examples/playground/supabase/functions/deno.lock delete mode 100644 examples/playground/supabase/functions/import_map.local.json delete mode 100644 examples/playground/supabase/functions/pgflow-cron-worker/DEPLOY.md delete mode 100644 examples/playground/supabase/functions/pgflow-cron-worker/README.md delete mode 100644 examples/playground/supabase/functions/pgflow-cron-worker/index.ts delete mode 100644 examples/playground/supabase/functions/pgflow-cron-worker/setup-cron-local.sql delete mode 100644 examples/playground/supabase/functions/pgflow-cron-worker/setup-cron.sql delete mode 100755 examples/playground/supabase/functions/pgflow-cron-worker/start-cron.sh delete mode 100755 examples/playground/supabase/functions/pgflow-cron-worker/stop-cron.sh delete mode 100755 examples/playground/supabase/functions/pgflow-cron-worker/test-local.sh delete mode 100644 examples/playground/supabase/functions/utils.ts delete mode 100644 examples/playground/supabase/migrations/20250429064909_fix_db_reset.sql delete mode 100644 examples/playground/supabase/migrations/20250429164909_pgflow_initial.sql delete mode 100644 examples/playground/supabase/migrations/20250429164919_add_websites.sql delete mode 100644 examples/playground/supabase/migrations/20250429164929_add_start_analyze_website_flow.sql delete mode 100644 examples/playground/supabase/migrations/20250429164939_permissions.sql delete mode 100644 examples/playground/supabase/migrations/20250430140439_create_analyze_website_flow.sql delete mode 100644 examples/playground/supabase/migrations/20250517125006_20250517072017_pgflow_fix_poll_for_tasks_to_use_separate_statement_for_polling.sql delete mode 100644 examples/playground/supabase/migrations/20250610080624_20250609105135_pgflow_add_start_tasks_and_started_status.sql delete mode 100644 examples/playground/supabase/migrations/20250610180554_pgflow_add_set_vt_batch_and_use_it_in_start_tasks.sql delete mode 100644 examples/playground/supabase/migrations/20250615172434_20250614124241_pgflow_add_realtime.sql delete mode 100644 examples/playground/supabase/migrations/20250627215516_20250619195327_pgflow_fix_fail_task_missing_realtime_event.sql delete mode 100644 examples/playground/supabase/migrations/20250627215517_20250627090700_pgflow_fix_function_search_paths.sql delete mode 100644 examples/playground/supabase/migrations/20251008044437_20250707210212_pgflow_add_opt_start_delay.sql delete mode 100644 examples/playground/supabase/migrations/20251008044438_20250719205006_pgflow_worker_deprecation.sql delete mode 100644 examples/playground/supabase/migrations/20251008044439_20251006073122_pgflow_add_map_step_type.sql delete mode 100644 examples/playground/tailwind.config.ts delete mode 100644 examples/playground/tsconfig.json delete mode 100644 examples/playground/types/deno/index.d.ts delete mode 100644 examples/playground/utils/supabase/check-env-vars.ts delete mode 100644 examples/playground/utils/supabase/client.ts delete mode 100644 examples/playground/utils/supabase/middleware.ts delete mode 100644 examples/playground/utils/supabase/server.ts delete mode 100644 examples/playground/utils/utils.ts delete mode 100644 netlify.toml diff --git a/.changeset/config.json b/.changeset/config.json index 7427339cb..399f4e904 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,5 +7,5 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": ["playground"] + "ignore": [] } diff --git a/.github/actions/deployment-comment/action.yml b/.github/actions/deployment-comment/action.yml index 498277058..6a430cbaa 100644 --- a/.github/actions/deployment-comment/action.yml +++ b/.github/actions/deployment-comment/action.yml @@ -3,7 +3,7 @@ description: 'Post deployment status comments on PRs for both preview and produc inputs: project-name: - description: 'Name of the project being deployed (e.g., playground, website)' + description: 'Name of the project being deployed (e.g., website)' required: true preview-url: description: 'The preview deployment URL' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 93bb42cd7..e9dd13643 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,8 +50,8 @@ jobs: - name: Quality gate (lint + typecheck + test) run: pnpm nx affected -t lint typecheck test --parallel --configuration=production --base="$NX_BASE" --head="$NX_HEAD" - - name: Build all affected projects (except playground) - run: pnpm nx affected -t build --configuration=production --parallel --exclude=playground --base="$NX_BASE" --head="$NX_HEAD" + - name: Build all affected projects + run: pnpm nx affected -t build --configuration=production --parallel --base="$NX_BASE" --head="$NX_HEAD" # ─────────────────────────────────────── 2. EDGE-WORKER E2E ────────────────────────────────────── @@ -101,49 +101,7 @@ jobs: run: pnpm nx affected -t test:e2e --parallel --base="$NX_BASE" --head="$NX_HEAD" -# ────────────────────────────────── 3. DEPLOY PLAYGROUND ─────────────────────────── - deploy-playground: - needs: [build-and-test, edge-worker-e2e] - if: false # Disabled - # if: >- - # ${{ - # (github.event_name == 'pull_request') || - # (github.ref == 'refs/heads/main' && github.event_name == 'push') - # }} - runs-on: ubuntu-latest - environment: ${{ github.event_name == 'pull_request' && 'preview' || 'production' }} - env: - NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.NETLIFY_PLAYGROUND_SITE_ID }} - NEXT_PUBLIC_SUPABASE_URL: ${{ github.event_name == 'pull_request' && secrets.DEMO_PREVIEW_SUPABASE_URL || secrets.DEMO_PRODUCTION_SUPABASE_URL }} - NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ github.event_name == 'pull_request' && secrets.DEMO_PREVIEW_SUPABASE_ANON_KEY || secrets.DEMO_PRODUCTION_SUPABASE_ANON_KEY }} - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - uses: ./.github/actions/setup - - # Build the workspace libraries that the app imports - - run: pnpm nx run-many -t build --projects client,dsl --configuration=production - - - name: Build & deploy to Netlify - id: deploy - run: | - pnpm netlify deploy --build --filter=playground \ - --context ${{ github.event_name == 'pull_request' && 'deploy-preview' || 'production' }} \ - ${{ github.event_name == 'pull_request' && format('--alias=pr-{0}', github.event.pull_request.number) || '--prod' }} - - - name: Post deployment comment - if: always() - uses: ./.github/actions/deployment-comment - with: - project-name: Playground - preview-url: https://pr-${{ github.event.pull_request.number }}--pgflow-demo.netlify.app - production-url: https://playground.pgflow.dev - -# ────────────────────────────────── 4. DEPLOY WEBSITE ─────────────────────────── +# ────────────────────────────────── 3. DEPLOY WEBSITE ─────────────────────────── deploy-website: needs: [build-and-test, edge-worker-e2e] runs-on: ubuntu-latest diff --git a/.nxignore b/.nxignore index 941ecbbef..e8a05a632 100644 --- a/.nxignore +++ b/.nxignore @@ -1,3 +1,2 @@ # Ignore Supabase Edge Functions from Nx dependency analysis -# These are Deno runtime functions with their own import resolution -examples/playground/supabase/functions/ \ No newline at end of file +# These are Deno runtime functions with their own import resolution \ No newline at end of file diff --git a/RELEASES.md b/RELEASES.md index 29df6d40c..6c7a5c96b 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -48,7 +48,7 @@ When the Version Packages PR is merged: ```bash # 1. Build all packages -pnpm nx run-many -t build --exclude=playground +pnpm nx run-many -t build # 2. Publish to npm (all packages except edge-worker) pnpm publish --recursive --filter=!./pkgs/edge-worker diff --git a/examples/playground/.env.example b/examples/playground/.env.example deleted file mode 100644 index df47c920d..000000000 --- a/examples/playground/.env.example +++ /dev/null @@ -1,6 +0,0 @@ -# Update these with your Supabase details from your project settings > API -# https://app.supabase.com/project/_/settings/api -NEXT_PUBLIC_SUPABASE_URL="http://127.0.0.1:54321" -NEXT_PUBLIC_SUPABASE_ANON_KEY="your key here" -GITHUB_OAUTH_CLIEND_ID= -GITHUB_OAUTH_CLIENT_SECRET= diff --git a/examples/playground/.gitignore b/examples/playground/.gitignore deleted file mode 100644 index 59d63f38b..000000000 --- a/examples/playground/.gitignore +++ /dev/null @@ -1,46 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/versions - -# testing -/coverage - -# next.js -/.next/ -/out/ -/dist/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local -.env - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts -package-lock.json - -# Local development vendor directory -supabase/functions/_vendor/ diff --git a/examples/playground/.npmrc b/examples/playground/.npmrc deleted file mode 100644 index 39074bc13..000000000 --- a/examples/playground/.npmrc +++ /dev/null @@ -1,4 +0,0 @@ -strict-peer-dependencies=false -auto-install-peers=true -@jsr:registry=https://npm.jsr.io -link-workspace-packages=false \ No newline at end of file diff --git a/examples/playground/.nvmrc b/examples/playground/.nvmrc deleted file mode 100644 index f812e4592..000000000 --- a/examples/playground/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -20.18.1 \ No newline at end of file diff --git a/examples/playground/CLAUDE.md b/examples/playground/CLAUDE.md deleted file mode 100644 index 1b4147a06..000000000 --- a/examples/playground/CLAUDE.md +++ /dev/null @@ -1,58 +0,0 @@ -# CLAUDE.md - -> [!WARNING] -> QUOTE ALL THE FILE PATHS THAT CONTAIN ROUTE PARAMETERS LIKE '[run_id]' -> BECAUSE BRACKETS HAVE SPECIAL MEANING IN BASH! -> Do this: `cat 'some/path/to/[id]/page.tsx'` instead of `cat some/path/to/[id]/page.tsx` - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Build/Run Commands - -- `npm run dev` - Start development server -- `npm run build` - Build the application -- `npm run start` - Start production server -- `npm run start-functions` - Start Supabase Edge Functions -- `npm run start-worker` - Trigger the analyze_website function -- `npm run gen-types` - Generate TypeScript types from Supabase schema - -## Utility Scripts - -### run_sql.sh -A utility script for running SQL queries against the local Supabase database. It automatically gets the database URL from `supabase status`. - -Location: `./scripts/run_sql.sh` - -Usage: -```bash -# Run a simple query -./scripts/run_sql.sh "SELECT * FROM pgflow.flows;" - -# Run with explicit -c flag -./scripts/run_sql.sh -c "SELECT COUNT(*) FROM pgflow.step_tasks;" - -# Run a SQL file -./scripts/run_sql.sh -f some_script.sql - -# Pipe SQL to the script -echo "SELECT NOW();" | ./scripts/run_sql.sh -``` - -Benefits: -- No need to remember or type the database connection string -- Automatically detects if Supabase is running -- Supports all standard psql options -- Simplifies database queries during development - -## Code Style Guidelines - -- **TypeScript**: Use strict mode with proper type annotations -- **Imports**: Use `@/` alias prefix for project imports (e.g., `@/components/ui/button`) -- **Components**: Follow React Server Component patterns with proper props typing -- **Formatting**: Project uses Prettier with default settings -- **UI**: Uses shadcn/ui component library with Tailwind CSS -- **Next.js**: Follow App Router conventions with page.tsx for routes -- **Error Handling**: Use proper error boundaries and form validation -- **Database**: Use Supabase for backend with Edge Functions -- **Naming**: Use PascalCase for components, camelCase for variables/functions -- **File Structure**: Group related components in dedicated folders diff --git a/examples/playground/DEPLOYMENT.md b/examples/playground/DEPLOYMENT.md deleted file mode 100644 index e7e05b28c..000000000 --- a/examples/playground/DEPLOYMENT.md +++ /dev/null @@ -1,179 +0,0 @@ -# Playground Deployment Guide - -This document explains the deployment setup for the pgflow playground example, including important caveats and requirements for CI/CD. - -## Overview - -The playground is a Next.js application deployed to Netlify. It demonstrates pgflow features using Supabase Edge Functions and requires careful coordination between build and deployment steps. - -## Key Configuration Files - -### 1. `project.json` - Nx Configuration - -The playground uses specific output paths that may seem unusual but are required for Next.js + Netlify: - -```json -{ - "build": { - "executor": "@nx/next:build", - "outputs": ["{projectRoot}/.next"], - "options": { - "outputPath": "{projectRoot}" // ⚠️ This is correct - do not change! - } - } -} -``` - -**Why `outputPath: {projectRoot}`?** -- Next.js builds into `.next` folder within the project root -- Netlify needs access to the entire project structure (including `package.json`, `next.config.js`) -- The Netlify Next.js plugin expects standard Next.js directory layout -- Changing this breaks the deployment - -### 2. `netlify.toml` - Netlify Configuration - -```toml -[build] - base = "examples/playground" - command = "pnpm build" - publish = ".next" - -[[plugins]] - package = "@netlify/plugin-nextjs" -``` - -**Important Notes:** -- `base` must point to the playground directory -- `publish` is `.next` (not `dist` or other paths) -- The Next.js plugin handles serverless function generation - -## CI/CD Requirements - -### 1. Build Dependencies First - -The playground imports from workspace packages (`@pgflow/client`, `@pgflow/dsl`). These MUST be built before the playground: - -```yaml -# Build dependencies first -- run: pnpm nx run-many -t build --projects client,dsl --configuration=production - -# Then deploy playground -- run: pnpm netlify deploy --build --filter=playground -``` - -### 2. Environment Variables - -Different environments require different Supabase configurations: - -**Preview Deployments (PRs):** -```yaml -NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.DEMO_PREVIEW_SUPABASE_URL }} -NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.DEMO_PREVIEW_SUPABASE_ANON_KEY }} -``` - -**Production Deployments:** -```yaml -NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.DEMO_PRODUCTION_SUPABASE_URL }} -NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.DEMO_PRODUCTION_SUPABASE_ANON_KEY }} -``` - -### 3. Netlify CLI Authentication - -Required secrets: -- `NETLIFY_AUTH_TOKEN` - Personal access token from Netlify -- `NETLIFY_SITE_ID` - The site's unique identifier - -### 4. Deployment Commands - -**Preview Deployment:** -```bash -pnpm netlify deploy --build --filter=playground \ - --context deploy-preview \ - --alias=pr-${{ github.event.pull_request.number }} -``` - -**Production Deployment:** -```bash -pnpm netlify deploy --build --filter=playground \ - --context production \ - --prod -``` - -## Common Issues and Solutions - -### Issue: "Cannot find module @pgflow/client" - -**Cause:** Dependencies not built before playground deployment - -**Solution:** Always build `client` and `dsl` packages first: -```bash -pnpm nx run-many -t build --projects client,dsl -``` - -### Issue: Netlify can't find Next.js app - -**Cause:** Incorrect `outputPath` in project.json - -**Solution:** Keep `outputPath: "{projectRoot}"` - do not change to `dist/` or other paths - -### Issue: Preview URLs not working - -**Cause:** Incorrect alias format - -**Solution:** Use predictable aliases like `pr-123`: -- Preview URL format: `https://pr-123--pgflow-demo.netlify.app` -- Site name is `pgflow-demo`, not the site ID - -### Issue: Environment variables not available in build - -**Cause:** Variables set in CI but not passed to Netlify build - -**Solution:** Either: -1. Set them in Netlify UI (recommended for secrets) -2. Pass them explicitly in the deploy command -3. Use Netlify's environment variable UI for different contexts - -## Local Testing - -To test the deployment process locally: - -```bash -# 1. Build dependencies -pnpm nx run-many -t build --projects client,dsl - -# 2. Build playground -pnpm nx build playground - -# 3. Test Netlify build (requires Netlify CLI) -cd examples/playground -netlify build - -# 4. Preview locally -netlify dev -``` - -## Deployment Flow - -1. **CI triggers** on PR or push to main -2. **Build job** runs tests and builds all affected projects -3. **Deploy job** checks out code, rebuilds dependencies, and deploys -4. **PR comment** posts deployment status with preview URL - -## Important Caveats - -1. **Do NOT cache node_modules between build and deploy jobs** - The deploy job needs to rebuild to ensure proper module resolution - -2. **Always use `--filter=playground`** with Netlify CLI to ensure it runs from the correct directory - -3. **The `--build` flag is intentional** - It ensures Netlify runs its build process with proper context - -4. **Nx Cloud caching helps** but doesn't replace the need to rebuild in deploy job - -5. **Environment variables must be set before build** - Next.js bakes them in at build time - -## Future Improvements - -- Consider using Nx artifacts to pass built packages between jobs -- Implement deployment status checks -- Add rollback capabilities -- Extract deployment URL from Netlify CLI output for accurate PR comments \ No newline at end of file diff --git a/examples/playground/LICENSE b/examples/playground/LICENSE deleted file mode 100644 index 1255b6b41..000000000 --- a/examples/playground/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2025 Wojciech Majewski - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/examples/playground/README.md b/examples/playground/README.md deleted file mode 100644 index 85903648a..000000000 --- a/examples/playground/README.md +++ /dev/null @@ -1,159 +0,0 @@ - - Next.js and Supabase Starter Kit - the fastest way to build apps with Next.js and Supabase -

Next.js and Supabase Starter Kit

-
- -

- The fastest way to build apps with Next.js and Supabase -

- -

- Features · - Demo · - Deploy to Vercel · - Clone and run locally · - Feedback and issues - More Examples -

-
- -## Features - -- Works across the entire [Next.js](https://nextjs.org) stack - - App Router - - Pages Router - - Middleware - - Client - - Server - - It just works! -- supabase-ssr. A package to configure Supabase Auth to use cookies -- Styling with [Tailwind CSS](https://tailwindcss.com) -- Components with [shadcn/ui](https://ui.shadcn.com/) -- Optional deployment with [Supabase Vercel Integration and Vercel deploy](#deploy-your-own) - - Environment variables automatically assigned to Vercel project - -## Demo - -You can view a fully working demo at [demo-nextjs-with-supabase.vercel.app](https://demo-nextjs-with-supabase.vercel.app/). - -## Deploy to Vercel - -Vercel deployment will guide you through creating a Supabase account and project. - -After installation of the Supabase integration, all relevant environment variables will be assigned to the project so the deployment is fully functioning. - -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnext.js%2Ftree%2Fcanary%2Fexamples%2Fwith-supabase&project-name=nextjs-with-supabase&repository-name=nextjs-with-supabase&demo-title=nextjs-with-supabase&demo-description=This+starter+configures+Supabase+Auth+to+use+cookies%2C+making+the+user%27s+session+available+throughout+the+entire+Next.js+app+-+Client+Components%2C+Server+Components%2C+Route+Handlers%2C+Server+Actions+and+Middleware.&demo-url=https%3A%2F%2Fdemo-nextjs-with-supabase.vercel.app%2F&external-id=https%3A%2F%2Fgithub.com%2Fvercel%2Fnext.js%2Ftree%2Fcanary%2Fexamples%2Fwith-supabase&demo-image=https%3A%2F%2Fdemo-nextjs-with-supabase.vercel.app%2Fopengraph-image.png) - -The above will also clone the Starter kit to your GitHub, you can clone that locally and develop locally. - -If you wish to just develop locally and not deploy to Vercel, [follow the steps below](#clone-and-run-locally). - -## Clone and run locally - -1. You'll first need a Supabase project which can be made [via the Supabase dashboard](https://database.new) - -2. Create a Next.js app using the Supabase Starter template npx command - - ```bash - npx create-next-app --example with-supabase with-supabase-app - ``` - - ```bash - yarn create next-app --example with-supabase with-supabase-app - ``` - - ```bash - pnpm create next-app --example with-supabase with-supabase-app - ``` - -3. Use `cd` to change into the app's directory - - ```bash - cd with-supabase-app - ``` - -4. Rename `.env.example` to `.env.local` and update the following: - - ``` - NEXT_PUBLIC_SUPABASE_URL=[INSERT SUPABASE PROJECT URL] - NEXT_PUBLIC_SUPABASE_ANON_KEY=[INSERT SUPABASE PROJECT API ANON KEY] - ``` - - Both `NEXT_PUBLIC_SUPABASE_URL` and `NEXT_PUBLIC_SUPABASE_ANON_KEY` can be found in [your Supabase project's API settings](https://app.supabase.com/project/_/settings/api) - -5. Set up GitHub OAuth provider: - - - Go to [GitHub Developer Settings](https://github.com/settings/developers) - - Click "New OAuth App" - - Fill in the form: - - Application name: (Your app name) - - Homepage URL: `http://localhost:3000` - - Authorization callback URL: `http://localhost:3000/auth/callback` - - Click "Register application" - - Copy the Client ID - - Generate a new Client Secret and copy it - - In your Supabase dashboard, go to Authentication > Providers - - Find GitHub and enable it - - Enter your GitHub Client ID and Client Secret - - Save changes - -6. You can now run the Next.js local development server: - - ```bash - npm run dev - ``` - - The starter kit should now be running on [localhost:3000](http://localhost:3000/). - -7. This template comes with the default shadcn/ui style initialized. If you instead want other ui.shadcn styles, delete `components.json` and [re-install shadcn/ui](https://ui.shadcn.com/docs/installation/next) - -> Check out [the docs for Local Development](https://supabase.com/docs/guides/getting-started/local-development) to also run Supabase locally. - -## Utility Scripts - -### run_sql.sh - -A convenient script for running SQL queries against the local Supabase database without needing to remember connection strings. - -Location: `./scripts/run_sql.sh` - -#### Usage Examples - -```bash -# Run a simple query -./scripts/run_sql.sh "SELECT * FROM pgflow.flows;" - -# Check cron job status -./scripts/run_sql.sh "SELECT * FROM cron.job WHERE jobname = 'pgflow-analyze-website-worker';" - -# View HTTP responses from pg_net -./scripts/run_sql.sh "SELECT id, status_code, created FROM net._http_response ORDER BY created DESC LIMIT 10;" - -# Check pgflow task processing -./scripts/run_sql.sh "SELECT * FROM pgflow.step_tasks WHERE status = 'completed' ORDER BY completed_at DESC LIMIT 10;" - -# Run with explicit -c flag -./scripts/run_sql.sh -c "SELECT COUNT(*) FROM pgflow.step_tasks;" - -# Run a SQL file -./scripts/run_sql.sh -f some_script.sql - -# Pipe SQL to the script -echo "SELECT NOW();" | ./scripts/run_sql.sh -``` - -The script automatically: -- Gets the database URL from `supabase status` -- Checks if Supabase is running -- Passes through all psql options -- Handles both direct SQL queries and file execution - -## Feedback and issues - -Please file feedback and issues over on the [Supabase GitHub org](https://github.com/supabase/supabase/issues/new/choose). - -## More Supabase examples - -- [Next.js Subscription Payments Starter](https://github.com/vercel/nextjs-subscription-payments) -- [Cookie-based Auth and the Next.js 13 App Router (free course)](https://youtube.com/playlist?list=PL5S4mPUpp4OtMhpnp93EFSo42iQ40XjbF) -- [Supabase Auth and the Next.js App Router](https://github.com/supabase/supabase/tree/master/examples/auth/nextjs) diff --git a/examples/playground/app/(auth-pages)/forgot-password/page.tsx b/examples/playground/app/(auth-pages)/forgot-password/page.tsx deleted file mode 100644 index 33da02906..000000000 --- a/examples/playground/app/(auth-pages)/forgot-password/page.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { forgotPasswordAction } from "@/app/actions"; -import { FormMessage, Message } from "@/components/form-message"; -import { SubmitButton } from "@/components/submit-button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import Link from "next/link"; -import { SmtpMessage } from "../smtp-message"; - -export const dynamic = 'force-static'; - -export default async function ForgotPassword(props: { - searchParams: Promise; -}) { - const searchParams = await props.searchParams; - return ( - <> -
-
-

Reset Password

-

- Already have an account?{" "} - - Sign in - -

-
-
- - - - Reset Password - - -
-
- - - ); -} diff --git a/examples/playground/app/(auth-pages)/layout.tsx b/examples/playground/app/(auth-pages)/layout.tsx deleted file mode 100644 index e038de15a..000000000 --- a/examples/playground/app/(auth-pages)/layout.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export default async function Layout({ - children, -}: { - children: React.ReactNode; -}) { - return ( -
{children}
- ); -} diff --git a/examples/playground/app/(auth-pages)/sign-in/page.tsx b/examples/playground/app/(auth-pages)/sign-in/page.tsx deleted file mode 100644 index 1b96369c7..000000000 --- a/examples/playground/app/(auth-pages)/sign-in/page.tsx +++ /dev/null @@ -1,109 +0,0 @@ -'use client'; -export const runtime = 'edge'; - -import { signInAction } from '@/app/actions'; -import { FormMessage, Message } from '@/components/form-message'; -import { GithubButton } from '@/components/github-button'; -import { SubmitButton } from '@/components/submit-button'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; -import Link from 'next/link'; -import { useRouter } from 'next/navigation'; -import { useEffect, useState } from 'react'; -import { createClient } from '@/utils/supabase/client'; - -export default function Login({ - searchParams, -}: { - searchParams: Promise; -}) { - const [message, setMessage] = useState(null); - const [isLoading, setIsLoading] = useState(false); - const router = useRouter(); - - // After successful login, redirect to home page - useEffect(() => { - // Process the searchParams Promise when component mounts - const processSearchParams = async () => { - try { - const resolvedParams = await searchParams; - setMessage(resolvedParams); - } catch (error) { - console.error('Error processing searchParams:', error); - } - }; - - processSearchParams(); - - const checkAuth = async () => { - const supabase = createClient(); - const { - data: { user }, - } = await supabase.auth.getUser(); - - // If user is logged in and we're on the sign-in page, redirect to home - if ( - user && - typeof window !== 'undefined' && - window.location.pathname === '/sign-in' - ) { - router.push('/'); - } - }; - - checkAuth(); - }, [router, searchParams]); - - return ( -
{ - e.preventDefault(); - setIsLoading(true); - }}> -

Sign in

-

- Don't have an account?{' '} - - Sign up - -

-
- -
-
- Or continue with email -
-
- - -
- - - Forgot Password? - -
- - - Sign in with email - - -
-
- ); -} diff --git a/examples/playground/app/(auth-pages)/sign-up/page.tsx b/examples/playground/app/(auth-pages)/sign-up/page.tsx deleted file mode 100644 index 3ea6672db..000000000 --- a/examples/playground/app/(auth-pages)/sign-up/page.tsx +++ /dev/null @@ -1,85 +0,0 @@ -'use client'; -export const runtime = 'edge'; - -import { signUpAction } from "@/app/actions"; -import { FormMessage, Message } from "@/components/form-message"; -import { GithubButton } from "@/components/github-button"; -import { SubmitButton } from "@/components/submit-button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import Link from "next/link"; -import { useState, useEffect } from 'react'; - -export default function Signup(props: { - searchParams: Promise; -}) { - const [message, setMessage] = useState(null); - const [isLoading, setIsLoading] = useState(false); - - useEffect(() => { - const processSearchParams = async () => { - try { - const resolvedParams = await props.searchParams; - setMessage(resolvedParams); - } catch (error) { - console.error('Error processing searchParams:', error); - } - }; - - processSearchParams(); - }, [props.searchParams]); - - if (message && "message" in message) { - return ( -
- -
- ); - } - - return ( - <> -
setIsLoading(true)}> -

Sign up

-

- Already have an account?{" "} - - Sign in - -

-
- -
-
- Or sign up with email -
-
- - - - - - Sign up with email - - -
-
- - ); -} diff --git a/examples/playground/app/(auth-pages)/smtp-message.tsx b/examples/playground/app/(auth-pages)/smtp-message.tsx deleted file mode 100644 index 84c21fce2..000000000 --- a/examples/playground/app/(auth-pages)/smtp-message.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { ArrowUpRight, InfoIcon } from "lucide-react"; -import Link from "next/link"; - -export function SmtpMessage() { - return ( -
- -
- - Note: Emails are rate limited. Enable Custom SMTP to - increase the rate limit. - -
- - Learn more - -
-
-
- ); -} diff --git a/examples/playground/app/actions.ts b/examples/playground/app/actions.ts deleted file mode 100644 index b4f55c299..000000000 --- a/examples/playground/app/actions.ts +++ /dev/null @@ -1,148 +0,0 @@ -'use server'; - -import { encodedRedirect } from '@/utils/utils'; -import { createClient } from '@/utils/supabase/server'; -import { headers } from 'next/headers'; -import { redirect } from 'next/navigation'; - -export const signUpAction = async (formData: FormData) => { - const email = formData.get('email')?.toString(); - const password = formData.get('password')?.toString(); - const supabase = await createClient(); - - if (!email || !password) { - return encodedRedirect( - 'error', - '/sign-up', - 'Email and password are required', - ); - } - - // Sign up with auto-confirm enabled (skip email verification) - const { error: signUpError } = await supabase.auth.signUp({ - email, - password, - options: { - // Disable email confirmation flow - emailRedirectTo: undefined, - // Auto-confirm the user - data: { - email_confirmed: true - } - }, - }); - - if (signUpError) { - console.error(signUpError.code + ' ' + signUpError.message); - return encodedRedirect('error', '/sign-up', signUpError.message); - } - - // Automatically sign in the user after sign up - const { error: signInError } = await supabase.auth.signInWithPassword({ - email, - password, - }); - - if (signInError) { - console.error(signInError.code + ' ' + signInError.message); - return encodedRedirect('error', '/sign-up', 'Sign up successful but could not automatically sign in.'); - } - - // Redirect to home page - return redirect('/'); -}; - -export const signInAction = async (formData: FormData) => { - const email = formData.get('email') as string; - const password = formData.get('password') as string; - const supabase = await createClient(); - - const { error } = await supabase.auth.signInWithPassword({ - email, - password, - }); - - if (error) { - return encodedRedirect('error', '/sign-in', error.message); - } - - // Redirect to home page - return redirect('/'); -}; - -export const forgotPasswordAction = async (formData: FormData) => { - const email = formData.get('email')?.toString(); - const supabase = await createClient(); - const origin = (await headers()).get('origin'); - const callbackUrl = formData.get('callbackUrl')?.toString(); - - if (!email) { - return encodedRedirect('error', '/forgot-password', 'Email is required'); - } - - const { error } = await supabase.auth.resetPasswordForEmail(email, { - redirectTo: `${origin}/auth/callback?redirect_to=/protected/reset-password`, - }); - - if (error) { - console.error(error.message); - return encodedRedirect( - 'error', - '/forgot-password', - 'Could not reset password', - ); - } - - if (callbackUrl) { - return redirect(callbackUrl); - } - - return encodedRedirect( - 'success', - '/forgot-password', - 'Check your email for a link to reset your password.', - ); -}; - -export const resetPasswordAction = async (formData: FormData) => { - const supabase = await createClient(); - - const password = formData.get('password') as string; - const confirmPassword = formData.get('confirmPassword') as string; - - if (!password || !confirmPassword) { - encodedRedirect( - 'error', - '/protected/reset-password', - 'Password and confirm password are required', - ); - } - - if (password !== confirmPassword) { - encodedRedirect( - 'error', - '/protected/reset-password', - 'Passwords do not match', - ); - } - - const { error } = await supabase.auth.updateUser({ - password: password, - }); - - if (error) { - encodedRedirect( - 'error', - '/protected/reset-password', - 'Password update failed', - ); - } - - encodedRedirect('success', '/protected/reset-password', 'Password updated'); -}; - -export const signOutAction = async () => { - const supabase = await createClient(); - await supabase.auth.signOut(); - return redirect('/sign-in'); -}; diff --git a/examples/playground/app/auth/callback/route.ts b/examples/playground/app/auth/callback/route.ts deleted file mode 100644 index 0c32b07cd..000000000 --- a/examples/playground/app/auth/callback/route.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createClient } from '@/utils/supabase/server'; -import { NextResponse } from 'next/server'; - -export async function GET(request: Request) { - // The `/auth/callback` route is required for the server-side auth flow implemented - // by the SSR package. It exchanges an auth code for the user's session. - // https://supabase.com/docs/guides/auth/server-side/nextjs - const requestUrl = new URL(request.url); - const code = requestUrl.searchParams.get('code'); - const origin = requestUrl.origin; - const redirectTo = requestUrl.searchParams.get('redirect_to')?.toString(); - - console.log('Auth callback - code:', code); - console.log('Auth callback - origin:', origin); - console.log('Auth callback - redirectTo:', redirectTo); - - if (code) { - const supabase = await createClient(); - const { data, error } = await supabase.auth.exchangeCodeForSession(code); - console.log('Exchange code result - data:', data); - console.log('Exchange code result - error:', error); - } - - if (redirectTo) { - return NextResponse.redirect(`${origin}${redirectTo}`); - } - - // URL to redirect to after sign up process completes - return NextResponse.redirect(`${origin}/`); -} diff --git a/examples/playground/app/globals.css b/examples/playground/app/globals.css deleted file mode 100644 index 7e4a2c8b8..000000000 --- a/examples/playground/app/globals.css +++ /dev/null @@ -1,90 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 0 0% 3.9%; - --card: 0 0% 100%; - --card-foreground: 0 0% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 0 0% 3.9%; - --primary: 0 0% 9%; - --primary-foreground: 0 0% 98%; - --secondary: 0 0% 96.1%; - --secondary-foreground: 0 0% 9%; - --muted: 0 0% 96.1%; - --muted-foreground: 0 0% 45.1%; - --accent: 0 0% 96.1%; - --accent-foreground: 0 0% 9%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 89.8%; - --input: 0 0% 89.8%; - --ring: 0 0% 3.9%; - --radius: 0.5rem; - --chart-1: 12 76% 61%; - --chart-2: 173 58% 39%; - --chart-3: 197 37% 24%; - --chart-4: 43 74% 66%; - --chart-5: 27 87% 67%; - } - - .dark { - --background: 0 0% 3.9%; - --foreground: 0 0% 98%; - --card: 0 0% 3.9%; - --card-foreground: 0 0% 98%; - --popover: 0 0% 3.9%; - --popover-foreground: 0 0% 98%; - --primary: 0 0% 98%; - --primary-foreground: 0 0% 9%; - --secondary: 0 0% 14.9%; - --secondary-foreground: 0 0% 98%; - --muted: 0 0% 14.9%; - --muted-foreground: 0 0% 63.9%; - --accent: 0 0% 14.9%; - --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 0% 98%; - --border: 0 0% 14.9%; - --input: 0 0% 14.9%; - --ring: 0 0% 83.1%; - --chart-1: 220 70% 50%; - --chart-2: 160 60% 45%; - --chart-3: 30 80% 55%; - --chart-4: 280 65% 60%; - --chart-5: 340 75% 55%; - } -} - -@layer base { - * { - @apply border-border; - } - - body { - @apply bg-background text-foreground; - } -} - -/********** CUSTOM OVERRIDES **********/ - -@keyframes breathe { - 0% { - opacity: 0.4; - } - - 50% { - opacity: 1; - } - - 100% { - opacity: 0.4; - } -} - -.breathing { - animation: breathe 2s infinite ease-in-out; -} diff --git a/examples/playground/app/layout.tsx b/examples/playground/app/layout.tsx deleted file mode 100644 index 7fd446c14..000000000 --- a/examples/playground/app/layout.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import { EnvVarWarning } from '@/components/env-var-warning'; -import HeaderAuth from '@/components/header-auth'; -import { LoadingStateProvider } from '@/components/loading-state-provider'; -import { PgflowClientProvider } from '@/lib/pgflow-client-provider'; -import { MobileLinks } from '@/components/mobile-links'; -import { ThemeSwitcher } from '@/components/theme-switcher'; -import { hasEnvVars } from '@/utils/supabase/check-env-vars'; -import { Geist } from 'next/font/google'; -import { ThemeProvider } from 'next-themes'; -import Link from 'next/link'; -import { - BookOpen, - Github, - AlertCircle, - Twitter, - MessagesSquare, -} from 'lucide-react'; -import './globals.css'; - -// import PlausibleProvider from 'next-plausible'; - -const defaultUrl = process.env.VERCEL_URL - ? `https://${process.env.VERCEL_URL}` - : 'http://localhost:3000'; - -export const metadata = { - metadataBase: new URL(defaultUrl), - title: 'pgflow', - description: 'Place to test and understand how pgflow works.', -}; - -const geistSans = Geist({ - display: 'swap', - subsets: ['latin'], -}); - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - {/* */} - - - -
-
- -
- {children} -
- - -
-
-
-
-
- {/*
*/} - - - ); -} diff --git a/examples/playground/app/page.tsx b/examples/playground/app/page.tsx deleted file mode 100644 index 493c2814e..000000000 --- a/examples/playground/app/page.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import WebsiteAnalyzerForm from '@/components/website-analyzer-form'; -import ExampleLinks from '@/components/example-links'; - -export const runtime = 'edge'; - -export default function Home() { - - return ( - <> -
-
- -
-

How it works

-

- Enter a URL in the form to analyze a website. Our tool will scrape - it then use AI to summarize it and extract tags. -

- -
-

- Example Websites to Analyze -

- -
-
-
-
- - ); -} diff --git a/examples/playground/app/protected/page.tsx b/examples/playground/app/protected/page.tsx deleted file mode 100644 index 5508abab3..000000000 --- a/examples/playground/app/protected/page.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import FetchDataSteps from "@/components/tutorial/fetch-data-steps"; -import { createClient } from "@/utils/supabase/server"; -import { InfoIcon } from "lucide-react"; -import { redirect } from "next/navigation"; - -export default async function ProtectedPage() { - const supabase = await createClient(); - - const { - data: { user }, - } = await supabase.auth.getUser(); - - if (!user) { - return redirect("/sign-in"); - } - - return ( -
-
-
- - This is a protected page that you can only see as an authenticated - user -
-
-
-

Your user details

-
-          {JSON.stringify(user, null, 2)}
-        
-
-
-

Next steps

- -
-
- ); -} diff --git a/examples/playground/app/protected/reset-password/page.tsx b/examples/playground/app/protected/reset-password/page.tsx deleted file mode 100644 index 1eb8fa55c..000000000 --- a/examples/playground/app/protected/reset-password/page.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { resetPasswordAction } from '@/app/actions'; -import { FormMessage, Message } from '@/components/form-message'; -import { SubmitButton } from '@/components/submit-button'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; - -export default async function ResetPassword(props: { - searchParams: Promise; -}) { - const searchParams = await props.searchParams; - return ( -
-

Reset password

-

- Please enter your new password below. -

- - - - - - Reset password - - - - ); -} diff --git a/examples/playground/app/websites/page.tsx b/examples/playground/app/websites/page.tsx deleted file mode 100644 index d61b45bdc..000000000 --- a/examples/playground/app/websites/page.tsx +++ /dev/null @@ -1,132 +0,0 @@ -'use client'; - -import { createClient } from '@/utils/supabase/client'; -import { useEffect, useState } from 'react'; -import { useStartAnalysis } from '@/lib/hooks/use-start-analysis'; -import type { Database } from '@/supabase/functions/database-types'; -import { Label } from '@/components/ui/label'; -import { Input } from '@/components/ui/input'; -import { FormMessage } from '@/components/form-message'; -import { SubmitButton } from '@/components/submit-button'; -import { SkeletonTable } from '@/components/skeleton-table'; - -type WebsiteRow = Database['public']['Tables']['websites']['Row']; - -export default function Page() { - const [websites, setWebsites] = useState(null); - const [url, setUrl] = useState('https://reddit.com/r/supabase'); - const { start: startAnalysis, isPending, error: formError } = useStartAnalysis(); - const supabase = createClient(); - - // Process URL parameter when the component mounts - useEffect(() => { - const getData = async () => { - const { data } = await supabase.from('websites').select(); - setWebsites(data); - }; - getData(); - - // Check for URL parameter and start analysis if present - if (typeof window !== 'undefined') { - const urlParams = new URLSearchParams(window.location.search); - const urlParam = urlParams.get('url'); - - if (urlParam) { - setUrl(urlParam); - console.log("Found URL parameter, starting analysis:", urlParam); - - // Use a tiny delay to ensure we're already in the client-side - // This helps prevent the page from fully rendering before redirecting - setTimeout(() => { - startAnalysis(urlParam); - }, 10); - } - } - }, [startAnalysis]); - - async function startAnalyzeWebsiteFlow(formData: FormData) { - const url = formData.get('url') as string; - if (url) { - startAnalysis(url); - } - } - - return ( -
-
-
-
-

Analyze a Website

-

- Enter a URL to analyze a website -

-
- - setUrl(e.target.value)} - required - disabled={isPending} - /> -
- - Start Analysis - - {formError && } - -
- -
-

Your Websites

- {websites === null ? ( - - ) : websites.length > 0 ? ( -
-
- - - - - - - - - - {websites.map((website) => ( - - - - - - ))} - -
IDURLCreated At
{website.id}{website.website_url} - {new Date(website.created_at).toLocaleString()} -
-
-
- ) : ( -

No websites analyzed yet

- )} - -
- - View Raw Data - -
-              {JSON.stringify(websites, null, 2)}
-            
-
-
-
-
- ); -} diff --git a/examples/playground/app/websites/runs/[run_id]/page.tsx b/examples/playground/app/websites/runs/[run_id]/page.tsx deleted file mode 100644 index ee0d822de..000000000 --- a/examples/playground/app/websites/runs/[run_id]/page.tsx +++ /dev/null @@ -1,153 +0,0 @@ -'use client'; - -import { useParams } from 'next/navigation'; -import { FlowRunProvider, useFlowRun } from '@/components/flow-run-provider'; -import FlowRunDetails from '@/components/flow-run-details'; -import WebsiteAnalysisUI from '@/components/website-analysis-ui'; -import { useState } from 'react'; - -// Component that uses the shared context -function RunPageContent() { - const [isPinned, setIsPinned] = useState(() => { - // Initialize from localStorage if available (client-side only) - if (typeof window !== 'undefined') { - const saved = localStorage.getItem('techDetailsPinned'); - return saved !== null ? saved === 'true' : true; // Default to true if not set - } - return true; // Default to true - }); - - const { flowRun, loading, error } = useFlowRun(); - - return ( -
- {/* Debug panel: Technical details - first on mobile, right side on desktop */} -
-
- {/* Pin button for keeping sidebar visible - moved to right side */} -
{ - e.stopPropagation(); - const newPinned = !isPinned; - setIsPinned(newPinned); - // Save to localStorage - if (typeof window !== 'undefined') { - localStorage.setItem('techDetailsPinned', newPinned.toString()); - } - }} - > - - {isPinned ? "Panel always visible" : "Always show this panel"} - -
- {isPinned && ( - - - - )} -
-
- - {/* Interactive hover hint overlay - only shown when not pinned */} - {!isPinned && ( - <> -
- - {/* Large centered hint */} -
-
- - - - - -

- Hover to reveal -

-
- - {/* Pulsing animation to draw attention */} -
-
- - {/* Floating hint badge at bottom right */} -
- - - - - - - Hover to reveal -
- - )} - - -
-
- - {/* Main panel: User-friendly UI - second on mobile, left side on desktop */} -
- -
-
- ); -} - -export default function RunPage() { - const params = useParams(); - const runId = params.run_id as string; - - - return ( - - - - ); -} \ No newline at end of file diff --git a/examples/playground/app/websites/runs/layout.tsx b/examples/playground/app/websites/runs/layout.tsx deleted file mode 100644 index 7174ac1b0..000000000 --- a/examples/playground/app/websites/runs/layout.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function RunsLayout({ - children, -}: { - children: React.ReactNode; -}) { - return
{children}
; -} diff --git a/examples/playground/app/websites/runs/page.tsx b/examples/playground/app/websites/runs/page.tsx deleted file mode 100644 index aca8b97e8..000000000 --- a/examples/playground/app/websites/runs/page.tsx +++ /dev/null @@ -1,120 +0,0 @@ -'use client'; - -import { createClient } from '@/utils/supabase/client'; -import { useEffect, useState } from 'react'; -import Link from 'next/link'; - -import { Database } from '@/supabase/functions/database-types'; - -type RunRow = Database['pgflow']['Tables']['runs']['Row']; - -export default function RunsListPage() { - const [runs, setRuns] = useState([]); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - const supabase = createClient(); - - useEffect(() => { - const fetchRuns = async () => { - try { - setLoading(true); - - const { data, error } = await supabase - .schema('pgflow') - .from('runs') - .select('*'); - - if (error) { - setError(`Error fetching runs: ${error.message}`); - return; - } - - setRuns(data || []); - } catch (err) { - console.error('Error fetching runs:', err); - setError('An error occurred while fetching runs'); - } finally { - setLoading(false); - } - }; - - fetchRuns(); - }, [supabase]); - - if (loading) { - return ( -
-
-
-
-

Loading runs...

-
-
-
- ); - } - - if (error) { - return ( -
-
-

Error

-

{error}

-
-
- ); - } - - return ( -
-

Website Analysis Runs

- - {runs.length === 0 ? ( -
-

No runs found

- - Analyze a website - -
- ) : ( -
- {runs.map((run) => ( - -
-
-

{run.flow_slug}

-

- {new Date(run.started_at).toLocaleString()} -

-
-
- - - {run.status || 'unknown'} - -
-
- - ))} -
- )} -
- ); -} diff --git a/examples/playground/components.json b/examples/playground/components.json deleted file mode 100644 index ec9676bf2..000000000 --- a/examples/playground/components.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "default", - "rsc": true, - "tsx": true, - "tailwind": { - "config": "tailwind.config.ts", - "css": "app/globals.css", - "baseColor": "neutral", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/lib/utils" - } -} diff --git a/examples/playground/components/deploy-button.tsx b/examples/playground/components/deploy-button.tsx deleted file mode 100644 index 8a5a19209..000000000 --- a/examples/playground/components/deploy-button.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import Link from "next/link"; -import { Button } from "./ui/button"; - -export default function DeployButton() { - return ( - <> - - - - - ); -} diff --git a/examples/playground/components/env-var-warning.tsx b/examples/playground/components/env-var-warning.tsx deleted file mode 100644 index b6a193f6c..000000000 --- a/examples/playground/components/env-var-warning.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import Link from "next/link"; -import { Badge } from "./ui/badge"; -import { Button } from "./ui/button"; - -export function EnvVarWarning() { - return ( -
- - Supabase environment variables required - -
- - -
-
- ); -} diff --git a/examples/playground/components/example-links.tsx b/examples/playground/components/example-links.tsx deleted file mode 100644 index 65a43a7d6..000000000 --- a/examples/playground/components/example-links.tsx +++ /dev/null @@ -1,44 +0,0 @@ -'use client'; - -import { useStartAnalysis } from '@/lib/hooks/use-start-analysis'; -import { exampleLinks } from '@/lib/example-links'; -import { useLoadingState } from './loading-state-provider'; - -export default function ExampleLinks() { - const { start, isPending } = useStartAnalysis(); - const { setLoading } = useLoadingState(); - - // Function to handle example link clicks - const handleExampleClick = (e: React.MouseEvent, url: string) => { - e.preventDefault(); - if (isPending) return; - - // Set global loading state to true - setLoading(true); - - // Start analysis will handle auth check and redirect - start(url); - }; - - return ( - - ); -} \ No newline at end of file diff --git a/examples/playground/components/flow-run-details.tsx b/examples/playground/components/flow-run-details.tsx deleted file mode 100644 index 43e5ae8ce..000000000 --- a/examples/playground/components/flow-run-details.tsx +++ /dev/null @@ -1,182 +0,0 @@ -'use client'; - -import { useEffect, useState } from 'react'; -import type { FlowRun } from '@pgflow/client'; -import type { AnyFlow } from '@pgflow/dsl'; -import { - Collapsible, - CollapsibleContent, - CollapsibleTrigger, -} from '@/components/ui/collapsible'; -import JSONHighlighter from '@/components/json-highlighter'; -import { FormMessage } from '@/components/form-message'; -import { useElapsedTime } from '@/lib/hooks/use-elapsed-time'; - -// Format time difference in a concise way (e.g., "5s", "3m 45s", "2h 15m") -function formatTimeDifference( - startDate: Date | null, - endDate: Date | null, -): string { - if (!startDate) return ''; - - const start = startDate; - const end = endDate || new Date(); - - const diffMs = end.getTime() - start.getTime(); - const diffSec = Math.floor(diffMs / 1000); - - if (diffSec < 1) { - return '< 1s'; - } - - if (diffSec < 60) { - return `${diffSec}s`; - } - - const minutes = Math.floor(diffSec / 60); - const seconds = diffSec % 60; - - if (minutes < 60) { - return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`; - } - - const hours = Math.floor(minutes / 60); - const remainingMinutes = minutes % 60; - - return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`; -} - - -interface FlowRunDetailsProps { - runId: string; - flowRun: FlowRun | null; - loading: boolean; - error: string | null; -} - -export default function FlowRunDetails({ - runId, - flowRun, - loading, - error, -}: FlowRunDetailsProps) { - const [, setRefresh] = useState(0); - const elapsedTimeRef = useElapsedTime(flowRun?.started_at || null); - - useEffect(() => { - if (!flowRun) return; - - // Subscribe to all run events to trigger re-renders - const unsubscribeRun = flowRun.on('*', () => { - setRefresh(prev => prev + 1); - }); - - return () => { - unsubscribeRun(); - }; - }, [flowRun]); - - if (loading) { - return ( -
-
Loading flow run...
-
- ); - } - - if (error) { - return ( -
- -
- ); - } - - if (!flowRun) { - return ( -
-
No flow run found
-
- ); - } - - return ( -
-
-
-

Technical Details

- - {/* Run Info */} -
-
- Run ID: - {runId} -
-
- Status: - - {flowRun.status} - -
-
- Remaining Steps: - {flowRun.remaining_steps} -
- {flowRun.started_at && ( -
- Started: - -
- )} - {flowRun.completed_at && ( -
- Duration: - {formatTimeDifference(flowRun.started_at, flowRun.completed_at)} -
- )} -
-
- - {/* Flow Input/Output */} - {flowRun.input && ( - - -
- Flow Input -
-
- -
-
- -
-
-
-
- )} - - {flowRun.output && ( - - -
- Flow Output -
-
- -
-
- -
-
-
-
- )} -
-
- ); -} \ No newline at end of file diff --git a/examples/playground/components/flow-run-provider.tsx b/examples/playground/components/flow-run-provider.tsx deleted file mode 100644 index 81904337a..000000000 --- a/examples/playground/components/flow-run-provider.tsx +++ /dev/null @@ -1,121 +0,0 @@ -'use client'; - -import { createContext, useContext, useEffect, useState } from 'react'; -import { usePgflowClient } from '@/lib/pgflow-client-provider'; -import { useLoadingState } from './loading-state-provider'; -import type { FlowRun } from '@pgflow/client'; -import type { AnyFlow } from '@pgflow/dsl'; - -interface FlowRunContextType { - flowRun: FlowRun | null; - loading: boolean; - error: string | null; -} - -const FlowRunContext = createContext({ - flowRun: null, - loading: true, - error: null, -}); - -export const useFlowRun = () => useContext(FlowRunContext); - -interface FlowRunProviderProps { - runId: string; - children: React.ReactNode; -} - -export function FlowRunProvider({ runId, children }: FlowRunProviderProps) { - const [flowRun, setFlowRun] = useState | null>(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - const { setLoading: setGlobalLoading } = useLoadingState(); - const pgflow = usePgflowClient(); - - useEffect(() => { - if (!runId) return; - - setLoading(true); - // Set global loading state to true when initially loading run data - setGlobalLoading(true); - - // Track if this effect is still mounted - let isMounted = true; - - // Load the flow run - const loadFlowRun = async () => { - try { - - // Just call getRun - the PgflowClient will return cached instance if exists - const run = await pgflow.getRun(runId); - - if (!run) { - if (isMounted) { - setError('Flow run not found'); - setGlobalLoading(false); - setLoading(false); - } - return; - } - - if (!isMounted) return; - - setFlowRun(run); - - // Subscribe to all run events to update global loading - const unsubscribeStatus = run.on('*', (event) => { - if (event.status === 'completed' || event.status === 'failed') { - setGlobalLoading(false); - } - }); - - // Check initial status - const currentStatus = run.status; - if (currentStatus === 'completed' || currentStatus === 'failed') { - setGlobalLoading(false); - } - - if (isMounted) { - setLoading(false); - } - - // Return cleanup function - return () => { - unsubscribeStatus(); - // Don't dispose the run - let PgflowClient manage its cache - // pgflow.dispose(runId); - }; - } catch (err) { - if (isMounted) { - setError(err instanceof Error ? err.message : 'Failed to load flow run'); - setGlobalLoading(false); - setLoading(false); - } - return undefined; - } - }; - - let cleanup: (() => void) | undefined; - loadFlowRun().then(cleanupFn => { - if (isMounted) { - cleanup = cleanupFn; - } - }); - - return () => { - isMounted = false; - cleanup?.(); - }; - }, [runId, setGlobalLoading, pgflow]); - - const value = { - flowRun, - loading, - error, - }; - - return ( - {children} - ); -} \ No newline at end of file diff --git a/examples/playground/components/form-message.tsx b/examples/playground/components/form-message.tsx deleted file mode 100644 index 9917a814f..000000000 --- a/examples/playground/components/form-message.tsx +++ /dev/null @@ -1,26 +0,0 @@ -export type Message = - | { success: string } - | { error: string } - | { message: string }; - -export function FormMessage({ message }: { message: Message | null }) { - if (!message) return null; - - return ( -
- {'success' in message && ( -
- {message.success} -
- )} - {'error' in message && ( -
- {message.error} -
- )} - {'message' in message && ( -
{message.message}
- )} -
- ); -} diff --git a/examples/playground/components/github-button.tsx b/examples/playground/components/github-button.tsx deleted file mode 100644 index 5346ed858..000000000 --- a/examples/playground/components/github-button.tsx +++ /dev/null @@ -1,67 +0,0 @@ -'use client'; - -import { Button } from '@/components/ui/button'; -import { createClient } from '@/utils/supabase/client'; -import { useState } from 'react'; - -interface GithubButtonProps { - className?: string; - onLoadingChange?: (isLoading: boolean) => void; - disabled?: boolean; - text?: string; -} - -export function GithubButton({ className = '', onLoadingChange, disabled, text = 'Sign in with GitHub' }: GithubButtonProps) { - const [isLoadingLocal, setIsLoadingLocal] = useState(false); - - const handleGithubSignIn = async () => { - try { - setIsLoadingLocal(true); - onLoadingChange?.(true); - const supabase = createClient(); - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'github', - options: { - redirectTo: `${window.location.origin}/auth/callback`, - }, - }); - - if (error) { - console.error('GitHub OAuth error:', error); - setIsLoadingLocal(false); - onLoadingChange?.(false); - return; - } - - // Redirect to the OAuth URL - if (data?.url) { - window.location.href = data.url; - } - } catch (error) { - console.error('GitHub sign-in error:', error); - setIsLoadingLocal(false); - onLoadingChange?.(false); - } - }; - - return ( - - ); -} \ No newline at end of file diff --git a/examples/playground/components/header-auth.tsx b/examples/playground/components/header-auth.tsx deleted file mode 100644 index e0ac584da..000000000 --- a/examples/playground/components/header-auth.tsx +++ /dev/null @@ -1,103 +0,0 @@ -'use client' - -import { signOutAction } from "@/app/actions"; -import { hasEnvVars } from "@/utils/supabase/check-env-vars"; -import Link from "next/link"; -import { Badge } from "./ui/badge"; -import { Button } from "./ui/button"; -import { createClient } from "@/utils/supabase/client"; -import { SpinnerWrapper } from "./spinner-wrapper"; -import { useEffect, useState } from "react"; -import type { User } from "@supabase/supabase-js"; - -export default function AuthButton() { - const [user, setUser] = useState(null); - const [checking, setChecking] = useState(true); - - useEffect(() => { - const supabase = createClient(); - - // Initial auth check - supabase.auth.getUser().then(({ data, error }) => { - console.log('Auth check - user:', data.user); - console.log('Auth check - error:', error); - setUser(data.user ?? null); - setChecking(false); - }); - - // Listen for auth state changes - const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => { - console.log('Auth state changed:', _event, session?.user); - setUser(session?.user ?? null); - }); - - return () => subscription.unsubscribe(); - }, []); - - if (!hasEnvVars) { - return ( - <> -
-
- - Please update .env.local file with anon key and url - -
-
- - -
-
- - ); - } - - if (checking) { - return ; - } - - return user ? ( -
- -
- Hey, {user.email}! -
-
- -
-
- ) : ( -
- -
- - -
-
- ); -} diff --git a/examples/playground/components/hero.tsx b/examples/playground/components/hero.tsx deleted file mode 100644 index e7815d1a0..000000000 --- a/examples/playground/components/hero.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import NextLogo from './next-logo'; -import SupabaseLogo from './supabase-logo'; - -export default function Header() { - return ( -
-
- - - - - - - -
-

Supabase and Next.js Starter Template

-

- The fastest way to build apps with{' '} - - Supabase - {' '} - and{' '} - - Next.js - -

-
-
- ); -} diff --git a/examples/playground/components/json-highlighter.tsx b/examples/playground/components/json-highlighter.tsx deleted file mode 100644 index e82093980..000000000 --- a/examples/playground/components/json-highlighter.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Json } from '@/supabase/functions/database-types'; - -export default function JSONHighlighter({ data }: { data: Json }) { - const jsonString = JSON.stringify(data, null, 2) - .replace(/&/g, '&') - .replace(//g, '>') - .replace( - /("(\\u[\dA-Fa-f]{4}|\\[^u]|[^\\"])*"|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)/g, - (match) => { - let className = 'text-yellow-500'; // number - using yellow-500 (#eab308) - if (/^"/.test(match)) { - className = match.endsWith(':') - ? 'text-blue-500' // key - using blue-500 (#3b82f6) - : 'text-green-500'; // string - using green-500 (#22c55e) - } else if (/true|false/.test(match)) { - className = 'text-blue-500'; // boolean - using blue-500 (#3b82f6) - } else if (/null/.test(match)) { - className = 'text-red-500'; // null - using red-500 (#ef4444) - } - return `${match}`; - }, - ); - - return ( -
-      
-    
- ); -} diff --git a/examples/playground/components/loading-state-provider.tsx b/examples/playground/components/loading-state-provider.tsx deleted file mode 100644 index e9bafcf5e..000000000 --- a/examples/playground/components/loading-state-provider.tsx +++ /dev/null @@ -1,36 +0,0 @@ -'use client'; - -import { createContext, useContext, useState, ReactNode, useEffect, useCallback } from 'react'; -import { usePathname } from 'next/navigation'; - -interface LoadingState { - isLoading: boolean; - setLoading: (loading: boolean) => void; -} - -const LoadingStateContext = createContext({ - isLoading: false, - setLoading: () => { /* Default implementation */ }, -}); - -export const useLoadingState = () => useContext(LoadingStateContext); - -export function LoadingStateProvider({ children }: { children: ReactNode }) { - const [isLoading, setIsLoading] = useState(false); - const pathname = usePathname(); - - // Reset loading state when pathname changes - useEffect(() => { - setIsLoading(false); - }, [pathname]); - - const setLoading = useCallback((loading: boolean) => { - setIsLoading(loading); - }, []); - - return ( - - {children} - - ); -} \ No newline at end of file diff --git a/examples/playground/components/mobile-links.tsx b/examples/playground/components/mobile-links.tsx deleted file mode 100644 index fc6554e53..000000000 --- a/examples/playground/components/mobile-links.tsx +++ /dev/null @@ -1,83 +0,0 @@ -'use client'; - -import { useState } from 'react'; -import { BookOpen, Github, Twitter, AlertCircle, MessagesSquare, MoreHorizontal } from 'lucide-react'; - -export function MobileLinks() { - const [isOpen, setIsOpen] = useState(false); - - return ( -
- - - {isOpen && ( - - )} -
- ); -} \ No newline at end of file diff --git a/examples/playground/components/next-logo.tsx b/examples/playground/components/next-logo.tsx deleted file mode 100644 index 165558213..000000000 --- a/examples/playground/components/next-logo.tsx +++ /dev/null @@ -1,46 +0,0 @@ -export default function NextLogo() { - return ( - - - - - - - - - - - ); -} diff --git a/examples/playground/components/skeleton-table.tsx b/examples/playground/components/skeleton-table.tsx deleted file mode 100644 index 60cfb6bc3..000000000 --- a/examples/playground/components/skeleton-table.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { Skeleton } from "@/components/ui/skeleton"; - -export function SkeletonTable() { - return ( -
-
- - - - - - - - - - {[...Array(3)].map((_, i) => ( - - - - - - ))} - -
- - - - - -
- - - - - -
-
-
- ); -} \ No newline at end of file diff --git a/examples/playground/components/spinner-wrapper.tsx b/examples/playground/components/spinner-wrapper.tsx deleted file mode 100644 index 7643b53c9..000000000 --- a/examples/playground/components/spinner-wrapper.tsx +++ /dev/null @@ -1,7 +0,0 @@ -'use client'; - -import { Spinner } from './spinner'; - -export function SpinnerWrapper() { - return ; -} \ No newline at end of file diff --git a/examples/playground/components/spinner.tsx b/examples/playground/components/spinner.tsx deleted file mode 100644 index 8e8bd3a27..000000000 --- a/examples/playground/components/spinner.tsx +++ /dev/null @@ -1,19 +0,0 @@ -'use client'; - -import { useLoadingState } from './loading-state-provider'; - -export function Spinner() { - const { isLoading } = useLoadingState(); - - if (!isLoading) return null; - - return ( -
-
- Processing... -
- ); -} \ No newline at end of file diff --git a/examples/playground/components/submit-button.tsx b/examples/playground/components/submit-button.tsx deleted file mode 100644 index 23ba0f175..000000000 --- a/examples/playground/components/submit-button.tsx +++ /dev/null @@ -1,35 +0,0 @@ -"use client"; - -import { Button } from "@/components/ui/button"; -import { type ComponentProps } from "react"; -import { useFormStatus } from "react-dom"; - -type Props = ComponentProps & { - pendingText?: string; -}; - -export function SubmitButton({ - children, - pendingText = "Submitting...", - ...props -}: Props) { - const { pending } = useFormStatus(); - - return ( - - ); -} diff --git a/examples/playground/components/supabase-logo.tsx b/examples/playground/components/supabase-logo.tsx deleted file mode 100644 index 96a56a54a..000000000 --- a/examples/playground/components/supabase-logo.tsx +++ /dev/null @@ -1,102 +0,0 @@ -export default function SupabaseLogo() { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/examples/playground/components/theme-switcher.tsx b/examples/playground/components/theme-switcher.tsx deleted file mode 100644 index d838e4042..000000000 --- a/examples/playground/components/theme-switcher.tsx +++ /dev/null @@ -1,78 +0,0 @@ -"use client"; - -import { Button } from "@/components/ui/button"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { Laptop, Moon, Sun } from "lucide-react"; -import { useTheme } from "next-themes"; -import { useEffect, useState } from "react"; - -const ThemeSwitcher = () => { - const [mounted, setMounted] = useState(false); - const { theme, setTheme } = useTheme(); - - // useEffect only runs on the client, so now we can safely show the UI - useEffect(() => { - setMounted(true); - }, []); - - if (!mounted) { - return null; - } - - const ICON_SIZE = 16; - - return ( - - - - - - setTheme(e)} - > - - {" "} - Light - - - {" "} - Dark - - - {" "} - System - - - - - ); -}; - -export { ThemeSwitcher }; diff --git a/examples/playground/components/tutorial/code-block.tsx b/examples/playground/components/tutorial/code-block.tsx deleted file mode 100644 index 9f1b13d64..000000000 --- a/examples/playground/components/tutorial/code-block.tsx +++ /dev/null @@ -1,61 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { Button } from "../ui/button"; - -const CopyIcon = () => ( - - - - -); - -const CheckIcon = () => ( - - - -); - -export function CodeBlock({ code }: { code: string }) { - const [icon, setIcon] = useState(CopyIcon); - - const copy = async () => { - await navigator?.clipboard?.writeText(code); - setIcon(CheckIcon); - setTimeout(() => setIcon(CopyIcon), 2000); - }; - - return ( -
-      
-      {code}
-    
- ); -} diff --git a/examples/playground/components/tutorial/connect-supabase-steps.tsx b/examples/playground/components/tutorial/connect-supabase-steps.tsx deleted file mode 100644 index 04ca37f0e..000000000 --- a/examples/playground/components/tutorial/connect-supabase-steps.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { TutorialStep } from "./tutorial-step"; - -export default function ConnectSupabaseSteps() { - return ( -
    - -

    - Head over to{" "} - - database.new - {" "} - and create a new Supabase project. -

    -
    - - -

    - Rename the{" "} - - .env.example - {" "} - file in your Next.js app to{" "} - - .env.local - {" "} - and populate with values from{" "} - - your Supabase project's API Settings - - . -

    -
    - - -

    - You may need to quit your Next.js development server and run{" "} - - npm run dev - {" "} - again to load the new environment variables. -

    -
    - - -

    - You may need to refresh the page for Next.js to load the new - environment variables. -

    -
    -
- ); -} diff --git a/examples/playground/components/tutorial/fetch-data-steps.tsx b/examples/playground/components/tutorial/fetch-data-steps.tsx deleted file mode 100644 index 23c7df52d..000000000 --- a/examples/playground/components/tutorial/fetch-data-steps.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { TutorialStep } from "./tutorial-step"; -import { CodeBlock } from "./code-block"; - -const create = `create table notes ( - id bigserial primary key, - title text -); - -insert into notes(title) -values - ('Today I created a Supabase project.'), - ('I added some data and queried it from Next.js.'), - ('It was awesome!'); -`.trim(); - -const server = `import { createClient } from '@/utils/supabase/server' - -export default async function Page() { - const supabase = await createClient() - const { data: notes } = await supabase.from('notes').select() - - return
{JSON.stringify(notes, null, 2)}
-} -`.trim(); - -const client = `'use client' - -import { createClient } from '@/utils/supabase/client' -import { useEffect, useState } from 'react' - -export default function Page() { - const [notes, setNotes] = useState(null) - const supabase = createClient() - - useEffect(() => { - const getData = async () => { - const { data } = await supabase.from('notes').select() - setNotes(data) - } - getData() - }, []) - - return
{JSON.stringify(notes, null, 2)}
-} -`.trim(); - -export default function FetchDataSteps() { - return ( -
    - -

    - Head over to the{" "} - - Table Editor - {" "} - for your Supabase project to create a table and insert some example - data. If you're stuck for creativity, you can copy and paste the - following into the{" "} - - SQL Editor - {" "} - and click RUN! -

    - -
    - - -

    - To create a Supabase client and query data from an Async Server - Component, create a new page.tsx file at{" "} - - /app/notes/page.tsx - {" "} - and add the following. -

    - -

    Alternatively, you can use a Client Component.

    - -
    - - -

    You're ready to launch your product to the world! 🚀

    -
    -
- ); -} diff --git a/examples/playground/components/tutorial/sign-up-user-steps.tsx b/examples/playground/components/tutorial/sign-up-user-steps.tsx deleted file mode 100644 index c00fb66e3..000000000 --- a/examples/playground/components/tutorial/sign-up-user-steps.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import Link from "next/link"; -import { TutorialStep } from "./tutorial-step"; -import { ArrowUpRight } from "lucide-react"; - -export default function SignUpUserSteps() { - return ( -
    - {process.env.VERCEL_ENV === "preview" || - process.env.VERCEL_ENV === "production" ? ( - -

    It looks like this App is hosted on Vercel.

    -

    - This particular deployment is - - "{process.env.VERCEL_ENV}" - {" "} - on - - https://{process.env.VERCEL_URL} - - . -

    -

    - You will need to{" "} - - update your Supabase project - {" "} - with redirect URLs based on your Vercel deployment URLs. -

    -
      -
    • - -{" "} - - http://localhost:3000/** - -
    • -
    • - -{" "} - - {`https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}/**`} - -
    • -
    • - -{" "} - - {`https://${process.env.VERCEL_PROJECT_PRODUCTION_URL?.replace(".vercel.app", "")}-*-[vercel-team-url].vercel.app/**`} - {" "} - (Vercel Team URL can be found in{" "} - - Vercel Team settings - - ) -
    • -
    - - Redirect URLs Docs - -
    - ) : null} - -

    - Head over to the{" "} - - Sign up - {" "} - page and sign up your first user. It's okay if this is just you for - now. Your awesome idea will have plenty of users later! -

    -
    -
- ); -} diff --git a/examples/playground/components/tutorial/tutorial-step.tsx b/examples/playground/components/tutorial/tutorial-step.tsx deleted file mode 100644 index 0ab9cd4e3..000000000 --- a/examples/playground/components/tutorial/tutorial-step.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Checkbox } from "../ui/checkbox"; - -export function TutorialStep({ - title, - children, -}: { - title: string; - children: React.ReactNode; -}) { - return ( -
  • - - -
  • - ); -} diff --git a/examples/playground/components/typography/inline-code.tsx b/examples/playground/components/typography/inline-code.tsx deleted file mode 100644 index 288f9e30e..000000000 --- a/examples/playground/components/typography/inline-code.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export function TypographyInlineCode() { - return ( - - @radix-ui/react-alert-dialog - - ); -} diff --git a/examples/playground/components/ui/badge.tsx b/examples/playground/components/ui/badge.tsx deleted file mode 100644 index d3d5d6040..000000000 --- a/examples/playground/components/ui/badge.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from "react"; -import { cva, type VariantProps } from "class-variance-authority"; - -import { cn } from "@/lib/utils"; - -const badgeVariants = cva( - "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", - { - variants: { - variant: { - default: - "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", - secondary: - "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", - destructive: - "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", - outline: "text-foreground", - }, - }, - defaultVariants: { - variant: "default", - }, - }, -); - -export interface BadgeProps - extends React.HTMLAttributes, - VariantProps {} - -function Badge({ className, variant, ...props }: BadgeProps) { - return ( -
    - ); -} - -export { Badge, badgeVariants }; diff --git a/examples/playground/components/ui/button.tsx b/examples/playground/components/ui/button.tsx deleted file mode 100644 index 57c9fe47e..000000000 --- a/examples/playground/components/ui/button.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; -import { cva, type VariantProps } from "class-variance-authority"; - -import { cn } from "@/lib/utils"; - -const buttonVariants = cva( - "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", - { - variants: { - variant: { - default: "bg-primary text-primary-foreground hover:bg-primary/90", - destructive: - "bg-destructive text-destructive-foreground hover:bg-destructive/90", - outline: - "border border-input bg-background hover:bg-accent hover:text-accent-foreground", - secondary: - "bg-secondary text-secondary-foreground hover:bg-secondary/80", - ghost: "hover:bg-accent hover:text-accent-foreground", - link: "text-primary underline-offset-4 hover:underline", - }, - size: { - default: "h-10 px-4 py-2", - sm: "h-9 rounded-md px-3", - lg: "h-11 rounded-md px-8", - icon: "h-10 w-10", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - }, -); - -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean; -} - -const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : "button"; - return ( - - ); - }, -); -Button.displayName = "Button"; - -export { Button, buttonVariants }; diff --git a/examples/playground/components/ui/checkbox.tsx b/examples/playground/components/ui/checkbox.tsx deleted file mode 100644 index 5985e3c3e..000000000 --- a/examples/playground/components/ui/checkbox.tsx +++ /dev/null @@ -1,30 +0,0 @@ -"use client"; - -import * as React from "react"; -import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; -import { Check } from "lucide-react"; - -import { cn } from "@/lib/utils"; - -const Checkbox = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - - - -)); -Checkbox.displayName = CheckboxPrimitive.Root.displayName; - -export { Checkbox }; diff --git a/examples/playground/components/ui/collapsible.tsx b/examples/playground/components/ui/collapsible.tsx deleted file mode 100644 index 9fa48946a..000000000 --- a/examples/playground/components/ui/collapsible.tsx +++ /dev/null @@ -1,11 +0,0 @@ -"use client" - -import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" - -const Collapsible = CollapsiblePrimitive.Root - -const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger - -const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent - -export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/examples/playground/components/ui/dropdown-menu.tsx b/examples/playground/components/ui/dropdown-menu.tsx deleted file mode 100644 index 3a0c7fed7..000000000 --- a/examples/playground/components/ui/dropdown-menu.tsx +++ /dev/null @@ -1,200 +0,0 @@ -"use client"; - -import * as React from "react"; -import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; -import { Check, ChevronRight, Circle } from "lucide-react"; - -import { cn } from "@/lib/utils"; - -const DropdownMenu = DropdownMenuPrimitive.Root; - -const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; - -const DropdownMenuGroup = DropdownMenuPrimitive.Group; - -const DropdownMenuPortal = DropdownMenuPrimitive.Portal; - -const DropdownMenuSub = DropdownMenuPrimitive.Sub; - -const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; - -const DropdownMenuSubTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean; - } ->(({ className, inset, children, ...props }, ref) => ( - - {children} - - -)); -DropdownMenuSubTrigger.displayName = - DropdownMenuPrimitive.SubTrigger.displayName; - -const DropdownMenuSubContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -DropdownMenuSubContent.displayName = - DropdownMenuPrimitive.SubContent.displayName; - -const DropdownMenuContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, sideOffset = 4, ...props }, ref) => ( - - - -)); -DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; - -const DropdownMenuItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean; - } ->(({ className, inset, ...props }, ref) => ( - -)); -DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; - -const DropdownMenuCheckboxItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, checked, ...props }, ref) => ( - - - - - - - {children} - -)); -DropdownMenuCheckboxItem.displayName = - DropdownMenuPrimitive.CheckboxItem.displayName; - -const DropdownMenuRadioItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - - - - - - {children} - -)); -DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; - -const DropdownMenuLabel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean; - } ->(({ className, inset, ...props }, ref) => ( - -)); -DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; - -const DropdownMenuSeparator = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; - -const DropdownMenuShortcut = ({ - className, - ...props -}: React.HTMLAttributes) => { - return ( - - ); -}; -DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; - -export { - DropdownMenu, - DropdownMenuTrigger, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuCheckboxItem, - DropdownMenuRadioItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuShortcut, - DropdownMenuGroup, - DropdownMenuPortal, - DropdownMenuSub, - DropdownMenuSubContent, - DropdownMenuSubTrigger, - DropdownMenuRadioGroup, -}; diff --git a/examples/playground/components/ui/input.tsx b/examples/playground/components/ui/input.tsx deleted file mode 100644 index 2380fc98d..000000000 --- a/examples/playground/components/ui/input.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import * as React from 'react'; - -import { cn } from '@/lib/utils'; - -export type InputProps = React.InputHTMLAttributes; - -const Input = React.forwardRef( - ({ className, type, ...props }, ref) => { - return ( - - ); - }, -); -Input.displayName = 'Input'; - -export { Input }; diff --git a/examples/playground/components/ui/label.tsx b/examples/playground/components/ui/label.tsx deleted file mode 100644 index 84f8b0c70..000000000 --- a/examples/playground/components/ui/label.tsx +++ /dev/null @@ -1,26 +0,0 @@ -"use client"; - -import * as React from "react"; -import * as LabelPrimitive from "@radix-ui/react-label"; -import { cva, type VariantProps } from "class-variance-authority"; - -import { cn } from "@/lib/utils"; - -const labelVariants = cva( - "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", -); - -const Label = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & - VariantProps ->(({ className, ...props }, ref) => ( - -)); -Label.displayName = LabelPrimitive.Root.displayName; - -export { Label }; diff --git a/examples/playground/components/ui/skeleton.tsx b/examples/playground/components/ui/skeleton.tsx deleted file mode 100644 index bee96db9e..000000000 --- a/examples/playground/components/ui/skeleton.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { cn } from "@/lib/utils" - -function Skeleton({ - className, - ...props -}: React.HTMLAttributes) { - return ( -
    - ) -} - -export { Skeleton } \ No newline at end of file diff --git a/examples/playground/components/website-analysis-ui.tsx b/examples/playground/components/website-analysis-ui.tsx deleted file mode 100644 index 93c412755..000000000 --- a/examples/playground/components/website-analysis-ui.tsx +++ /dev/null @@ -1,236 +0,0 @@ -'use client'; - -import React, { useState, useEffect } from 'react'; -import type { FlowRun } from '@pgflow/client'; -import type { AnyFlow } from '@pgflow/dsl'; -import { Badge } from '@/components/ui/badge'; -import { Button } from '@/components/ui/button'; -import { motion, AnimatePresence } from 'framer-motion'; -import { ChevronDown, ChevronUp } from 'lucide-react'; - -interface WebsiteAnalysisUIProps { - flowRun: FlowRun | null; - loading: boolean; - error: string | null; -} - -export default function WebsiteAnalysisUI({ - flowRun, - loading, - error, -}: WebsiteAnalysisUIProps) { - const [analysisExpanded, setAnalysisExpanded] = useState(true); - const [, setRefresh] = useState(0); - - useEffect(() => { - if (!flowRun) return; - - const unsubscribes: (() => void)[] = []; - - // Subscribe to flow run events - unsubscribes.push( - flowRun.on('*', () => { - setRefresh(prev => prev + 1); - }) - ); - - // Subscribe to step events for the steps we care about - const stepSlugs = ['website', 'summary', 'tags', 'saveToDb']; - for (const stepSlug of stepSlugs) { - const step = flowRun.step(stepSlug); - unsubscribes.push( - step.on('*', () => { - setRefresh(prev => prev + 1); - }) - ); - } - - return () => { - unsubscribes.forEach(unsubscribe => unsubscribe()); - }; - }, [flowRun]); - - // Get the input URL from the run - const analyzedUrl = flowRun?.input?.url || ''; - - // Check if analysis is complete - const isAnalysisComplete = flowRun?.status === 'completed'; - - // Get summary and tags from step outputs - // We'll need to access these through the step() method - const summaryStep = flowRun?.step('summary'); - const tagsStep = flowRun?.step('tags'); - - // The summary step returns a string directly - const summary = typeof summaryStep?.output === 'string' ? summaryStep.output : null; - // The tags step returns an array of strings directly - const tags = Array.isArray(tagsStep?.output) ? tagsStep.output : []; - - - if (loading) { - return
    Loading...
    ; - } - - if (error) { - return
    Error: {String(error)}
    ; - } - - return ( -
    - {/* Header Section */} -
    -

    Website Analyzer

    -

    - Analyze any website using AI to extract key information, generate summaries, and identify relevant tags. -

    -
    - - - {/* Analysis Results */} - {flowRun && ( -
    - - - - - - - {analysisExpanded && ( - - {/* Progress Steps */} -
    - {['website', 'summary', 'tags', 'saveToDb'].map((stepSlug) => { - const step = flowRun.step(stepSlug); - const displayName = stepSlug === 'saveToDb' ? 'Save to Database' : stepSlug; - const stepStatus = step?.status || 'pending'; - return ( -
    - - {displayName.replace(/_/g, ' ')} - - - {stepStatus} - -
    - ); - })} -
    - - {/* Summary Section */} - {isAnalysisComplete && summary && ( -
    -

    Summary

    -

    - {String(summary)} -

    -
    - )} - - {/* Tags Section */} - {isAnalysisComplete && tags.length > 0 && ( -
    -

    Tags

    -
    - {tags.map((tag: string, index: number) => ( - - {String(tag)} - - ))} -
    -
    - )} - - {/* Status Message */} - {!isAnalysisComplete && ( -
    -

    - Analysis in progress... This may take a few moments. -

    -
    - )} -
    - )} -
    -
    -
    -
    - )} -
    - ); -} - -// Helper component for collapsible sections -function Collapsible({ - children, - open, - onOpenChange -}: { - children: React.ReactNode; - open: boolean; - onOpenChange: (open: boolean) => void; -}) { - return ( -
    - {React.Children.map(children, child => { - if (React.isValidElement(child)) { - if (child.type === CollapsibleTrigger) { - return React.cloneElement(child as React.ReactElement<{onClick?: () => void}>, { - onClick: () => onOpenChange(!open) - }); - } - if (child.type === CollapsibleContent) { - return open ? child : null; - } - } - return child; - })} -
    - ); -} - -function CollapsibleTrigger({ - children, - asChild, - onClick -}: { - children: React.ReactNode; - asChild?: boolean; - onClick?: () => void; -}) { - if (asChild && React.isValidElement(children)) { - return React.cloneElement(children as React.ReactElement<{onClick?: () => void}>, { onClick }); - } - return
    {children}
    ; -} - -function CollapsibleContent({ children }: { children: React.ReactNode }) { - return <>{children}; -} \ No newline at end of file diff --git a/examples/playground/components/website-analyzer-form.tsx b/examples/playground/components/website-analyzer-form.tsx deleted file mode 100644 index ffcb4339d..000000000 --- a/examples/playground/components/website-analyzer-form.tsx +++ /dev/null @@ -1,72 +0,0 @@ -'use client'; - -import { useStartAnalysis } from '@/lib/hooks/use-start-analysis'; -import { useEffect, useState } from 'react'; -import { createClient } from '@/utils/supabase/client'; -import { Label } from '@/components/ui/label'; -import { Input } from '@/components/ui/input'; -import { FormMessage } from '@/components/form-message'; -import { SubmitButton } from '@/components/submit-button'; -import { useLoadingState } from './loading-state-provider'; - -export default function WebsiteAnalyzerForm() { - const { start: startAnalysis, isPending, error: formError } = useStartAnalysis(); - const [isLoggedIn, setIsLoggedIn] = useState(null); - const supabase = createClient(); - const { setLoading } = useLoadingState(); - - useEffect(() => { - supabase.auth.getUser().then(({ data }) => { - setIsLoggedIn(!!data.user); - }); - }, []); - - async function handleAnalyzeWebsite(formData: FormData) { - const url = formData.get('url') as string; - - if (!url) { - return; - } - - // Set global loading state to true - setLoading(true); - - // Start analysis will handle auth check and redirect - startAnalysis(url); - } - - return ( -
    -

    Analyze a Website

    -

    - Enter a URL to analyze a website -

    -
    -
    - - -
    - - 🚀 Start Analysis - - {formError && } - - {isLoggedIn === false && ( -
    -

    - You'll need to sign in to analyze websites. When you click the - button, you'll be redirected to the sign-in page. -

    -
    - )} -
    - ); -} diff --git a/examples/playground/eslint.config.cjs b/examples/playground/eslint.config.cjs deleted file mode 100644 index 81d5a8e11..000000000 --- a/examples/playground/eslint.config.cjs +++ /dev/null @@ -1,8 +0,0 @@ -const baseConfig = require('../../eslint.config.cjs'); - -module.exports = [ - ...baseConfig, - { - ignores: ['.next/**', 'supabase/functions/**/*.ts'], - }, -]; diff --git a/examples/playground/lib/db.ts b/examples/playground/lib/db.ts deleted file mode 100644 index 54f6151de..000000000 --- a/examples/playground/lib/db.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Database } from '@/supabase/functions/database-types'; - -// Keep only the database type exports that might be needed elsewhere -export type RunRow = Database['pgflow']['Tables']['runs']['Row']; -export type StepStateRow = Database['pgflow']['Tables']['step_states']['Row']; -export type StepTaskRow = Database['pgflow']['Tables']['step_tasks']['Row']; - -// Note: The observation functions and custom types have been removed -// as they are now handled by the @pgflow/client library \ No newline at end of file diff --git a/examples/playground/lib/example-links.ts b/examples/playground/lib/example-links.ts deleted file mode 100644 index e2f0f622f..000000000 --- a/examples/playground/lib/example-links.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Common example links for website analysis - */ - -export interface ExampleLink { - url: string; - label: string; - variant: 'success' | 'failure'; -} - -export const exampleLinks: ExampleLink[] = [ - { - url: 'https://en.wikipedia.org/wiki/PostgreSQL', - label: 'PostgreSQL Wikipedia', - variant: 'success', - }, - { - url: 'https://supabase.com/docs', - label: 'Supabase Docs', - variant: 'success', - }, - { - url: 'https://pgflow.dev', - label: 'pgflow.dev', - variant: 'success', - }, - // { - // url: 'https://aws.amazon.com/', - // label: '50% failure', - // variant: 'failure', - // }, - { - url: 'https://firebase.google.com/', - label: '100% failure', - variant: 'failure', - }, -]; diff --git a/examples/playground/lib/hooks/use-elapsed-time.ts b/examples/playground/lib/hooks/use-elapsed-time.ts deleted file mode 100644 index 47f2a2eab..000000000 --- a/examples/playground/lib/hooks/use-elapsed-time.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { useEffect, useRef, useCallback } from 'react'; - -// Format relative time in a concise way (e.g., "3s ago", "5m ago") -function formatRelativeTime( - date: Date | null, - now: Date = new Date(), -): string { - if (!date) return ''; - - const then = date; - const diffMs = now.getTime() - then.getTime(); - const diffSec = Math.floor(diffMs / 1000); - - // Handle case where time difference is negative (server/client time mismatch) - if (diffSec < 1) { - return '0s'; - } - - if (diffSec < 60) { - return `${diffSec}s`; - } - - const minutes = Math.floor(diffSec / 60); - - if (minutes < 60) { - return `${minutes}m`; - } - - const hours = Math.floor(minutes / 60); - - if (hours < 24) { - return `${hours}h`; - } - - const days = Math.floor(hours / 24); - return `${days}d`; -} - -/** - * Hook that returns a ref callback to attach to elements that need elapsed time updates. - * This avoids re-rendering the entire component tree when the timer ticks. - */ -export function useElapsedTime(startDate: Date | null) { - const elementRefs = useRef>(new Set()); - const intervalRef = useRef | undefined>(undefined); - - // Update all registered elements with the current elapsed time - const updateElements = useCallback(() => { - if (!startDate) return; - - const now = new Date(); - const timeString = `${formatRelativeTime(startDate, now)} ago`; - - elementRefs.current.forEach(element => { - if (element.textContent !== timeString) { - element.textContent = timeString; - } - }); - }, [startDate]); - - // Ref callback to register/unregister elements - const refCallback = useCallback((element: HTMLElement | null) => { - if (element) { - elementRefs.current.add(element); - // Update immediately when element is registered - if (startDate) { - const now = new Date(); - element.textContent = `${formatRelativeTime(startDate, now)} ago`; - } - } else { - // Element is being unmounted, remove from set - elementRefs.current.forEach(el => { - if (!document.contains(el)) { - elementRefs.current.delete(el); - } - }); - } - }, [startDate]); - - useEffect(() => { - if (!startDate) return; - - // Update immediately - updateElements(); - - // Set up interval to update every second - intervalRef.current = setInterval(updateElements, 1000); - - return () => { - if (intervalRef.current) { - clearInterval(intervalRef.current); - } - }; - }, [startDate, updateElements]); - - return refCallback; -} \ No newline at end of file diff --git a/examples/playground/lib/hooks/use-start-analysis.ts b/examples/playground/lib/hooks/use-start-analysis.ts deleted file mode 100644 index f40de8369..000000000 --- a/examples/playground/lib/hooks/use-start-analysis.ts +++ /dev/null @@ -1,38 +0,0 @@ -// lib/hooks/use-start-analysis.ts -'use client'; - -import { useState } from 'react'; -import { useRouter } from 'next/navigation'; -import { startWebsiteAnalysis } from '@/lib/services/start-analysis'; -import { usePgflowClient } from '@/lib/pgflow-client-provider'; - -export function useStartAnalysis() { - const router = useRouter(); - const pgflow = usePgflowClient(); - const [error, setError] = useState(null); - const [isPending, setIsPending] = useState(false); - - async function start(url: string) { - setError(null); - setIsPending(true); - - try { - const flowRun = await startWebsiteAnalysis(url, {}, pgflow); - // Navigate immediately - PgflowClient already has the run cached - router.push(`/websites/runs/${flowRun.run_id}`); - } catch (err) { - const error = err as {code?: string; message?: string}; - if (error?.code === 'AUTH_REQUIRED') { - // we want to remember the url and redirect - localStorage.setItem('pendingAnalysisUrl', url); - router.push('/sign-in'); - return; - } - setError(error.message ?? 'Something went wrong'); - } finally { - setIsPending(false); - } - } - - return { start, error, isPending }; -} \ No newline at end of file diff --git a/examples/playground/lib/pgflow-client-provider.tsx b/examples/playground/lib/pgflow-client-provider.tsx deleted file mode 100644 index 11bf96478..000000000 --- a/examples/playground/lib/pgflow-client-provider.tsx +++ /dev/null @@ -1,31 +0,0 @@ -'use client'; - -import React, { createContext, useContext, useRef, ReactNode } from 'react'; -import { PgflowClient } from '@pgflow/client'; -import { createClient } from '@/utils/supabase/client'; - -const PgflowClientContext = createContext(null); - -export function PgflowClientProvider({ children }: { children: ReactNode }) { - // Use a ref to ensure the client instance is stable across renders - const clientRef = useRef(null); - - if (!clientRef.current) { - const supabase = createClient(); - clientRef.current = new PgflowClient(supabase); - } - - return ( - - {children} - - ); -} - -export function usePgflowClient() { - const client = useContext(PgflowClientContext); - if (!client) { - throw new Error('usePgflowClient must be used within PgflowClientProvider'); - } - return client; -} \ No newline at end of file diff --git a/examples/playground/lib/services/start-analysis.ts b/examples/playground/lib/services/start-analysis.ts deleted file mode 100644 index 1ca9eb2e5..000000000 --- a/examples/playground/lib/services/start-analysis.ts +++ /dev/null @@ -1,54 +0,0 @@ -// lib/services/start-analysis.ts -import { createClient } from '@/utils/supabase/client'; -import type { FlowRun, PgflowClient } from '@pgflow/client'; -import type { AnyFlow } from '@pgflow/dsl'; - -export interface StartAnalysisOptions { - /** - * If true, throws an AuthRequiredError when the user is not logged in. - * If false, function continues but you can handle unauthenticated state yourself. - */ - requireAuth?: boolean; - /** - * Predetermined run id (useful for optimistic UI / testing). - */ - runId?: string; -} - -/** - * Starts analyse-website pgflow run and returns the FlowRun instance. - * **This is the ONLY place that knows HOW we start a flow.** - */ -export async function startWebsiteAnalysis( - url: string, - { requireAuth = true, runId }: StartAnalysisOptions = {}, - pgflow: PgflowClient -): Promise> { - if (!url) throw new Error('URL is required'); - if (!pgflow) throw new Error('PgflowClient is required'); - - const supabase = createClient(); - - // optional auth guard - if (requireAuth) { - const { data } = await supabase.auth.getUser(); - if (!data.user) { - const err = new Error('AUTH_REQUIRED') as Error & {code?: string}; - // tiny custom error class makes catching easier - err.code = 'AUTH_REQUIRED'; - throw err; - } - } - - // Get the user ID for the flow input - const { data: userData } = await supabase.auth.getUser(); - const userId = userData.user?.id; - - const flowRun = await pgflow.startFlow( - 'analyze_website', - { url, user_id: userId }, - runId - ); - - return flowRun; -} \ No newline at end of file diff --git a/examples/playground/lib/utils.ts b/examples/playground/lib/utils.ts deleted file mode 100644 index a5ef19350..000000000 --- a/examples/playground/lib/utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { clsx, type ClassValue } from "clsx"; -import { twMerge } from "tailwind-merge"; - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); -} diff --git a/examples/playground/middleware.ts b/examples/playground/middleware.ts deleted file mode 100644 index 53428f8c9..000000000 --- a/examples/playground/middleware.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type NextRequest } from "next/server"; -import { updateSession } from "@/utils/supabase/middleware"; - -export async function middleware(request: NextRequest) { - return await updateSession(request); -} - -export const config = { - matcher: [ - /* - * Match all request paths except: - * - _next/static (static files) - * - _next/image (image optimization files) - * - favicon.ico (favicon file) - * - images - .svg, .png, .jpg, .jpeg, .gif, .webp - * Feel free to modify this pattern to include more paths. - */ - "/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)", - ], -}; diff --git a/examples/playground/next.config.ts b/examples/playground/next.config.ts deleted file mode 100644 index ef7a43c4c..000000000 --- a/examples/playground/next.config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { NextConfig } from 'next'; -import { composePlugins, withNx } from '@nx/next'; -import { withPlausibleProxy } from 'next-plausible'; - -const nextConfig: NextConfig = { - experimental: { - externalDir: true, - }, - transpilePackages: ['@pgflow/client', '@pgflow/dsl'], - nx: { - svgr: false, // Disable deprecated SVGR support - }, - webpack: (config, { isServer }) => { - if (!isServer) { - // Provide fallbacks for Node.js modules that ws tries to use - config.resolve.fallback = { - ...config.resolve.fallback, - net: false, - tls: false, - fs: false, - crypto: false, - }; - } - - return config; - }, -}; - -// Compose plugins properly - withNx handles workspace library resolution -export default composePlugins( - withNx, - withPlausibleProxy() -)(nextConfig); \ No newline at end of file diff --git a/examples/playground/package.json b/examples/playground/package.json deleted file mode 100644 index 2163bc55a..000000000 --- a/examples/playground/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "playground", - "private": true, - "scripts": { - "build": "next build", - "start": "next start" - }, - "dependencies": { - "@pgflow/client": "workspace:*", - "@pgflow/dsl": "workspace:*", - "@radix-ui/react-checkbox": "^1.1.1", - "@radix-ui/react-collapsible": "^1.1.8", - "@radix-ui/react-dropdown-menu": "^2.1.1", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-slot": "^1.1.0", - "@supabase/ssr": "latest", - "@supabase/supabase-js": "2.49.4", - "@types/react": "19.1.9", - "@types/react-dom": "19.0.2", - "@types/uuid": "10.0.0", - "autoprefixer": "10.4.20", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "framer-motion": "^12.9.2", - "lucide-react": "^0.468.0", - "nanoevents": "7.0.1", - "next": "15.0.3", - "next-plausible": "^3.12.4", - "next-themes": "^0.4.3", - "postcss": "8.4.49", - "postgres": "3.4.5", - "react": "19.0.0", - "react-dom": "19.0.0", - "sharp": "0.32.6", - "supabase": "2.21.1", - "tailwind-merge": "2.6.0", - "tailwindcss": "3.4.17", - "tailwindcss-animate": "1.0.7", - "terser": "5.43.1", - "typescript": "5.8.3", - "uuid": "9.0.1" - } -} \ No newline at end of file diff --git a/examples/playground/postcss.config.js b/examples/playground/postcss.config.js deleted file mode 100644 index 12a703d90..000000000 --- a/examples/playground/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/examples/playground/project.json b/examples/playground/project.json deleted file mode 100644 index c76519561..000000000 --- a/examples/playground/project.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "playground", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "examples/playground", - "projectType": "application", - "tags": [], - "targets": { - "build": { - "executor": "@nx/next:build", - "outputs": ["{projectRoot}/.next"], - "defaultConfiguration": "production", - "options": { - "outputPath": "{projectRoot}" - }, - "configurations": { - "development": { - "outputPath": "{projectRoot}" - }, - "production": { - "outputPath": "{projectRoot}" - } - } - }, - "bundle": { - "executor": "nx:run-commands", - "dependsOn": ["build"], - "options": { - "cwd": "{projectRoot}", - "command": "pnpm netlify build --context=${NETLIFY_CONTEXT:-production}" - }, - "outputs": ["{projectRoot}/.netlify"] - }, - "deploy:preview": { - "executor": "nx:run-commands", - "dependsOn": ["bundle"], - "options": { - "cwd": "{projectRoot}", - "command": "pnpm netlify deploy --dir=.netlify/dist --functions=.netlify/functions --alias=${GITHUB_SHA:-preview}" - } - }, - "deploy:prod": { - "executor": "nx:run-commands", - "dependsOn": ["bundle"], - "options": { - "cwd": "{projectRoot}", - "command": "pnpm netlify deploy --dir=.netlify/dist --functions=.netlify/functions --prod" - } - }, - "sync-edge-deps": { - "executor": "nx:run-commands", - "dependsOn": [ - { - "projects": ["core", "dsl"], - "target": "build" - } - ], - "options": { - "command": "./scripts/sync-edge-deps.sh", - "cwd": "examples/playground" - } - }, - "start-functions": { - "executor": "nx:run-commands", - "dependsOn": ["sync-edge-deps"], - "options": { - "command": "./scripts/supabase functions serve --import-map ./supabase/functions/import_map.local.json", - "cwd": "examples/playground" - } - } - } -} diff --git a/examples/playground/public/.gitkeep b/examples/playground/public/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/playground/public/favicon.ico b/examples/playground/public/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/examples/playground/public/opengraph-image.png b/examples/playground/public/opengraph-image.png deleted file mode 100644 index 57595e662c3b56c9a1e6ff5e9b6bf43d5316e1a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289886 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 z 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 z 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/dev/null | jq -r '.DB_URL') - -if [ -z "$DB_URL" ] || [ "$DB_URL" = "null" ]; then - echo "Error: Could not get database URL from supabase status" >&2 - echo "Make sure supabase is running: npm run supabase:start" >&2 - exit 1 -fi - -# If no arguments provided but stdin is available, use stdin -if [ $# -eq 0 ] && [ ! -t 0 ]; then - psql "$DB_URL" -# If a single argument without -c or -f flag, assume it's a SQL command -elif [ $# -eq 1 ] && [[ ! "$1" =~ ^- ]]; then - psql "$DB_URL" -c "$1" -else - # Otherwise pass all arguments through to psql - psql "$DB_URL" "$@" -fi \ No newline at end of file diff --git a/examples/playground/scripts/supabase b/examples/playground/scripts/supabase deleted file mode 100755 index d4525b2a4..000000000 --- a/examples/playground/scripts/supabase +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -# Source the environment variables -source .env - -# Export required variables for Supabase -export GITHUB_OAUTH_CLIENT_ID -export GITHUB_OAUTH_CLIENT_SECRET - -# Execute supabase with all arguments passed through -pnpm exec supabase "$@" \ No newline at end of file diff --git a/examples/playground/scripts/sync-edge-deps.sh b/examples/playground/scripts/sync-edge-deps.sh deleted file mode 100755 index d8c934b75..000000000 --- a/examples/playground/scripts/sync-edge-deps.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PLAYGROUND_DIR="$(dirname "$SCRIPT_DIR")" -MONOREPO_ROOT="$(cd "$PLAYGROUND_DIR/../.." && pwd)" -VENDOR_DIR="$PLAYGROUND_DIR/supabase/functions/_vendor" - -echo "🔄 Syncing edge function dependencies for local development..." - -# Clean and create vendor directory -rm -rf "$VENDOR_DIR" -mkdir -p "$VENDOR_DIR/@pgflow" - -# Verify builds succeeded -if [ ! -d "$MONOREPO_ROOT/pkgs/core/dist" ]; then - echo "❌ Error: core package build failed - dist directory not found" - exit 1 -fi - -if [ ! -d "$MONOREPO_ROOT/pkgs/dsl/dist" ]; then - echo "❌ Error: dsl package build failed - dist directory not found" - exit 1 -fi - -# Copy core package -echo "📋 Copying @pgflow/core..." -mkdir -p "$VENDOR_DIR/@pgflow/core" -cp -r "$MONOREPO_ROOT/pkgs/core/dist/"* "$VENDOR_DIR/@pgflow/core/" -cp "$MONOREPO_ROOT/pkgs/core/package.json" "$VENDOR_DIR/@pgflow/core/" - -# Copy dsl package -echo "📋 Copying @pgflow/dsl..." -mkdir -p "$VENDOR_DIR/@pgflow/dsl" -cp -r "$MONOREPO_ROOT/pkgs/dsl/dist/"* "$VENDOR_DIR/@pgflow/dsl/" -cp "$MONOREPO_ROOT/pkgs/dsl/package.json" "$VENDOR_DIR/@pgflow/dsl/" - -# Copy edge-worker source (not built) - preserving directory structure -echo "📋 Copying @pgflow/edge-worker..." -mkdir -p "$VENDOR_DIR/@pgflow/edge-worker" -# Copy the entire src directory to maintain relative imports -cp -r "$MONOREPO_ROOT/pkgs/edge-worker/src" "$VENDOR_DIR/@pgflow/edge-worker/" - -# Simple fix: replace .js with .ts in imports -find "$VENDOR_DIR/@pgflow/edge-worker" -name "*.ts" -type f -exec sed -i 's/\.js"/\.ts"/g' {} + -find "$VENDOR_DIR/@pgflow/edge-worker" -name "*.ts" -type f -exec sed -i "s/\.js'/\.ts'/g" {} + - -# Create a redirect index.ts at the root that points to src/index.ts -cat > "$VENDOR_DIR/@pgflow/edge-worker/index.ts" << 'EOF' -// Re-export from the src directory to maintain compatibility -export * from './src/index.ts'; -EOF - -# Create _internal.ts redirect as well since edge-worker exports this path -cat > "$VENDOR_DIR/@pgflow/edge-worker/_internal.ts" << 'EOF' -// Re-export from the src directory to maintain compatibility -export * from './src/_internal.ts'; -EOF - -# Verify key files exist -if [ ! -f "$VENDOR_DIR/@pgflow/core/index.js" ]; then - echo "⚠️ Warning: @pgflow/core/index.js not found after copy" -fi - -if [ ! -f "$VENDOR_DIR/@pgflow/dsl/index.js" ]; then - echo "⚠️ Warning: @pgflow/dsl/index.js not found after copy" -fi - -if [ ! -f "$VENDOR_DIR/@pgflow/edge-worker/src/index.ts" ]; then - echo "⚠️ Warning: @pgflow/edge-worker/src/index.ts not found after copy" -fi - -echo "✅ Dependencies synced to $VENDOR_DIR" \ No newline at end of file diff --git a/examples/playground/supabase/.gitignore b/examples/playground/supabase/.gitignore deleted file mode 100644 index ad9264f0b..000000000 --- a/examples/playground/supabase/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Supabase -.branches -.temp - -# dotenvx -.env.keys -.env.local -.env.*.local diff --git a/examples/playground/supabase/config.toml b/examples/playground/supabase/config.toml deleted file mode 100644 index e7de7b3c9..000000000 --- a/examples/playground/supabase/config.toml +++ /dev/null @@ -1,342 +0,0 @@ -# For detailed configuration reference documentation, visit: -# https://supabase.com/docs/guides/local-development/cli/config -# A string used to distinguish different Supabase projects on the same host. Defaults to the -# working directory name when running `supabase init`. -project_id = "pgflow-demo" - -[api] -enabled = true -# Port to use for the API URL. -port = 54321 -# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API -# endpoints. `public` and `graphql_public` schemas are included by default. -schemas = ["public", "graphql_public", "pgflow"] -# Extra schemas to add to the search_path of every request. -extra_search_path = ["public", "extensions", "pgflow"] -# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size -# for accidental or malicious requests. -max_rows = 1000 - -[api.tls] -# Enable HTTPS endpoints locally using a self-signed certificate. -enabled = false - -[db] -# Port to use for the local database URL. -port = 54322 -# Port used by db diff command to initialize the shadow database. -shadow_port = 54320 -# The database major version to use. This has to be the same as your remote database's. Run `SHOW -# server_version;` on the remote database to check. -major_version = 15 - -[db.pooler] -enabled = true -# Port to use for the local connection pooler. -port = 54329 -# Specifies when a server connection can be reused by other clients. -# Configure one of the supported pooler modes: `transaction`, `session`. -pool_mode = "transaction" -# How many server connections to allow per user/database pair. -default_pool_size = 20 -# Maximum number of client connections allowed. -max_client_conn = 100 - -# [db.vault] -# secret_key = "env(SECRET_VALUE)" - -[db.migrations] -# Specifies an ordered list of schema files that describe your database. -# Supports glob patterns relative to supabase directory: "./schemas/*.sql" -schema_paths = [] - -[db.seed] -# If enabled, seeds the database after migrations during a db reset. -enabled = true -# Specifies an ordered list of seed files to load during db reset. -# Supports glob patterns relative to supabase directory: "./seeds/*.sql" -sql_paths = ["./seed.sql"] - -[realtime] -enabled = true -# Bind realtime via either IPv4 or IPv6. (default: IPv4) -# ip_version = "IPv6" -# The maximum length in bytes of HTTP request headers. (default: 4096) -# max_header_length = 4096 - -[studio] -enabled = true -# Port to use for Supabase Studio. -port = 54323 -# External URL of the API server that frontend connects to. -api_url = "http://127.0.0.1" -# OpenAI API Key to use for Supabase AI in the Supabase Studio. -openai_api_key = "env(OPENAI_API_KEY)" - -# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they -# are monitored, and you can view the emails that would have been sent from the web interface. -[inbucket] -enabled = true -# Port to use for the email testing server web interface. -port = 54324 -# Uncomment to expose additional ports for testing user applications that send emails. -# smtp_port = 54325 -# pop3_port = 54326 -# admin_email = "admin@email.com" -# sender_name = "Admin" - -[storage] -enabled = true -# The maximum file size allowed (e.g. "5MB", "500KB"). -file_size_limit = "50MiB" - -# Image transformation API is available to Supabase Pro plan. -# [storage.image_transformation] -# enabled = true - -# Uncomment to configure local storage buckets -# [storage.buckets.images] -# public = false -# file_size_limit = "50MiB" -# allowed_mime_types = ["image/png", "image/jpeg"] -# objects_path = "./images" - -[auth] -enabled = true -# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used -# in emails. -site_url = "http://localhost:3000" -# A list of *exact* URLs that auth providers are permitted to redirect to post authentication. -additional_redirect_urls = ["http://127.0.0.1:3000", "https://127.0.0.1:3000", "http://localhost:3000", "https://localhost:3000"] -# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 (1 week). -jwt_expiry = 3600 -# If disabled, the refresh token will never expire. -enable_refresh_token_rotation = true -# Allows refresh tokens to be reused after expiry, up to the specified interval in seconds. -# Requires enable_refresh_token_rotation = true. -refresh_token_reuse_interval = 10 -# Allow/disallow new user signups to your project. -enable_signup = true -# Allow/disallow anonymous sign-ins to your project. -enable_anonymous_sign_ins = false -# Allow/disallow testing manual linking of accounts -enable_manual_linking = false -# Passwords shorter than this value will be rejected as weak. Minimum 6, recommended 8 or more. -minimum_password_length = 6 -# Passwords that do not meet the following requirements will be rejected as weak. Supported values -# are: `letters_digits`, `lower_upper_letters_digits`, `lower_upper_letters_digits_symbols` -password_requirements = "" - -[auth.rate_limit] -# Number of emails that can be sent per hour. Requires auth.email.smtp to be enabled. -email_sent = 2 -# Number of SMS messages that can be sent per hour. Requires auth.sms to be enabled. -sms_sent = 30 -# Number of anonymous sign-ins that can be made per hour per IP address. Requires enable_anonymous_sign_ins = true. -anonymous_users = 30 -# Number of sessions that can be refreshed in a 5 minute interval per IP address. -token_refresh = 150 -# Number of sign up and sign-in requests that can be made in a 5 minute interval per IP address (excludes anonymous users). -sign_in_sign_ups = 30 -# Number of OTP / Magic link verifications that can be made in a 5 minute interval per IP address. -token_verifications = 30 - -# Configure one of the supported captcha providers: `hcaptcha`, `turnstile`. -# [auth.captcha] -# enabled = true -# provider = "hcaptcha" -# secret = "" - -[auth.email] -# Allow/disallow new user signups via email to your project. -enable_signup = true -# If enabled, a user will be required to confirm any email change on both the old, and new email -# addresses. If disabled, only the new email is required to confirm. -double_confirm_changes = true -# If enabled, users need to confirm their email address before signing in. -enable_confirmations = false -# If enabled, users will need to reauthenticate or have logged in recently to change their password. -secure_password_change = false -# Controls the minimum amount of time that must pass before sending another signup confirmation or password reset email. -max_frequency = "1s" -# Number of characters used in the email OTP. -otp_length = 6 -# Number of seconds before the email OTP expires (defaults to 1 hour). -otp_expiry = 3600 - -# Use a production-ready SMTP server -# [auth.email.smtp] -# enabled = true -# host = "smtp.sendgrid.net" -# port = 587 -# user = "apikey" -# pass = "env(SENDGRID_API_KEY)" -# admin_email = "admin@email.com" -# sender_name = "Admin" - -# Uncomment to customize email template -# [auth.email.template.invite] -# subject = "You have been invited" -# content_path = "./supabase/templates/invite.html" - -[auth.sms] -# Allow/disallow new user signups via SMS to your project. -enable_signup = false -# If enabled, users need to confirm their phone number before signing in. -enable_confirmations = false -# Template for sending OTP to users -template = "Your code is {{ .Code }}" -# Controls the minimum amount of time that must pass before sending another sms otp. -max_frequency = "5s" - -# Use pre-defined map of phone number to OTP for testing. -# [auth.sms.test_otp] -# 4152127777 = "123456" - -# Configure logged in session timeouts. -# [auth.sessions] -# Force log out after the specified duration. -# timebox = "24h" -# Force log out if the user has been inactive longer than the specified duration. -# inactivity_timeout = "8h" - -# This hook runs before a token is issued and allows you to add additional claims based on the authentication method used. -# [auth.hook.custom_access_token] -# enabled = true -# uri = "pg-functions:////" - -# Configure one of the supported SMS providers: `twilio`, `twilio_verify`, `messagebird`, `textlocal`, `vonage`. -[auth.sms.twilio] -enabled = false -account_sid = "" -message_service_sid = "" -# DO NOT commit your Twilio auth token to git. Use environment variable substitution instead: -auth_token = "env(SUPABASE_AUTH_SMS_TWILIO_AUTH_TOKEN)" - -# Multi-factor-authentication is available to Supabase Pro plan. -[auth.mfa] -# Control how many MFA factors can be enrolled at once per user. -max_enrolled_factors = 10 - -# Control MFA via App Authenticator (TOTP) -[auth.mfa.totp] -enroll_enabled = false -verify_enabled = false - -# Configure MFA via Phone Messaging -[auth.mfa.phone] -enroll_enabled = false -verify_enabled = false -otp_length = 6 -template = "Your code is {{ .Code }}" -max_frequency = "5s" - -# Configure MFA via WebAuthn -# [auth.mfa.web_authn] -# enroll_enabled = true -# verify_enabled = true - -[auth.external.github] -enabled = true -client_id = "env(GITHUB_OAUTH_CLIENT_ID)" -secret = "env(GITHUB_OAUTH_CLIENT_SECRET)" -# Using the default callback URL for Supabase GitHub OAuth -redirect_uri = "http://localhost:54321/auth/v1/callback" - -# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, -# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin_oidc`, `notion`, `twitch`, -# `twitter`, `slack`, `spotify`, `workos`, `zoom`. -[auth.external.apple] -enabled = false -client_id = "" -# DO NOT commit your OAuth provider secret to git. Use environment variable substitution instead: -secret = "env(SUPABASE_AUTH_EXTERNAL_APPLE_SECRET)" -# Overrides the default auth redirectUrl. -redirect_uri = "" -# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure, -# or any other third-party OIDC providers. -url = "" -# If enabled, the nonce check will be skipped. Required for local sign in with Google auth. -skip_nonce_check = false - -# Use Firebase Auth as a third-party provider alongside Supabase Auth. -[auth.third_party.firebase] -enabled = false -# project_id = "my-firebase-project" - -# Use Auth0 as a third-party provider alongside Supabase Auth. -[auth.third_party.auth0] -enabled = false -# tenant = "my-auth0-tenant" -# tenant_region = "us" - -# Use AWS Cognito (Amplify) as a third-party provider alongside Supabase Auth. -[auth.third_party.aws_cognito] -enabled = false -# user_pool_id = "my-user-pool-id" -# user_pool_region = "us-east-1" - -# Use Clerk as a third-party provider alongside Supabase Auth. -[auth.third_party.clerk] -enabled = false -# Obtain from https://clerk.com/setup/supabase -# domain = "example.clerk.accounts.dev" - -[edge_runtime] -enabled = true -# Configure one of the supported request policies: `oneshot`, `per_worker`. -# Use `oneshot` for hot reload, or `per_worker` for load testing. -policy = "per_worker" -# Port to attach the Chrome inspector for debugging edge functions. -inspector_port = 8083 -# The Deno major version to use. -deno_version = 1 - -# [edge_runtime.secrets] -# secret_key = "env(SECRET_VALUE)" - -[analytics] -enabled = true -port = 54327 -# Configure one of the supported backends: `postgres`, `bigquery`. -backend = "postgres" - -# Experimental features may be deprecated any time -[experimental] -# Configures Postgres storage engine to use OrioleDB (S3) -orioledb_version = "" -# Configures S3 bucket URL, eg. .s3-.amazonaws.com -s3_host = "env(S3_HOST)" -# Configures S3 bucket region, eg. us-east-1 -s3_region = "env(S3_REGION)" -# Configures AWS_ACCESS_KEY_ID for S3 bucket -s3_access_key = "env(S3_ACCESS_KEY)" -# Configures AWS_SECRET_ACCESS_KEY for S3 bucket -s3_secret_key = "env(S3_SECRET_KEY)" - -[functions.analyze_website_worker_0] -enabled = true -verify_jwt = false -import_map = "./functions/deno.json" -entrypoint = "./functions/analyze_website_worker_0/index.ts" -[functions.analyze_website_worker_1] -enabled = true -verify_jwt = false -import_map = "./functions/deno.json" -entrypoint = "./functions/analyze_website_worker_1/index.ts" -[functions.analyze_website_worker_2] -enabled = true -verify_jwt = false -import_map = "./functions/deno.json" -entrypoint = "./functions/analyze_website_worker_2/index.ts" -[functions.analyze_website_worker_3] -enabled = true -verify_jwt = false -import_map = "./functions/deno.json" -entrypoint = "./functions/analyze_website_worker_3/index.ts" - -[functions.pgflow-cron-worker] -enabled = true -verify_jwt = false -import_map = "./functions/deno.json" -entrypoint = "./functions/pgflow-cron-worker/index.ts" diff --git a/examples/playground/supabase/functions/.env.example b/examples/playground/supabase/functions/.env.example deleted file mode 100644 index 690038350..000000000 --- a/examples/playground/supabase/functions/.env.example +++ /dev/null @@ -1 +0,0 @@ -GROQ_API_KEY="" diff --git a/examples/playground/supabase/functions/LOCAL_DEV_README.md b/examples/playground/supabase/functions/LOCAL_DEV_README.md deleted file mode 100644 index 0142d5545..000000000 --- a/examples/playground/supabase/functions/LOCAL_DEV_README.md +++ /dev/null @@ -1,195 +0,0 @@ -# Edge Functions Local Development Guide - -## Quick Start - -To use local pgflow packages during development: - -```bash -# Terminal 1: Start Supabase -pnpm start-supabase - -# Terminal 2: Start Edge Functions (automatically syncs local packages) -pnpm start-functions -``` - -Your edge functions will now use local versions of `@pgflow/core`, `@pgflow/dsl`, and `@pgflow/edge-worker`. - -**Note:** When you make changes to any pgflow packages, restart the edge functions (`Ctrl+C` and run `pnpm start-functions` again) to sync the latest changes. - -## Why This Setup? - -The pgflow monorepo has a unique challenge: - -1. **@pgflow/edge-worker** is published to JSR (JavaScript Registry) as TypeScript source -2. **@pgflow/core** and **@pgflow/dsl** are published to npm as compiled JavaScript -3. Edge Functions run in Docker containers that can't access files outside `supabase/functions/` - -During development, we need to use unpublished local versions of these packages, which requires copying them into the Edge Functions directory. - -## How It Works - -### Import Mapping Strategy - -We use different import configurations for production and local development: - -1. **Production** (`deno.json`): - - Contains imports pointing to published packages on npm/jsr - - This is what gets deployed to Supabase - -2. **Local Development** (`import_map.local.json`): - - Contains imports pointing to the local vendor directory - - Used via the `--import-map` flag which overrides `deno.json` - -### The --import-map Flag - -When you run `pnpm start-functions`, it executes: -```bash -supabase functions serve --import-map ./supabase/functions/import_map.local.json -``` - -The `--import-map` flag **completely overrides** any imports defined in `deno.json`. This allows us to: -- Keep production configuration as the default (safe for deployments) -- Use local packages only when explicitly running with the flag -- Avoid any git status pollution from modifying tracked files - -### Vendor Directory - -The sync script copies packages into `_vendor/`: - -``` -_vendor/ -├── @pgflow/ -│ ├── core/ # Compiled JavaScript from pkgs/core/dist -│ ├── dsl/ # Compiled JavaScript from pkgs/dsl/dist -│ └── edge-worker/ # TypeScript source from pkgs/edge-worker/src -``` - -### Import Extension Fix - -Edge-worker source files use `.js` extensions for JSR compatibility: -```typescript -// Original in edge-worker -import { foo } from './bar.js'; -``` - -The sync script automatically converts these to `.ts` for local development: -```typescript -// After sync -import { foo } from './bar.ts'; -``` - -## Manual Operations - -### Sync Dependencies Once - -```bash -pnpm nx sync-edge-deps playground -``` - -### Test with Production Packages - -To test with published packages: - -```bash -pnpm nx start-functions:prod playground -``` - -This will use the imports defined in `deno.json` (production packages) without any local overrides. - -## Caveats and Limitations - -### 1. Import Extensions -- Edge-worker uses `.js` extensions in imports for JSR -- These are automatically converted to `.ts` during sync -- This means the vendor files differ from source files - -### 2. Build Requirements -- You must build core and dsl packages before syncing -- The sync script does this automatically -- Build failures will prevent syncing - -### 3. Type Definitions -- TypeScript may have issues with complex type imports -- Some type-only imports might need adjustment -- The compiled packages include `.d.ts` files - -### 4. Subpath Imports -- Imports like `@pgflow/dsl/supabase` need explicit mapping -- Add these to `import_map.json` as needed: - ```json - "@pgflow/dsl/supabase": "./_vendor/@pgflow/dsl/supabase.js" - ``` - -### 5. Docker Isolation -- All dependencies must be inside `supabase/functions/` -- Symlinks don't work reliably with Docker -- File changes might require function restart - -### 6. Version Mismatch -- Local packages might differ from published versions -- Test with production config before deploying -- Keep `deno.prod.json` updated with latest versions - -## Troubleshooting - -### Module Not Found Errors - -If you see "Module not found" errors: - -1. Check if the import needs a subpath mapping -2. Verify the file exists in vendor directory -3. Ensure import extensions are correct (.js for compiled, .ts for source) - -### Type Errors - -TypeScript errors in your flow definitions are unrelated to the vendor setup. Fix these in your flow files. - -### Changes Not Reflected - -If your changes aren't showing up: - -1. Run the sync script again to update dependencies -2. Check that builds succeed -3. Restart edge functions if needed -4. Clear Deno cache: `deno cache --reload` - -### Permission Errors - -Make the sync script executable: -```bash -chmod +x examples/playground/scripts/sync-edge-deps.sh -``` - -## Best Practices - -1. **Run the sync script** after making changes to pgflow packages -2. **Test with production config** before deploying -3. **Commit import_map.json** - it's part of the development setup -4. **Don't commit _vendor/** - it's generated and gitignored -5. **Keep both configs updated** - maintain both local and production configurations - -## Directory Structure Reference - -``` -supabase/functions/ -├── _vendor/ # Generated - local packages (gitignored) -├── import_map.local.json # Import mappings for local development -├── deno.json # Production imports (npm/jsr packages) -├── pgflow-cron-worker/ # Example edge function -└── analyze_website_worker_*/ # Worker functions -``` - -## How Import Resolution Works - -1. **Production Deployment**: - - Uses `deno.json` directly - - Imports resolve to npm/jsr registries - - No vendor directory needed - -2. **Local Development**: - - `pnpm start-functions` runs with `--import-map import_map.local.json` - - This flag **completely overrides** imports in `deno.json` - - Imports resolve to `_vendor/` directory - - Git status stays clean (no tracked files modified) - -This setup provides a seamless local development experience while maintaining compatibility with production deployments. \ No newline at end of file diff --git a/examples/playground/supabase/functions/README.md b/examples/playground/supabase/functions/README.md deleted file mode 100644 index def7ff2b7..000000000 --- a/examples/playground/supabase/functions/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# pgflow Functions Directory Structure - -This directory contains pgflow functions organized according to best practices for maintainability, reusability, and clarity. - -## Key Components - -### `_flows/` Directory - -Contains flow definitions that compose tasks into directed acyclic graphs (DAGs): - -- **analyze_website.ts** - Orchestrates website analysis by coordinating scraping, summarization, tagging, and saving tasks - -Flows define: - -- Execution order -- Parallelism opportunities -- Data dependencies between tasks -- Error handling and retry logic - -### `_tasks/` Directory - -Contains small, focused functions that each perform a single unit of work: - -- **scrapeWebsite.ts** - Fetches content from a given URL -- **convertToCleanMarkdown.ts** - Converts HTML to clean Markdown format -- **summarizeWithAI.ts** - Uses AI to generate content summaries -- **extractTags.ts** - Extracts relevant tags from content using AI -- **saveWebsite.ts** - Persists website data to the database - -Tasks are: - -- Modular and reusable across different flows -- Testable in isolation -- Designed with clear inputs and outputs -- JSON-serializable (required by pgflow) - -### Edge Function Workers - -Each flow has a corresponding edge function worker that executes the flow logic. By convention, workers are numbered (e.g., `analyze_website_worker_0`, `analyze_website_worker_1`) to enable multiple concurrent workers for the same flow. - -### Supporting Files - -- **utils.ts** - Shared utilities for database connections and common operations -- **database-types.d.ts** - TypeScript type definitions generated from the database schema -- **deno.json** - Configuration for Deno runtime in Edge Functions -- **deno.lock** - Lock file ensuring consistent dependency versions - -## Best Practices - -1. **Task Design**: Keep tasks focused on a single responsibility -2. **Flow Organization**: Use descriptive names and group related logic -3. **Type Safety**: Leverage TypeScript for flow inputs/outputs -4. **Error Handling**: Configure appropriate retries and timeouts -5. **JSON Serialization**: Ensure all data is JSON-serializable - -For more details on organizing pgflow code, see the documentation at: -https://pgflow.io/how-to/organize-flows-code/ diff --git a/examples/playground/supabase/functions/_flows/analyze_website.ts b/examples/playground/supabase/functions/_flows/analyze_website.ts deleted file mode 100644 index 8b68c8e04..000000000 --- a/examples/playground/supabase/functions/_flows/analyze_website.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Flow } from '@pgflow/dsl/supabase'; -import scrapeWebsite from '../_tasks/scrapeWebsite.ts'; -import summarizeWithAI from '../_tasks/summarizeWithAI.ts'; -import extractTags from '../_tasks/extractTags.ts'; -import saveWebsite from '../_tasks/saveWebsite.ts'; -import { simulateFailure } from '../utils.ts'; - -type Input = { - url: string; - user_id: string; -}; - -export default new Flow({ - slug: 'analyze_website', - maxAttempts: 3, - timeout: 4, - baseDelay: 1, -}) - .step( - { slug: 'website' }, - async (input) => await scrapeWebsite(input.run.url) - ) - .step( - { slug: 'summary', dependsOn: ['website'] }, - async (input) => await summarizeWithAI(input.website.content) - ) - .step({ slug: 'tags', dependsOn: ['website'] }, async (input) => { - await simulateFailure(input.run.url); - - const { keywords } = await extractTags(input.website.content); - return keywords; - }) - .step( - { slug: 'saveToDb', dependsOn: ['summary', 'tags'] }, - async (input, { supabase }) => { - const websiteData = { - user_id: input.run.user_id, - website_url: input.run.url, - summary: input.summary, - tags: input.tags, - }; - const { website } = await saveWebsite(websiteData, supabase); - - return website; - } - ); diff --git a/examples/playground/supabase/functions/_tasks/convertToCleanMarkdown.ts b/examples/playground/supabase/functions/_tasks/convertToCleanMarkdown.ts deleted file mode 100644 index 797363edc..000000000 --- a/examples/playground/supabase/functions/_tasks/convertToCleanMarkdown.ts +++ /dev/null @@ -1,19 +0,0 @@ -import sanitizeHtml from 'npm:sanitize-html'; -import { TurndownService } from 'npm:turndown'; - -export default async function convertToCleanMarkdown(rawHtml: string) { - const cleanHtml = sanitizeHtml(rawHtml, { - allowedTags: ['h1', 'h2', 'h3', 'p', 'a', 'ul', 'ol', 'li', 'code', 'pre'], - allowedAttributes: { - a: ['href', 'title'], - code: ['class'], - }, - allowedIframeHostnames: ['youtube.com'], - }); - const turndown = new TurndownService(); - return turndown.turndown(cleanHtml); -} - -// Usage -const markdown = await convertToCleanMarkdown('https://example.com'); -console.log(markdown); diff --git a/examples/playground/supabase/functions/_tasks/extractTags.ts b/examples/playground/supabase/functions/_tasks/extractTags.ts deleted file mode 100644 index c8aa1de3e..000000000 --- a/examples/playground/supabase/functions/_tasks/extractTags.ts +++ /dev/null @@ -1,52 +0,0 @@ -import Groq from 'groq-sdk'; - -let _groq: Groq | undefined; - -function getGroq() { - if (!_groq) { - _groq = new Groq({ - apiKey: Deno.env.get('GROQ_API_KEY'), - }); - } - - return _groq; -} - -export default async (content: string) => { - const chatCompletion = await getGroq().chat.completions.create({ - messages: [ - { - role: 'system', - content: 'You extract relevant keywords and tags from website content.', - }, - { - role: 'user', - content: `Extract the most important keywords and tags from the following website content. -Return a JSON object with a single "keywords" field containing an array of strings. -Focus on the most relevant and descriptive terms that represent the main topics and themes. -Limit to 5-10 keywords maximum. - -Website content: -${content}`, - }, - ], - model: 'meta-llama/llama-4-scout-17b-16e-instruct', - response_format: { - type: 'json_object', - }, - }); - - // Parse the JSON response directly - const responseJson = JSON.parse( - chatCompletion.choices[0].message.content || '{}', - ); - let keywords: string[] = []; // Default to empty array - - if (Array.isArray(responseJson.keywords)) { - keywords = responseJson.keywords; - } - - return { - keywords: keywords, - }; -}; diff --git a/examples/playground/supabase/functions/_tasks/saveWebsite.ts b/examples/playground/supabase/functions/_tasks/saveWebsite.ts deleted file mode 100644 index 1b1134fc2..000000000 --- a/examples/playground/supabase/functions/_tasks/saveWebsite.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { SupabaseClient } from '@supabase/supabase-js'; -import type { Database } from '../database-types.d.ts'; - -interface WebsiteData { - user_id: string; - website_url: string; - summary: string; - tags: string[]; -} - -export default async ( - websiteData: WebsiteData, - supabase: SupabaseClient, -) => { - const { data } = await supabase - .schema('public') - .from('websites') - .insert([websiteData]) - .select('*') - .single() - .throwOnError(); - console.log('results', data); - - return { success: true, website: data }; -}; diff --git a/examples/playground/supabase/functions/_tasks/scrapeWebsite.ts b/examples/playground/supabase/functions/_tasks/scrapeWebsite.ts deleted file mode 100644 index 8e191047d..000000000 --- a/examples/playground/supabase/functions/_tasks/scrapeWebsite.ts +++ /dev/null @@ -1,57 +0,0 @@ -export default async function scrapeWebsite(url: string) { - const response = await fetch(url); - - if (!response.ok) { - throw new Error(`Failed to fetch website: ${response.status}`); - } - - const rawContent = await response.text(); - - // Extract text content from HTML - const textContent = stripHtmlTags(rawContent); - - return { - content: textContent, - }; -} - -/** - * Strips HTML tags from content and extracts text - * Focuses on content within the body tag and removes scripts, styles, etc. - */ -function stripHtmlTags(html: string): string { - // Extract body content if possible - const bodyMatch = html.match(/]*>([\s\S]*?)<\/body>/i); - const bodyContent = bodyMatch ? bodyMatch[1] : html; - - // Remove script and style tags and their contents - let cleanedContent = bodyContent - .replace(/)<[^<]*)*<\/script>/gi, '') - .replace(/)<[^<]*)*<\/style>/gi, ''); - - // Remove HTML tags but preserve line breaks - cleanedContent = cleanedContent - .replace(//gi, '\n') - .replace(/<\/p>/gi, '\n\n') - .replace(/<\/div>/gi, '\n') - .replace(/<\/h[1-6]>/gi, '\n\n') - .replace(/<\/li>/gi, '\n') - .replace(/<[^>]*>/g, ''); - - // Decode HTML entities - cleanedContent = cleanedContent - .replace(/ /g, ' ') - .replace(/&/g, '&') - .replace(/</g, '<') - .replace(/>/g, '>') - .replace(/"/g, '"') - .replace(/'/g, "'"); - - // Remove excessive whitespace - cleanedContent = cleanedContent - .replace(/\n\s*\n\s*\n/g, '\n\n') - .replace(/\s+/g, ' ') - .trim(); - - return cleanedContent; -} diff --git a/examples/playground/supabase/functions/_tasks/summarizeWithAI.ts b/examples/playground/supabase/functions/_tasks/summarizeWithAI.ts deleted file mode 100644 index d288aaccd..000000000 --- a/examples/playground/supabase/functions/_tasks/summarizeWithAI.ts +++ /dev/null @@ -1,30 +0,0 @@ -import Groq from 'groq-sdk'; - -let _groq: Groq | undefined; - -function getGroq() { - if (!_groq) { - _groq = new Groq({ - apiKey: Deno.env.get('GROQ_API_KEY'), - }); - } - - return _groq; -} - -export default async (content: string) => { - const chatCompletion = await getGroq().chat.completions.create({ - messages: [ - { - role: 'user', - content: `Please provide a concise summary of the following content:\n\n${content}`, - }, - ], - model: 'meta-llama/llama-4-scout-17b-16e-instruct', - }); - - return ( - chatCompletion.choices[0].message.content ?? - 'Summary not available, please try again.' - ); -}; diff --git a/examples/playground/supabase/functions/analyze_website_worker_0/index.ts b/examples/playground/supabase/functions/analyze_website_worker_0/index.ts deleted file mode 100644 index 07b86d1e9..000000000 --- a/examples/playground/supabase/functions/analyze_website_worker_0/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { EdgeWorker } from '@pgflow/edge-worker'; -import AnalyzeWebsite from '../_flows/analyze_website.ts'; - -EdgeWorker.start(AnalyzeWebsite, { maxPollSeconds: 5 }); diff --git a/examples/playground/supabase/functions/analyze_website_worker_1/index.ts b/examples/playground/supabase/functions/analyze_website_worker_1/index.ts deleted file mode 100644 index 07b86d1e9..000000000 --- a/examples/playground/supabase/functions/analyze_website_worker_1/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { EdgeWorker } from '@pgflow/edge-worker'; -import AnalyzeWebsite from '../_flows/analyze_website.ts'; - -EdgeWorker.start(AnalyzeWebsite, { maxPollSeconds: 5 }); diff --git a/examples/playground/supabase/functions/analyze_website_worker_2/index.ts b/examples/playground/supabase/functions/analyze_website_worker_2/index.ts deleted file mode 100644 index 07b86d1e9..000000000 --- a/examples/playground/supabase/functions/analyze_website_worker_2/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { EdgeWorker } from '@pgflow/edge-worker'; -import AnalyzeWebsite from '../_flows/analyze_website.ts'; - -EdgeWorker.start(AnalyzeWebsite, { maxPollSeconds: 5 }); diff --git a/examples/playground/supabase/functions/analyze_website_worker_3/index.ts b/examples/playground/supabase/functions/analyze_website_worker_3/index.ts deleted file mode 100644 index 07b86d1e9..000000000 --- a/examples/playground/supabase/functions/analyze_website_worker_3/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { EdgeWorker } from '@pgflow/edge-worker'; -import AnalyzeWebsite from '../_flows/analyze_website.ts'; - -EdgeWorker.start(AnalyzeWebsite, { maxPollSeconds: 5 }); diff --git a/examples/playground/supabase/functions/database-types.d.ts b/examples/playground/supabase/functions/database-types.d.ts deleted file mode 100644 index a5d1921c1..000000000 --- a/examples/playground/supabase/functions/database-types.d.ts +++ /dev/null @@ -1,657 +0,0 @@ -export type Json = - | string - | number - | boolean - | null - | { [key: string]: Json | undefined } - | Json[] - -export type Database = { - pgflow: { - Tables: { - deps: { - Row: { - created_at: string - dep_slug: string - flow_slug: string - step_slug: string - } - Insert: { - created_at?: string - dep_slug: string - flow_slug: string - step_slug: string - } - Update: { - created_at?: string - dep_slug?: string - flow_slug?: string - step_slug?: string - } - Relationships: [ - { - foreignKeyName: "deps_flow_slug_dep_slug_fkey" - columns: ["flow_slug", "dep_slug"] - isOneToOne: false - referencedRelation: "steps" - referencedColumns: ["flow_slug", "step_slug"] - }, - { - foreignKeyName: "deps_flow_slug_fkey" - columns: ["flow_slug"] - isOneToOne: false - referencedRelation: "flows" - referencedColumns: ["flow_slug"] - }, - { - foreignKeyName: "deps_flow_slug_step_slug_fkey" - columns: ["flow_slug", "step_slug"] - isOneToOne: false - referencedRelation: "steps" - referencedColumns: ["flow_slug", "step_slug"] - }, - ] - } - flows: { - Row: { - created_at: string - flow_slug: string - opt_base_delay: number - opt_max_attempts: number - opt_timeout: number - } - Insert: { - created_at?: string - flow_slug: string - opt_base_delay?: number - opt_max_attempts?: number - opt_timeout?: number - } - Update: { - created_at?: string - flow_slug?: string - opt_base_delay?: number - opt_max_attempts?: number - opt_timeout?: number - } - Relationships: [] - } - runs: { - Row: { - completed_at: string | null - failed_at: string | null - flow_slug: string - input: Json - output: Json | null - remaining_steps: number - run_id: string - started_at: string - status: string - } - Insert: { - completed_at?: string | null - failed_at?: string | null - flow_slug: string - input: Json - output?: Json | null - remaining_steps?: number - run_id?: string - started_at?: string - status?: string - } - Update: { - completed_at?: string | null - failed_at?: string | null - flow_slug?: string - input?: Json - output?: Json | null - remaining_steps?: number - run_id?: string - started_at?: string - status?: string - } - Relationships: [ - { - foreignKeyName: "runs_flow_slug_fkey" - columns: ["flow_slug"] - isOneToOne: false - referencedRelation: "flows" - referencedColumns: ["flow_slug"] - }, - ] - } - step_states: { - Row: { - completed_at: string | null - created_at: string - failed_at: string | null - flow_slug: string - remaining_deps: number - remaining_tasks: number - run_id: string - started_at: string | null - status: string - step_slug: string - } - Insert: { - completed_at?: string | null - created_at?: string - failed_at?: string | null - flow_slug: string - remaining_deps?: number - remaining_tasks?: number - run_id: string - started_at?: string | null - status?: string - step_slug: string - } - Update: { - completed_at?: string | null - created_at?: string - failed_at?: string | null - flow_slug?: string - remaining_deps?: number - remaining_tasks?: number - run_id?: string - started_at?: string | null - status?: string - step_slug?: string - } - Relationships: [ - { - foreignKeyName: "step_states_flow_slug_fkey" - columns: ["flow_slug"] - isOneToOne: false - referencedRelation: "flows" - referencedColumns: ["flow_slug"] - }, - { - foreignKeyName: "step_states_flow_slug_step_slug_fkey" - columns: ["flow_slug", "step_slug"] - isOneToOne: false - referencedRelation: "steps" - referencedColumns: ["flow_slug", "step_slug"] - }, - { - foreignKeyName: "step_states_run_id_fkey" - columns: ["run_id"] - isOneToOne: false - referencedRelation: "runs" - referencedColumns: ["run_id"] - }, - ] - } - step_tasks: { - Row: { - attempts_count: number - completed_at: string | null - error_message: string | null - failed_at: string | null - flow_slug: string - message_id: number | null - output: Json | null - queued_at: string - run_id: string - status: string - step_slug: string - task_index: number - } - Insert: { - attempts_count?: number - completed_at?: string | null - error_message?: string | null - failed_at?: string | null - flow_slug: string - message_id?: number | null - output?: Json | null - queued_at?: string - run_id: string - status?: string - step_slug: string - task_index?: number - } - Update: { - attempts_count?: number - completed_at?: string | null - error_message?: string | null - failed_at?: string | null - flow_slug?: string - message_id?: number | null - output?: Json | null - queued_at?: string - run_id?: string - status?: string - step_slug?: string - task_index?: number - } - Relationships: [ - { - foreignKeyName: "step_tasks_flow_slug_fkey" - columns: ["flow_slug"] - isOneToOne: false - referencedRelation: "flows" - referencedColumns: ["flow_slug"] - }, - { - foreignKeyName: "step_tasks_run_id_fkey" - columns: ["run_id"] - isOneToOne: false - referencedRelation: "runs" - referencedColumns: ["run_id"] - }, - { - foreignKeyName: "step_tasks_run_id_step_slug_fkey" - columns: ["run_id", "step_slug"] - isOneToOne: false - referencedRelation: "step_states" - referencedColumns: ["run_id", "step_slug"] - }, - ] - } - steps: { - Row: { - created_at: string - deps_count: number - flow_slug: string - opt_base_delay: number | null - opt_max_attempts: number | null - opt_timeout: number | null - step_index: number - step_slug: string - step_type: string - } - Insert: { - created_at?: string - deps_count?: number - flow_slug: string - opt_base_delay?: number | null - opt_max_attempts?: number | null - opt_timeout?: number | null - step_index?: number - step_slug: string - step_type?: string - } - Update: { - created_at?: string - deps_count?: number - flow_slug?: string - opt_base_delay?: number | null - opt_max_attempts?: number | null - opt_timeout?: number | null - step_index?: number - step_slug?: string - step_type?: string - } - Relationships: [ - { - foreignKeyName: "steps_flow_slug_fkey" - columns: ["flow_slug"] - isOneToOne: false - referencedRelation: "flows" - referencedColumns: ["flow_slug"] - }, - ] - } - workers: { - Row: { - function_name: string - last_heartbeat_at: string - queue_name: string - started_at: string - stopped_at: string | null - worker_id: string - } - Insert: { - function_name: string - last_heartbeat_at?: string - queue_name: string - started_at?: string - stopped_at?: string | null - worker_id: string - } - Update: { - function_name?: string - last_heartbeat_at?: string - queue_name?: string - started_at?: string - stopped_at?: string | null - worker_id?: string - } - Relationships: [] - } - } - Views: { - [_ in never]: never - } - Functions: { - add_step: { - Args: - | { - flow_slug: string - step_slug: string - deps_slugs: string[] - max_attempts?: number - base_delay?: number - timeout?: number - } - | { - flow_slug: string - step_slug: string - max_attempts?: number - base_delay?: number - timeout?: number - } - Returns: { - created_at: string - deps_count: number - flow_slug: string - opt_base_delay: number | null - opt_max_attempts: number | null - opt_timeout: number | null - step_index: number - step_slug: string - step_type: string - } - } - calculate_retry_delay: { - Args: { base_delay: number; attempts_count: number } - Returns: number - } - complete_task: { - Args: { - run_id: string - step_slug: string - task_index: number - output: Json - } - Returns: { - attempts_count: number - completed_at: string | null - error_message: string | null - failed_at: string | null - flow_slug: string - message_id: number | null - output: Json | null - queued_at: string - run_id: string - status: string - step_slug: string - task_index: number - }[] - } - create_flow: { - Args: { - flow_slug: string - max_attempts?: number - base_delay?: number - timeout?: number - } - Returns: { - created_at: string - flow_slug: string - opt_base_delay: number - opt_max_attempts: number - opt_timeout: number - } - } - fail_task: { - Args: { - run_id: string - step_slug: string - task_index: number - error_message: string - } - Returns: { - attempts_count: number - completed_at: string | null - error_message: string | null - failed_at: string | null - flow_slug: string - message_id: number | null - output: Json | null - queued_at: string - run_id: string - status: string - step_slug: string - task_index: number - }[] - } - is_valid_slug: { - Args: { slug: string } - Returns: boolean - } - maybe_complete_run: { - Args: { run_id: string } - Returns: undefined - } - poll_for_tasks: { - Args: { - queue_name: string - vt: number - qty: number - max_poll_seconds?: number - poll_interval_ms?: number - } - Returns: Database["pgflow"]["CompositeTypes"]["step_task_record"][] - } - read_with_poll: { - Args: { - queue_name: string - vt: number - qty: number - max_poll_seconds?: number - poll_interval_ms?: number - conditional?: Json - } - Returns: unknown[] - } - start_flow: { - Args: { flow_slug: string; input: Json } - Returns: { - completed_at: string | null - failed_at: string | null - flow_slug: string - input: Json - output: Json | null - remaining_steps: number - run_id: string - started_at: string - status: string - }[] - } - start_ready_steps: { - Args: { run_id: string } - Returns: undefined - } - } - Enums: { - [_ in never]: never - } - CompositeTypes: { - step_task_record: { - flow_slug: string | null - run_id: string | null - step_slug: string | null - input: Json | null - msg_id: number | null - } - } - } - public: { - Tables: { - websites: { - Row: { - created_at: string - id: number - sentiment: number - summary: string - tags: string[] - updated_at: string - user_id: string - website_url: string - } - Insert: { - created_at?: string - id?: number - sentiment: number - summary: string - tags?: string[] - updated_at?: string - user_id: string - website_url: string - } - Update: { - created_at?: string - id?: number - sentiment?: number - summary?: string - tags?: string[] - updated_at?: string - user_id?: string - website_url?: string - } - Relationships: [] - } - } - Views: { - [_ in never]: never - } - Functions: { - start_analyze_website_flow: { - Args: { url: string } - Returns: { - completed_at: string | null - failed_at: string | null - flow_slug: string - input: Json - output: Json | null - remaining_steps: number - run_id: string - started_at: string - status: string - } - } - } - Enums: { - [_ in never]: never - } - CompositeTypes: { - [_ in never]: never - } - } -} - -type DefaultSchema = Database[Extract] - -export type Tables< - DefaultSchemaTableNameOrOptions extends - | keyof (DefaultSchema["Tables"] & DefaultSchema["Views"]) - | { schema: keyof Database }, - TableName extends DefaultSchemaTableNameOrOptions extends { - schema: keyof Database - } - ? keyof (Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] & - Database[DefaultSchemaTableNameOrOptions["schema"]]["Views"]) - : never = never, -> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database } - ? (Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] & - Database[DefaultSchemaTableNameOrOptions["schema"]]["Views"])[TableName] extends { - Row: infer R - } - ? R - : never - : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema["Tables"] & - DefaultSchema["Views"]) - ? (DefaultSchema["Tables"] & - DefaultSchema["Views"])[DefaultSchemaTableNameOrOptions] extends { - Row: infer R - } - ? R - : never - : never - -export type TablesInsert< - DefaultSchemaTableNameOrOptions extends - | keyof DefaultSchema["Tables"] - | { schema: keyof Database }, - TableName extends DefaultSchemaTableNameOrOptions extends { - schema: keyof Database - } - ? keyof Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] - : never = never, -> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database } - ? Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends { - Insert: infer I - } - ? I - : never - : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] - ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { - Insert: infer I - } - ? I - : never - : never - -export type TablesUpdate< - DefaultSchemaTableNameOrOptions extends - | keyof DefaultSchema["Tables"] - | { schema: keyof Database }, - TableName extends DefaultSchemaTableNameOrOptions extends { - schema: keyof Database - } - ? keyof Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] - : never = never, -> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database } - ? Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends { - Update: infer U - } - ? U - : never - : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] - ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { - Update: infer U - } - ? U - : never - : never - -export type Enums< - DefaultSchemaEnumNameOrOptions extends - | keyof DefaultSchema["Enums"] - | { schema: keyof Database }, - EnumName extends DefaultSchemaEnumNameOrOptions extends { - schema: keyof Database - } - ? keyof Database[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"] - : never = never, -> = DefaultSchemaEnumNameOrOptions extends { schema: keyof Database } - ? Database[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"][EnumName] - : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema["Enums"] - ? DefaultSchema["Enums"][DefaultSchemaEnumNameOrOptions] - : never - -export type CompositeTypes< - PublicCompositeTypeNameOrOptions extends - | keyof DefaultSchema["CompositeTypes"] - | { schema: keyof Database }, - CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { - schema: keyof Database - } - ? keyof Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"] - : never = never, -> = PublicCompositeTypeNameOrOptions extends { schema: keyof Database } - ? Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName] - : PublicCompositeTypeNameOrOptions extends keyof DefaultSchema["CompositeTypes"] - ? DefaultSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions] - : never - -export const Constants = { - pgflow: { - Enums: {}, - }, - public: { - Enums: {}, - }, -} as const - diff --git a/examples/playground/supabase/functions/deno.json b/examples/playground/supabase/functions/deno.json deleted file mode 100644 index 04121074e..000000000 --- a/examples/playground/supabase/functions/deno.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "imports": { - "@pgflow/edge-worker": "jsr:@pgflow/edge-worker@0.0.0-array-map-steps-cd94242a-20251008042921", - "@pgflow/edge-worker/_internal": "jsr:@pgflow/edge-worker@0.0.0-array-map-steps-cd94242a-20251008042921/_internal", - "@pgflow/dsl": "npm:@pgflow/dsl@0.0.0-array-map-steps-cd94242a-20251008042921", - "@pgflow/dsl/supabase": "npm:@pgflow/dsl@0.0.0-array-map-steps-cd94242a-20251008042921/supabase", - "@pgflow/core": "npm:@pgflow/core@0.0.0-array-map-steps-cd94242a-20251008042921", - "@henrygd/queue": "jsr:@henrygd/queue@^1.0.7", - "@supabase/supabase-js": "jsr:@supabase/supabase-js@^2.49.4", - "groq-sdk": "npm:groq-sdk@^0.20.1", - "postgres": "npm:postgres@3.4.5", - "sanitize-html": "npm:sanitize-html@^2.16.0", - "turndown": "npm:turndown@^7.2.0" - } -} diff --git a/examples/playground/supabase/functions/deno.lock b/examples/playground/supabase/functions/deno.lock deleted file mode 100644 index 8f77d40ca..000000000 --- a/examples/playground/supabase/functions/deno.lock +++ /dev/null @@ -1,623 +0,0 @@ -{ - "version": "3", - "packages": { - "specifiers": { - "jsr:@henrygd/queue@^1.0.7": "jsr:@henrygd/queue@1.0.7", - "jsr:@pgflow/edge-worker@0.0.0-array-map-steps-cd94242a-20251008042921": "jsr:@pgflow/edge-worker@0.0.0-array-map-steps-cd94242a-20251008042921", - "jsr:@supabase/supabase-js@^2.49.4": "jsr:@supabase/supabase-js@2.58.0", - "npm:@pgflow/core@0.0.0-array-map-steps-cd94242a-20251008042921": "npm:@pgflow/core@0.0.0-array-map-steps-cd94242a-20251008042921", - "npm:@pgflow/dsl@0.0.0-array-map-steps-cd94242a-20251008042921": "npm:@pgflow/dsl@0.0.0-array-map-steps-cd94242a-20251008042921", - "npm:@supabase/auth-js@2.69.1": "npm:@supabase/auth-js@2.69.1", - "npm:@supabase/auth-js@2.70.0": "npm:@supabase/auth-js@2.70.0", - "npm:@supabase/auth-js@2.72.0": "npm:@supabase/auth-js@2.72.0", - "npm:@supabase/functions-js@2.4.4": "npm:@supabase/functions-js@2.4.4", - "npm:@supabase/functions-js@2.5.0": "npm:@supabase/functions-js@2.5.0", - "npm:@supabase/node-fetch@2.6.15": "npm:@supabase/node-fetch@2.6.15", - "npm:@supabase/postgrest-js@1.19.4": "npm:@supabase/postgrest-js@1.19.4", - "npm:@supabase/postgrest-js@1.21.4": "npm:@supabase/postgrest-js@1.21.4", - "npm:@supabase/realtime-js@2.11.10": "npm:@supabase/realtime-js@2.11.10", - "npm:@supabase/realtime-js@2.11.15": "npm:@supabase/realtime-js@2.11.15_ws@8.18.2", - "npm:@supabase/realtime-js@2.11.2": "npm:@supabase/realtime-js@2.11.2", - "npm:@supabase/realtime-js@2.15.5": "npm:@supabase/realtime-js@2.15.5", - "npm:@supabase/storage-js@2.12.2": "npm:@supabase/storage-js@2.12.2", - "npm:@supabase/storage-js@2.7.1": "npm:@supabase/storage-js@2.7.1", - "npm:@supabase/supabase-js@^2.47.10": "npm:@supabase/supabase-js@2.74.0", - "npm:groq-sdk@^0.20.1": "npm:groq-sdk@0.20.1", - "npm:postgres@3.4.5": "npm:postgres@3.4.5", - "npm:sanitize-html": "npm:sanitize-html@2.16.0", - "npm:turndown": "npm:turndown@7.2.0" - }, - "jsr": { - "@henrygd/queue@1.0.7": { - "integrity": "98cade132744bb420957c5413393f76eb8ba7261826f026c8a89a562b8fa2961" - }, - "@pgflow/edge-worker@0.0.0-array-map-steps-cd94242a-20251008042921": { - "integrity": "1aabede3ce7d770911287274ac09ef86502c3484e8cb989d55f83d6afd5419b3", - "dependencies": [ - "jsr:@henrygd/queue@^1.0.7", - "npm:@pgflow/core@0.0.0-array-map-steps-cd94242a-20251008042921", - "npm:@pgflow/dsl@0.0.0-array-map-steps-cd94242a-20251008042921", - "npm:@supabase/supabase-js@^2.47.10", - "npm:postgres@3.4.5" - ] - }, - "@pgflow/edge-worker@0.4.3": { - "integrity": "914f3ce2d46d97be7c314face183ebbd1f5a9d85f6edfc2019cee37d2ed5d6c9", - "dependencies": [ - "jsr:@henrygd/queue@^1.0.7", - "npm:@pgflow/core@0.4.3", - "npm:@pgflow/dsl@0.4.3", - "npm:postgres@3.4.5" - ] - }, - "@supabase/supabase-js@2.49.4": { - "integrity": "4b785f9cd4a62feb7b3f84606bb923a4ea51e3e000eafff0972bc779240b7592", - "dependencies": [ - "npm:@supabase/auth-js@2.69.1", - "npm:@supabase/functions-js@2.4.4", - "npm:@supabase/node-fetch@2.6.15", - "npm:@supabase/postgrest-js@1.19.4", - "npm:@supabase/realtime-js@2.11.2", - "npm:@supabase/storage-js@2.7.1" - ] - }, - "@supabase/supabase-js@2.50.0": { - "integrity": "d583ced1777f6bda163de3aca49f9b00b62c48633c5d129492531a11b3542457", - "dependencies": [ - "npm:@supabase/auth-js@2.70.0", - "npm:@supabase/functions-js@2.4.4", - "npm:@supabase/node-fetch@2.6.15", - "npm:@supabase/postgrest-js@1.19.4", - "npm:@supabase/realtime-js@2.11.10", - "npm:@supabase/storage-js@2.7.1" - ] - }, - "@supabase/supabase-js@2.50.2": { - "integrity": "d7fc817c78310906df97c03121b184ac7dcc083f893ce61e057e02312c6638c3", - "dependencies": [ - "npm:@supabase/auth-js@2.70.0", - "npm:@supabase/functions-js@2.4.4", - "npm:@supabase/node-fetch@2.6.15", - "npm:@supabase/postgrest-js@1.19.4", - "npm:@supabase/realtime-js@2.11.15", - "npm:@supabase/storage-js@2.7.1" - ] - }, - "@supabase/supabase-js@2.58.0": { - "integrity": "4d04e72e9f632b451ac7d1a84de0b85249c0097fdf06253f371c1f0a23e62c87", - "dependencies": [ - "npm:@supabase/auth-js@2.72.0", - "npm:@supabase/functions-js@2.5.0", - "npm:@supabase/node-fetch@2.6.15", - "npm:@supabase/postgrest-js@1.21.4", - "npm:@supabase/realtime-js@2.15.5", - "npm:@supabase/storage-js@2.12.2" - ] - } - }, - "npm": { - "@mixmark-io/domino@2.2.0": { - "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", - "dependencies": {} - }, - "@pgflow/core@0.0.0-array-map-steps-cd94242a-20251008042921": { - "integrity": "sha512-2E/HJSp7QHCtlNHHTlwbp/f8gVM6kQba3u2tFghvnJpqsQxE0sEzQwpZzO/OcgjmpmuuFYxroTviBjilFif/kw==", - "dependencies": { - "@pgflow/dsl": "@pgflow/dsl@0.0.0-array-map-steps-cd94242a-20251008042921", - "postgres": "postgres@3.4.5" - } - }, - "@pgflow/dsl@0.0.0-array-map-steps-cd94242a-20251008042921": { - "integrity": "sha512-0Ph2n6tiia4zDz/DT8Eo1nLiJC+A5ZZaKe9hmG2bEgAT1qNKnq9osP8ka2Ds3DxVMJR6N+fou8BE+SOv9D+FAA==", - "dependencies": {} - }, - "@supabase/auth-js@2.69.1": { - "integrity": "sha512-FILtt5WjCNzmReeRLq5wRs3iShwmnWgBvxHfqapC/VoljJl+W8hDAyFmf1NVw3zH+ZjZ05AKxiKxVeb0HNWRMQ==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/auth-js@2.70.0": { - "integrity": "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/auth-js@2.72.0": { - "integrity": "sha512-4+bnUrtTDK1YD0/FCx2YtMiQH5FGu9Jlf4IQi5kcqRwRwqp2ey39V61nHNdH86jm3DIzz0aZKiWfTW8qXk1swQ==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/auth-js@2.74.0": { - "integrity": "sha512-EJYDxYhBCOS40VJvfQ5zSjo8Ku7JbTICLTcmXt4xHMQZt4IumpRfHg11exXI9uZ6G7fhsQlNgbzDhFN4Ni9NnA==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/functions-js@2.4.4": { - "integrity": "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/functions-js@2.5.0": { - "integrity": "sha512-SXBx6Jvp+MOBekeKFu+G11YLYPeVeGQl23eYyAG9+Ro0pQ1aIP0UZNIBxHKNHqxzR0L0n6gysNr2KT3841NATw==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/functions-js@2.74.0": { - "integrity": "sha512-VqWYa981t7xtIFVf7LRb9meklHckbH/tqwaML5P3LgvlaZHpoSPjMCNLcquuLYiJLxnh2rio7IxLh+VlvRvSWw==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/node-fetch@2.6.15": { - "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", - "dependencies": { - "whatwg-url": "whatwg-url@5.0.0" - } - }, - "@supabase/postgrest-js@1.19.4": { - "integrity": "sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/postgrest-js@1.21.4": { - "integrity": "sha512-TxZCIjxk6/dP9abAi89VQbWWMBbybpGWyvmIzTd79OeravM13OjR/YEYeyUOPcM1C3QyvXkvPZhUfItvmhY1IQ==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/postgrest-js@2.74.0": { - "integrity": "sha512-9Ypa2eS0Ib/YQClE+BhDSjx7OKjYEF6LAGjTB8X4HucdboGEwR0LZKctNfw6V0PPIAVjjzZxIlNBXGv0ypIkHw==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/realtime-js@2.11.10": { - "integrity": "sha512-SJKVa7EejnuyfImrbzx+HaD9i6T784khuw1zP+MBD7BmJYChegGxYigPzkKX8CK8nGuDntmeSD3fvriaH0EGZA==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15", - "@types/phoenix": "@types/phoenix@1.6.6", - "@types/ws": "@types/ws@8.18.1", - "ws": "ws@8.18.2" - } - }, - "@supabase/realtime-js@2.11.15_ws@8.18.2": { - "integrity": "sha512-HQKRnwAqdVqJW/P9TjKVK+/ETpW4yQ8tyDPPtRMKOH4Uh3vQD74vmj353CYs8+YwVBKubeUOOEpI9CT8mT4obw==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15", - "@types/phoenix": "@types/phoenix@1.6.6", - "@types/ws": "@types/ws@8.18.1", - "isows": "isows@1.0.7_ws@8.18.2", - "ws": "ws@8.18.2" - } - }, - "@supabase/realtime-js@2.11.2": { - "integrity": "sha512-u/XeuL2Y0QEhXSoIPZZwR6wMXgB+RQbJzG9VErA3VghVt7uRfSVsjeqd7m5GhX3JR6dM/WRmLbVR8URpDWG4+w==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15", - "@types/phoenix": "@types/phoenix@1.6.6", - "@types/ws": "@types/ws@8.18.1", - "ws": "ws@8.18.1" - } - }, - "@supabase/realtime-js@2.15.5": { - "integrity": "sha512-/Rs5Vqu9jejRD8ZeuaWXebdkH+J7V6VySbCZ/zQM93Ta5y3mAmocjioa/nzlB6qvFmyylUgKVS1KpE212t30OA==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15", - "@types/phoenix": "@types/phoenix@1.6.6", - "@types/ws": "@types/ws@8.18.1", - "ws": "ws@8.18.2" - } - }, - "@supabase/realtime-js@2.74.0": { - "integrity": "sha512-K5VqpA4/7RO1u1nyD5ICFKzWKu58bIDcPxHY0aFA7MyWkFd0pzi/XYXeoSsAifnD9p72gPIpgxVXCQZKJg1ktQ==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15", - "@types/phoenix": "@types/phoenix@1.6.6", - "@types/ws": "@types/ws@8.18.1", - "ws": "ws@8.18.2" - } - }, - "@supabase/storage-js@2.12.2": { - "integrity": "sha512-SiySHxi3q7gia7NBYpsYRu8gyI0NhFwSORMxbZIxJ/zAVkN6QpwDRan158CJ+UdzD4WB/rQMAGRqIJQP+7ccAQ==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/storage-js@2.7.1": { - "integrity": "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/storage-js@2.74.0": { - "integrity": "sha512-o0cTQdMqHh4ERDLtjUp1/KGPbQoNwKRxUh6f8+KQyjC5DSmiw/r+jgFe/WHh067aW+WU8nA9Ytw9ag7OhzxEkQ==", - "dependencies": { - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15" - } - }, - "@supabase/supabase-js@2.74.0": { - "integrity": "sha512-IEMM/V6gKdP+N/X31KDIczVzghDpiPWFGLNjS8Rus71KvV6y6ueLrrE/JGCHDrU+9pq5copF3iCa0YQh+9Lq9Q==", - "dependencies": { - "@supabase/auth-js": "@supabase/auth-js@2.74.0", - "@supabase/functions-js": "@supabase/functions-js@2.74.0", - "@supabase/node-fetch": "@supabase/node-fetch@2.6.15", - "@supabase/postgrest-js": "@supabase/postgrest-js@2.74.0", - "@supabase/realtime-js": "@supabase/realtime-js@2.74.0", - "@supabase/storage-js": "@supabase/storage-js@2.74.0" - } - }, - "@types/node-fetch@2.6.12": { - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", - "dependencies": { - "@types/node": "@types/node@18.16.19", - "form-data": "form-data@4.0.2" - } - }, - "@types/node@18.16.19": { - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", - "dependencies": {} - }, - "@types/node@18.19.87": { - "integrity": "sha512-OIAAu6ypnVZHmsHCeJ+7CCSub38QNBS9uceMQeg7K5Ur0Jr+wG9wEOEvvMbhp09pxD5czIUy/jND7s7Tb6Nw7A==", - "dependencies": { - "undici-types": "undici-types@5.26.5" - } - }, - "@types/phoenix@1.6.6": { - "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==", - "dependencies": {} - }, - "@types/ws@8.18.1": { - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dependencies": { - "@types/node": "@types/node@18.16.19" - } - }, - "abort-controller@3.0.0": { - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "event-target-shim@5.0.1" - } - }, - "agentkeepalive@4.6.0": { - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "dependencies": { - "humanize-ms": "humanize-ms@1.2.1" - } - }, - "asynckit@0.4.0": { - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dependencies": {} - }, - "call-bind-apply-helpers@1.0.2": { - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": { - "es-errors": "es-errors@1.3.0", - "function-bind": "function-bind@1.1.2" - } - }, - "combined-stream@1.0.8": { - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "delayed-stream@1.0.0" - } - }, - "deepmerge@4.3.1": { - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dependencies": {} - }, - "delayed-stream@1.0.0": { - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dependencies": {} - }, - "dom-serializer@2.0.0": { - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "domelementtype@2.3.0", - "domhandler": "domhandler@5.0.3", - "entities": "entities@4.5.0" - } - }, - "domelementtype@2.3.0": { - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dependencies": {} - }, - "domhandler@5.0.3": { - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "domelementtype@2.3.0" - } - }, - "domutils@3.2.2": { - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dependencies": { - "dom-serializer": "dom-serializer@2.0.0", - "domelementtype": "domelementtype@2.3.0", - "domhandler": "domhandler@5.0.3" - } - }, - "dunder-proto@1.0.1": { - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "call-bind-apply-helpers@1.0.2", - "es-errors": "es-errors@1.3.0", - "gopd": "gopd@1.2.0" - } - }, - "entities@4.5.0": { - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dependencies": {} - }, - "es-define-property@1.0.1": { - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dependencies": {} - }, - "es-errors@1.3.0": { - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dependencies": {} - }, - "es-object-atoms@1.1.1": { - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "es-errors@1.3.0" - } - }, - "es-set-tostringtag@2.1.0": { - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dependencies": { - "es-errors": "es-errors@1.3.0", - "get-intrinsic": "get-intrinsic@1.3.0", - "has-tostringtag": "has-tostringtag@1.0.2", - "hasown": "hasown@2.0.2" - } - }, - "escape-string-regexp@4.0.0": { - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dependencies": {} - }, - "event-target-shim@5.0.1": { - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dependencies": {} - }, - "form-data-encoder@1.7.2": { - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "dependencies": {} - }, - "form-data@4.0.2": { - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dependencies": { - "asynckit": "asynckit@0.4.0", - "combined-stream": "combined-stream@1.0.8", - "es-set-tostringtag": "es-set-tostringtag@2.1.0", - "mime-types": "mime-types@2.1.35" - } - }, - "formdata-node@4.4.1": { - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "dependencies": { - "node-domexception": "node-domexception@1.0.0", - "web-streams-polyfill": "web-streams-polyfill@4.0.0-beta.3" - } - }, - "function-bind@1.1.2": { - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dependencies": {} - }, - "get-intrinsic@1.3.0": { - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dependencies": { - "call-bind-apply-helpers": "call-bind-apply-helpers@1.0.2", - "es-define-property": "es-define-property@1.0.1", - "es-errors": "es-errors@1.3.0", - "es-object-atoms": "es-object-atoms@1.1.1", - "function-bind": "function-bind@1.1.2", - "get-proto": "get-proto@1.0.1", - "gopd": "gopd@1.2.0", - "has-symbols": "has-symbols@1.1.0", - "hasown": "hasown@2.0.2", - "math-intrinsics": "math-intrinsics@1.1.0" - } - }, - "get-proto@1.0.1": { - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "dunder-proto@1.0.1", - "es-object-atoms": "es-object-atoms@1.1.1" - } - }, - "gopd@1.2.0": { - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dependencies": {} - }, - "groq-sdk@0.20.1": { - "integrity": "sha512-I/U7mHDcanKHR/P0oKSSS0M6oHR69G1QgtMplqmF3gSejJ5ihV7l+/0OqbNoqOzYoQKG4XH7O4zCqMoTKCztQQ==", - "dependencies": { - "@types/node": "@types/node@18.19.87", - "@types/node-fetch": "@types/node-fetch@2.6.12", - "abort-controller": "abort-controller@3.0.0", - "agentkeepalive": "agentkeepalive@4.6.0", - "form-data-encoder": "form-data-encoder@1.7.2", - "formdata-node": "formdata-node@4.4.1", - "node-fetch": "node-fetch@2.7.0" - } - }, - "has-symbols@1.1.0": { - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dependencies": {} - }, - "has-tostringtag@1.0.2": { - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "has-symbols@1.1.0" - } - }, - "hasown@2.0.2": { - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "function-bind@1.1.2" - } - }, - "htmlparser2@8.0.2": { - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dependencies": { - "domelementtype": "domelementtype@2.3.0", - "domhandler": "domhandler@5.0.3", - "domutils": "domutils@3.2.2", - "entities": "entities@4.5.0" - } - }, - "humanize-ms@1.2.1": { - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dependencies": { - "ms": "ms@2.1.3" - } - }, - "is-plain-object@5.0.0": { - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dependencies": {} - }, - "isows@1.0.7_ws@8.18.2": { - "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", - "dependencies": { - "ws": "ws@8.18.2" - } - }, - "math-intrinsics@1.1.0": { - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dependencies": {} - }, - "mime-db@1.52.0": { - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dependencies": {} - }, - "mime-types@2.1.35": { - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "mime-db@1.52.0" - } - }, - "ms@2.1.3": { - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dependencies": {} - }, - "nanoid@3.3.11": { - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dependencies": {} - }, - "node-domexception@1.0.0": { - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dependencies": {} - }, - "node-fetch@2.7.0": { - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "whatwg-url@5.0.0" - } - }, - "parse-srcset@1.0.2": { - "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", - "dependencies": {} - }, - "picocolors@1.1.1": { - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dependencies": {} - }, - "postcss@8.5.3": { - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dependencies": { - "nanoid": "nanoid@3.3.11", - "picocolors": "picocolors@1.1.1", - "source-map-js": "source-map-js@1.2.1" - } - }, - "postgres@3.4.5": { - "integrity": "sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==", - "dependencies": {} - }, - "sanitize-html@2.16.0": { - "integrity": "sha512-0s4caLuHHaZFVxFTG74oW91+j6vW7gKbGD6CD2+miP73CE6z6YtOBN0ArtLd2UGyi4IC7K47v3ENUbQX4jV3Mg==", - "dependencies": { - "deepmerge": "deepmerge@4.3.1", - "escape-string-regexp": "escape-string-regexp@4.0.0", - "htmlparser2": "htmlparser2@8.0.2", - "is-plain-object": "is-plain-object@5.0.0", - "parse-srcset": "parse-srcset@1.0.2", - "postcss": "postcss@8.5.3" - } - }, - "source-map-js@1.2.1": { - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dependencies": {} - }, - "tr46@0.0.3": { - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dependencies": {} - }, - "turndown@7.2.0": { - "integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==", - "dependencies": { - "@mixmark-io/domino": "@mixmark-io/domino@2.2.0" - } - }, - "undici-types@5.26.5": { - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dependencies": {} - }, - "web-streams-polyfill@4.0.0-beta.3": { - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "dependencies": {} - }, - "webidl-conversions@3.0.1": { - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dependencies": {} - }, - "whatwg-url@5.0.0": { - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "tr46@0.0.3", - "webidl-conversions": "webidl-conversions@3.0.1" - } - }, - "ws@8.18.1": { - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "dependencies": {} - }, - "ws@8.18.2": { - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "dependencies": {} - } - } - }, - "remote": { - "https://deno.land/std@0.168.0/async/abortable.ts": "80b2ac399f142cc528f95a037a7d0e653296352d95c681e284533765961de409", - "https://deno.land/std@0.168.0/async/deadline.ts": "2c2deb53c7c28ca1dda7a3ad81e70508b1ebc25db52559de6b8636c9278fd41f", - "https://deno.land/std@0.168.0/async/debounce.ts": "60301ffb37e730cd2d6f9dadfd0ecb2a38857681bd7aaf6b0a106b06e5210a98", - "https://deno.land/std@0.168.0/async/deferred.ts": "77d3f84255c3627f1cc88699d8472b664d7635990d5358c4351623e098e917d6", - "https://deno.land/std@0.168.0/async/delay.ts": "5a9bfba8de38840308a7a33786a0155a7f6c1f7a859558ddcec5fe06e16daf57", - "https://deno.land/std@0.168.0/async/mod.ts": "7809ad4bb223e40f5fdc043e5c7ca04e0e25eed35c32c3c32e28697c553fa6d9", - "https://deno.land/std@0.168.0/async/mux_async_iterator.ts": "770a0ff26c59f8bbbda6b703a2235f04e379f73238e8d66a087edc68c2a2c35f", - "https://deno.land/std@0.168.0/async/pool.ts": "6854d8cd675a74c73391c82005cbbe4cc58183bddcd1fbbd7c2bcda42b61cf69", - "https://deno.land/std@0.168.0/async/retry.ts": "e8e5173623915bbc0ddc537698fa418cf875456c347eda1ed453528645b42e67", - "https://deno.land/std@0.168.0/async/tee.ts": "3a47cc4e9a940904fd4341f0224907e199121c80b831faa5ec2b054c6d2eff5e", - "https://deno.land/std@0.168.0/http/server.ts": "e99c1bee8a3f6571ee4cdeb2966efad465b8f6fe62bec1bdb59c1f007cc4d155" - }, - "workspace": { - "dependencies": [ - "jsr:@henrygd/queue@^1.0.7", - "jsr:@pgflow/edge-worker@0.0.0-array-map-steps-cd94242a-20251008042921", - "jsr:@supabase/supabase-js@^2.49.4", - "npm:@pgflow/core@0.0.0-array-map-steps-cd94242a-20251008042921", - "npm:@pgflow/dsl@0.0.0-array-map-steps-cd94242a-20251008042921", - "npm:groq-sdk@^0.20.1", - "npm:postgres@3.4.5", - "npm:sanitize-html@^2.16.0", - "npm:turndown@^7.2.0" - ] - } -} diff --git a/examples/playground/supabase/functions/import_map.local.json b/examples/playground/supabase/functions/import_map.local.json deleted file mode 100644 index 6c63bbe06..000000000 --- a/examples/playground/supabase/functions/import_map.local.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "imports": { - "@pgflow/core": "./_vendor/@pgflow/core/index.js", - "@pgflow/core/": "./_vendor/@pgflow/core/", - "@pgflow/dsl": "./_vendor/@pgflow/dsl/index.js", - "@pgflow/dsl/": "./_vendor/@pgflow/dsl/", - "@pgflow/dsl/supabase": "./_vendor/@pgflow/dsl/supabase.js", - "@pgflow/edge-worker": "./_vendor/@pgflow/edge-worker/index.ts", - "@pgflow/edge-worker/": "./_vendor/@pgflow/edge-worker/", - "@pgflow/edge-worker/_internal": "./_vendor/@pgflow/edge-worker/_internal.ts", - "@henrygd/queue": "jsr:@henrygd/queue@^1.0.7", - "@supabase/supabase-js": "jsr:@supabase/supabase-js@^2.49.4", - "groq-sdk": "npm:groq-sdk@^0.20.1", - "postgres": "npm:postgres@3.4.5", - "sanitize-html": "npm:sanitize-html@^2.16.0", - "turndown": "npm:turndown@^7.2.0" - } -} \ No newline at end of file diff --git a/examples/playground/supabase/functions/pgflow-cron-worker/DEPLOY.md b/examples/playground/supabase/functions/pgflow-cron-worker/DEPLOY.md deleted file mode 100644 index d5466cbbe..000000000 --- a/examples/playground/supabase/functions/pgflow-cron-worker/DEPLOY.md +++ /dev/null @@ -1,149 +0,0 @@ -# Deploying pgflow Cron Worker to Supabase - -This guide explains how to deploy the pgflow cron worker to your hosted Supabase project. - -## Prerequisites - -- Supabase CLI installed and configured -- Access to your Supabase project dashboard -- Your project's anon key and URL - -## Step 1: Deploy the Edge Function - -Deploy the pgflow-cron-worker edge function to your Supabase project: - -```bash -supabase functions deploy pgflow-cron-worker -``` - -## Step 2: Set Environment Variables - -In your Supabase dashboard: - -1. Go to Settings → Edge Functions -2. Find `pgflow-cron-worker` -3. Add the following environment variable: - - `EDGE_WORKER_DB_URL`: Your database connection string (use the connection pooler URL from Settings → Database) - -## Step 3: Enable Required Extensions - -Run this SQL in your Supabase SQL editor: - -```sql --- Enable required extensions -CREATE EXTENSION IF NOT EXISTS pg_cron; -CREATE EXTENSION IF NOT EXISTS pg_net; - --- Grant necessary permissions -GRANT USAGE ON SCHEMA cron TO postgres; -GRANT USAGE ON SCHEMA net TO postgres; -``` - -## Step 4: Create the Cron Job - -Replace the placeholders and run this SQL in your Supabase SQL editor: - -```sql --- Remove existing job if it exists -SELECT cron.unschedule(jobname) -FROM cron.job -WHERE jobname = 'pgflow-worker--analyze_website'; - --- Create the cron job --- Replace YOUR_PROJECT_REF with your Supabase project reference (e.g., 'abcdefghijklmnop') --- Replace YOUR_ANON_KEY with your project's anon key -SELECT cron.schedule( - 'pgflow-worker--analyze_website', -- job name - '*/4 * * * * *', -- every 4 seconds - $$ - SELECT net.http_post( - url := 'https://YOUR_PROJECT_REF.supabase.co/functions/v1/pgflow-cron-worker', - headers := jsonb_build_object( - 'Content-Type', 'application/json', - 'Authorization', 'Bearer YOUR_ANON_KEY' - ), - body := jsonb_build_object( - 'flow_slug', 'analyze_website', - 'batch_size', 10, - 'max_concurrent', 5, - 'cron_interval_seconds', 4 - ), - timeout_milliseconds := 25000 - ) as request_id; - $$ -); -``` - -## Step 5: Verify the Deployment - -Check that the cron job is created: - -```sql --- View scheduled jobs -SELECT * FROM cron.job WHERE jobname = 'pgflow-worker--analyze_website'; - --- Check recent job runs (after a minute) -SELECT * FROM cron.job_run_details -WHERE jobname = 'pgflow-worker--analyze_website' -ORDER BY start_time DESC -LIMIT 10; - --- Monitor HTTP requests -SELECT - created, - url, - status_code, - response_body -FROM net._http_response -WHERE url LIKE '%pgflow-cron-worker%' -ORDER BY created DESC -LIMIT 10; -``` - -## Configuration Parameters - -When creating the cron job, you must provide all these parameters: - -- `flow_slug`: The slug of the flow to process -- `batch_size`: Number of tasks to process in each batch -- `max_concurrent`: Maximum concurrent task executions -- `cron_interval_seconds`: How often the cron runs (should match your cron schedule) - -## Adjusting the Schedule - -The cron schedule uses standard cron syntax. Common examples: - -- `*/4 * * * * *` - Every 4 seconds -- `*/30 * * * * *` - Every 30 seconds -- `* * * * *` - Every minute -- `*/5 * * * *` - Every 5 minutes -- `0 * * * *` - Every hour - -Remember to update `cron_interval_seconds` in the request body to match your schedule. - -## Stopping the Cron Job - -To stop the cron job: - -```sql -SELECT cron.unschedule('pgflow-worker--analyze_website'); -``` - -## Troubleshooting - -1. **Function not found**: Ensure the edge function is deployed -2. **Authentication errors**: Verify your anon key is correct -3. **No tasks processing**: Check that the flow exists and has pending tasks -4. **Worker registration errors**: Ensure the pgflow workers table exists - -## Security Note - -For production, consider storing your anon key as a database setting instead of hardcoding it: - -```sql --- Set the anon key as a database setting -ALTER DATABASE postgres SET app.supabase_anon_key = 'YOUR_ANON_KEY'; - --- Then use this in your cron job -'Authorization', 'Bearer ' || current_setting('app.supabase_anon_key') -``` \ No newline at end of file diff --git a/examples/playground/supabase/functions/pgflow-cron-worker/README.md b/examples/playground/supabase/functions/pgflow-cron-worker/README.md deleted file mode 100644 index 8457b9c59..000000000 --- a/examples/playground/supabase/functions/pgflow-cron-worker/README.md +++ /dev/null @@ -1,167 +0,0 @@ -# pgflow Cron Worker - -This Edge Function implements a cron-based worker architecture for pgflow, designed to be triggered by pg_cron instead of running as a persistent worker. - -## Overview - -The cron-based worker solves the scaling and control issues of persistent Edge Workers by: -- Running on a predictable schedule (every 5 seconds) -- Processing one batch of tasks per invocation -- Terminating cleanly after each run -- Avoiding uncontrolled worker spawning - -## Dependencies - -This function requires: -- `@pgflow/edge-worker@0.3.1` - For internal worker components -- `@pgflow/core@0.3.1` - For PgflowSqlClient -- `@pgflow/dsl@0.3.1` - For flow type definitions -- `postgres@3.4.5` - PostgreSQL client - -Make sure all versions are aligned with what edge-worker expects. - -## Environment Variables - -This function uses the same environment variables as other Edge Workers. The required `EDGE_WORKER_DB_URL` is already configured in `supabase/functions/.env`. - -## How it works - -Unlike the traditional Edge Worker that runs continuously, this function: -- Processes a single batch of tasks per HTTP request -- Is triggered periodically by pg_cron (every 5 seconds) -- Completes and terminates after processing -- Avoids the scaling issues of persistent Edge Workers - -## Quick Start - -### 1. Start the Edge Functions -```bash -npm run start-functions -``` - -### 2. Start the cron job -```bash -cd supabase/functions/pgflow-cron-worker -./start-cron.sh -``` - -This will: -- Get the database URL from `supabase status` -- Create a pg_cron job that runs every 5 seconds -- Start triggering the Edge Function automatically - -### 3. Monitor execution -Check the cron job status and monitor HTTP responses using SQL queries to verify the worker is running correctly. - -### 4. Stop the cron job -```bash -./stop-cron.sh -``` - -## Helper Scripts - -### start-cron.sh -Starts the pg_cron job by: -- Getting the database URL dynamically from `supabase status` -- Running the setup SQL to create the cron schedule -- Configuring the job to call the Edge Function every 5 seconds - -### stop-cron.sh -Stops the pg_cron job by: -- Getting the database URL dynamically -- Unscheduling the cron job - -### test-local.sh -Tests the Edge Function directly without cron: -```bash -./test-local.sh -``` - -### setup-cron-local.sql -SQL script that creates the pg_cron job with: -- Schedule: '5 seconds' (using interval syntax) -- URL: http://host.docker.internal:54321/functions/v1/pgflow-cron-worker -- Payload: Configures flow_slug, batch_size, and max_concurrent - -## Usage - -### 1. Deploy the function - -```bash -supabase functions deploy pgflow-cron-worker -``` - -### 2. Set up pg_cron - -Create a cron job in your database to trigger the worker: - -```sql --- Schedule polling every 5 seconds -SELECT cron.schedule( - 'pgflow-analyze-website-worker', - '*/5 * * * * *', -- Every 5 seconds - $$ - SELECT net.http_post( - url := 'https://your-project-ref.supabase.co/functions/v1/pgflow-cron-worker', - headers := jsonb_build_object( - 'Content-Type', 'application/json', - 'Authorization', 'Bearer ' || current_setting('app.supabase_anon_key') - ), - body := jsonb_build_object( - 'flow_slug', 'analyze_website', - 'batch_size', 10, - 'max_concurrent', 5 - ), - timeout_milliseconds := 25000 -- 25 second timeout - ) as request_id; - $$ -); -``` - -### 3. Test the function - -You can test the function directly: - -```bash -curl -X POST https://your-project-ref.supabase.co/functions/v1/pgflow-cron-worker \ - -H "Authorization: Bearer YOUR_ANON_KEY" \ - -H "Content-Type: application/json" \ - -d '{ - "flow_slug": "analyze_website", - "batch_size": 10, - "max_concurrent": 5 - }' -``` - -## Configuration - -The function accepts the following parameters: - -- `flow_slug` (required): The slug of the flow to process tasks for -- `batch_size` (optional, default: 10): Number of tasks to poll in a single batch -- `max_concurrent` (optional, default: 5): Maximum concurrent task executions - -## Monitoring - -The function returns JSON responses with: -- `status`: "completed" or "error" -- `flow_slug`: The flow that was processed -- `batch_size`: Number of tasks requested -- `max_concurrent`: Concurrency limit used -- `worker_id`: Unique ID of this worker instance -- `error`: Error message (only on failure) - -## Adding more flows - -To add support for more flows, edit `index.ts` and add your flow to the `flows` Map: - -```typescript -import myNewFlow from '../_flows/my_new_flow.ts'; - -const flows = new Map([ - ['analyze_website', analyzeWebsiteFlow], - ['my_new_flow', myNewFlow], // Add your flow here -]); -``` - -Then create a corresponding pg_cron job for the new flow. \ No newline at end of file diff --git a/examples/playground/supabase/functions/pgflow-cron-worker/index.ts b/examples/playground/supabase/functions/pgflow-cron-worker/index.ts deleted file mode 100644 index 8af956b24..000000000 --- a/examples/playground/supabase/functions/pgflow-cron-worker/index.ts +++ /dev/null @@ -1,271 +0,0 @@ -import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'; -import postgres from 'postgres'; -import * as internal from '@pgflow/edge-worker/_internal'; -import { PgflowSqlClient } from '@pgflow/core'; -import type { AnyFlow } from '@pgflow/dsl'; - -// Import flow definitions -import analyzeWebsiteFlow from '../_flows/analyze_website.ts'; - -const flows = new Map([ - ['analyze_website', analyzeWebsiteFlow], - // Add more flows here as needed -]); - -// Create platform adapter to get access to platform resources -const platformAdapter = internal.platform.createAdapter(); - -// Initialize all components outside request handler -const loggingFactory = internal.platform.createLoggingFactory(); -const workerId = crypto.randomUUID(); -loggingFactory.setWorkerId(workerId); - -const sql = postgres(Deno.env.get('EDGE_WORKER_DB_URL')!, { - max: 10, // Reasonable default for cron-based execution - prepare: false, -}); - -// Create abort controller without timeout - can be triggered on demand -const abortController = new AbortController(); - -// Create loggers -const logger = loggingFactory.createLogger('CronWorker'); - -// Create queries instance for worker management -const queries = new internal.core.Queries(sql); - -// Register worker once at startup -const workerRow = await queries.onWorkerStarted({ - queueName: 'analyze_website', // Default queue name - workerId: workerId, - edgeFunctionName: 'pgflow-cron-worker', -}); - -// Track heartbeat timing -let lastHeartbeat = 0; -const heartbeatInterval = 4000; // Send heartbeat every 4 seconds - -// Function to process a batch for a specific flow -async function processBatchForFlow( - flowDef: TFlow, - flow_slug: string, - batch_size: number, - max_concurrent: number, -) { - // Create pgflow SQL client with proper type - const pgflowClient = new PgflowSqlClient(sql); - - // Create poller for this flow - const poller = new internal.flow.StepTaskPoller( - pgflowClient, - abortController.signal, - { - batchSize: batch_size, - queueName: flow_slug, - visibilityTimeout: 30, - maxPollSeconds: 5, // Short poll - no need to match cron interval - pollIntervalMs: 100, // Fast polling within the 2 seconds - }, - () => workerId, - loggingFactory.createLogger('StepTaskPoller'), - ); - - // Create execution controller for this flow - const executorFactory = ( - taskWithMessage: any, // StepTaskWithMessage - type not exported through internal API - signal: AbortSignal - ) => { - // Debug logging - logger.info('ExecutorFactory received:', { - hasMessage: !!taskWithMessage?.message, - hasTask: !!taskWithMessage?.task, - hasMsgId: !!taskWithMessage?.msg_id, - keys: taskWithMessage ? Object.keys(taskWithMessage) : [], - taskWithMessage: JSON.stringify(taskWithMessage) - }); - - // Build context for StepTaskExecutor - const context = { - // Core platform resources - env: Deno.env.toObject(), - shutdownSignal: abortController.signal, - - // Step task execution context - rawMessage: taskWithMessage.message, - stepTask: taskWithMessage.task, - - // Platform-specific resources (Supabase) - ...platformAdapter.platformResources - }; - - return new internal.flow.StepTaskExecutor( - flowDef, - pgflowClient, - signal, - loggingFactory.createLogger('StepTaskExecutor'), - context - ); - }; - - const executionController = new internal.core.ExecutionController( - executorFactory, - abortController.signal, - { maxConcurrent: max_concurrent }, - loggingFactory.createLogger('ExecutionController'), - ); - - // Create and use BatchProcessor for single batch - const batchProcessor = new internal.core.BatchProcessor( - executionController, - poller, - abortController.signal, - loggingFactory.createLogger('BatchProcessor'), - ); - - // Process one batch - const startTime = Date.now(); - logger.info(`Starting batch processing for flow: ${flow_slug}`); - - await batchProcessor.processBatch(); - - // Wait for completion - await executionController.awaitCompletion(); - - const duration = Date.now() - startTime; - logger.info(`Batch processing completed for flow: ${flow_slug}`, { - duration_ms: duration, - batch_size, - max_concurrent, - }); -} - -// Helper function to send heartbeat -async function sendHeartbeat() { - const now = Date.now(); - if (now - lastHeartbeat >= heartbeatInterval) { - const result = await queries.sendHeartbeat(workerRow); - logger.debug(result.is_deprecated ? 'DEPRECATED' : 'OK'); - lastHeartbeat = now; - - if (result.is_deprecated) { - logger.warn('Worker marked for deprecation'); - // In a cron worker, we might want to handle this differently - // For now, just log the warning - } - } -} - -serve(async (req) => { - try { - // Send heartbeat - await sendHeartbeat(); - - const body = await req.json(); - const { flow_slug, batch_size, max_concurrent, cron_interval_seconds } = - body; - - // Validate required parameters - const missingParams = []; - if (!flow_slug) missingParams.push('flow_slug'); - if (batch_size === undefined || batch_size === null) - missingParams.push('batch_size'); - if (max_concurrent === undefined || max_concurrent === null) - missingParams.push('max_concurrent'); - if (cron_interval_seconds === undefined || cron_interval_seconds === null) - missingParams.push('cron_interval_seconds'); - - if (missingParams.length > 0) { - return new Response( - JSON.stringify({ - error: `Missing required parameters: ${missingParams.join(', ')}`, - required_params: [ - 'flow_slug', - 'batch_size', - 'max_concurrent', - 'cron_interval_seconds', - ], - }), - { - status: 400, - headers: { 'Content-Type': 'application/json' }, - }, - ); - } - - const flow = flows.get(flow_slug); - if (!flow) { - return new Response( - JSON.stringify({ error: `Unknown flow: ${flow_slug}` }), - { - status: 400, - headers: { 'Content-Type': 'application/json' }, - }, - ); - } - - logger.info(`Processing batch for flow: ${flow_slug}`, { - batch_size, - max_concurrent, - cron_interval_seconds, - }); - - const processingStartTime = Date.now(); - const maxExecutionTime = (cron_interval_seconds - 1) * 1000; // Leave 1 second buffer - const maxIterations = cron_interval_seconds * 4; // Safety limit - - let iterations = 0; - let totalProcessed = 0; - - // Keep processing batches until we're close to the next cron invocation - while ( - Date.now() - processingStartTime < maxExecutionTime && - iterations < maxIterations - ) { - iterations++; - - logger.info(`Starting batch iteration ${iterations}`); - - // Send heartbeat before each batch - await sendHeartbeat(); - - await processBatchForFlow(flow, flow_slug, batch_size, max_concurrent); - totalProcessed++; - - // Small delay to prevent tight loop if no tasks available - await new Promise((resolve) => setTimeout(resolve, 100)); - } - - const totalDuration = Date.now() - processingStartTime; - - const response = { - status: 'completed', - flow_slug, - batch_size, - max_concurrent, - cron_interval_seconds, - worker_id: workerId, - duration_ms: totalDuration, - iterations: totalProcessed, - timestamp: new Date().toISOString(), - }; - - logger.info('Request completed successfully', response); - - return new Response(JSON.stringify(response), { - headers: { 'Content-Type': 'application/json' }, - }); - } catch (error) { - logger.error('Error processing batch:', error); - return new Response( - JSON.stringify({ - status: 'error', - error: error.message, - worker_id: workerId, - }), - { - status: 500, - headers: { 'Content-Type': 'application/json' }, - }, - ); - } -}); diff --git a/examples/playground/supabase/functions/pgflow-cron-worker/setup-cron-local.sql b/examples/playground/supabase/functions/pgflow-cron-worker/setup-cron-local.sql deleted file mode 100644 index c6f18bd51..000000000 --- a/examples/playground/supabase/functions/pgflow-cron-worker/setup-cron-local.sql +++ /dev/null @@ -1,52 +0,0 @@ --- Setup pg_cron job for pgflow cron worker (LOCAL DEVELOPMENT) --- This creates a cron job that triggers the Edge Function every 5 seconds - --- First, ensure pg_cron and pg_net extensions are enabled -CREATE EXTENSION IF NOT EXISTS pg_cron; -CREATE EXTENSION IF NOT EXISTS pg_net; - --- Grant necessary permissions (if not already granted) -GRANT USAGE ON SCHEMA cron TO postgres; -GRANT USAGE ON SCHEMA net TO postgres; - --- Remove existing job if it exists to prevent duplicates -SELECT cron.unschedule(jobname) -FROM cron.job -WHERE jobname = 'pgflow-worker--analyze_website'; - --- Create the cron job for analyze_website flow (LOCAL VERSION) --- This uses localhost URLs for local development -SELECT cron.schedule( - 'pgflow-worker--analyze_website', -- job name - '4 seconds', -- run every 4 seconds using interval syntax - $$ - SELECT net.http_post( - url := 'http://host.docker.internal:54321/functions/v1/pgflow-cron-worker', - headers := jsonb_build_object( - 'Content-Type', 'application/json', - 'Authorization', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0' - ), - body := jsonb_build_object( - 'flow_slug', 'analyze_website', - 'batch_size', 5, - 'max_concurrent', 3, - 'cron_interval_seconds', 4 - ), - timeout_milliseconds := 25000 - ) as request_id; - $$ -); - --- View scheduled jobs -SELECT * FROM cron.job; - --- View recent job runs --- Note: Column names may vary by pg_cron version --- This query attempts to show job execution details - --- To unschedule the job: --- SELECT cron.unschedule('pgflow-worker--analyze_website'); - --- Monitor pg_net requests (useful for debugging) --- Check the net._http_response table for request logs --- SELECT * FROM net._http_response ORDER BY id DESC LIMIT 10; \ No newline at end of file diff --git a/examples/playground/supabase/functions/pgflow-cron-worker/setup-cron.sql b/examples/playground/supabase/functions/pgflow-cron-worker/setup-cron.sql deleted file mode 100644 index 08912bcdc..000000000 --- a/examples/playground/supabase/functions/pgflow-cron-worker/setup-cron.sql +++ /dev/null @@ -1,92 +0,0 @@ --- Setup pg_cron job for pgflow cron worker --- This creates a cron job that triggers the Edge Function every 5 seconds - --- First, ensure pg_cron and pg_net extensions are enabled -CREATE EXTENSION IF NOT EXISTS pg_cron; -CREATE EXTENSION IF NOT EXISTS pg_net; - --- Grant necessary permissions (if not already granted) -GRANT USAGE ON SCHEMA cron TO postgres; -GRANT USAGE ON SCHEMA net TO postgres; - --- Remove existing job if it exists to prevent duplicates -SELECT cron.unschedule(jobname) -FROM cron.job -WHERE jobname = 'pgflow-worker--analyze_website'; - --- Create the cron job for analyze_website flow --- Replace 'YOUR_PROJECT_REF' with your actual Supabase project reference --- Replace 'YOUR_ANON_KEY' with your actual anon key (or use the setting approach below) -SELECT cron.schedule( - 'pgflow-worker--analyze_website', -- job name - '*/4 * * * * *', -- every 4 seconds - $$ - SELECT net.http_post( - url := 'https://YOUR_PROJECT_REF.supabase.co/functions/v1/pgflow-cron-worker', - headers := jsonb_build_object( - 'Content-Type', 'application/json', - 'Authorization', 'Bearer YOUR_ANON_KEY' - ), - body := jsonb_build_object( - 'flow_slug', 'analyze_website', - 'batch_size', 10, - 'max_concurrent', 5, - 'cron_interval_seconds', 4 - ), - timeout_milliseconds := 25000 - ) as request_id; - $$ -); - --- Alternative: Use database settings for anon key (more secure) --- First set the anon key as a database setting: --- ALTER DATABASE postgres SET app.supabase_anon_key = 'YOUR_ANON_KEY'; - --- Then use this version of the cron job: -/* -SELECT cron.schedule( - 'pgflow-analyze-website-worker', - '*/5 * * * * *', - $$ - SELECT net.http_post( - url := 'https://YOUR_PROJECT_REF.supabase.co/functions/v1/pgflow-cron-worker', - headers := jsonb_build_object( - 'Content-Type', 'application/json', - 'Authorization', 'Bearer ' || current_setting('app.supabase_anon_key') - ), - body := jsonb_build_object( - 'flow_slug', 'analyze_website', - 'batch_size', 10, - 'max_concurrent', 5 - ), - timeout_milliseconds := 25000 - ) as request_id; - $$ -); -*/ - --- View scheduled jobs -SELECT * FROM cron.job; - --- View job run details (useful for debugging) -SELECT * FROM cron.job_run_details -WHERE jobname = 'pgflow-worker--analyze_website' -ORDER BY start_time DESC -LIMIT 10; - --- To unschedule the job later: --- SELECT cron.unschedule('pgflow-worker--analyze_website'); - --- Monitor pg_net requests (useful for debugging) -/* -SELECT - created, - url, - status_code, - response_body, - error_msg -FROM net._http_response -WHERE url LIKE '%pgflow-cron-worker%' -ORDER BY created DESC -LIMIT 10; -*/ \ No newline at end of file diff --git a/examples/playground/supabase/functions/pgflow-cron-worker/start-cron.sh b/examples/playground/supabase/functions/pgflow-cron-worker/start-cron.sh deleted file mode 100755 index 65438260c..000000000 --- a/examples/playground/supabase/functions/pgflow-cron-worker/start-cron.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# Start the pg_cron job for the pgflow cron worker -# This script gets the database URL from supabase status - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PROJECT_ROOT="$SCRIPT_DIR/../../.." - -# Get database URL from supabase status -echo "Getting database URL from supabase status..." -DB_URL=$(cd "$PROJECT_ROOT" && ./scripts/supabase status --output json | jq -r '.DB_URL') - -if [ -z "$DB_URL" ] || [ "$DB_URL" = "null" ]; then - echo "Error: Could not get database URL from supabase status" - echo "Make sure supabase is running: npm run supabase:start" - exit 1 -fi - -echo "Using database URL: $DB_URL" -echo "" -echo "Setting up pg_cron job for pgflow-cron-worker..." -echo "" - -# Run the SQL script (it already handles duplicate prevention) -psql "$DB_URL" -f "$SCRIPT_DIR/setup-cron-local.sql" - -echo "" -echo "Done! The cron job should now be running every 4 seconds." -echo "" -echo "To check the job status, run:" -echo " psql \"$DB_URL\" -c \"SELECT * FROM cron.job;\"" -echo "" -echo "To stop the cron job, run:" -echo " ./stop-cron.sh" \ No newline at end of file diff --git a/examples/playground/supabase/functions/pgflow-cron-worker/stop-cron.sh b/examples/playground/supabase/functions/pgflow-cron-worker/stop-cron.sh deleted file mode 100755 index 7c3a3e034..000000000 --- a/examples/playground/supabase/functions/pgflow-cron-worker/stop-cron.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# Stop the pg_cron job for the pgflow cron worker - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -PROJECT_ROOT="$SCRIPT_DIR/../../.." - -# Get database URL from supabase status -echo "Getting database URL from supabase status..." -DB_URL=$(cd "$PROJECT_ROOT" && ./scripts/supabase status --output json | jq -r '.DB_URL') - -if [ -z "$DB_URL" ] || [ "$DB_URL" = "null" ]; then - echo "Error: Could not get database URL from supabase status" - echo "Make sure supabase is running: npm run supabase:start" - exit 1 -fi - -echo "Stopping pg_cron job for pgflow-cron-worker..." -echo "" - -# Unschedule the cron job using the exact job name from setup-cron-local.sql -psql "$DB_URL" -c "SELECT cron.unschedule('pgflow-worker--analyze_website');" - -echo "" -echo "Cron job stopped." \ No newline at end of file diff --git a/examples/playground/supabase/functions/pgflow-cron-worker/test-local.sh b/examples/playground/supabase/functions/pgflow-cron-worker/test-local.sh deleted file mode 100755 index 102f2c2af..000000000 --- a/examples/playground/supabase/functions/pgflow-cron-worker/test-local.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -# Test the cron worker locally -# Usage: ./test-local.sh - -echo "Testing pgflow-cron-worker locally..." - -# Get the function URL (assumes local Supabase is running) -FUNCTION_URL="http://localhost:54321/functions/v1/pgflow-cron-worker" - -# Get the anon key from environment or use default local key -ANON_KEY="${SUPABASE_ANON_KEY:-eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0}" - -# Test payload -PAYLOAD='{ - "flow_slug": "analyze_website", - "batch_size": 5, - "max_concurrent": 3 -}' - -echo "Sending request to: $FUNCTION_URL" -echo "Payload: $PAYLOAD" -echo "" - -# Make the request -curl -X POST "$FUNCTION_URL" \ - -H "Authorization: Bearer $ANON_KEY" \ - -H "Content-Type: application/json" \ - -d "$PAYLOAD" \ - -w "\n\nHTTP Status: %{http_code}\nTime: %{time_total}s\n" \ No newline at end of file diff --git a/examples/playground/supabase/functions/utils.ts b/examples/playground/supabase/functions/utils.ts deleted file mode 100644 index 9eda46f8a..000000000 --- a/examples/playground/supabase/functions/utils.ts +++ /dev/null @@ -1,23 +0,0 @@ -// this function sleeps for ms number of milliseconds -export async function sleep(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -// this function sleeps for a random number of milliseconds between min and max -export async function randomSleep(min: number, max: number) { - const ms = Math.floor(Math.random() * (max - min + 1) + min); - await sleep(ms); -} - -const FAILURE_URL = 'https://firebase.google.com/'; - -/** - * Simulates a random failure with a 50% probability - * Optionally checks for a specific value that always fails - */ -export async function simulateFailure(url: string): Promise { - // Only fail if random is greater than 0.5 (50% chance) - if (url === FAILURE_URL) { - throw new Error('Simulated random failure to demonstrate error handling'); - } -} diff --git a/examples/playground/supabase/migrations/20250429064909_fix_db_reset.sql b/examples/playground/supabase/migrations/20250429064909_fix_db_reset.sql deleted file mode 100644 index 8c2363aed..000000000 --- a/examples/playground/supabase/migrations/20250429064909_fix_db_reset.sql +++ /dev/null @@ -1,31 +0,0 @@ --- This migration fixes any issues that might occur with the pgflow initial migration --- It ensures all required schemas and extensions exist - --- Ensure pgflow schema exists -do $$ -BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'pgflow') THEN - CREATE SCHEMA "pgflow"; - END IF; -END -$$; - --- Ensure pgmq schema exists -do $$ -BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = 'pgmq') THEN - CREATE SCHEMA "pgmq"; - END IF; -END -$$; - --- Ensure pgmq extension exists -do $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 FROM pg_extension WHERE extname = 'pgmq' - ) THEN - CREATE EXTENSION "pgmq" WITH SCHEMA "pgmq" VERSION "1.4.4"; - END IF; -END -$$; diff --git a/examples/playground/supabase/migrations/20250429164909_pgflow_initial.sql b/examples/playground/supabase/migrations/20250429164909_pgflow_initial.sql deleted file mode 100644 index 3bc6b6837..000000000 --- a/examples/playground/supabase/migrations/20250429164909_pgflow_initial.sql +++ /dev/null @@ -1,766 +0,0 @@ --- These statements are now handled in 20250504000000_fix_pgflow_schema_creation.sql --- to ensure they work correctly with Supabase's database reset behavior --- Add new schema named "pgflow" --- create schema "pgflow"; --- -- Add new schema named "pgmq" --- CREATE SCHEMA "pgmq"; --- -- Create extension "pgmq" --- CREATE EXTENSION "pgmq" WITH SCHEMA "pgmq" VERSION "1.4.4"; --- Create "read_with_poll" function -create function "pgflow"."read_with_poll"( - "queue_name" text, - "vt" integer, - "qty" integer, - "max_poll_seconds" integer default 5, - "poll_interval_ms" integer default 100, - "conditional" jsonb default '{}' -) returns setof pgmq.message_record language plpgsql as $$ -DECLARE - r pgmq.message_record; - stop_at TIMESTAMP; - sql TEXT; - qtable TEXT := pgmq.format_table_name(queue_name, 'q'); -BEGIN - stop_at := clock_timestamp() + make_interval(secs => max_poll_seconds); - LOOP - IF (SELECT clock_timestamp() >= stop_at) THEN - RETURN; - END IF; - - sql := FORMAT( - $QUERY$ - WITH cte AS - ( - SELECT msg_id - FROM pgmq.%I - WHERE vt <= clock_timestamp() AND CASE - WHEN %L != '{}'::jsonb THEN (message @> %2$L)::integer - ELSE 1 - END = 1 - ORDER BY msg_id ASC - LIMIT $1 - FOR UPDATE SKIP LOCKED - ) - UPDATE pgmq.%I m - SET - vt = clock_timestamp() + %L, - read_ct = read_ct + 1 - FROM cte - WHERE m.msg_id = cte.msg_id - RETURNING m.msg_id, m.read_ct, m.enqueued_at, m.vt, m.message; - $QUERY$, - qtable, conditional, qtable, make_interval(secs => vt) - ); - - FOR r IN - EXECUTE sql USING qty - LOOP - RETURN NEXT r; - END LOOP; - IF FOUND THEN - RETURN; - ELSE - PERFORM pg_sleep(poll_interval_ms::numeric / 1000); - END IF; - END LOOP; -END; -$$; --- Create composite type "step_task_record" -create type "pgflow"."step_task_record" as ( - "flow_slug" text, "run_id" uuid, "step_slug" text, "input" jsonb, "msg_id" bigint -); --- Create "is_valid_slug" function -create function "pgflow"."is_valid_slug"("slug" text) returns boolean language plpgsql immutable as $$ -begin - return - slug is not null - and slug <> '' - and length(slug) <= 128 - and slug ~ '^[a-zA-Z_][a-zA-Z0-9_]*$' - and slug NOT IN ('run'); -- reserved words -end; -$$; --- Create "flows" table -create table "pgflow"."flows" ( - "flow_slug" text not null, - "opt_max_attempts" integer not null default 3, - "opt_base_delay" integer not null default 1, - "opt_timeout" integer not null default 60, - "created_at" timestamptz not null default now(), - primary key ("flow_slug"), - constraint "opt_base_delay_is_nonnegative" check (opt_base_delay >= 0), - constraint "opt_max_attempts_is_nonnegative" check (opt_max_attempts >= 0), - constraint "opt_timeout_is_positive" check (opt_timeout > 0), - constraint "slug_is_valid" check (pgflow.is_valid_slug(flow_slug)) -); --- Create "steps" table -create table "pgflow"."steps" ( - "flow_slug" text not null, - "step_slug" text not null, - "step_type" text not null default 'single', - "step_index" integer not null default 0, - "deps_count" integer not null default 0, - "opt_max_attempts" integer null, - "opt_base_delay" integer null, - "opt_timeout" integer null, - "created_at" timestamptz not null default now(), - primary key ("flow_slug", "step_slug"), - constraint "steps_flow_slug_step_index_key" unique ("flow_slug", "step_index"), - constraint "steps_flow_slug_fkey" foreign key ("flow_slug") references "pgflow"."flows" ( - "flow_slug" - ) on update no action on delete no action, - constraint "opt_base_delay_is_nonnegative" check ((opt_base_delay is null) or (opt_base_delay >= 0)), - constraint "opt_max_attempts_is_nonnegative" check ((opt_max_attempts is null) or (opt_max_attempts >= 0)), - constraint "opt_timeout_is_positive" check ((opt_timeout is null) or (opt_timeout > 0)), - constraint "steps_deps_count_check" check (deps_count >= 0), - constraint "steps_step_slug_check" check (pgflow.is_valid_slug(step_slug)), - constraint "steps_step_type_check" check (step_type = 'single'::text) -); --- Create "deps" table -create table "pgflow"."deps" ( - "flow_slug" text not null, - "dep_slug" text not null, - "step_slug" text not null, - "created_at" timestamptz not null default now(), - primary key ("flow_slug", "dep_slug", "step_slug"), - constraint "deps_flow_slug_dep_slug_fkey" foreign key ("flow_slug", "dep_slug") references "pgflow"."steps" ( - "flow_slug", "step_slug" - ) on update no action on delete no action, - constraint "deps_flow_slug_fkey" foreign key ("flow_slug") references "pgflow"."flows" ( - "flow_slug" - ) on update no action on delete no action, - constraint "deps_flow_slug_step_slug_fkey" foreign key ("flow_slug", "step_slug") references "pgflow"."steps" ( - "flow_slug", "step_slug" - ) on update no action on delete no action, - constraint "deps_check" check (dep_slug <> step_slug) -); --- Create index "idx_deps_by_flow_dep" to table: "deps" -create index "idx_deps_by_flow_dep" on "pgflow"."deps" ("flow_slug", "dep_slug"); --- Create index "idx_deps_by_flow_step" to table: "deps" -create index "idx_deps_by_flow_step" on "pgflow"."deps" ("flow_slug", "step_slug"); --- Create "runs" table -create table "pgflow"."runs" ( - "run_id" uuid not null default gen_random_uuid(), - "flow_slug" text not null, - "status" text not null default 'started', - "input" jsonb not null, - "output" jsonb null, - "remaining_steps" integer not null default 0, - "started_at" timestamptz not null default now(), - "completed_at" timestamptz null, - "failed_at" timestamptz null, - primary key ("run_id"), - constraint "runs_flow_slug_fkey" foreign key ("flow_slug") references "pgflow"."flows" ( - "flow_slug" - ) on update no action on delete no action, - constraint "completed_at_is_after_started_at" check ((completed_at is null) or (completed_at >= started_at)), - constraint "completed_at_or_failed_at" check (not ((completed_at is not null) and (failed_at is not null))), - constraint "failed_at_is_after_started_at" check ((failed_at is null) or (failed_at >= started_at)), - constraint "runs_remaining_steps_check" check (remaining_steps >= 0), - constraint "status_is_valid" check (status = any(array['started'::text, 'failed'::text, 'completed'::text])) -); --- Create index "idx_runs_flow_slug" to table: "runs" -create index "idx_runs_flow_slug" on "pgflow"."runs" ("flow_slug"); --- Create index "idx_runs_status" to table: "runs" -create index "idx_runs_status" on "pgflow"."runs" ("status"); --- Create "step_states" table -create table "pgflow"."step_states" ( - "flow_slug" text not null, - "run_id" uuid not null, - "step_slug" text not null, - "status" text not null default 'created', - "remaining_tasks" integer not null default 1, - "remaining_deps" integer not null default 0, - "created_at" timestamptz not null default now(), - "started_at" timestamptz null, - "completed_at" timestamptz null, - "failed_at" timestamptz null, - primary key ("run_id", "step_slug"), - constraint "step_states_flow_slug_fkey" foreign key ("flow_slug") references "pgflow"."flows" ( - "flow_slug" - ) on update no action on delete no action, - constraint "step_states_flow_slug_step_slug_fkey" foreign key ( - "flow_slug", "step_slug" - ) references "pgflow"."steps" ("flow_slug", "step_slug") on update no action on delete no action, - constraint "step_states_run_id_fkey" foreign key ("run_id") references "pgflow"."runs" ( - "run_id" - ) on update no action on delete no action, - constraint "completed_at_is_after_started_at" check ((completed_at is null) or (completed_at >= started_at)), - constraint "completed_at_or_failed_at" check (not ((completed_at is not null) and (failed_at is not null))), - constraint "failed_at_is_after_started_at" check ((failed_at is null) or (failed_at >= started_at)), - constraint "started_at_is_after_created_at" check ((started_at is null) or (started_at >= created_at)), - constraint "status_and_remaining_tasks_match" check ((status <> 'completed'::text) or (remaining_tasks = 0)), - constraint "status_is_valid" check ( - status = any(array['created'::text, 'started'::text, 'completed'::text, 'failed'::text]) - ), - constraint "step_states_remaining_deps_check" check (remaining_deps >= 0), - constraint "step_states_remaining_tasks_check" check (remaining_tasks >= 0) -); --- Create index "idx_step_states_failed" to table: "step_states" -create index "idx_step_states_failed" on "pgflow"."step_states" ("run_id", "step_slug") where (status = 'failed'::text); --- Create index "idx_step_states_flow_slug" to table: "step_states" -create index "idx_step_states_flow_slug" on "pgflow"."step_states" ("flow_slug"); --- Create index "idx_step_states_ready" to table: "step_states" -create index "idx_step_states_ready" on "pgflow"."step_states" ("run_id", "status", "remaining_deps") where ( - (status = 'created'::text) and (remaining_deps = 0) -); --- Create "step_tasks" table -create table "pgflow"."step_tasks" ( - "flow_slug" text not null, - "run_id" uuid not null, - "step_slug" text not null, - "message_id" bigint null, - "task_index" integer not null default 0, - "status" text not null default 'queued', - "attempts_count" integer not null default 0, - "error_message" text null, - "output" jsonb null, - "queued_at" timestamptz not null default now(), - "completed_at" timestamptz null, - "failed_at" timestamptz null, - primary key ("run_id", "step_slug", "task_index"), - constraint "step_tasks_flow_slug_fkey" foreign key ("flow_slug") references "pgflow"."flows" ( - "flow_slug" - ) on update no action on delete no action, - constraint "step_tasks_run_id_fkey" foreign key ("run_id") references "pgflow"."runs" ( - "run_id" - ) on update no action on delete no action, - constraint "step_tasks_run_id_step_slug_fkey" foreign key ("run_id", "step_slug") references "pgflow"."step_states" ( - "run_id", "step_slug" - ) on update no action on delete no action, - constraint "attempts_count_nonnegative" check (attempts_count >= 0), - constraint "completed_at_is_after_queued_at" check ((completed_at is null) or (completed_at >= queued_at)), - constraint "completed_at_or_failed_at" check (not ((completed_at is not null) and (failed_at is not null))), - constraint "failed_at_is_after_queued_at" check ((failed_at is null) or (failed_at >= queued_at)), - constraint "only_single_task_per_step" check (task_index = 0), - constraint "output_valid_only_for_completed" check ((output is null) or (status = 'completed'::text)), - constraint "valid_status" check (status = any(array['queued'::text, 'completed'::text, 'failed'::text])) -); --- Create index "idx_step_tasks_completed" to table: "step_tasks" -create index "idx_step_tasks_completed" on "pgflow"."step_tasks" ("run_id", "step_slug") where ( - status = 'completed'::text -); --- Create index "idx_step_tasks_failed" to table: "step_tasks" -create index "idx_step_tasks_failed" on "pgflow"."step_tasks" ("run_id", "step_slug") where (status = 'failed'::text); --- Create index "idx_step_tasks_flow_run_step" to table: "step_tasks" -create index "idx_step_tasks_flow_run_step" on "pgflow"."step_tasks" ("flow_slug", "run_id", "step_slug"); --- Create index "idx_step_tasks_message_id" to table: "step_tasks" -create index "idx_step_tasks_message_id" on "pgflow"."step_tasks" ("message_id"); --- Create index "idx_step_tasks_queued" to table: "step_tasks" -create index "idx_step_tasks_queued" on "pgflow"."step_tasks" ("run_id", "step_slug") where (status = 'queued'::text); --- Create "poll_for_tasks" function -create function "pgflow"."poll_for_tasks"( - "queue_name" text, - "vt" integer, - "qty" integer, - "max_poll_seconds" integer default 5, - "poll_interval_ms" integer default 100 -) returns setof "pgflow"."step_task_record" language sql set "search_path" -= '' as $$ -with read_messages as ( - select * - from pgflow.read_with_poll( - queue_name, - vt, - qty, - max_poll_seconds, - poll_interval_ms - ) -), -tasks as ( - select - task.flow_slug, - task.run_id, - task.step_slug, - task.task_index, - task.message_id - from pgflow.step_tasks as task - join read_messages as message on message.msg_id = task.message_id - where task.message_id = message.msg_id - and task.status = 'queued' -), -increment_attempts as ( - update pgflow.step_tasks - set attempts_count = attempts_count + 1 - from tasks - where step_tasks.message_id = tasks.message_id - and status = 'queued' -), -runs as ( - select - r.run_id, - r.input - from pgflow.runs r - where r.run_id in (select run_id from tasks) -), -deps as ( - select - st.run_id, - st.step_slug, - dep.dep_slug, - dep_task.output as dep_output - from tasks st - join pgflow.deps dep on dep.flow_slug = st.flow_slug and dep.step_slug = st.step_slug - join pgflow.step_tasks dep_task on - dep_task.run_id = st.run_id and - dep_task.step_slug = dep.dep_slug and - dep_task.status = 'completed' -), -deps_outputs as ( - select - d.run_id, - d.step_slug, - jsonb_object_agg(d.dep_slug, d.dep_output) as deps_output - from deps d - group by d.run_id, d.step_slug -), -timeouts as ( - select - task.message_id, - coalesce(step.opt_timeout, flow.opt_timeout) + 2 as vt_delay - from tasks task - join pgflow.flows flow on flow.flow_slug = task.flow_slug - join pgflow.steps step on step.flow_slug = task.flow_slug and step.step_slug = task.step_slug -) - -select - st.flow_slug, - st.run_id, - st.step_slug, - jsonb_build_object('run', r.input) || - coalesce(dep_out.deps_output, '{}'::jsonb) as input, - st.message_id as msg_id -from tasks st -join runs r on st.run_id = r.run_id -left join deps_outputs dep_out on - dep_out.run_id = st.run_id and - dep_out.step_slug = st.step_slug -cross join lateral ( - -- TODO: this is slow because it calls set_vt for each row, and set_vt - -- builds dynamic query from string every time it is called - -- implement set_vt_batch(msgs_ids bigint[], vt_delays int[]) - select pgmq.set_vt(queue_name, st.message_id, - (select t.vt_delay from timeouts t where t.message_id = st.message_id) - ) -) set_vt; -$$; --- Create "add_step" function -create function "pgflow"."add_step"( - "flow_slug" text, - "step_slug" text, - "deps_slugs" text [], - "max_attempts" integer default null::integer, - "base_delay" integer default null::integer, - "timeout" integer default null::integer -) returns "pgflow"."steps" language sql set "search_path" -= '' as $$ -WITH - next_index AS ( - SELECT COALESCE(MAX(step_index) + 1, 0) as idx - FROM pgflow.steps - WHERE flow_slug = add_step.flow_slug - ), - create_step AS ( - INSERT INTO pgflow.steps (flow_slug, step_slug, step_index, deps_count, opt_max_attempts, opt_base_delay, opt_timeout) - SELECT add_step.flow_slug, add_step.step_slug, idx, COALESCE(array_length(deps_slugs, 1), 0), max_attempts, base_delay, timeout - FROM next_index - ON CONFLICT (flow_slug, step_slug) - DO UPDATE SET step_slug = pgflow.steps.step_slug - RETURNING * - ), - insert_deps AS ( - INSERT INTO pgflow.deps (flow_slug, dep_slug, step_slug) - SELECT add_step.flow_slug, d.dep_slug, add_step.step_slug - FROM unnest(deps_slugs) AS d(dep_slug) - ON CONFLICT (flow_slug, dep_slug, step_slug) DO NOTHING - RETURNING 1 - ) --- Return the created step -SELECT * FROM create_step; -$$; --- Create "add_step" function -create function "pgflow"."add_step"( - "flow_slug" text, - "step_slug" text, - "max_attempts" integer default null::integer, - "base_delay" integer default null::integer, - "timeout" integer default null::integer -) returns "pgflow"."steps" language sql set "search_path" -= '' as $$ --- Call the original function with an empty array - SELECT * FROM pgflow.add_step(flow_slug, step_slug, ARRAY[]::text[], max_attempts, base_delay, timeout); -$$; --- Create "calculate_retry_delay" function -create function "pgflow"."calculate_retry_delay"( - "base_delay" numeric, "attempts_count" integer -) returns integer language sql immutable parallel safe as $$ select floor(base_delay * power(2, attempts_count))::int $$; --- Create "maybe_complete_run" function -create function "pgflow"."maybe_complete_run"("run_id" uuid) returns void language sql set "search_path" = '' as $$ --- Update run status to completed and set output when there are no remaining steps - -- All done in a single declarative SQL statement - UPDATE pgflow.runs - SET - status = 'completed', - completed_at = now(), - output = ( - -- Get outputs from final steps (steps that are not dependencies for other steps) - SELECT jsonb_object_agg(st.step_slug, st.output) - FROM pgflow.step_tasks st - JOIN pgflow.step_states ss ON ss.run_id = st.run_id AND ss.step_slug = st.step_slug - JOIN pgflow.runs r ON r.run_id = ss.run_id AND r.flow_slug = ss.flow_slug - WHERE st.run_id = maybe_complete_run.run_id - AND st.status = 'completed' - AND NOT EXISTS ( - SELECT 1 - FROM pgflow.deps d - WHERE d.flow_slug = ss.flow_slug - AND d.dep_slug = ss.step_slug - ) - ) - WHERE pgflow.runs.run_id = maybe_complete_run.run_id - AND pgflow.runs.remaining_steps = 0 - AND pgflow.runs.status != 'completed'; -$$; --- Create "start_ready_steps" function -create function "pgflow"."start_ready_steps"("run_id" uuid) returns void language sql set "search_path" = '' as $$ -WITH ready_steps AS ( - SELECT * - FROM pgflow.step_states AS step_state - WHERE step_state.run_id = start_ready_steps.run_id - AND step_state.status = 'created' - AND step_state.remaining_deps = 0 - ORDER BY step_state.step_slug - FOR UPDATE -), -started_step_states AS ( - UPDATE pgflow.step_states - SET status = 'started', - started_at = now() - FROM ready_steps - WHERE pgflow.step_states.run_id = start_ready_steps.run_id - AND pgflow.step_states.step_slug = ready_steps.step_slug - RETURNING pgflow.step_states.* -), -sent_messages AS ( - SELECT - started_step.flow_slug, - started_step.run_id, - started_step.step_slug, - pgmq.send(started_step.flow_slug, jsonb_build_object( - 'flow_slug', started_step.flow_slug, - 'run_id', started_step.run_id, - 'step_slug', started_step.step_slug, - 'task_index', 0 - )) AS msg_id - FROM started_step_states AS started_step -) -INSERT INTO pgflow.step_tasks (flow_slug, run_id, step_slug, message_id) -SELECT - sent_messages.flow_slug, - sent_messages.run_id, - sent_messages.step_slug, - sent_messages.msg_id -FROM sent_messages; -$$; --- Create "complete_task" function -create function "pgflow"."complete_task"( - "run_id" uuid, "step_slug" text, "task_index" integer, "output" jsonb -) returns setof "pgflow"."step_tasks" language plpgsql set "search_path" -= '' as $$ -begin - -WITH run_lock AS ( - SELECT * FROM pgflow.runs - WHERE pgflow.runs.run_id = complete_task.run_id - FOR UPDATE -), -step_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = complete_task.step_slug - FOR UPDATE -), -task AS ( - UPDATE pgflow.step_tasks - SET - status = 'completed', - completed_at = now(), - output = complete_task.output - WHERE pgflow.step_tasks.run_id = complete_task.run_id - AND pgflow.step_tasks.step_slug = complete_task.step_slug - AND pgflow.step_tasks.task_index = complete_task.task_index - RETURNING * -), -step_state AS ( - UPDATE pgflow.step_states - SET - status = CASE - WHEN pgflow.step_states.remaining_tasks = 1 THEN 'completed' -- Will be 0 after decrement - ELSE 'started' - END, - completed_at = CASE - WHEN pgflow.step_states.remaining_tasks = 1 THEN now() -- Will be 0 after decrement - ELSE NULL - END, - remaining_tasks = pgflow.step_states.remaining_tasks - 1 - FROM task - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = complete_task.step_slug - RETURNING pgflow.step_states.* -), --- Find all dependent steps if the current step was completed -dependent_steps AS ( - SELECT d.step_slug AS dependent_step_slug - FROM pgflow.deps d - JOIN step_state s ON s.status = 'completed' AND d.flow_slug = s.flow_slug - WHERE d.dep_slug = complete_task.step_slug - ORDER BY d.step_slug -- Ensure consistent ordering -), --- Lock dependent steps before updating -dependent_steps_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug IN (SELECT dependent_step_slug FROM dependent_steps) - FOR UPDATE -), --- Update all dependent steps -dependent_steps_update AS ( - UPDATE pgflow.step_states - SET remaining_deps = pgflow.step_states.remaining_deps - 1 - FROM dependent_steps - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = dependent_steps.dependent_step_slug -) --- Only decrement remaining_steps, don't update status -UPDATE pgflow.runs -SET remaining_steps = pgflow.runs.remaining_steps - 1 -FROM step_state -WHERE pgflow.runs.run_id = complete_task.run_id - AND step_state.status = 'completed'; - -PERFORM pgmq.archive( - queue_name => (SELECT run.flow_slug FROM pgflow.runs AS run WHERE run.run_id = complete_task.run_id), - msg_id => (SELECT message_id FROM pgflow.step_tasks AS step_task - WHERE step_task.run_id = complete_task.run_id - AND step_task.step_slug = complete_task.step_slug - AND step_task.task_index = complete_task.task_index) -); - -PERFORM pgflow.start_ready_steps(complete_task.run_id); - -PERFORM pgflow.maybe_complete_run(complete_task.run_id); - -RETURN QUERY SELECT * -FROM pgflow.step_tasks AS step_task -WHERE step_task.run_id = complete_task.run_id - AND step_task.step_slug = complete_task.step_slug - AND step_task.task_index = complete_task.task_index; - -end; -$$; --- Create "create_flow" function -create function "pgflow"."create_flow"( - "flow_slug" text, "max_attempts" integer default 3, "base_delay" integer default 5, "timeout" integer default 60 -) returns "pgflow"."flows" language sql set "search_path" -= '' as $$ -WITH - flow_upsert AS ( - INSERT INTO pgflow.flows (flow_slug, opt_max_attempts, opt_base_delay, opt_timeout) - VALUES (flow_slug, max_attempts, base_delay, timeout) - ON CONFLICT (flow_slug) DO UPDATE - SET flow_slug = pgflow.flows.flow_slug -- Dummy update - RETURNING * - ), - ensure_queue AS ( - SELECT pgmq.create(flow_slug) - WHERE NOT EXISTS ( - SELECT 1 FROM pgmq.list_queues() WHERE queue_name = flow_slug - ) - ) -SELECT f.* -FROM flow_upsert f -LEFT JOIN (SELECT 1 FROM ensure_queue) _dummy ON true; -- Left join ensures flow is returned -$$; --- Create "fail_task" function -create function "pgflow"."fail_task"( - "run_id" uuid, "step_slug" text, "task_index" integer, "error_message" text -) returns setof "pgflow"."step_tasks" language plpgsql set "search_path" -= '' as $$ -begin - -WITH run_lock AS ( - SELECT * FROM pgflow.runs - WHERE pgflow.runs.run_id = fail_task.run_id - FOR UPDATE -), -step_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - FOR UPDATE -), -flow_info AS ( - SELECT r.flow_slug - FROM pgflow.runs r - WHERE r.run_id = fail_task.run_id -), -config AS ( - SELECT - COALESCE(s.opt_max_attempts, f.opt_max_attempts) AS opt_max_attempts, - COALESCE(s.opt_base_delay, f.opt_base_delay) AS opt_base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN flow_info fi ON fi.flow_slug = s.flow_slug - WHERE s.flow_slug = fi.flow_slug AND s.step_slug = fail_task.step_slug -), - -fail_or_retry_task as ( - UPDATE pgflow.step_tasks as task - SET - status = CASE - WHEN task.attempts_count < (SELECT opt_max_attempts FROM config) THEN 'queued' - ELSE 'failed' - END, - failed_at = CASE - WHEN task.attempts_count >= (SELECT opt_max_attempts FROM config) THEN now() - ELSE NULL - END, - error_message = fail_task.error_message - WHERE task.run_id = fail_task.run_id - AND task.step_slug = fail_task.step_slug - AND task.task_index = fail_task.task_index - AND task.status = 'queued' - RETURNING * -), -maybe_fail_step AS ( - UPDATE pgflow.step_states - SET - status = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN 'failed' - ELSE pgflow.step_states.status - END, - failed_at = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN now() - ELSE NULL - END - FROM fail_or_retry_task - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - RETURNING pgflow.step_states.* -) -UPDATE pgflow.runs -SET status = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN 'failed' - ELSE status - END, - failed_at = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN now() - ELSE NULL - END -WHERE pgflow.runs.run_id = fail_task.run_id; - --- For queued tasks: delay the message for retry with exponential backoff -PERFORM ( - WITH retry_config AS ( - SELECT - COALESCE(s.opt_base_delay, f.opt_base_delay) AS base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN pgflow.runs r ON r.flow_slug = f.flow_slug - WHERE r.run_id = fail_task.run_id - AND s.step_slug = fail_task.step_slug - ), - queued_tasks AS ( - SELECT - r.flow_slug, - st.message_id, - pgflow.calculate_retry_delay((SELECT base_delay FROM retry_config), st.attempts_count) AS calculated_delay - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'queued' - ) - SELECT pgmq.set_vt(qt.flow_slug, qt.message_id, qt.calculated_delay) - FROM queued_tasks qt - WHERE EXISTS (SELECT 1 FROM queued_tasks) -); - --- For failed tasks: archive the message -PERFORM ( - WITH failed_tasks AS ( - SELECT r.flow_slug, st.message_id - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'failed' - ) - SELECT pgmq.archive(ft.flow_slug, ft.message_id) - FROM failed_tasks ft - WHERE EXISTS (SELECT 1 FROM failed_tasks) -); - -return query select * -from pgflow.step_tasks st -where st.run_id = fail_task.run_id - and st.step_slug = fail_task.step_slug - and st.task_index = fail_task.task_index; - -end; -$$; --- Create "start_flow" function -create function "pgflow"."start_flow"( - "flow_slug" text, "input" jsonb -) returns setof "pgflow"."runs" language plpgsql set "search_path" -= '' as $$ -declare - v_created_run pgflow.runs%ROWTYPE; -begin - -WITH - flow_steps AS ( - SELECT steps.flow_slug, steps.step_slug, steps.deps_count - FROM pgflow.steps - WHERE steps.flow_slug = start_flow.flow_slug - ), - created_run AS ( - INSERT INTO pgflow.runs (flow_slug, input, remaining_steps) - VALUES ( - start_flow.flow_slug, - start_flow.input, - (SELECT count(*) FROM flow_steps) - ) - RETURNING * - ), - created_step_states AS ( - INSERT INTO pgflow.step_states (flow_slug, run_id, step_slug, remaining_deps) - SELECT - fs.flow_slug, - (SELECT run_id FROM created_run), - fs.step_slug, - fs.deps_count - FROM flow_steps fs - ) -SELECT * FROM created_run INTO v_created_run; - -PERFORM pgflow.start_ready_steps(v_created_run.run_id); - -RETURN QUERY SELECT * FROM pgflow.runs where run_id = v_created_run.run_id; - -end; -$$; --- Create "workers" table -create table "pgflow"."workers" ( - "worker_id" uuid not null, - "queue_name" text not null, - "function_name" text not null, - "started_at" timestamptz not null default now(), - "stopped_at" timestamptz null, - "last_heartbeat_at" timestamptz not null default now(), - primary key ("worker_id") -); --- Create index "idx_workers_queue_name" to table: "workers" -create index "idx_workers_queue_name" on "pgflow"."workers" ("queue_name"); diff --git a/examples/playground/supabase/migrations/20250429164919_add_websites.sql b/examples/playground/supabase/migrations/20250429164919_add_websites.sql deleted file mode 100644 index b85b064ec..000000000 --- a/examples/playground/supabase/migrations/20250429164919_add_websites.sql +++ /dev/null @@ -1,44 +0,0 @@ -create table public.websites ( - id SERIAL primary key, - user_id UUID not null references auth.users (id), - website_url TEXT not null, - summary TEXT not null, - tags TEXT [] not null default '{}', - created_at TIMESTAMP WITH TIME ZONE default NOW() not null, - updated_at TIMESTAMP WITH TIME ZONE default NOW() not null -); - -create index idx_websites_website_url on public.websites (website_url); -create index idx_websites_user_id on public.websites (user_id); - --- Enable Row Level Security -alter table public.websites enable row level security; - --- Policy: Allow all users (including anonymous) to select from websites -create policy "Allow select for all users" -on public.websites -for select -to public -using (true); - --- Policy: Only owners can update their websites -create policy "Allow update for owners only" -on public.websites -for update -to authenticated -using ((select auth.uid()) = user_id) -with check ((select auth.uid()) = user_id); - --- Policy: Only owners can delete their websites -create policy "Allow delete for owners only" -on public.websites -for delete -to authenticated -using ((select auth.uid()) = user_id); - --- Policy: Ensure user_id is set to the current user on insert -create policy "Allow insert with user_id set to current user" -on public.websites -for insert -to authenticated -with check ((select auth.uid()) = user_id); diff --git a/examples/playground/supabase/migrations/20250429164929_add_start_analyze_website_flow.sql b/examples/playground/supabase/migrations/20250429164929_add_start_analyze_website_flow.sql deleted file mode 100644 index bfb40cdc3..000000000 --- a/examples/playground/supabase/migrations/20250429164929_add_start_analyze_website_flow.sql +++ /dev/null @@ -1,35 +0,0 @@ --- Create a secure wrapper function for pgflow.start_flow --- This is a security definer function that will run with the privileges of the creator --- rather than the caller, allowing it to call pgflow.start_flow even if direct access is blocked -create or replace function public.start_analyze_website_flow(url text) -returns pgflow.runs -language plpgsql -security definer -- Run as the function creator (superuser) -set search_path = public, pgflow -- Restrict search path for security -as $$ -DECLARE - result_run pgflow.runs; -BEGIN - -- Check if user is authenticated - IF auth.uid() IS NULL THEN - RAISE EXCEPTION 'User must be authenticated to start a flow'; - END IF; - - -- Call pgflow.start_flow as the function owner and get a single run record - SELECT * - INTO result_run - FROM pgflow.start_flow( - 'analyze_website', - jsonb_build_object( - 'url', url, - 'user_id', auth.uid() - ) - ) LIMIT 1; - - -- Return the single run record - RETURN result_run; -END; -$$; - --- Grant execute permission on the wrapper function to authenticated users -grant execute on function public.start_analyze_website_flow(text) to authenticated; diff --git a/examples/playground/supabase/migrations/20250429164939_permissions.sql b/examples/playground/supabase/migrations/20250429164939_permissions.sql deleted file mode 100644 index 490f3152b..000000000 --- a/examples/playground/supabase/migrations/20250429164939_permissions.sql +++ /dev/null @@ -1,57 +0,0 @@ --- Configure permissions to allow authenticated users to access pgflow tables and functions - --- Grant usage on the pgflow schema to authenticated users -grant usage on schema pgflow to authenticated; - --- Enable RLS for pgflow tables -alter table pgflow.flows enable row level security; -alter table pgflow.steps enable row level security; -alter table pgflow.deps enable row level security; -alter table pgflow.runs enable row level security; -alter table pgflow.step_states enable row level security; -alter table pgflow.step_tasks enable row level security; -alter table pgflow.workers enable row level security; - --- Create RLS policies for authenticated users to view pgflow tables -create policy flows_select_policy on pgflow.flows -for select to authenticated using (true); - -create policy steps_select_policy on pgflow.steps -for select to authenticated using (true); - -create policy deps_select_policy on pgflow.deps -for select to authenticated using (true); - -create policy runs_select_policy on pgflow.runs -for select to authenticated using (true); - -create policy step_states_select_policy on pgflow.step_states -for select to authenticated using (true); - -create policy step_tasks_select_policy on pgflow.step_tasks -for select to authenticated using (true); - -create policy workers_select_policy on pgflow.workers -for select to authenticated using (true); - --- Grant select permissions on pgflow tables to authenticated users -grant select on pgflow.flows to authenticated; -grant select on pgflow.steps to authenticated; -grant select on pgflow.deps to authenticated; -grant select on pgflow.runs to authenticated; -grant select on pgflow.step_states to authenticated; -grant select on pgflow.step_tasks to authenticated; -grant select on pgflow.workers to authenticated; - --- REVOKE direct RPC access to pgflow.start_flow from authenticated users --- This ensures that users can only call the flow through our secure wrapper -revoke execute on function pgflow.start_flow(text, jsonb) from authenticated; - --- Set up realtime subscriptions for pgflow tables -alter publication supabase_realtime add table pgflow.flows; -alter publication supabase_realtime add table pgflow.steps; -alter publication supabase_realtime add table pgflow.deps; -alter publication supabase_realtime add table pgflow.runs; -alter publication supabase_realtime add table pgflow.step_states; -alter publication supabase_realtime add table pgflow.step_tasks; -alter publication supabase_realtime add table pgflow.workers; diff --git a/examples/playground/supabase/migrations/20250430140439_create_analyze_website_flow.sql b/examples/playground/supabase/migrations/20250430140439_create_analyze_website_flow.sql deleted file mode 100644 index a35dbf018..000000000 --- a/examples/playground/supabase/migrations/20250430140439_create_analyze_website_flow.sql +++ /dev/null @@ -1,5 +0,0 @@ -SELECT pgflow.create_flow('analyze_website', max_attempts => 3, base_delay => 1, timeout => 4); -SELECT pgflow.add_step('analyze_website', 'website'); -SELECT pgflow.add_step('analyze_website', 'summary', ARRAY['website']); -SELECT pgflow.add_step('analyze_website', 'tags', ARRAY['website']); -SELECT pgflow.add_step('analyze_website', 'saveToDb', ARRAY['summary', 'tags']); diff --git a/examples/playground/supabase/migrations/20250517125006_20250517072017_pgflow_fix_poll_for_tasks_to_use_separate_statement_for_polling.sql b/examples/playground/supabase/migrations/20250517125006_20250517072017_pgflow_fix_poll_for_tasks_to_use_separate_statement_for_polling.sql deleted file mode 100644 index 74f0e91c4..000000000 --- a/examples/playground/supabase/migrations/20250517125006_20250517072017_pgflow_fix_poll_for_tasks_to_use_separate_statement_for_polling.sql +++ /dev/null @@ -1,101 +0,0 @@ --- Modify "poll_for_tasks" function -CREATE OR REPLACE FUNCTION "pgflow"."poll_for_tasks" ("queue_name" text, "vt" integer, "qty" integer, "max_poll_seconds" integer DEFAULT 5, "poll_interval_ms" integer DEFAULT 100) RETURNS SETOF "pgflow"."step_task_record" LANGUAGE plpgsql SET "search_path" = '' AS $$ -declare - msg_ids bigint[]; -begin - -- First statement: Read messages and capture their IDs - -- This gets its own snapshot and can see newly committed messages - select array_agg(msg_id) - into msg_ids - from pgflow.read_with_poll( - queue_name, - vt, - qty, - max_poll_seconds, - poll_interval_ms - ); - - -- If no messages were read, return empty set - if msg_ids is null or array_length(msg_ids, 1) is null then - return; - end if; - - -- Second statement: Process tasks with fresh snapshot - -- This can now see step_tasks that were committed during the poll - return query - with tasks as ( - select - task.flow_slug, - task.run_id, - task.step_slug, - task.task_index, - task.message_id - from pgflow.step_tasks as task - where task.message_id = any(msg_ids) - and task.status = 'queued' - ), - increment_attempts as ( - update pgflow.step_tasks - set attempts_count = attempts_count + 1 - from tasks - where step_tasks.message_id = tasks.message_id - and status = 'queued' - ), - runs as ( - select - r.run_id, - r.input - from pgflow.runs r - where r.run_id in (select run_id from tasks) - ), - deps as ( - select - st.run_id, - st.step_slug, - dep.dep_slug, - dep_task.output as dep_output - from tasks st - join pgflow.deps dep on dep.flow_slug = st.flow_slug and dep.step_slug = st.step_slug - join pgflow.step_tasks dep_task on - dep_task.run_id = st.run_id and - dep_task.step_slug = dep.dep_slug and - dep_task.status = 'completed' - ), - deps_outputs as ( - select - d.run_id, - d.step_slug, - jsonb_object_agg(d.dep_slug, d.dep_output) as deps_output - from deps d - group by d.run_id, d.step_slug - ), - timeouts as ( - select - task.message_id, - coalesce(step.opt_timeout, flow.opt_timeout) + 2 as vt_delay - from tasks task - join pgflow.flows flow on flow.flow_slug = task.flow_slug - join pgflow.steps step on step.flow_slug = task.flow_slug and step.step_slug = task.step_slug - ) - select - st.flow_slug, - st.run_id, - st.step_slug, - jsonb_build_object('run', r.input) || - coalesce(dep_out.deps_output, '{}'::jsonb) as input, - st.message_id as msg_id - from tasks st - join runs r on st.run_id = r.run_id - left join deps_outputs dep_out on - dep_out.run_id = st.run_id and - dep_out.step_slug = st.step_slug - cross join lateral ( - -- TODO: this is slow because it calls set_vt for each row, and set_vt - -- builds dynamic query from string every time it is called - -- implement set_vt_batch(msgs_ids bigint[], vt_delays int[]) - select pgmq.set_vt(queue_name, st.message_id, - (select t.vt_delay from timeouts t where t.message_id = st.message_id) - ) - ) set_vt; -end; -$$; diff --git a/examples/playground/supabase/migrations/20250610080624_20250609105135_pgflow_add_start_tasks_and_started_status.sql b/examples/playground/supabase/migrations/20250610080624_20250609105135_pgflow_add_start_tasks_and_started_status.sql deleted file mode 100644 index 7f696c8b5..000000000 --- a/examples/playground/supabase/migrations/20250610080624_20250609105135_pgflow_add_start_tasks_and_started_status.sql +++ /dev/null @@ -1,371 +0,0 @@ --- Create index "idx_workers_heartbeat" to table: "workers" -create index "idx_workers_heartbeat" on "pgflow"."workers" ("last_heartbeat_at"); --- Modify "step_tasks" table -alter table "pgflow"."step_tasks" drop constraint "valid_status", -add constraint "valid_status" check ( - status = ANY(array['queued'::text, 'started'::text, 'completed'::text, 'failed'::text]) -), -add constraint "completed_at_is_after_started_at" check ( - (completed_at is null) or (started_at is null) or (completed_at >= started_at) -), -add constraint "failed_at_is_after_started_at" check ( - (failed_at is null) or (started_at is null) or (failed_at >= started_at) -), -add constraint "started_at_is_after_queued_at" check ((started_at is null) or (started_at >= queued_at)), -add column "started_at" timestamptz null, -add column "last_worker_id" uuid null, -add constraint "step_tasks_last_worker_id_fkey" foreign key ("last_worker_id") references "pgflow"."workers" ( - "worker_id" -) on update no action on delete set null; --- Create index "idx_step_tasks_last_worker" to table: "step_tasks" -create index "idx_step_tasks_last_worker" on "pgflow"."step_tasks" ("last_worker_id") where (status = 'started'::text); --- Create index "idx_step_tasks_queued_msg" to table: "step_tasks" -create index "idx_step_tasks_queued_msg" on "pgflow"."step_tasks" ("message_id") where (status = 'queued'::text); --- Create index "idx_step_tasks_started" to table: "step_tasks" -create index "idx_step_tasks_started" on "pgflow"."step_tasks" ("started_at") where (status = 'started'::text); --- Modify "complete_task" function -create or replace function "pgflow"."complete_task"( - "run_id" uuid, "step_slug" text, "task_index" integer, "output" jsonb -) returns setof "pgflow"."step_tasks" language plpgsql set "search_path" -= '' as $$ -begin - -WITH run_lock AS ( - SELECT * FROM pgflow.runs - WHERE pgflow.runs.run_id = complete_task.run_id - FOR UPDATE -), -step_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = complete_task.step_slug - FOR UPDATE -), -task AS ( - UPDATE pgflow.step_tasks - SET - status = 'completed', - completed_at = now(), - output = complete_task.output - WHERE pgflow.step_tasks.run_id = complete_task.run_id - AND pgflow.step_tasks.step_slug = complete_task.step_slug - AND pgflow.step_tasks.task_index = complete_task.task_index - AND pgflow.step_tasks.status = 'started' - RETURNING * -), -step_state AS ( - UPDATE pgflow.step_states - SET - status = CASE - WHEN pgflow.step_states.remaining_tasks = 1 THEN 'completed' -- Will be 0 after decrement - ELSE 'started' - END, - completed_at = CASE - WHEN pgflow.step_states.remaining_tasks = 1 THEN now() -- Will be 0 after decrement - ELSE NULL - END, - remaining_tasks = pgflow.step_states.remaining_tasks - 1 - FROM task - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = complete_task.step_slug - RETURNING pgflow.step_states.* -), --- Find all dependent steps if the current step was completed -dependent_steps AS ( - SELECT d.step_slug AS dependent_step_slug - FROM pgflow.deps d - JOIN step_state s ON s.status = 'completed' AND d.flow_slug = s.flow_slug - WHERE d.dep_slug = complete_task.step_slug - ORDER BY d.step_slug -- Ensure consistent ordering -), --- Lock dependent steps before updating -dependent_steps_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug IN (SELECT dependent_step_slug FROM dependent_steps) - FOR UPDATE -), --- Update all dependent steps -dependent_steps_update AS ( - UPDATE pgflow.step_states - SET remaining_deps = pgflow.step_states.remaining_deps - 1 - FROM dependent_steps - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = dependent_steps.dependent_step_slug -) --- Only decrement remaining_steps, don't update status -UPDATE pgflow.runs -SET remaining_steps = pgflow.runs.remaining_steps - 1 -FROM step_state -WHERE pgflow.runs.run_id = complete_task.run_id - AND step_state.status = 'completed'; - --- For completed tasks: archive the message -PERFORM ( - WITH completed_tasks AS ( - SELECT r.flow_slug, st.message_id - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = complete_task.run_id - AND st.step_slug = complete_task.step_slug - AND st.task_index = complete_task.task_index - AND st.status = 'completed' - ) - SELECT pgmq.archive(ct.flow_slug, ct.message_id) - FROM completed_tasks ct - WHERE EXISTS (SELECT 1 FROM completed_tasks) -); - -PERFORM pgflow.start_ready_steps(complete_task.run_id); - -PERFORM pgflow.maybe_complete_run(complete_task.run_id); - -RETURN QUERY SELECT * -FROM pgflow.step_tasks AS step_task -WHERE step_task.run_id = complete_task.run_id - AND step_task.step_slug = complete_task.step_slug - AND step_task.task_index = complete_task.task_index; - -end; -$$; --- Modify "fail_task" function -create or replace function "pgflow"."fail_task"( - "run_id" uuid, "step_slug" text, "task_index" integer, "error_message" text -) returns setof "pgflow"."step_tasks" language plpgsql set "search_path" -= '' as $$ -begin - -WITH run_lock AS ( - SELECT * FROM pgflow.runs - WHERE pgflow.runs.run_id = fail_task.run_id - FOR UPDATE -), -step_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - FOR UPDATE -), -flow_info AS ( - SELECT r.flow_slug - FROM pgflow.runs r - WHERE r.run_id = fail_task.run_id -), -config AS ( - SELECT - COALESCE(s.opt_max_attempts, f.opt_max_attempts) AS opt_max_attempts, - COALESCE(s.opt_base_delay, f.opt_base_delay) AS opt_base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN flow_info fi ON fi.flow_slug = s.flow_slug - WHERE s.flow_slug = fi.flow_slug AND s.step_slug = fail_task.step_slug -), - -fail_or_retry_task as ( - UPDATE pgflow.step_tasks as task - SET - status = CASE - WHEN task.attempts_count < (SELECT opt_max_attempts FROM config) THEN 'queued' - ELSE 'failed' - END, - failed_at = CASE - WHEN task.attempts_count >= (SELECT opt_max_attempts FROM config) THEN now() - ELSE NULL - END, - started_at = CASE - WHEN task.attempts_count < (SELECT opt_max_attempts FROM config) THEN NULL - ELSE task.started_at - END, - error_message = fail_task.error_message - WHERE task.run_id = fail_task.run_id - AND task.step_slug = fail_task.step_slug - AND task.task_index = fail_task.task_index - AND task.status = 'started' - RETURNING * -), -maybe_fail_step AS ( - UPDATE pgflow.step_states - SET - status = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN 'failed' - ELSE pgflow.step_states.status - END, - failed_at = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN now() - ELSE NULL - END - FROM fail_or_retry_task - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - RETURNING pgflow.step_states.* -) -UPDATE pgflow.runs -SET status = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN 'failed' - ELSE status - END, - failed_at = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN now() - ELSE NULL - END -WHERE pgflow.runs.run_id = fail_task.run_id; - --- For queued tasks: delay the message for retry with exponential backoff -PERFORM ( - WITH retry_config AS ( - SELECT - COALESCE(s.opt_base_delay, f.opt_base_delay) AS base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN pgflow.runs r ON r.flow_slug = f.flow_slug - WHERE r.run_id = fail_task.run_id - AND s.step_slug = fail_task.step_slug - ), - queued_tasks AS ( - SELECT - r.flow_slug, - st.message_id, - pgflow.calculate_retry_delay((SELECT base_delay FROM retry_config), st.attempts_count) AS calculated_delay - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'queued' - ) - SELECT pgmq.set_vt(qt.flow_slug, qt.message_id, qt.calculated_delay) - FROM queued_tasks qt - WHERE EXISTS (SELECT 1 FROM queued_tasks) -); - --- For failed tasks: archive the message -PERFORM ( - WITH failed_tasks AS ( - SELECT r.flow_slug, st.message_id - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'failed' - ) - SELECT pgmq.archive(ft.flow_slug, ft.message_id) - FROM failed_tasks ft - WHERE EXISTS (SELECT 1 FROM failed_tasks) -); - -return query select * -from pgflow.step_tasks st -where st.run_id = fail_task.run_id - and st.step_slug = fail_task.step_slug - and st.task_index = fail_task.task_index; - -end; -$$; --- Modify "poll_for_tasks" function -create or replace function "pgflow"."poll_for_tasks"( - "queue_name" text, - "vt" integer, - "qty" integer, - "max_poll_seconds" integer default 5, - "poll_interval_ms" integer default 100 -) returns setof "pgflow"."step_task_record" language plpgsql set "search_path" -= '' as $$ -begin - -- DEPRECATED: This function is deprecated and will be removed in a future version. - -- Please update pgflow to use the new two-phase polling approach. - -- Run 'npx pgflow install' to update your installation. - raise notice 'DEPRECATED: poll_for_tasks is deprecated and will be removed. Please update pgflow via "npx pgflow install".'; - - -- Return empty set - no tasks will be processed - return; -end; -$$; --- Create "start_tasks" function -create function "pgflow"."start_tasks"( - "flow_slug" text, "msg_ids" bigint [], "worker_id" uuid -) returns setof "pgflow"."step_task_record" language sql set "search_path" -= '' as $$ -with tasks as ( - select - task.flow_slug, - task.run_id, - task.step_slug, - task.task_index, - task.message_id - from pgflow.step_tasks as task - where task.flow_slug = start_tasks.flow_slug - and task.message_id = any(msg_ids) - and task.status = 'queued' - ), - start_tasks_update as ( - update pgflow.step_tasks - set - attempts_count = attempts_count + 1, - status = 'started', - started_at = now(), - last_worker_id = worker_id - from tasks - where step_tasks.message_id = tasks.message_id - and step_tasks.flow_slug = tasks.flow_slug - and step_tasks.status = 'queued' - ), - runs as ( - select - r.run_id, - r.input - from pgflow.runs r - where r.run_id in (select run_id from tasks) - ), - deps as ( - select - st.run_id, - st.step_slug, - dep.dep_slug, - dep_task.output as dep_output - from tasks st - join pgflow.deps dep on dep.flow_slug = st.flow_slug and dep.step_slug = st.step_slug - join pgflow.step_tasks dep_task on - dep_task.run_id = st.run_id and - dep_task.step_slug = dep.dep_slug and - dep_task.status = 'completed' - ), - deps_outputs as ( - select - d.run_id, - d.step_slug, - jsonb_object_agg(d.dep_slug, d.dep_output) as deps_output - from deps d - group by d.run_id, d.step_slug - ), - timeouts as ( - select - task.message_id, - task.flow_slug, - coalesce(step.opt_timeout, flow.opt_timeout) + 2 as vt_delay - from tasks task - join pgflow.flows flow on flow.flow_slug = task.flow_slug - join pgflow.steps step on step.flow_slug = task.flow_slug and step.step_slug = task.step_slug - ) - select - st.flow_slug, - st.run_id, - st.step_slug, - jsonb_build_object('run', r.input) || - coalesce(dep_out.deps_output, '{}'::jsonb) as input, - st.message_id as msg_id - from tasks st - join runs r on st.run_id = r.run_id - left join deps_outputs dep_out on - dep_out.run_id = st.run_id and - dep_out.step_slug = st.step_slug - cross join lateral ( - -- TODO: this is slow because it calls set_vt for each row, and set_vt - -- builds dynamic query from string every time it is called - -- implement set_vt_batch(msgs_ids bigint[], vt_delays int[]) - select pgmq.set_vt(t.flow_slug, st.message_id, t.vt_delay) - from timeouts t - where t.message_id = st.message_id - and t.flow_slug = st.flow_slug - ) set_vt -$$; diff --git a/examples/playground/supabase/migrations/20250610180554_pgflow_add_set_vt_batch_and_use_it_in_start_tasks.sql b/examples/playground/supabase/migrations/20250610180554_pgflow_add_set_vt_batch_and_use_it_in_start_tasks.sql deleted file mode 100644 index 1e8585a5a..000000000 --- a/examples/playground/supabase/migrations/20250610180554_pgflow_add_set_vt_batch_and_use_it_in_start_tasks.sql +++ /dev/null @@ -1,127 +0,0 @@ --- Create "set_vt_batch" function -CREATE FUNCTION "pgflow"."set_vt_batch" ("queue_name" text, "msg_ids" bigint[], "vt_offsets" integer[]) RETURNS SETOF pgmq.message_record LANGUAGE plpgsql AS $$ -DECLARE - qtable TEXT := pgmq.format_table_name(queue_name, 'q'); - sql TEXT; -BEGIN - /* ---------- safety checks ---------------------------------------------------- */ - IF msg_ids IS NULL OR vt_offsets IS NULL OR array_length(msg_ids, 1) = 0 THEN - RETURN; -- nothing to do, return empty set - END IF; - - IF array_length(msg_ids, 1) IS DISTINCT FROM array_length(vt_offsets, 1) THEN - RAISE EXCEPTION - 'msg_ids length (%) must equal vt_offsets length (%)', - array_length(msg_ids, 1), array_length(vt_offsets, 1); - END IF; - - /* ---------- dynamic statement ------------------------------------------------ */ - /* One UPDATE joins with the unnested arrays */ - sql := format( - $FMT$ - WITH input (msg_id, vt_offset) AS ( - SELECT unnest($1)::bigint - , unnest($2)::int - ) - UPDATE pgmq.%I q - SET vt = clock_timestamp() + make_interval(secs => input.vt_offset), - read_ct = read_ct -- no change, but keeps RETURNING list aligned - FROM input - WHERE q.msg_id = input.msg_id - RETURNING q.msg_id, - q.read_ct, - q.enqueued_at, - q.vt, - q.message - $FMT$, - qtable - ); - - RETURN QUERY EXECUTE sql USING msg_ids, vt_offsets; -END; -$$; --- Modify "start_tasks" function -CREATE OR REPLACE FUNCTION "pgflow"."start_tasks" ("flow_slug" text, "msg_ids" bigint[], "worker_id" uuid) RETURNS SETOF "pgflow"."step_task_record" LANGUAGE sql SET "search_path" = '' AS $$ -with tasks as ( - select - task.flow_slug, - task.run_id, - task.step_slug, - task.task_index, - task.message_id - from pgflow.step_tasks as task - where task.flow_slug = start_tasks.flow_slug - and task.message_id = any(msg_ids) - and task.status = 'queued' - ), - start_tasks_update as ( - update pgflow.step_tasks - set - attempts_count = attempts_count + 1, - status = 'started', - started_at = now(), - last_worker_id = worker_id - from tasks - where step_tasks.message_id = tasks.message_id - and step_tasks.flow_slug = tasks.flow_slug - and step_tasks.status = 'queued' - ), - runs as ( - select - r.run_id, - r.input - from pgflow.runs r - where r.run_id in (select run_id from tasks) - ), - deps as ( - select - st.run_id, - st.step_slug, - dep.dep_slug, - dep_task.output as dep_output - from tasks st - join pgflow.deps dep on dep.flow_slug = st.flow_slug and dep.step_slug = st.step_slug - join pgflow.step_tasks dep_task on - dep_task.run_id = st.run_id and - dep_task.step_slug = dep.dep_slug and - dep_task.status = 'completed' - ), - deps_outputs as ( - select - d.run_id, - d.step_slug, - jsonb_object_agg(d.dep_slug, d.dep_output) as deps_output - from deps d - group by d.run_id, d.step_slug - ), - timeouts as ( - select - task.message_id, - task.flow_slug, - coalesce(step.opt_timeout, flow.opt_timeout) + 2 as vt_delay - from tasks task - join pgflow.flows flow on flow.flow_slug = task.flow_slug - join pgflow.steps step on step.flow_slug = task.flow_slug and step.step_slug = task.step_slug - ), - -- Batch update visibility timeouts for all messages - set_vt_batch as ( - select pgflow.set_vt_batch( - start_tasks.flow_slug, - array_agg(t.message_id order by t.message_id), - array_agg(t.vt_delay order by t.message_id) - ) - from timeouts t - ) - select - st.flow_slug, - st.run_id, - st.step_slug, - jsonb_build_object('run', r.input) || - coalesce(dep_out.deps_output, '{}'::jsonb) as input, - st.message_id as msg_id - from tasks st - join runs r on st.run_id = r.run_id - left join deps_outputs dep_out on - dep_out.run_id = st.run_id and - dep_out.step_slug = st.step_slug -$$; diff --git a/examples/playground/supabase/migrations/20250615172434_20250614124241_pgflow_add_realtime.sql b/examples/playground/supabase/migrations/20250615172434_20250614124241_pgflow_add_realtime.sql deleted file mode 100644 index 353ade1ca..000000000 --- a/examples/playground/supabase/migrations/20250615172434_20250614124241_pgflow_add_realtime.sql +++ /dev/null @@ -1,501 +0,0 @@ --- Modify "step_states" table -ALTER TABLE "pgflow"."step_states" ADD COLUMN "error_message" text NULL; --- Create index "idx_step_states_run_id" to table: "step_states" -CREATE INDEX "idx_step_states_run_id" ON "pgflow"."step_states" ("run_id"); --- Modify "maybe_complete_run" function -CREATE OR REPLACE FUNCTION "pgflow"."maybe_complete_run" ("run_id" uuid) RETURNS void LANGUAGE plpgsql SET "search_path" = '' AS $$ -declare - v_completed_run pgflow.runs%ROWTYPE; -begin - -- Update run status to completed and set output when there are no remaining steps - WITH run_output AS ( - -- Get outputs from final steps (steps that are not dependencies for other steps) - SELECT jsonb_object_agg(st.step_slug, st.output) as final_output - FROM pgflow.step_tasks st - JOIN pgflow.step_states ss ON ss.run_id = st.run_id AND ss.step_slug = st.step_slug - JOIN pgflow.runs r ON r.run_id = ss.run_id AND r.flow_slug = ss.flow_slug - WHERE st.run_id = maybe_complete_run.run_id - AND st.status = 'completed' - AND NOT EXISTS ( - SELECT 1 - FROM pgflow.deps d - WHERE d.flow_slug = ss.flow_slug - AND d.dep_slug = ss.step_slug - ) - ) - UPDATE pgflow.runs - SET - status = 'completed', - completed_at = now(), - output = (SELECT final_output FROM run_output) - WHERE pgflow.runs.run_id = maybe_complete_run.run_id - AND pgflow.runs.remaining_steps = 0 - AND pgflow.runs.status != 'completed' - RETURNING * INTO v_completed_run; - - -- Only send broadcast if run was completed - IF v_completed_run.run_id IS NOT NULL THEN - PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'run:completed', - 'run_id', v_completed_run.run_id, - 'flow_slug', v_completed_run.flow_slug, - 'status', 'completed', - 'output', v_completed_run.output, - 'completed_at', v_completed_run.completed_at - ), - 'run:completed', - concat('pgflow:run:', v_completed_run.run_id), - false - ); - END IF; -end; -$$; --- Modify "start_ready_steps" function -CREATE OR REPLACE FUNCTION "pgflow"."start_ready_steps" ("run_id" uuid) RETURNS void LANGUAGE sql SET "search_path" = '' AS $$ -WITH ready_steps AS ( - SELECT * - FROM pgflow.step_states AS step_state - WHERE step_state.run_id = start_ready_steps.run_id - AND step_state.status = 'created' - AND step_state.remaining_deps = 0 - ORDER BY step_state.step_slug - FOR UPDATE -), -started_step_states AS ( - UPDATE pgflow.step_states - SET status = 'started', - started_at = now() - FROM ready_steps - WHERE pgflow.step_states.run_id = start_ready_steps.run_id - AND pgflow.step_states.step_slug = ready_steps.step_slug - RETURNING pgflow.step_states.* -), -sent_messages AS ( - SELECT - started_step.flow_slug, - started_step.run_id, - started_step.step_slug, - pgmq.send(started_step.flow_slug, jsonb_build_object( - 'flow_slug', started_step.flow_slug, - 'run_id', started_step.run_id, - 'step_slug', started_step.step_slug, - 'task_index', 0 - )) AS msg_id - FROM started_step_states AS started_step -), -broadcast_events AS ( - SELECT - realtime.send( - jsonb_build_object( - 'event_type', 'step:started', - 'run_id', started_step.run_id, - 'step_slug', started_step.step_slug, - 'status', 'started', - 'started_at', started_step.started_at, - 'remaining_tasks', 1, - 'remaining_deps', started_step.remaining_deps - ), - concat('step:', started_step.step_slug, ':started'), - concat('pgflow:run:', started_step.run_id), - false - ) - FROM started_step_states AS started_step -) -INSERT INTO pgflow.step_tasks (flow_slug, run_id, step_slug, message_id) -SELECT - sent_messages.flow_slug, - sent_messages.run_id, - sent_messages.step_slug, - sent_messages.msg_id -FROM sent_messages; -$$; --- Modify "complete_task" function -CREATE OR REPLACE FUNCTION "pgflow"."complete_task" ("run_id" uuid, "step_slug" text, "task_index" integer, "output" jsonb) RETURNS SETOF "pgflow"."step_tasks" LANGUAGE plpgsql SET "search_path" = '' AS $$ -declare - v_step_state pgflow.step_states%ROWTYPE; -begin - -WITH run_lock AS ( - SELECT * FROM pgflow.runs - WHERE pgflow.runs.run_id = complete_task.run_id - FOR UPDATE -), -step_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = complete_task.step_slug - FOR UPDATE -), -task AS ( - UPDATE pgflow.step_tasks - SET - status = 'completed', - completed_at = now(), - output = complete_task.output - WHERE pgflow.step_tasks.run_id = complete_task.run_id - AND pgflow.step_tasks.step_slug = complete_task.step_slug - AND pgflow.step_tasks.task_index = complete_task.task_index - AND pgflow.step_tasks.status = 'started' - RETURNING * -), -step_state AS ( - UPDATE pgflow.step_states - SET - status = CASE - WHEN pgflow.step_states.remaining_tasks = 1 THEN 'completed' -- Will be 0 after decrement - ELSE 'started' - END, - completed_at = CASE - WHEN pgflow.step_states.remaining_tasks = 1 THEN now() -- Will be 0 after decrement - ELSE NULL - END, - remaining_tasks = pgflow.step_states.remaining_tasks - 1 - FROM task - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = complete_task.step_slug - RETURNING pgflow.step_states.* -), --- Find all dependent steps if the current step was completed -dependent_steps AS ( - SELECT d.step_slug AS dependent_step_slug - FROM pgflow.deps d - JOIN step_state s ON s.status = 'completed' AND d.flow_slug = s.flow_slug - WHERE d.dep_slug = complete_task.step_slug - ORDER BY d.step_slug -- Ensure consistent ordering -), --- Lock dependent steps before updating -dependent_steps_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug IN (SELECT dependent_step_slug FROM dependent_steps) - FOR UPDATE -), --- Update all dependent steps -dependent_steps_update AS ( - UPDATE pgflow.step_states - SET remaining_deps = pgflow.step_states.remaining_deps - 1 - FROM dependent_steps - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = dependent_steps.dependent_step_slug -) --- Only decrement remaining_steps, don't update status -UPDATE pgflow.runs -SET remaining_steps = pgflow.runs.remaining_steps - 1 -FROM step_state -WHERE pgflow.runs.run_id = complete_task.run_id - AND step_state.status = 'completed'; - --- Get the updated step state for broadcasting -SELECT * INTO v_step_state FROM pgflow.step_states -WHERE pgflow.step_states.run_id = complete_task.run_id AND pgflow.step_states.step_slug = complete_task.step_slug; - --- Send broadcast event for step completed if the step is completed -IF v_step_state.status = 'completed' THEN - PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'step:completed', - 'run_id', complete_task.run_id, - 'step_slug', complete_task.step_slug, - 'status', 'completed', - 'output', complete_task.output, - 'completed_at', v_step_state.completed_at - ), - concat('step:', complete_task.step_slug, ':completed'), - concat('pgflow:run:', complete_task.run_id), - false - ); -END IF; - --- For completed tasks: archive the message -PERFORM ( - WITH completed_tasks AS ( - SELECT r.flow_slug, st.message_id - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = complete_task.run_id - AND st.step_slug = complete_task.step_slug - AND st.task_index = complete_task.task_index - AND st.status = 'completed' - ) - SELECT pgmq.archive(ct.flow_slug, ct.message_id) - FROM completed_tasks ct - WHERE EXISTS (SELECT 1 FROM completed_tasks) -); - -PERFORM pgflow.start_ready_steps(complete_task.run_id); - -PERFORM pgflow.maybe_complete_run(complete_task.run_id); - -RETURN QUERY SELECT * -FROM pgflow.step_tasks AS step_task -WHERE step_task.run_id = complete_task.run_id - AND step_task.step_slug = complete_task.step_slug - AND step_task.task_index = complete_task.task_index; - -end; -$$; --- Modify "fail_task" function -CREATE OR REPLACE FUNCTION "pgflow"."fail_task" ("run_id" uuid, "step_slug" text, "task_index" integer, "error_message" text) RETURNS SETOF "pgflow"."step_tasks" LANGUAGE plpgsql SET "search_path" = '' AS $$ -DECLARE - v_run_failed boolean; -begin - -WITH run_lock AS ( - SELECT * FROM pgflow.runs - WHERE pgflow.runs.run_id = fail_task.run_id - FOR UPDATE -), -step_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - FOR UPDATE -), -flow_info AS ( - SELECT r.flow_slug - FROM pgflow.runs r - WHERE r.run_id = fail_task.run_id -), -config AS ( - SELECT - COALESCE(s.opt_max_attempts, f.opt_max_attempts) AS opt_max_attempts, - COALESCE(s.opt_base_delay, f.opt_base_delay) AS opt_base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN flow_info fi ON fi.flow_slug = s.flow_slug - WHERE s.flow_slug = fi.flow_slug AND s.step_slug = fail_task.step_slug -), -fail_or_retry_task as ( - UPDATE pgflow.step_tasks as task - SET - status = CASE - WHEN task.attempts_count < (SELECT opt_max_attempts FROM config) THEN 'queued' - ELSE 'failed' - END, - failed_at = CASE - WHEN task.attempts_count >= (SELECT opt_max_attempts FROM config) THEN now() - ELSE NULL - END, - started_at = CASE - WHEN task.attempts_count < (SELECT opt_max_attempts FROM config) THEN NULL - ELSE task.started_at - END, - error_message = fail_task.error_message - WHERE task.run_id = fail_task.run_id - AND task.step_slug = fail_task.step_slug - AND task.task_index = fail_task.task_index - AND task.status = 'started' - RETURNING * -), -maybe_fail_step AS ( - UPDATE pgflow.step_states - SET - status = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN 'failed' - ELSE pgflow.step_states.status - END, - failed_at = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN now() - ELSE NULL - END, - error_message = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN fail_task.error_message - ELSE NULL - END - FROM fail_or_retry_task - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - RETURNING pgflow.step_states.* -), --- Send broadcast event for step failed if necessary -broadcast_step_failed AS ( - SELECT - realtime.send( - jsonb_build_object( - 'event_type', 'step:failed', - 'run_id', fail_task.run_id, - 'step_slug', fail_task.step_slug, - 'status', 'failed', - 'error_message', fail_task.error_message, - 'failed_at', now() - ), - concat('step:', fail_task.step_slug, ':failed'), - concat('pgflow:run:', fail_task.run_id), - false - ) - FROM maybe_fail_step - WHERE maybe_fail_step.status = 'failed' -) --- Only decrement remaining_steps, don't update status -UPDATE pgflow.runs -SET status = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN 'failed' - ELSE status - END, - failed_at = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN now() - ELSE NULL - END -WHERE pgflow.runs.run_id = fail_task.run_id -RETURNING (status = 'failed') INTO v_run_failed; - --- Send broadcast event for run failure if the run was failed -IF v_run_failed THEN - DECLARE - v_flow_slug text; - BEGIN - SELECT flow_slug INTO v_flow_slug FROM pgflow.runs WHERE pgflow.runs.run_id = fail_task.run_id; - - PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'run:failed', - 'run_id', fail_task.run_id, - 'flow_slug', v_flow_slug, - 'status', 'failed', - 'error_message', fail_task.error_message, - 'failed_at', now() - ), - 'run:failed', - concat('pgflow:run:', fail_task.run_id), - false - ); - END; -END IF; - --- For queued tasks: delay the message for retry with exponential backoff -PERFORM ( - WITH retry_config AS ( - SELECT - COALESCE(s.opt_base_delay, f.opt_base_delay) AS base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN pgflow.runs r ON r.flow_slug = f.flow_slug - WHERE r.run_id = fail_task.run_id - AND s.step_slug = fail_task.step_slug - ), - queued_tasks AS ( - SELECT - r.flow_slug, - st.message_id, - pgflow.calculate_retry_delay((SELECT base_delay FROM retry_config), st.attempts_count) AS calculated_delay - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'queued' - ) - SELECT pgmq.set_vt(qt.flow_slug, qt.message_id, qt.calculated_delay) - FROM queued_tasks qt - WHERE EXISTS (SELECT 1 FROM queued_tasks) -); - --- For failed tasks: archive the message -PERFORM ( - WITH failed_tasks AS ( - SELECT r.flow_slug, st.message_id - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'failed' - ) - SELECT pgmq.archive(ft.flow_slug, ft.message_id) - FROM failed_tasks ft - WHERE EXISTS (SELECT 1 FROM failed_tasks) -); - -return query select * -from pgflow.step_tasks st -where st.run_id = fail_task.run_id - and st.step_slug = fail_task.step_slug - and st.task_index = fail_task.task_index; - -end; -$$; --- Create "get_run_with_states" function -CREATE FUNCTION "pgflow"."get_run_with_states" ("run_id" uuid) RETURNS jsonb LANGUAGE sql SECURITY DEFINER AS $$ -SELECT jsonb_build_object( - 'run', to_jsonb(r), - 'steps', COALESCE(jsonb_agg(to_jsonb(s)) FILTER (WHERE s.run_id IS NOT NULL), '[]'::jsonb) - ) - FROM pgflow.runs r - LEFT JOIN pgflow.step_states s ON s.run_id = r.run_id - WHERE r.run_id = get_run_with_states.run_id - GROUP BY r.run_id; -$$; --- Create "start_flow" function -CREATE FUNCTION "pgflow"."start_flow" ("flow_slug" text, "input" jsonb, "run_id" uuid DEFAULT NULL::uuid) RETURNS SETOF "pgflow"."runs" LANGUAGE plpgsql SET "search_path" = '' AS $$ -declare - v_created_run pgflow.runs%ROWTYPE; -begin - -WITH - flow_steps AS ( - SELECT steps.flow_slug, steps.step_slug, steps.deps_count - FROM pgflow.steps - WHERE steps.flow_slug = start_flow.flow_slug - ), - created_run AS ( - INSERT INTO pgflow.runs (run_id, flow_slug, input, remaining_steps) - VALUES ( - COALESCE(start_flow.run_id, gen_random_uuid()), - start_flow.flow_slug, - start_flow.input, - (SELECT count(*) FROM flow_steps) - ) - RETURNING * - ), - created_step_states AS ( - INSERT INTO pgflow.step_states (flow_slug, run_id, step_slug, remaining_deps) - SELECT - fs.flow_slug, - (SELECT created_run.run_id FROM created_run), - fs.step_slug, - fs.deps_count - FROM flow_steps fs - ) -SELECT * FROM created_run INTO v_created_run; - --- Send broadcast event for run started -PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'run:started', - 'run_id', v_created_run.run_id, - 'flow_slug', v_created_run.flow_slug, - 'input', v_created_run.input, - 'status', 'started', - 'remaining_steps', v_created_run.remaining_steps, - 'started_at', v_created_run.started_at - ), - 'run:started', - concat('pgflow:run:', v_created_run.run_id), - false -); - -PERFORM pgflow.start_ready_steps(v_created_run.run_id); - -RETURN QUERY SELECT * FROM pgflow.runs where pgflow.runs.run_id = v_created_run.run_id; - -end; -$$; --- Create "start_flow_with_states" function -CREATE FUNCTION "pgflow"."start_flow_with_states" ("flow_slug" text, "input" jsonb, "run_id" uuid DEFAULT NULL::uuid) RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER AS $$ -DECLARE - v_run_id UUID; -BEGIN - -- Start the flow using existing function - SELECT r.run_id INTO v_run_id FROM pgflow.start_flow( - start_flow_with_states.flow_slug, - start_flow_with_states.input, - start_flow_with_states.run_id - ) AS r LIMIT 1; - - -- Use get_run_with_states to return the complete state - RETURN pgflow.get_run_with_states(v_run_id); -END; -$$; --- Drop "start_flow" function -DROP FUNCTION "pgflow"."start_flow" (text, jsonb); diff --git a/examples/playground/supabase/migrations/20250627215516_20250619195327_pgflow_fix_fail_task_missing_realtime_event.sql b/examples/playground/supabase/migrations/20250627215516_20250619195327_pgflow_fix_fail_task_missing_realtime_event.sql deleted file mode 100644 index 9782f5393..000000000 --- a/examples/playground/supabase/migrations/20250627215516_20250619195327_pgflow_fix_fail_task_missing_realtime_event.sql +++ /dev/null @@ -1,185 +0,0 @@ --- Modify "fail_task" function -CREATE OR REPLACE FUNCTION "pgflow"."fail_task" ("run_id" uuid, "step_slug" text, "task_index" integer, "error_message" text) RETURNS SETOF "pgflow"."step_tasks" LANGUAGE plpgsql SET "search_path" = '' AS $$ -DECLARE - v_run_failed boolean; - v_step_failed boolean; -begin - -WITH run_lock AS ( - SELECT * FROM pgflow.runs - WHERE pgflow.runs.run_id = fail_task.run_id - FOR UPDATE -), -step_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - FOR UPDATE -), -flow_info AS ( - SELECT r.flow_slug - FROM pgflow.runs r - WHERE r.run_id = fail_task.run_id -), -config AS ( - SELECT - COALESCE(s.opt_max_attempts, f.opt_max_attempts) AS opt_max_attempts, - COALESCE(s.opt_base_delay, f.opt_base_delay) AS opt_base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN flow_info fi ON fi.flow_slug = s.flow_slug - WHERE s.flow_slug = fi.flow_slug AND s.step_slug = fail_task.step_slug -), -fail_or_retry_task as ( - UPDATE pgflow.step_tasks as task - SET - status = CASE - WHEN task.attempts_count < (SELECT opt_max_attempts FROM config) THEN 'queued' - ELSE 'failed' - END, - failed_at = CASE - WHEN task.attempts_count >= (SELECT opt_max_attempts FROM config) THEN now() - ELSE NULL - END, - started_at = CASE - WHEN task.attempts_count < (SELECT opt_max_attempts FROM config) THEN NULL - ELSE task.started_at - END, - error_message = fail_task.error_message - WHERE task.run_id = fail_task.run_id - AND task.step_slug = fail_task.step_slug - AND task.task_index = fail_task.task_index - AND task.status = 'started' - RETURNING * -), -maybe_fail_step AS ( - UPDATE pgflow.step_states - SET - status = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN 'failed' - ELSE pgflow.step_states.status - END, - failed_at = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN now() - ELSE NULL - END, - error_message = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN fail_task.error_message - ELSE NULL - END - FROM fail_or_retry_task - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - RETURNING pgflow.step_states.* -) --- Update run status -UPDATE pgflow.runs -SET status = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN 'failed' - ELSE status - END, - failed_at = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN now() - ELSE NULL - END -WHERE pgflow.runs.run_id = fail_task.run_id -RETURNING (status = 'failed') INTO v_run_failed; - --- Check if step failed by querying the step_states table -SELECT (status = 'failed') INTO v_step_failed -FROM pgflow.step_states -WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug; - --- Send broadcast event for step failure if the step was failed -IF v_step_failed THEN - PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'step:failed', - 'run_id', fail_task.run_id, - 'step_slug', fail_task.step_slug, - 'status', 'failed', - 'error_message', fail_task.error_message, - 'failed_at', now() - ), - concat('step:', fail_task.step_slug, ':failed'), - concat('pgflow:run:', fail_task.run_id), - false - ); -END IF; - --- Send broadcast event for run failure if the run was failed -IF v_run_failed THEN - DECLARE - v_flow_slug text; - BEGIN - SELECT flow_slug INTO v_flow_slug FROM pgflow.runs WHERE pgflow.runs.run_id = fail_task.run_id; - - PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'run:failed', - 'run_id', fail_task.run_id, - 'flow_slug', v_flow_slug, - 'status', 'failed', - 'error_message', fail_task.error_message, - 'failed_at', now() - ), - 'run:failed', - concat('pgflow:run:', fail_task.run_id), - false - ); - END; -END IF; - --- For queued tasks: delay the message for retry with exponential backoff -PERFORM ( - WITH retry_config AS ( - SELECT - COALESCE(s.opt_base_delay, f.opt_base_delay) AS base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN pgflow.runs r ON r.flow_slug = f.flow_slug - WHERE r.run_id = fail_task.run_id - AND s.step_slug = fail_task.step_slug - ), - queued_tasks AS ( - SELECT - r.flow_slug, - st.message_id, - pgflow.calculate_retry_delay((SELECT base_delay FROM retry_config), st.attempts_count) AS calculated_delay - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'queued' - ) - SELECT pgmq.set_vt(qt.flow_slug, qt.message_id, qt.calculated_delay) - FROM queued_tasks qt - WHERE EXISTS (SELECT 1 FROM queued_tasks) -); - --- For failed tasks: archive the message -PERFORM ( - WITH failed_tasks AS ( - SELECT r.flow_slug, st.message_id - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'failed' - ) - SELECT pgmq.archive(ft.flow_slug, ft.message_id) - FROM failed_tasks ft - WHERE EXISTS (SELECT 1 FROM failed_tasks) -); - -return query select * -from pgflow.step_tasks st -where st.run_id = fail_task.run_id - and st.step_slug = fail_task.step_slug - and st.task_index = fail_task.task_index; - -end; -$$; diff --git a/examples/playground/supabase/migrations/20250627215517_20250627090700_pgflow_fix_function_search_paths.sql b/examples/playground/supabase/migrations/20250627215517_20250627090700_pgflow_fix_function_search_paths.sql deleted file mode 100644 index 09d325c00..000000000 --- a/examples/playground/supabase/migrations/20250627215517_20250627090700_pgflow_fix_function_search_paths.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Add "calculate_retry_delay" function configuration parameter -ALTER FUNCTION "pgflow"."calculate_retry_delay" SET "search_path" = ''; --- Add "is_valid_slug" function configuration parameter -ALTER FUNCTION "pgflow"."is_valid_slug" SET "search_path" = ''; --- Add "read_with_poll" function configuration parameter -ALTER FUNCTION "pgflow"."read_with_poll" SET "search_path" = ''; diff --git a/examples/playground/supabase/migrations/20251008044437_20250707210212_pgflow_add_opt_start_delay.sql b/examples/playground/supabase/migrations/20251008044437_20250707210212_pgflow_add_opt_start_delay.sql deleted file mode 100644 index 28e05deb8..000000000 --- a/examples/playground/supabase/migrations/20251008044437_20250707210212_pgflow_add_opt_start_delay.sql +++ /dev/null @@ -1,103 +0,0 @@ --- Modify "steps" table -ALTER TABLE "pgflow"."steps" ADD CONSTRAINT "opt_start_delay_is_nonnegative" CHECK ((opt_start_delay IS NULL) OR (opt_start_delay >= 0)), ADD COLUMN "opt_start_delay" integer NULL; --- Modify "start_ready_steps" function -CREATE OR REPLACE FUNCTION "pgflow"."start_ready_steps" ("run_id" uuid) RETURNS void LANGUAGE sql SET "search_path" = '' AS $$ -WITH ready_steps AS ( - SELECT * - FROM pgflow.step_states AS step_state - WHERE step_state.run_id = start_ready_steps.run_id - AND step_state.status = 'created' - AND step_state.remaining_deps = 0 - ORDER BY step_state.step_slug - FOR UPDATE -), -started_step_states AS ( - UPDATE pgflow.step_states - SET status = 'started', - started_at = now() - FROM ready_steps - WHERE pgflow.step_states.run_id = start_ready_steps.run_id - AND pgflow.step_states.step_slug = ready_steps.step_slug - RETURNING pgflow.step_states.* -), -sent_messages AS ( - SELECT - started_step.flow_slug, - started_step.run_id, - started_step.step_slug, - pgmq.send( - started_step.flow_slug, - jsonb_build_object( - 'flow_slug', started_step.flow_slug, - 'run_id', started_step.run_id, - 'step_slug', started_step.step_slug, - 'task_index', 0 - ), - COALESCE(step.opt_start_delay, 0) - ) AS msg_id - FROM started_step_states AS started_step - JOIN pgflow.steps AS step - ON step.flow_slug = started_step.flow_slug - AND step.step_slug = started_step.step_slug -), -broadcast_events AS ( - SELECT - realtime.send( - jsonb_build_object( - 'event_type', 'step:started', - 'run_id', started_step.run_id, - 'step_slug', started_step.step_slug, - 'status', 'started', - 'started_at', started_step.started_at, - 'remaining_tasks', 1, - 'remaining_deps', started_step.remaining_deps - ), - concat('step:', started_step.step_slug, ':started'), - concat('pgflow:run:', started_step.run_id), - false - ) - FROM started_step_states AS started_step -) -INSERT INTO pgflow.step_tasks (flow_slug, run_id, step_slug, message_id) -SELECT - sent_messages.flow_slug, - sent_messages.run_id, - sent_messages.step_slug, - sent_messages.msg_id -FROM sent_messages; -$$; --- Create "add_step" function -CREATE FUNCTION "pgflow"."add_step" ("flow_slug" text, "step_slug" text, "deps_slugs" text[], "max_attempts" integer DEFAULT NULL::integer, "base_delay" integer DEFAULT NULL::integer, "timeout" integer DEFAULT NULL::integer, "start_delay" integer DEFAULT NULL::integer) RETURNS "pgflow"."steps" LANGUAGE sql SET "search_path" = '' AS $$ -WITH - next_index AS ( - SELECT COALESCE(MAX(step_index) + 1, 0) as idx - FROM pgflow.steps - WHERE flow_slug = add_step.flow_slug - ), - create_step AS ( - INSERT INTO pgflow.steps (flow_slug, step_slug, step_index, deps_count, opt_max_attempts, opt_base_delay, opt_timeout, opt_start_delay) - SELECT add_step.flow_slug, add_step.step_slug, idx, COALESCE(array_length(deps_slugs, 1), 0), max_attempts, base_delay, timeout, start_delay - FROM next_index - ON CONFLICT (flow_slug, step_slug) - DO UPDATE SET step_slug = pgflow.steps.step_slug - RETURNING * - ), - insert_deps AS ( - INSERT INTO pgflow.deps (flow_slug, dep_slug, step_slug) - SELECT add_step.flow_slug, d.dep_slug, add_step.step_slug - FROM unnest(deps_slugs) AS d(dep_slug) - ON CONFLICT (flow_slug, dep_slug, step_slug) DO NOTHING - RETURNING 1 - ) --- Return the created step -SELECT * FROM create_step; -$$; --- Drop "add_step" function -DROP FUNCTION "pgflow"."add_step" (text, text, integer, integer, integer); --- Drop "add_step" function -DROP FUNCTION "pgflow"."add_step" (text, text, text[], integer, integer, integer); --- Create "add_step" function -CREATE FUNCTION "pgflow"."add_step" ("flow_slug" text, "step_slug" text, "max_attempts" integer DEFAULT NULL::integer, "base_delay" integer DEFAULT NULL::integer, "timeout" integer DEFAULT NULL::integer, "start_delay" integer DEFAULT NULL::integer) RETURNS "pgflow"."steps" LANGUAGE sql SET "search_path" = '' AS $$ --- Call the original function with an empty array - SELECT * FROM pgflow.add_step(flow_slug, step_slug, ARRAY[]::text[], max_attempts, base_delay, timeout, start_delay); -$$; diff --git a/examples/playground/supabase/migrations/20251008044438_20250719205006_pgflow_worker_deprecation.sql b/examples/playground/supabase/migrations/20251008044438_20250719205006_pgflow_worker_deprecation.sql deleted file mode 100644 index 783852022..000000000 --- a/examples/playground/supabase/migrations/20251008044438_20250719205006_pgflow_worker_deprecation.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Rename a column from "stopped_at" to "deprecated_at" -ALTER TABLE "pgflow"."workers" RENAME COLUMN "stopped_at" TO "deprecated_at"; diff --git a/examples/playground/supabase/migrations/20251008044439_20251006073122_pgflow_add_map_step_type.sql b/examples/playground/supabase/migrations/20251008044439_20251006073122_pgflow_add_map_step_type.sql deleted file mode 100644 index 3046fd848..000000000 --- a/examples/playground/supabase/migrations/20251008044439_20251006073122_pgflow_add_map_step_type.sql +++ /dev/null @@ -1,1246 +0,0 @@ --- Modify "step_task_record" composite type -ALTER TYPE "pgflow"."step_task_record" ADD ATTRIBUTE "task_index" integer; --- Modify "step_states" table - Step 1: Drop old constraint and NOT NULL -ALTER TABLE "pgflow"."step_states" - DROP CONSTRAINT "step_states_remaining_tasks_check", - ALTER COLUMN "remaining_tasks" DROP NOT NULL, - ALTER COLUMN "remaining_tasks" DROP DEFAULT, - ADD COLUMN "initial_tasks" integer NULL; --- MANUAL DATA MIGRATION: Prepare existing data for new constraints --- This must run AFTER dropping NOT NULL but BEFORE adding new constraints - --- Update 1: Set remaining_tasks to NULL for 'created' status --- The new constraint "remaining_tasks_state_consistency" requires that --- remaining_tasks is NULL when status = 'created' -UPDATE "pgflow"."step_states" -SET "remaining_tasks" = NULL -WHERE "status" = 'created'; - --- Update 2: Backfill initial_tasks for 'started' steps --- The new constraint "initial_tasks_known_when_started" requires that --- initial_tasks is NOT NULL when status = 'started' --- For existing started steps, initial_tasks should equal current remaining_tasks -UPDATE "pgflow"."step_states" -SET "initial_tasks" = COALESCE("remaining_tasks", 1) -WHERE "status" = 'started'; --- Modify "step_states" table - Step 2: Add new constraints -ALTER TABLE "pgflow"."step_states" - ADD CONSTRAINT "initial_tasks_known_when_started" CHECK ((status <> 'started'::text) OR (initial_tasks IS NOT NULL)), - ADD CONSTRAINT "remaining_tasks_state_consistency" CHECK ((remaining_tasks IS NULL) OR (status <> 'created'::text)), - ADD CONSTRAINT "step_states_initial_tasks_check" CHECK ((initial_tasks IS NULL) OR (initial_tasks >= 0)); --- Modify "step_tasks" table -ALTER TABLE "pgflow"."step_tasks" DROP CONSTRAINT "only_single_task_per_step", DROP CONSTRAINT "output_valid_only_for_completed", ADD CONSTRAINT "output_valid_only_for_completed" CHECK ((output IS NULL) OR (status = ANY (ARRAY['completed'::text, 'failed'::text]))); --- Modify "steps" table -ALTER TABLE "pgflow"."steps" DROP CONSTRAINT "steps_step_type_check", ADD CONSTRAINT "steps_step_type_check" CHECK (step_type = ANY (ARRAY['single'::text, 'map'::text])); --- Modify "maybe_complete_run" function -CREATE OR REPLACE FUNCTION "pgflow"."maybe_complete_run" ("run_id" uuid) RETURNS void LANGUAGE plpgsql SET "search_path" = '' AS $$ -declare - v_completed_run pgflow.runs%ROWTYPE; -begin - -- ========================================== - -- CHECK AND COMPLETE RUN IF FINISHED - -- ========================================== - -- ---------- Complete run if all steps done ---------- - UPDATE pgflow.runs - SET - status = 'completed', - completed_at = now(), - -- Only compute expensive aggregation when actually completing the run - output = ( - -- ---------- Gather outputs from leaf steps ---------- - -- Leaf steps = steps with no dependents - -- For map steps: aggregate all task outputs into array - -- For single steps: use the single task output - SELECT jsonb_object_agg( - step_slug, - CASE - WHEN step_type = 'map' THEN aggregated_output - ELSE single_output - END - ) - FROM ( - SELECT DISTINCT - leaf_state.step_slug, - leaf_step.step_type, - -- For map steps: aggregate all task outputs - CASE WHEN leaf_step.step_type = 'map' THEN - (SELECT COALESCE(jsonb_agg(leaf_task.output ORDER BY leaf_task.task_index), '[]'::jsonb) - FROM pgflow.step_tasks leaf_task - WHERE leaf_task.run_id = leaf_state.run_id - AND leaf_task.step_slug = leaf_state.step_slug - AND leaf_task.status = 'completed') - END as aggregated_output, - -- For single steps: get the single output - CASE WHEN leaf_step.step_type = 'single' THEN - (SELECT leaf_task.output - FROM pgflow.step_tasks leaf_task - WHERE leaf_task.run_id = leaf_state.run_id - AND leaf_task.step_slug = leaf_state.step_slug - AND leaf_task.status = 'completed' - LIMIT 1) - END as single_output - FROM pgflow.step_states leaf_state - JOIN pgflow.steps leaf_step ON leaf_step.flow_slug = leaf_state.flow_slug AND leaf_step.step_slug = leaf_state.step_slug - WHERE leaf_state.run_id = maybe_complete_run.run_id - AND leaf_state.status = 'completed' - AND NOT EXISTS ( - SELECT 1 - FROM pgflow.deps dep - WHERE dep.flow_slug = leaf_state.flow_slug - AND dep.dep_slug = leaf_state.step_slug - ) - ) leaf_outputs - ) - WHERE pgflow.runs.run_id = maybe_complete_run.run_id - AND pgflow.runs.remaining_steps = 0 - AND pgflow.runs.status != 'completed' - RETURNING * INTO v_completed_run; - - -- ========================================== - -- BROADCAST COMPLETION EVENT - -- ========================================== - IF v_completed_run.run_id IS NOT NULL THEN - PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'run:completed', - 'run_id', v_completed_run.run_id, - 'flow_slug', v_completed_run.flow_slug, - 'status', 'completed', - 'output', v_completed_run.output, - 'completed_at', v_completed_run.completed_at - ), - 'run:completed', - concat('pgflow:run:', v_completed_run.run_id), - false - ); - END IF; -end; -$$; --- Modify "start_ready_steps" function -CREATE OR REPLACE FUNCTION "pgflow"."start_ready_steps" ("run_id" uuid) RETURNS void LANGUAGE plpgsql SET "search_path" = '' AS $$ -begin --- ========================================== --- GUARD: No mutations on failed runs --- ========================================== -IF EXISTS (SELECT 1 FROM pgflow.runs WHERE pgflow.runs.run_id = start_ready_steps.run_id AND pgflow.runs.status = 'failed') THEN - RETURN; -END IF; - --- ========================================== --- HANDLE EMPTY ARRAY MAPS (initial_tasks = 0) --- ========================================== --- These complete immediately without spawning tasks -WITH empty_map_steps AS ( - SELECT step_state.* - FROM pgflow.step_states AS step_state - JOIN pgflow.steps AS step - ON step.flow_slug = step_state.flow_slug - AND step.step_slug = step_state.step_slug - WHERE step_state.run_id = start_ready_steps.run_id - AND step_state.status = 'created' - AND step_state.remaining_deps = 0 - AND step.step_type = 'map' - AND step_state.initial_tasks = 0 - ORDER BY step_state.step_slug - FOR UPDATE OF step_state -), --- ---------- Complete empty map steps ---------- -completed_empty_steps AS ( - UPDATE pgflow.step_states - SET status = 'completed', - started_at = now(), - completed_at = now(), - remaining_tasks = 0 - FROM empty_map_steps - WHERE pgflow.step_states.run_id = start_ready_steps.run_id - AND pgflow.step_states.step_slug = empty_map_steps.step_slug - RETURNING pgflow.step_states.* -), --- ---------- Broadcast completion events ---------- -broadcast_empty_completed AS ( - SELECT - realtime.send( - jsonb_build_object( - 'event_type', 'step:completed', - 'run_id', completed_step.run_id, - 'step_slug', completed_step.step_slug, - 'status', 'completed', - 'started_at', completed_step.started_at, - 'completed_at', completed_step.completed_at, - 'remaining_tasks', 0, - 'remaining_deps', 0, - 'output', '[]'::jsonb - ), - concat('step:', completed_step.step_slug, ':completed'), - concat('pgflow:run:', completed_step.run_id), - false - ) - FROM completed_empty_steps AS completed_step -), - --- ========================================== --- HANDLE NORMAL STEPS (initial_tasks > 0) --- ========================================== --- ---------- Find ready steps ---------- --- Steps with no remaining deps and known task count -ready_steps AS ( - SELECT * - FROM pgflow.step_states AS step_state - WHERE step_state.run_id = start_ready_steps.run_id - AND step_state.status = 'created' - AND step_state.remaining_deps = 0 - AND step_state.initial_tasks IS NOT NULL -- NEW: Cannot start with unknown count - AND step_state.initial_tasks > 0 -- Don't start taskless steps - -- Exclude empty map steps already handled - AND NOT EXISTS ( - SELECT 1 FROM empty_map_steps - WHERE empty_map_steps.run_id = step_state.run_id - AND empty_map_steps.step_slug = step_state.step_slug - ) - ORDER BY step_state.step_slug - FOR UPDATE -), --- ---------- Mark steps as started ---------- -started_step_states AS ( - UPDATE pgflow.step_states - SET status = 'started', - started_at = now(), - remaining_tasks = ready_steps.initial_tasks -- Copy initial_tasks to remaining_tasks when starting - FROM ready_steps - WHERE pgflow.step_states.run_id = start_ready_steps.run_id - AND pgflow.step_states.step_slug = ready_steps.step_slug - RETURNING pgflow.step_states.* -), - --- ========================================== --- TASK GENERATION AND QUEUE MESSAGES --- ========================================== --- ---------- Generate tasks and batch messages ---------- --- Single steps: 1 task (index 0) --- Map steps: N tasks (indices 0..N-1) -message_batches AS ( - SELECT - started_step.flow_slug, - started_step.run_id, - started_step.step_slug, - COALESCE(step.opt_start_delay, 0) as delay, - array_agg( - jsonb_build_object( - 'flow_slug', started_step.flow_slug, - 'run_id', started_step.run_id, - 'step_slug', started_step.step_slug, - 'task_index', task_idx.task_index - ) ORDER BY task_idx.task_index - ) AS messages, - array_agg(task_idx.task_index ORDER BY task_idx.task_index) AS task_indices - FROM started_step_states AS started_step - JOIN pgflow.steps AS step - ON step.flow_slug = started_step.flow_slug - AND step.step_slug = started_step.step_slug - -- Generate task indices from 0 to initial_tasks-1 - CROSS JOIN LATERAL generate_series(0, started_step.initial_tasks - 1) AS task_idx(task_index) - GROUP BY started_step.flow_slug, started_step.run_id, started_step.step_slug, step.opt_start_delay -), --- ---------- Send messages to queue ---------- --- Uses batch sending for performance with large arrays -sent_messages AS ( - SELECT - mb.flow_slug, - mb.run_id, - mb.step_slug, - task_indices.task_index, - msg_ids.msg_id - FROM message_batches mb - CROSS JOIN LATERAL unnest(mb.task_indices) WITH ORDINALITY AS task_indices(task_index, idx_ord) - CROSS JOIN LATERAL pgmq.send_batch(mb.flow_slug, mb.messages, mb.delay) WITH ORDINALITY AS msg_ids(msg_id, msg_ord) - WHERE task_indices.idx_ord = msg_ids.msg_ord -), - --- ---------- Broadcast step:started events ---------- -broadcast_events AS ( - SELECT - realtime.send( - jsonb_build_object( - 'event_type', 'step:started', - 'run_id', started_step.run_id, - 'step_slug', started_step.step_slug, - 'status', 'started', - 'started_at', started_step.started_at, - 'remaining_tasks', started_step.remaining_tasks, - 'remaining_deps', started_step.remaining_deps - ), - concat('step:', started_step.step_slug, ':started'), - concat('pgflow:run:', started_step.run_id), - false - ) - FROM started_step_states AS started_step -) - --- ========================================== --- RECORD TASKS IN DATABASE --- ========================================== -INSERT INTO pgflow.step_tasks (flow_slug, run_id, step_slug, task_index, message_id) -SELECT - sent_messages.flow_slug, - sent_messages.run_id, - sent_messages.step_slug, - sent_messages.task_index, - sent_messages.msg_id -FROM sent_messages; - -end; -$$; --- Create "cascade_complete_taskless_steps" function -CREATE FUNCTION "pgflow"."cascade_complete_taskless_steps" ("run_id" uuid) RETURNS integer LANGUAGE plpgsql AS $$ -DECLARE - v_total_completed int := 0; - v_iteration_completed int; - v_iterations int := 0; - v_max_iterations int := 50; -BEGIN - -- ========================================== - -- ITERATIVE CASCADE COMPLETION - -- ========================================== - -- Completes taskless steps in waves until none remain - LOOP - -- ---------- Safety check ---------- - v_iterations := v_iterations + 1; - IF v_iterations > v_max_iterations THEN - RAISE EXCEPTION 'Cascade loop exceeded safety limit of % iterations', v_max_iterations; - END IF; - - -- ========================================== - -- COMPLETE READY TASKLESS STEPS - -- ========================================== - WITH completed AS ( - -- ---------- Complete taskless steps ---------- - -- Steps with initial_tasks=0 and no remaining deps - UPDATE pgflow.step_states ss - SET status = 'completed', - started_at = now(), - completed_at = now(), - remaining_tasks = 0 - FROM pgflow.steps s - WHERE ss.run_id = cascade_complete_taskless_steps.run_id - AND ss.flow_slug = s.flow_slug - AND ss.step_slug = s.step_slug - AND ss.status = 'created' - AND ss.remaining_deps = 0 - AND ss.initial_tasks = 0 - -- Process in topological order to ensure proper cascade - RETURNING ss.* - ), - -- ---------- Update dependent steps ---------- - -- Propagate completion and empty arrays to dependents - dep_updates AS ( - UPDATE pgflow.step_states ss - SET remaining_deps = ss.remaining_deps - dep_count.count, - -- If the dependent is a map step and its dependency completed with 0 tasks, - -- set its initial_tasks to 0 as well - initial_tasks = CASE - WHEN s.step_type = 'map' AND dep_count.has_zero_tasks - THEN 0 -- Empty array propagation - ELSE ss.initial_tasks -- Keep existing value (including NULL) - END - FROM ( - -- Aggregate dependency updates per dependent step - SELECT - d.flow_slug, - d.step_slug as dependent_slug, - COUNT(*) as count, - BOOL_OR(c.initial_tasks = 0) as has_zero_tasks - FROM completed c - JOIN pgflow.deps d ON d.flow_slug = c.flow_slug - AND d.dep_slug = c.step_slug - GROUP BY d.flow_slug, d.step_slug - ) dep_count, - pgflow.steps s - WHERE ss.run_id = cascade_complete_taskless_steps.run_id - AND ss.flow_slug = dep_count.flow_slug - AND ss.step_slug = dep_count.dependent_slug - AND s.flow_slug = ss.flow_slug - AND s.step_slug = ss.step_slug - ), - -- ---------- Update run counters ---------- - -- Only decrement remaining_steps; let maybe_complete_run handle finalization - run_updates AS ( - UPDATE pgflow.runs r - SET remaining_steps = r.remaining_steps - c.completed_count - FROM (SELECT COUNT(*) AS completed_count FROM completed) c - WHERE r.run_id = cascade_complete_taskless_steps.run_id - AND c.completed_count > 0 - ) - -- ---------- Check iteration results ---------- - SELECT COUNT(*) INTO v_iteration_completed FROM completed; - - EXIT WHEN v_iteration_completed = 0; -- No more steps to complete - v_total_completed := v_total_completed + v_iteration_completed; - END LOOP; - - RETURN v_total_completed; -END; -$$; --- Modify "complete_task" function -CREATE OR REPLACE FUNCTION "pgflow"."complete_task" ("run_id" uuid, "step_slug" text, "task_index" integer, "output" jsonb) RETURNS SETOF "pgflow"."step_tasks" LANGUAGE plpgsql SET "search_path" = '' AS $$ -declare - v_step_state pgflow.step_states%ROWTYPE; - v_dependent_map_slug text; - v_run_record pgflow.runs%ROWTYPE; - v_step_record pgflow.step_states%ROWTYPE; -begin - --- ========================================== --- GUARD: No mutations on failed runs --- ========================================== -IF EXISTS (SELECT 1 FROM pgflow.runs WHERE pgflow.runs.run_id = complete_task.run_id AND pgflow.runs.status = 'failed') THEN - RETURN QUERY SELECT * FROM pgflow.step_tasks - WHERE pgflow.step_tasks.run_id = complete_task.run_id - AND pgflow.step_tasks.step_slug = complete_task.step_slug - AND pgflow.step_tasks.task_index = complete_task.task_index; - RETURN; -END IF; - --- ========================================== --- LOCK ACQUISITION AND TYPE VALIDATION --- ========================================== --- Acquire locks first to prevent race conditions -SELECT * INTO v_run_record FROM pgflow.runs -WHERE pgflow.runs.run_id = complete_task.run_id -FOR UPDATE; - -SELECT * INTO v_step_record FROM pgflow.step_states -WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = complete_task.step_slug -FOR UPDATE; - --- Check for type violations AFTER acquiring locks -SELECT child_step.step_slug INTO v_dependent_map_slug -FROM pgflow.deps dependency -JOIN pgflow.steps child_step ON child_step.flow_slug = dependency.flow_slug - AND child_step.step_slug = dependency.step_slug -JOIN pgflow.steps parent_step ON parent_step.flow_slug = dependency.flow_slug - AND parent_step.step_slug = dependency.dep_slug -JOIN pgflow.step_states child_state ON child_state.flow_slug = child_step.flow_slug - AND child_state.step_slug = child_step.step_slug -WHERE dependency.dep_slug = complete_task.step_slug -- parent is the completing step - AND dependency.flow_slug = v_run_record.flow_slug - AND parent_step.step_type = 'single' -- Only validate single steps - AND child_step.step_type = 'map' - AND child_state.run_id = complete_task.run_id - AND child_state.initial_tasks IS NULL - AND (complete_task.output IS NULL OR jsonb_typeof(complete_task.output) != 'array') -LIMIT 1; - --- Handle type violation if detected -IF v_dependent_map_slug IS NOT NULL THEN - -- Mark run as failed immediately - UPDATE pgflow.runs - SET status = 'failed', - failed_at = now() - WHERE pgflow.runs.run_id = complete_task.run_id; - - -- Archive all active messages (both queued and started) to prevent orphaned messages - PERFORM pgmq.archive( - v_run_record.flow_slug, - array_agg(st.message_id) - ) - FROM pgflow.step_tasks st - WHERE st.run_id = complete_task.run_id - AND st.status IN ('queued', 'started') - AND st.message_id IS NOT NULL - HAVING count(*) > 0; -- Only call archive if there are messages to archive - - -- Mark current task as failed and store the output - UPDATE pgflow.step_tasks - SET status = 'failed', - failed_at = now(), - output = complete_task.output, -- Store the output that caused the violation - error_message = '[TYPE_VIOLATION] Produced ' || - CASE WHEN complete_task.output IS NULL THEN 'null' - ELSE jsonb_typeof(complete_task.output) END || - ' instead of array' - WHERE pgflow.step_tasks.run_id = complete_task.run_id - AND pgflow.step_tasks.step_slug = complete_task.step_slug - AND pgflow.step_tasks.task_index = complete_task.task_index; - - -- Mark step state as failed - UPDATE pgflow.step_states - SET status = 'failed', - failed_at = now(), - error_message = '[TYPE_VIOLATION] Map step ' || v_dependent_map_slug || - ' expects array input but dependency ' || complete_task.step_slug || - ' produced ' || CASE WHEN complete_task.output IS NULL THEN 'null' - ELSE jsonb_typeof(complete_task.output) END - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = complete_task.step_slug; - - -- Archive the current task's message (it was started, now failed) - PERFORM pgmq.archive( - v_run_record.flow_slug, - st.message_id -- Single message, use scalar form - ) - FROM pgflow.step_tasks st - WHERE st.run_id = complete_task.run_id - AND st.step_slug = complete_task.step_slug - AND st.task_index = complete_task.task_index - AND st.message_id IS NOT NULL; - - -- Return empty result - RETURN QUERY SELECT * FROM pgflow.step_tasks WHERE false; - RETURN; -END IF; - --- ========================================== --- MAIN CTE CHAIN: Update task and propagate changes --- ========================================== -WITH --- ---------- Task completion ---------- --- Update the task record with completion status and output -task AS ( - UPDATE pgflow.step_tasks - SET - status = 'completed', - completed_at = now(), - output = complete_task.output - WHERE pgflow.step_tasks.run_id = complete_task.run_id - AND pgflow.step_tasks.step_slug = complete_task.step_slug - AND pgflow.step_tasks.task_index = complete_task.task_index - AND pgflow.step_tasks.status = 'started' - RETURNING * -), --- ---------- Step state update ---------- --- Decrement remaining_tasks and potentially mark step as completed -step_state AS ( - UPDATE pgflow.step_states - SET - status = CASE - WHEN pgflow.step_states.remaining_tasks = 1 THEN 'completed' -- Will be 0 after decrement - ELSE 'started' - END, - completed_at = CASE - WHEN pgflow.step_states.remaining_tasks = 1 THEN now() -- Will be 0 after decrement - ELSE NULL - END, - remaining_tasks = pgflow.step_states.remaining_tasks - 1 - FROM task - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug = complete_task.step_slug - RETURNING pgflow.step_states.* -), --- ---------- Dependency resolution ---------- --- Find all child steps that depend on the completed parent step (only if parent completed) -child_steps AS ( - SELECT deps.step_slug AS child_step_slug - FROM pgflow.deps deps - JOIN step_state parent_state ON parent_state.status = 'completed' AND deps.flow_slug = parent_state.flow_slug - WHERE deps.dep_slug = complete_task.step_slug -- dep_slug is the parent, step_slug is the child - ORDER BY deps.step_slug -- Ensure consistent ordering -), --- ---------- Lock child steps ---------- --- Acquire locks on all child steps before updating them -child_steps_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = complete_task.run_id - AND pgflow.step_states.step_slug IN (SELECT child_step_slug FROM child_steps) - FOR UPDATE -), --- ---------- Update child steps ---------- --- Decrement remaining_deps and resolve NULL initial_tasks for map steps -child_steps_update AS ( - UPDATE pgflow.step_states child_state - SET remaining_deps = child_state.remaining_deps - 1, - -- Resolve NULL initial_tasks for child map steps - -- This is where child maps learn their array size from the parent - -- This CTE only runs when the parent step is complete (see child_steps JOIN) - initial_tasks = CASE - WHEN child_step.step_type = 'map' AND child_state.initial_tasks IS NULL THEN - CASE - WHEN parent_step.step_type = 'map' THEN - -- Map->map: Count all completed tasks from parent map - -- We add 1 because the current task is being completed in this transaction - -- but isn't yet visible as 'completed' in the step_tasks table - -- TODO: Refactor to use future column step_states.total_tasks - -- Would eliminate the COUNT query and just use parent_state.total_tasks - (SELECT COUNT(*)::int + 1 - FROM pgflow.step_tasks parent_tasks - WHERE parent_tasks.run_id = complete_task.run_id - AND parent_tasks.step_slug = complete_task.step_slug - AND parent_tasks.status = 'completed' - AND parent_tasks.task_index != complete_task.task_index) - ELSE - -- Single->map: Use output array length (single steps complete immediately) - CASE - WHEN complete_task.output IS NOT NULL - AND jsonb_typeof(complete_task.output) = 'array' THEN - jsonb_array_length(complete_task.output) - ELSE NULL -- Keep NULL if not an array - END - END - ELSE child_state.initial_tasks -- Keep existing value (including NULL) - END - FROM child_steps children - JOIN pgflow.steps child_step ON child_step.flow_slug = (SELECT r.flow_slug FROM pgflow.runs r WHERE r.run_id = complete_task.run_id) - AND child_step.step_slug = children.child_step_slug - JOIN pgflow.steps parent_step ON parent_step.flow_slug = (SELECT r.flow_slug FROM pgflow.runs r WHERE r.run_id = complete_task.run_id) - AND parent_step.step_slug = complete_task.step_slug - WHERE child_state.run_id = complete_task.run_id - AND child_state.step_slug = children.child_step_slug -) --- ---------- Update run remaining_steps ---------- --- Decrement the run's remaining_steps counter if step completed -UPDATE pgflow.runs -SET remaining_steps = pgflow.runs.remaining_steps - 1 -FROM step_state -WHERE pgflow.runs.run_id = complete_task.run_id - AND step_state.status = 'completed'; - --- ========================================== --- POST-COMPLETION ACTIONS --- ========================================== - --- ---------- Get updated state for broadcasting ---------- -SELECT * INTO v_step_state FROM pgflow.step_states -WHERE pgflow.step_states.run_id = complete_task.run_id AND pgflow.step_states.step_slug = complete_task.step_slug; - --- ---------- Handle step completion ---------- -IF v_step_state.status = 'completed' THEN - -- Cascade complete any taskless steps that are now ready - PERFORM pgflow.cascade_complete_taskless_steps(complete_task.run_id); - - -- Broadcast step:completed event - -- For map steps, aggregate all task outputs; for single steps, use the task output - PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'step:completed', - 'run_id', complete_task.run_id, - 'step_slug', complete_task.step_slug, - 'status', 'completed', - 'output', CASE - WHEN (SELECT s.step_type FROM pgflow.steps s - WHERE s.flow_slug = v_step_state.flow_slug - AND s.step_slug = complete_task.step_slug) = 'map' THEN - -- Aggregate all task outputs for map steps - (SELECT COALESCE(jsonb_agg(st.output ORDER BY st.task_index), '[]'::jsonb) - FROM pgflow.step_tasks st - WHERE st.run_id = complete_task.run_id - AND st.step_slug = complete_task.step_slug - AND st.status = 'completed') - ELSE - -- Single step: use the individual task output - complete_task.output - END, - 'completed_at', v_step_state.completed_at - ), - concat('step:', complete_task.step_slug, ':completed'), - concat('pgflow:run:', complete_task.run_id), - false - ); -END IF; - --- ---------- Archive completed task message ---------- --- Move message from active queue to archive table -PERFORM ( - WITH completed_tasks AS ( - SELECT r.flow_slug, st.message_id - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = complete_task.run_id - AND st.step_slug = complete_task.step_slug - AND st.task_index = complete_task.task_index - AND st.status = 'completed' - ) - SELECT pgmq.archive(ct.flow_slug, ct.message_id) - FROM completed_tasks ct - WHERE EXISTS (SELECT 1 FROM completed_tasks) -); - --- ---------- Trigger next steps ---------- --- Start any steps that are now ready (deps satisfied) -PERFORM pgflow.start_ready_steps(complete_task.run_id); - --- Check if the entire run is complete -PERFORM pgflow.maybe_complete_run(complete_task.run_id); - --- ---------- Return completed task ---------- -RETURN QUERY SELECT * -FROM pgflow.step_tasks AS step_task -WHERE step_task.run_id = complete_task.run_id - AND step_task.step_slug = complete_task.step_slug - AND step_task.task_index = complete_task.task_index; - -end; -$$; --- Modify "fail_task" function -CREATE OR REPLACE FUNCTION "pgflow"."fail_task" ("run_id" uuid, "step_slug" text, "task_index" integer, "error_message" text) RETURNS SETOF "pgflow"."step_tasks" LANGUAGE plpgsql SET "search_path" = '' AS $$ -DECLARE - v_run_failed boolean; - v_step_failed boolean; -begin - --- If run is already failed, no retries allowed -IF EXISTS (SELECT 1 FROM pgflow.runs WHERE pgflow.runs.run_id = fail_task.run_id AND pgflow.runs.status = 'failed') THEN - UPDATE pgflow.step_tasks - SET status = 'failed', - failed_at = now(), - error_message = fail_task.error_message - WHERE pgflow.step_tasks.run_id = fail_task.run_id - AND pgflow.step_tasks.step_slug = fail_task.step_slug - AND pgflow.step_tasks.task_index = fail_task.task_index - AND pgflow.step_tasks.status = 'started'; - - -- Archive the task's message - PERFORM pgmq.archive(r.flow_slug, ARRAY_AGG(st.message_id)) - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.message_id IS NOT NULL - GROUP BY r.flow_slug - HAVING COUNT(st.message_id) > 0; - - RETURN QUERY SELECT * FROM pgflow.step_tasks - WHERE pgflow.step_tasks.run_id = fail_task.run_id - AND pgflow.step_tasks.step_slug = fail_task.step_slug - AND pgflow.step_tasks.task_index = fail_task.task_index; - RETURN; -END IF; - -WITH run_lock AS ( - SELECT * FROM pgflow.runs - WHERE pgflow.runs.run_id = fail_task.run_id - FOR UPDATE -), -step_lock AS ( - SELECT * FROM pgflow.step_states - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - FOR UPDATE -), -flow_info AS ( - SELECT r.flow_slug - FROM pgflow.runs r - WHERE r.run_id = fail_task.run_id -), -config AS ( - SELECT - COALESCE(s.opt_max_attempts, f.opt_max_attempts) AS opt_max_attempts, - COALESCE(s.opt_base_delay, f.opt_base_delay) AS opt_base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN flow_info fi ON fi.flow_slug = s.flow_slug - WHERE s.flow_slug = fi.flow_slug AND s.step_slug = fail_task.step_slug -), -fail_or_retry_task as ( - UPDATE pgflow.step_tasks as task - SET - status = CASE - WHEN task.attempts_count < (SELECT opt_max_attempts FROM config) THEN 'queued' - ELSE 'failed' - END, - failed_at = CASE - WHEN task.attempts_count >= (SELECT opt_max_attempts FROM config) THEN now() - ELSE NULL - END, - started_at = CASE - WHEN task.attempts_count < (SELECT opt_max_attempts FROM config) THEN NULL - ELSE task.started_at - END, - error_message = fail_task.error_message - WHERE task.run_id = fail_task.run_id - AND task.step_slug = fail_task.step_slug - AND task.task_index = fail_task.task_index - AND task.status = 'started' - RETURNING * -), -maybe_fail_step AS ( - UPDATE pgflow.step_states - SET - status = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN 'failed' - ELSE pgflow.step_states.status - END, - failed_at = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN now() - ELSE NULL - END, - error_message = CASE - WHEN (select fail_or_retry_task.status from fail_or_retry_task) = 'failed' THEN fail_task.error_message - ELSE NULL - END - FROM fail_or_retry_task - WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug - RETURNING pgflow.step_states.* -) --- Update run status -UPDATE pgflow.runs -SET status = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN 'failed' - ELSE status - END, - failed_at = CASE - WHEN (select status from maybe_fail_step) = 'failed' THEN now() - ELSE NULL - END -WHERE pgflow.runs.run_id = fail_task.run_id -RETURNING (status = 'failed') INTO v_run_failed; - --- Check if step failed by querying the step_states table -SELECT (status = 'failed') INTO v_step_failed -FROM pgflow.step_states -WHERE pgflow.step_states.run_id = fail_task.run_id - AND pgflow.step_states.step_slug = fail_task.step_slug; - --- Send broadcast event for step failure if the step was failed -IF v_step_failed THEN - PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'step:failed', - 'run_id', fail_task.run_id, - 'step_slug', fail_task.step_slug, - 'status', 'failed', - 'error_message', fail_task.error_message, - 'failed_at', now() - ), - concat('step:', fail_task.step_slug, ':failed'), - concat('pgflow:run:', fail_task.run_id), - false - ); -END IF; - --- Send broadcast event for run failure if the run was failed -IF v_run_failed THEN - DECLARE - v_flow_slug text; - BEGIN - SELECT flow_slug INTO v_flow_slug FROM pgflow.runs WHERE pgflow.runs.run_id = fail_task.run_id; - - PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'run:failed', - 'run_id', fail_task.run_id, - 'flow_slug', v_flow_slug, - 'status', 'failed', - 'error_message', fail_task.error_message, - 'failed_at', now() - ), - 'run:failed', - concat('pgflow:run:', fail_task.run_id), - false - ); - END; -END IF; - --- Archive all active messages (both queued and started) when run fails -IF v_run_failed THEN - PERFORM pgmq.archive(r.flow_slug, ARRAY_AGG(st.message_id)) - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.status IN ('queued', 'started') - AND st.message_id IS NOT NULL - GROUP BY r.flow_slug - HAVING COUNT(st.message_id) > 0; -END IF; - --- For queued tasks: delay the message for retry with exponential backoff -PERFORM ( - WITH retry_config AS ( - SELECT - COALESCE(s.opt_base_delay, f.opt_base_delay) AS base_delay - FROM pgflow.steps s - JOIN pgflow.flows f ON f.flow_slug = s.flow_slug - JOIN pgflow.runs r ON r.flow_slug = f.flow_slug - WHERE r.run_id = fail_task.run_id - AND s.step_slug = fail_task.step_slug - ), - queued_tasks AS ( - SELECT - r.flow_slug, - st.message_id, - pgflow.calculate_retry_delay((SELECT base_delay FROM retry_config), st.attempts_count) AS calculated_delay - FROM pgflow.step_tasks st - JOIN pgflow.runs r ON st.run_id = r.run_id - WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'queued' - ) - SELECT pgmq.set_vt(qt.flow_slug, qt.message_id, qt.calculated_delay) - FROM queued_tasks qt - WHERE EXISTS (SELECT 1 FROM queued_tasks) -); - --- For failed tasks: archive the message -PERFORM pgmq.archive(r.flow_slug, ARRAY_AGG(st.message_id)) -FROM pgflow.step_tasks st -JOIN pgflow.runs r ON st.run_id = r.run_id -WHERE st.run_id = fail_task.run_id - AND st.step_slug = fail_task.step_slug - AND st.task_index = fail_task.task_index - AND st.status = 'failed' - AND st.message_id IS NOT NULL -GROUP BY r.flow_slug -HAVING COUNT(st.message_id) > 0; - -return query select * -from pgflow.step_tasks st -where st.run_id = fail_task.run_id - and st.step_slug = fail_task.step_slug - and st.task_index = fail_task.task_index; - -end; -$$; --- Modify "start_flow" function -CREATE OR REPLACE FUNCTION "pgflow"."start_flow" ("flow_slug" text, "input" jsonb, "run_id" uuid DEFAULT NULL::uuid) RETURNS SETOF "pgflow"."runs" LANGUAGE plpgsql SET "search_path" = '' AS $$ -declare - v_created_run pgflow.runs%ROWTYPE; - v_root_map_count int; -begin - --- ========================================== --- VALIDATION: Root map array input --- ========================================== -WITH root_maps AS ( - SELECT step_slug - FROM pgflow.steps - WHERE steps.flow_slug = start_flow.flow_slug - AND steps.step_type = 'map' - AND steps.deps_count = 0 -) -SELECT COUNT(*) INTO v_root_map_count FROM root_maps; - --- If we have root map steps, validate that input is an array -IF v_root_map_count > 0 THEN - -- First check for NULL (should be caught by NOT NULL constraint, but be defensive) - IF start_flow.input IS NULL THEN - RAISE EXCEPTION 'Flow % has root map steps but input is NULL', start_flow.flow_slug; - END IF; - - -- Then check if it's not an array - IF jsonb_typeof(start_flow.input) != 'array' THEN - RAISE EXCEPTION 'Flow % has root map steps but input is not an array (got %)', - start_flow.flow_slug, jsonb_typeof(start_flow.input); - END IF; -END IF; - --- ========================================== --- MAIN CTE CHAIN: Create run and step states --- ========================================== -WITH - -- ---------- Gather flow metadata ---------- - flow_steps AS ( - SELECT steps.flow_slug, steps.step_slug, steps.step_type, steps.deps_count - FROM pgflow.steps - WHERE steps.flow_slug = start_flow.flow_slug - ), - -- ---------- Create run record ---------- - created_run AS ( - INSERT INTO pgflow.runs (run_id, flow_slug, input, remaining_steps) - VALUES ( - COALESCE(start_flow.run_id, gen_random_uuid()), - start_flow.flow_slug, - start_flow.input, - (SELECT count(*) FROM flow_steps) - ) - RETURNING * - ), - -- ---------- Create step states ---------- - -- Sets initial_tasks: known for root maps, NULL for dependent maps - created_step_states AS ( - INSERT INTO pgflow.step_states (flow_slug, run_id, step_slug, remaining_deps, initial_tasks) - SELECT - fs.flow_slug, - (SELECT created_run.run_id FROM created_run), - fs.step_slug, - fs.deps_count, - -- Updated logic for initial_tasks: - CASE - WHEN fs.step_type = 'map' AND fs.deps_count = 0 THEN - -- Root map: get array length from input - CASE - WHEN jsonb_typeof(start_flow.input) = 'array' THEN - jsonb_array_length(start_flow.input) - ELSE - 1 - END - WHEN fs.step_type = 'map' AND fs.deps_count > 0 THEN - -- Dependent map: unknown until dependencies complete - NULL - ELSE - -- Single steps: always 1 task - 1 - END - FROM flow_steps fs - ) -SELECT * FROM created_run INTO v_created_run; - --- ========================================== --- POST-CREATION ACTIONS --- ========================================== - --- ---------- Broadcast run:started event ---------- -PERFORM realtime.send( - jsonb_build_object( - 'event_type', 'run:started', - 'run_id', v_created_run.run_id, - 'flow_slug', v_created_run.flow_slug, - 'input', v_created_run.input, - 'status', 'started', - 'remaining_steps', v_created_run.remaining_steps, - 'started_at', v_created_run.started_at - ), - 'run:started', - concat('pgflow:run:', v_created_run.run_id), - false -); - --- ---------- Complete taskless steps ---------- --- Handle empty array maps that should auto-complete -PERFORM pgflow.cascade_complete_taskless_steps(v_created_run.run_id); - --- ---------- Start initial steps ---------- --- Start root steps (those with no dependencies) -PERFORM pgflow.start_ready_steps(v_created_run.run_id); - --- ---------- Check for run completion ---------- --- If cascade completed all steps (zero-task flows), finalize the run -PERFORM pgflow.maybe_complete_run(v_created_run.run_id); - -RETURN QUERY SELECT * FROM pgflow.runs where pgflow.runs.run_id = v_created_run.run_id; - -end; -$$; --- Modify "start_tasks" function -CREATE OR REPLACE FUNCTION "pgflow"."start_tasks" ("flow_slug" text, "msg_ids" bigint[], "worker_id" uuid) RETURNS SETOF "pgflow"."step_task_record" LANGUAGE sql SET "search_path" = '' AS $$ -with tasks as ( - select - task.flow_slug, - task.run_id, - task.step_slug, - task.task_index, - task.message_id - from pgflow.step_tasks as task - join pgflow.runs r on r.run_id = task.run_id - where task.flow_slug = start_tasks.flow_slug - and task.message_id = any(msg_ids) - and task.status = 'queued' - -- MVP: Don't start tasks on failed runs - and r.status != 'failed' - ), - start_tasks_update as ( - update pgflow.step_tasks - set - attempts_count = attempts_count + 1, - status = 'started', - started_at = now(), - last_worker_id = worker_id - from tasks - where step_tasks.message_id = tasks.message_id - and step_tasks.flow_slug = tasks.flow_slug - and step_tasks.status = 'queued' - ), - runs as ( - select - r.run_id, - r.input - from pgflow.runs r - where r.run_id in (select run_id from tasks) - ), - deps as ( - select - st.run_id, - st.step_slug, - dep.dep_slug, - -- Aggregate map outputs or use single output - CASE - WHEN dep_step.step_type = 'map' THEN - -- Aggregate all task outputs ordered by task_index - -- Use COALESCE to return empty array if no tasks - (SELECT COALESCE(jsonb_agg(dt.output ORDER BY dt.task_index), '[]'::jsonb) - FROM pgflow.step_tasks dt - WHERE dt.run_id = st.run_id - AND dt.step_slug = dep.dep_slug - AND dt.status = 'completed') - ELSE - -- Single step: use the single task output - dep_task.output - END as dep_output - from tasks st - join pgflow.deps dep on dep.flow_slug = st.flow_slug and dep.step_slug = st.step_slug - join pgflow.steps dep_step on dep_step.flow_slug = dep.flow_slug and dep_step.step_slug = dep.dep_slug - left join pgflow.step_tasks dep_task on - dep_task.run_id = st.run_id and - dep_task.step_slug = dep.dep_slug and - dep_task.status = 'completed' - and dep_step.step_type = 'single' -- Only join for single steps - ), - deps_outputs as ( - select - d.run_id, - d.step_slug, - jsonb_object_agg(d.dep_slug, d.dep_output) as deps_output, - count(*) as dep_count - from deps d - group by d.run_id, d.step_slug - ), - timeouts as ( - select - task.message_id, - task.flow_slug, - coalesce(step.opt_timeout, flow.opt_timeout) + 2 as vt_delay - from tasks task - join pgflow.flows flow on flow.flow_slug = task.flow_slug - join pgflow.steps step on step.flow_slug = task.flow_slug and step.step_slug = task.step_slug - ), - -- Batch update visibility timeouts for all messages - set_vt_batch as ( - select pgflow.set_vt_batch( - start_tasks.flow_slug, - array_agg(t.message_id order by t.message_id), - array_agg(t.vt_delay order by t.message_id) - ) - from timeouts t - ) - select - st.flow_slug, - st.run_id, - st.step_slug, - -- ========================================== - -- INPUT CONSTRUCTION LOGIC - -- ========================================== - -- This nested CASE statement determines how to construct the input - -- for each task based on the step type (map vs non-map). - -- - -- The fundamental difference: - -- - Map steps: Receive RAW array elements (e.g., just 42 or "hello") - -- - Non-map steps: Receive structured objects with named keys - -- (e.g., {"run": {...}, "dependency1": {...}}) - -- ========================================== - CASE - -- -------------------- MAP STEPS -------------------- - -- Map steps process arrays element-by-element. - -- Each task receives ONE element from the array at its task_index position. - WHEN step.step_type = 'map' THEN - -- Map steps get raw array elements without any wrapper object - CASE - -- ROOT MAP: Gets array from run input - -- Example: run input = [1, 2, 3] - -- task 0 gets: 1 - -- task 1 gets: 2 - -- task 2 gets: 3 - WHEN step.deps_count = 0 THEN - -- Root map (deps_count = 0): no dependencies, reads from run input. - -- Extract the element at task_index from the run's input array. - -- Note: If run input is not an array, this will return NULL - -- and the flow will fail (validated in start_flow). - jsonb_array_element(r.input, st.task_index) - - -- DEPENDENT MAP: Gets array from its single dependency - -- Example: dependency output = ["a", "b", "c"] - -- task 0 gets: "a" - -- task 1 gets: "b" - -- task 2 gets: "c" - ELSE - -- Has dependencies (should be exactly 1 for map steps). - -- Extract the element at task_index from the dependency's output array. - -- - -- Why the subquery with jsonb_each? - -- - The dependency outputs a raw array: [1, 2, 3] - -- - deps_outputs aggregates it into: {"dep_name": [1, 2, 3]} - -- - We need to unwrap and get just the array value - -- - Map steps have exactly 1 dependency (enforced by add_step) - -- - So jsonb_each will return exactly 1 row - -- - We extract the 'value' which is the raw array [1, 2, 3] - -- - Then get the element at task_index from that array - (SELECT jsonb_array_element(value, st.task_index) - FROM jsonb_each(dep_out.deps_output) - LIMIT 1) - END - - -- -------------------- NON-MAP STEPS -------------------- - -- Regular (non-map) steps receive ALL inputs as a structured object. - -- This includes the original run input plus all dependency outputs. - ELSE - -- Non-map steps get structured input with named keys - -- Example output: { - -- "run": {"original": "input"}, - -- "step1": {"output": "from_step1"}, - -- "step2": {"output": "from_step2"} - -- } - -- - -- Build object with 'run' key containing original input - jsonb_build_object('run', r.input) || - -- Merge with deps_output which already has dependency outputs - -- deps_output format: {"dep1": output1, "dep2": output2, ...} - -- If no dependencies, defaults to empty object - coalesce(dep_out.deps_output, '{}'::jsonb) - END as input, - st.message_id as msg_id, - st.task_index as task_index - from tasks st - join runs r on st.run_id = r.run_id - join pgflow.steps step on - step.flow_slug = st.flow_slug and - step.step_slug = st.step_slug - left join deps_outputs dep_out on - dep_out.run_id = st.run_id and - dep_out.step_slug = st.step_slug -$$; --- Create "add_step" function -CREATE FUNCTION "pgflow"."add_step" ("flow_slug" text, "step_slug" text, "deps_slugs" text[] DEFAULT '{}', "max_attempts" integer DEFAULT NULL::integer, "base_delay" integer DEFAULT NULL::integer, "timeout" integer DEFAULT NULL::integer, "start_delay" integer DEFAULT NULL::integer, "step_type" text DEFAULT 'single') RETURNS "pgflow"."steps" LANGUAGE plpgsql SET "search_path" = '' AS $$ -DECLARE - result_step pgflow.steps; - next_idx int; -BEGIN - -- Validate map step constraints - -- Map steps can have either: - -- 0 dependencies (root map - maps over flow input array) - -- 1 dependency (dependent map - maps over dependency output array) - IF COALESCE(add_step.step_type, 'single') = 'map' AND COALESCE(array_length(add_step.deps_slugs, 1), 0) > 1 THEN - RAISE EXCEPTION 'Map step "%" can have at most one dependency, but % were provided: %', - add_step.step_slug, - COALESCE(array_length(add_step.deps_slugs, 1), 0), - array_to_string(add_step.deps_slugs, ', '); - END IF; - - -- Get next step index - SELECT COALESCE(MAX(s.step_index) + 1, 0) INTO next_idx - FROM pgflow.steps s - WHERE s.flow_slug = add_step.flow_slug; - - -- Create the step - INSERT INTO pgflow.steps ( - flow_slug, step_slug, step_type, step_index, deps_count, - opt_max_attempts, opt_base_delay, opt_timeout, opt_start_delay - ) - VALUES ( - add_step.flow_slug, - add_step.step_slug, - COALESCE(add_step.step_type, 'single'), - next_idx, - COALESCE(array_length(add_step.deps_slugs, 1), 0), - add_step.max_attempts, - add_step.base_delay, - add_step.timeout, - add_step.start_delay - ) - ON CONFLICT ON CONSTRAINT steps_pkey - DO UPDATE SET step_slug = EXCLUDED.step_slug - RETURNING * INTO result_step; - - -- Insert dependencies - INSERT INTO pgflow.deps (flow_slug, dep_slug, step_slug) - SELECT add_step.flow_slug, d.dep_slug, add_step.step_slug - FROM unnest(COALESCE(add_step.deps_slugs, '{}')) AS d(dep_slug) - WHERE add_step.deps_slugs IS NOT NULL AND array_length(add_step.deps_slugs, 1) > 0 - ON CONFLICT ON CONSTRAINT deps_pkey DO NOTHING; - - RETURN result_step; -END; -$$; --- Drop "add_step" function -DROP FUNCTION "pgflow"."add_step" (text, text, integer, integer, integer, integer); --- Drop "add_step" function -DROP FUNCTION "pgflow"."add_step" (text, text, text[], integer, integer, integer, integer); diff --git a/examples/playground/tailwind.config.ts b/examples/playground/tailwind.config.ts deleted file mode 100644 index 41668a3b1..000000000 --- a/examples/playground/tailwind.config.ts +++ /dev/null @@ -1,80 +0,0 @@ -import type { Config } from "tailwindcss"; - -const config = { - darkMode: ["class"], - content: [ - "./pages/**/*.{ts,tsx}", - "./components/**/*.{ts,tsx}", - "./app/**/*.{ts,tsx}", - "./src/**/*.{ts,tsx}", - ], - prefix: "", - theme: { - container: { - center: true, - padding: "2rem", - screens: { - "2xl": "1400px", - }, - }, - extend: { - colors: { - border: "hsl(var(--border))", - input: "hsl(var(--input))", - ring: "hsl(var(--ring))", - background: "hsl(var(--background))", - foreground: "hsl(var(--foreground))", - primary: { - DEFAULT: "hsl(var(--primary))", - foreground: "hsl(var(--primary-foreground))", - }, - secondary: { - DEFAULT: "hsl(var(--secondary))", - foreground: "hsl(var(--secondary-foreground))", - }, - destructive: { - DEFAULT: "hsl(var(--destructive))", - foreground: "hsl(var(--destructive-foreground))", - }, - muted: { - DEFAULT: "hsl(var(--muted))", - foreground: "hsl(var(--muted-foreground))", - }, - accent: { - DEFAULT: "hsl(var(--accent))", - foreground: "hsl(var(--accent-foreground))", - }, - popover: { - DEFAULT: "hsl(var(--popover))", - foreground: "hsl(var(--popover-foreground))", - }, - card: { - DEFAULT: "hsl(var(--card))", - foreground: "hsl(var(--card-foreground))", - }, - }, - borderRadius: { - lg: "var(--radius)", - md: "calc(var(--radius) - 2px)", - sm: "calc(var(--radius) - 4px)", - }, - keyframes: { - "accordion-down": { - from: { height: "0" }, - to: { height: "var(--radix-accordion-content-height)" }, - }, - "accordion-up": { - from: { height: "var(--radix-accordion-content-height)" }, - to: { height: "0" }, - }, - }, - animation: { - "accordion-down": "accordion-down 0.2s ease-out", - "accordion-up": "accordion-up 0.2s ease-out", - }, - }, - }, - plugins: [require("tailwindcss-animate")], -} satisfies Config; - -export default config; diff --git a/examples/playground/tsconfig.json b/examples/playground/tsconfig.json deleted file mode 100644 index a3ea03902..000000000 --- a/examples/playground/tsconfig.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "baseUrl": ".", - "paths": { - "@/*": ["./*"] - }, - "typeRoots": ["./types", "./node_modules/@types"] - }, - "include": [ - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - "next-env.d.ts", - "../../examples/playground/.next/types/**/*.ts" - ], - "exclude": [ - "node_modules", - "supabase/functions/**/*.ts", - "supabase/functions/**/*.d.ts" - ], - "references": [ - { - "path": "../../pkgs/dsl" - }, - { - "path": "../../pkgs/client" - } - ] -} diff --git a/examples/playground/types/deno/index.d.ts b/examples/playground/types/deno/index.d.ts deleted file mode 100644 index 5a7b11d3b..000000000 --- a/examples/playground/types/deno/index.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Minimal Deno runtime stub – enough for @supabase/supabase-js to type-check -declare namespace Deno { - // eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-empty-object-type - interface Reader {} - interface Env { - get(key: string): string | undefined; - } - const env: Env; -} - -export {}; // makes this a module and avoids global pollution diff --git a/examples/playground/utils/supabase/check-env-vars.ts b/examples/playground/utils/supabase/check-env-vars.ts deleted file mode 100644 index 7180f45b0..000000000 --- a/examples/playground/utils/supabase/check-env-vars.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This check can be removed -// it is just for tutorial purposes - -export const hasEnvVars = - process.env.NEXT_PUBLIC_SUPABASE_URL && - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY; diff --git a/examples/playground/utils/supabase/client.ts b/examples/playground/utils/supabase/client.ts deleted file mode 100644 index f38f0fa5e..000000000 --- a/examples/playground/utils/supabase/client.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createBrowserClient } from '@supabase/ssr'; -import { Database } from '@/supabase/functions/database-types'; - -export const createClient = () => - createBrowserClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, - ); diff --git a/examples/playground/utils/supabase/middleware.ts b/examples/playground/utils/supabase/middleware.ts deleted file mode 100644 index 9cf629af2..000000000 --- a/examples/playground/utils/supabase/middleware.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { createServerClient } from "@supabase/ssr"; -import { type NextRequest, NextResponse } from "next/server"; - -export const updateSession = async (request: NextRequest) => { - // This `try/catch` block is only here for the interactive tutorial. - // Feel free to remove once you have Supabase connected. - try { - // Create an unmodified response - let response = NextResponse.next({ - request: { - headers: request.headers, - }, - }); - - const supabase = createServerClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, - { - cookies: { - getAll() { - return request.cookies.getAll(); - }, - setAll(cookiesToSet) { - cookiesToSet.forEach(({ name, value }) => - request.cookies.set(name, value), - ); - response = NextResponse.next({ - request, - }); - cookiesToSet.forEach(({ name, value, options }) => - response.cookies.set(name, value, options), - ); - }, - }, - }, - ); - - // This will refresh session if expired - required for Server Components - // https://supabase.com/docs/guides/auth/server-side/nextjs - const user = await supabase.auth.getUser(); - - // protected routes - if ((request.nextUrl.pathname.startsWith("/protected") || - request.nextUrl.pathname.startsWith("/websites/runs")) && - user.error) { - return NextResponse.redirect(new URL("/sign-in", request.url)); - } - - // Allow access to the websites page for logged-in users only - if (request.nextUrl.pathname === "/websites" && user.error) { - return NextResponse.redirect(new URL("/sign-in", request.url)); - } - - return response; - } catch (e) { - // If you are here, a Supabase client could not be created! - // This is likely because you have not set up environment variables. - // Check out http://localhost:3000 for Next Steps. - return NextResponse.next({ - request: { - headers: request.headers, - }, - }); - } -}; diff --git a/examples/playground/utils/supabase/server.ts b/examples/playground/utils/supabase/server.ts deleted file mode 100644 index 2c00bbc96..000000000 --- a/examples/playground/utils/supabase/server.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { createServerClient } from "@supabase/ssr"; -import { cookies } from "next/headers"; - -export const createClient = async () => { - const cookieStore = await cookies(); - - return createServerClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, - { - cookies: { - getAll() { - return cookieStore.getAll(); - }, - setAll(cookiesToSet) { - try { - cookiesToSet.forEach(({ name, value, options }) => { - cookieStore.set(name, value, options); - }); - } catch (error) { - // The `set` method was called from a Server Component. - // This can be ignored if you have middleware refreshing - // user sessions. - } - }, - }, - }, - ); -}; diff --git a/examples/playground/utils/utils.ts b/examples/playground/utils/utils.ts deleted file mode 100644 index c9fbbe892..000000000 --- a/examples/playground/utils/utils.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { redirect } from "next/navigation"; - -/** - * Redirects to a specified path with an encoded message as a query parameter. - * @param {('error' | 'success')} type - The type of message, either 'error' or 'success'. - * @param {string} path - The path to redirect to. - * @param {string} message - The message to be encoded and added as a query parameter. - * @returns {never} This function doesn't return as it triggers a redirect. - */ -export function encodedRedirect( - type: "error" | "success", - path: string, - message: string, -) { - return redirect(`${path}?${type}=${encodeURIComponent(message)}`); -} diff --git a/netlify.toml b/netlify.toml deleted file mode 100644 index 817dd971b..000000000 --- a/netlify.toml +++ /dev/null @@ -1,7 +0,0 @@ -[build] - base = "examples/playground" - command = "pnpm build" - publish = ".next" - -[[plugins]] - package = "@netlify/plugin-nextjs" \ No newline at end of file diff --git a/package.json b/package.json index 379e6e8a5..3c08348fa 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,10 @@ "scripts": { "build": "nx run-many --target=build --all", "version": "pnpm changeset version && ./scripts/update-jsr-json-version.sh", - "validate:publish:npm": "pnpm nx run-many -t build --exclude=playground && pnpm publish --dry-run --recursive --filter=!./pkgs/edge-worker", + "validate:publish:npm": "pnpm nx run-many -t build && pnpm publish --dry-run --recursive --filter=!./pkgs/edge-worker", "validate:publish:jsr": "cd ./pkgs/edge-worker && jsr publish --dry-run --allow-slow-types", "validate:publish": "pnpm run validate:publish:npm && pnpm run validate:publish:jsr", - "publish:npm": "pnpm nx run-many -t build --exclude=playground && pnpm publish --recursive --filter=!./pkgs/edge-worker", + "publish:npm": "pnpm nx run-many -t build && pnpm publish --recursive --filter=!./pkgs/edge-worker", "publish:jsr": "cd ./pkgs/edge-worker && jsr publish --allow-slow-types", "changeset:tag": "pnpm changeset tag && git push --follow-tags", "release": "git status && pnpm run validate:publish && pnpm run publish:npm && pnpm run publish:jsr && pnpm run changeset:tag" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5f1f74fe..238b120f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -112,108 +112,6 @@ importers: specifier: ^1.3.1 version: 1.3.1(@types/node@18.16.20)(@vitest/ui@1.6.1)(jsdom@22.1.0)(less@4.1.3)(sass-embedded@1.93.3)(sass@1.94.0)(stylus@0.64.0)(terser@5.43.1) - examples/playground: - dependencies: - '@pgflow/client': - specifier: workspace:* - version: link:../../pkgs/client - '@pgflow/dsl': - specifier: workspace:* - version: link:../../pkgs/dsl - '@radix-ui/react-checkbox': - specifier: ^1.1.1 - version: 1.3.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-collapsible': - specifier: ^1.1.8 - version: 1.1.12(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-dropdown-menu': - specifier: ^2.1.1 - version: 2.1.16(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-label': - specifier: ^2.1.0 - version: 2.1.8(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': - specifier: ^1.1.0 - version: 1.2.4(@types/react@19.1.9)(react@19.0.0) - '@supabase/ssr': - specifier: latest - version: 0.7.0(@supabase/supabase-js@2.49.4) - '@supabase/supabase-js': - specifier: 2.49.4 - version: 2.49.4 - '@types/react': - specifier: 19.1.9 - version: 19.1.9 - '@types/react-dom': - specifier: 19.0.2 - version: 19.0.2(@types/react@19.1.9) - '@types/uuid': - specifier: 10.0.0 - version: 10.0.0 - autoprefixer: - specifier: 10.4.20 - version: 10.4.20(postcss@8.4.49) - class-variance-authority: - specifier: ^0.7.0 - version: 0.7.1 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - framer-motion: - specifier: ^12.9.2 - version: 12.23.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - lucide-react: - specifier: ^0.468.0 - version: 0.468.0(react@19.0.0) - nanoevents: - specifier: 7.0.1 - version: 7.0.1 - next: - specifier: 15.0.3 - version: 15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.94.0) - next-plausible: - specifier: ^3.12.4 - version: 3.12.5(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.94.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - next-themes: - specifier: ^0.4.3 - version: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - postcss: - specifier: 8.4.49 - version: 8.4.49 - postgres: - specifier: 3.4.5 - version: 3.4.5 - react: - specifier: 19.0.0 - version: 19.0.0 - react-dom: - specifier: 19.0.0 - version: 19.0.0(react@19.0.0) - sharp: - specifier: 0.32.6 - version: 0.32.6 - supabase: - specifier: 2.21.1 - version: 2.21.1 - tailwind-merge: - specifier: 2.6.0 - version: 2.6.0 - tailwindcss: - specifier: 3.4.17 - version: 3.4.17(ts-node@10.9.2(@types/node@18.16.20)(typescript@5.8.3)) - tailwindcss-animate: - specifier: 1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.16.20)(typescript@5.8.3))) - terser: - specifier: 5.43.1 - version: 5.43.1 - typescript: - specifier: 5.8.3 - version: 5.8.3 - uuid: - specifier: 9.0.1 - version: 9.0.1 - pkgs/cli: dependencies: '@clack/prompts': @@ -419,10 +317,6 @@ packages: '@adobe/css-tools@4.3.3': resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -2522,21 +2416,6 @@ packages: '@fastify/static@7.0.4': resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} - '@floating-ui/core@1.7.3': - resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - - '@floating-ui/dom@1.7.4': - resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} - - '@floating-ui/react-dom@2.1.6': - resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@henrygd/queue@1.1.1': resolution: {integrity: sha512-U6qjF4kIK7K72e74tmHyi2TWjSbwzKmnOlu9HOz1l6JFCeM9Sqe3znSoyK/kst+rie7Q8FvTqVxcBjG+Q7vJYQ==} @@ -3895,342 +3774,6 @@ packages: '@poppinss/exception@1.2.2': resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - - '@radix-ui/react-arrow@1.1.7': - resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-checkbox@1.3.3': - resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.11': - resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dropdown-menu@2.1.16': - resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-label@2.1.8': - resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-menu@2.1.16': - resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popper@1.2.8': - resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.4': - resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-slot@1.2.4': - resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.1': - resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-previous@1.1.1': - resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.1.1': - resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.1.1': - resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/rect@1.1.1': - resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -4529,53 +4072,26 @@ packages: '@speed-highlight/core@1.2.12': resolution: {integrity: sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA==} - '@supabase/auth-js@2.69.1': - resolution: {integrity: sha512-FILtt5WjCNzmReeRLq5wRs3iShwmnWgBvxHfqapC/VoljJl+W8hDAyFmf1NVw3zH+ZjZ05AKxiKxVeb0HNWRMQ==} - '@supabase/auth-js@2.81.0': resolution: {integrity: sha512-mWyRPO+XUo19MHNBFg5qdH8cMIyxRNj9HXhwkwToxDHYRZWru96hWZFCVb7trOrTpPVe4TgLer2yy3KMvYBMPw==} engines: {node: '>=20.0.0'} - '@supabase/functions-js@2.4.4': - resolution: {integrity: sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA==} - '@supabase/functions-js@2.81.0': resolution: {integrity: sha512-yxxIGbXm1TtRpP5VwXKEZIdQMd2XUrWS1xt3zPF3jMItX5dXfdpbz5YRPY3IfebR8gXB113d/APWvYLiNuzI1Q==} engines: {node: '>=20.0.0'} - '@supabase/node-fetch@2.6.15': - resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} - engines: {node: 4.x || >=6.0.0} - - '@supabase/postgrest-js@1.19.4': - resolution: {integrity: sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw==} - '@supabase/postgrest-js@2.81.0': resolution: {integrity: sha512-HdybTRf5Sy+gBxzgwkag+WkvV8QqMXhnKQ383YG51lCbm8p82CuCcUTzGy2xFHiA2ZXnnlkSzrfw8uKFAiAiog==} engines: {node: '>=20.0.0'} - '@supabase/realtime-js@2.11.2': - resolution: {integrity: sha512-u/XeuL2Y0QEhXSoIPZZwR6wMXgB+RQbJzG9VErA3VghVt7uRfSVsjeqd7m5GhX3JR6dM/WRmLbVR8URpDWG4+w==} - '@supabase/realtime-js@2.81.0': resolution: {integrity: sha512-WCL9kMbmHQNGAG4ep+jfU22+h9OiQVv7bbkOmLy4gwlqtE+SJszkAtRp3l3xthqYkbxHbIqGc/BlHv3Dh79cXg==} engines: {node: '>=20.0.0'} - '@supabase/ssr@0.7.0': - resolution: {integrity: sha512-G65t5EhLSJ5c8hTCcXifSL9Q/ZRXvqgXeNo+d3P56f4U1IxwTqjB64UfmfixvmMcjuxnq2yGqEWVJqUcO+AzAg==} - peerDependencies: - '@supabase/supabase-js': ^2.43.4 - - '@supabase/storage-js@2.7.1': - resolution: {integrity: sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA==} - '@supabase/storage-js@2.81.0': resolution: {integrity: sha512-gj9u+EyEVLgDA9jW8JOsAgEc8H79zg01STK5KLv9EU45kf5Qh7kAoCmG090Jkp/YEGvSiaR/Ta7Xs/gUTLqflw==} engines: {node: '>=20.0.0'} - '@supabase/supabase-js@2.49.4': - resolution: {integrity: sha512-jUF0uRUmS8BKt37t01qaZ88H9yV1mbGYnqLeuFWLcdV+x1P4fl0yP9DGtaEhFPZcwSom7u16GkLEH9QJZOqOkw==} - '@supabase/supabase-js@2.81.0': resolution: {integrity: sha512-FkiqUYCzsT92V/mfvoFueszkQrPqSTHgXhN9ADqeMpY5j0tUqeAZu8g2ptLYiDmx1pBbh4xoiqxWAf3UDIv4Bw==} engines: {node: '>=20.0.0'} @@ -4838,19 +4354,11 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@19.0.2': - resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==} - peerDependencies: - '@types/react': ^19.0.0 - '@types/react-dom@19.2.2': resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.1.9': - resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} - '@types/react@19.2.2': resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} @@ -5440,9 +4948,6 @@ packages: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -5467,10 +4972,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.6: - resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} - engines: {node: '>=10'} - aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -5857,10 +5358,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -5964,9 +5461,6 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - clean-deep@3.4.0: resolution: {integrity: sha512-Lo78NV5ItJL/jl+B5w0BycAisaieJGXK1qYi/9m4SjR8zbqmrUtO7Yhro40wEShGmmxs/aJLI/A+jNhdkXK8mw==} engines: {node: '>=4'} @@ -6117,10 +5611,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -6547,9 +6037,6 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -6614,9 +6101,6 @@ packages: dfa@1.2.0: resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7321,20 +6805,6 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.23.24: - resolution: {integrity: sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true - fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -7413,10 +6883,6 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - get-package-name@2.2.0: resolution: {integrity: sha512-LmCKVxioe63Fy6KDAQ/mmCSOSSRUE/x4zdrMD+7dU8quF3bGpzvP8mOmq4Dgce3nzU9AgkVDotucNOOg7c27BQ==} engines: {node: '>= 12.0.0'} @@ -8256,10 +7722,6 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} - hasBin: true - jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true @@ -8625,11 +8087,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lucide-react@0.468.0: - resolution: {integrity: sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc - luxon@3.7.2: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} @@ -9038,12 +8495,6 @@ packages: moize@6.1.6: resolution: {integrity: sha512-vSKdIUO61iCmTqhdoIDrqyrtp87nWZUmBPniNjO0fX49wEYmyDO4lvlnFXiGcaH1JLE/s/9HbiK4LSHsbiUY6Q==} - motion-dom@12.23.23: - resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==} - - motion-utils@12.23.6: - resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} - move-file@3.1.0: resolution: {integrity: sha512-4aE3U7CCBWgrQlQDMq8da4woBWDGHioJFiOZ8Ie6Yq2uwYQ9V2kGhTz4x3u6Wc+OU17nw0yc3rJ/lQ4jIiPe3A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -9082,9 +8533,6 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nan@2.23.1: resolution: {integrity: sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==} @@ -9134,19 +8582,6 @@ packages: netlify-redirector@0.5.0: resolution: {integrity: sha512-4zdzIP+6muqPCuE8avnrgDJ6KW/2+UpHTRcTbMXCIRxiRmyrX+IZ4WSJGZdHPWF3WmQpXpy603XxecZ9iygN7w==} - next-plausible@3.12.5: - resolution: {integrity: sha512-l1YMuTI9akb2u7z4hyTuxXpudy8KfSteRNXCYpWpnhAoBjaWQlv6sITai1TwcR7wWvVW8DFbLubvMQAsirAjcA==} - peerDependencies: - next: '^11.1.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 ' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - next-themes@0.4.6: - resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} - peerDependencies: - react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.0.3: resolution: {integrity: sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -9323,14 +8758,6 @@ packages: '@swc/core': optional: true - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -9756,30 +9183,6 @@ packages: peerDependencies: postcss: ^8.0.0 - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.1.0: - resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - postcss-loader@6.2.1: resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} @@ -10146,11 +9549,6 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} - peerDependencies: - react: ^19.0.0 - react-dom@19.2.0: resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} peerDependencies: @@ -10163,40 +9561,6 @@ packages: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.1: - resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} - react@19.2.0: resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} @@ -10664,9 +10028,6 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} - scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -11162,11 +10523,6 @@ packages: engines: {node: '>=16'} hasBin: true - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} @@ -11228,19 +10584,6 @@ packages: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} - tailwind-merge@2.6.0: - resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} - - tailwindcss-animate@1.0.7: - resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' - - tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} - engines: {node: '>=14.0.0'} - hasBin: true - tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -11312,13 +10655,6 @@ packages: text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thingies@2.5.0: resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} engines: {node: '>=10.18'} @@ -11443,9 +10779,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-loader@9.5.4: resolution: {integrity: sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==} engines: {node: '>=12.0.0'} @@ -11805,31 +11138,11 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - urlpattern-polyfill@10.1.0: - resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} - - urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + + urlpattern-polyfill@8.0.2: + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -12554,8 +11867,6 @@ snapshots: '@adobe/css-tools@4.3.3': {} - '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -14561,23 +13872,6 @@ snapshots: fastq: 1.19.1 glob: 10.4.5 - '@floating-ui/core@1.7.3': - dependencies: - '@floating-ui/utils': 0.2.10 - - '@floating-ui/dom@1.7.4': - dependencies: - '@floating-ui/core': 1.7.3 - '@floating-ui/utils': 0.2.10 - - '@floating-ui/react-dom@2.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/dom': 1.7.4 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@floating-ui/utils@0.2.10': {} - '@henrygd/queue@1.1.1': {} '@humanfs/core@0.19.1': {} @@ -16745,309 +16039,6 @@ snapshots: '@poppinss/exception@1.2.2': {} - '@radix-ui/primitive@1.1.3': {} - - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.9)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-context@1.1.2(@types/react@19.1.9)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-direction@1.1.1(@types/react@19.1.9)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.9)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-id@1.1.1(@types/react@19.1.9)(react@19.0.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-label@2.1.8(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.0.0) - aria-hidden: 1.2.6 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.7.1(@types/react@19.1.9)(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/rect': 1.1.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.0.2(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - '@types/react-dom': 19.0.2(@types/react@19.1.9) - - '@radix-ui/react-slot@1.2.3(@types/react@19.1.9)(react@19.0.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-slot@1.2.4(@types/react@19.1.9)(react@19.0.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.9)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.9)(react@19.0.0)': - dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.9)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.9)(react@19.0.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.9)(react@19.0.0)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.9)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.9)(react@19.0.0)': - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.9)(react@19.0.0)': - dependencies: - '@radix-ui/rect': 1.1.1 - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/react-use-size@1.1.1(@types/react@19.1.9)(react@19.0.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.9)(react@19.0.0) - react: 19.0.0 - optionalDependencies: - '@types/react': 19.1.9 - - '@radix-ui/rect@1.1.1': {} - '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/pluginutils@5.3.0(rollup@4.53.2)': @@ -17317,44 +16308,18 @@ snapshots: '@speed-highlight/core@1.2.12': {} - '@supabase/auth-js@2.69.1': - dependencies: - '@supabase/node-fetch': 2.6.15 - '@supabase/auth-js@2.81.0': dependencies: tslib: 2.8.1 - '@supabase/functions-js@2.4.4': - dependencies: - '@supabase/node-fetch': 2.6.15 - '@supabase/functions-js@2.81.0': dependencies: tslib: 2.8.1 - '@supabase/node-fetch@2.6.15': - dependencies: - whatwg-url: 5.0.0 - - '@supabase/postgrest-js@1.19.4': - dependencies: - '@supabase/node-fetch': 2.6.15 - '@supabase/postgrest-js@2.81.0': dependencies: tslib: 2.8.1 - '@supabase/realtime-js@2.11.2': - dependencies: - '@supabase/node-fetch': 2.6.15 - '@types/phoenix': 1.6.6 - '@types/ws': 8.18.1 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@supabase/realtime-js@2.81.0': dependencies: '@types/phoenix': 1.6.6 @@ -17365,31 +16330,10 @@ snapshots: - bufferutil - utf-8-validate - '@supabase/ssr@0.7.0(@supabase/supabase-js@2.49.4)': - dependencies: - '@supabase/supabase-js': 2.49.4 - cookie: 1.0.2 - - '@supabase/storage-js@2.7.1': - dependencies: - '@supabase/node-fetch': 2.6.15 - '@supabase/storage-js@2.81.0': dependencies: tslib: 2.8.1 - '@supabase/supabase-js@2.49.4': - dependencies: - '@supabase/auth-js': 2.69.1 - '@supabase/functions-js': 2.4.4 - '@supabase/node-fetch': 2.6.15 - '@supabase/postgrest-js': 1.19.4 - '@supabase/realtime-js': 2.11.2 - '@supabase/storage-js': 2.7.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@supabase/supabase-js@2.81.0': dependencies: '@supabase/auth-js': 2.81.0 @@ -17688,18 +16632,10 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.0.2(@types/react@19.1.9)': - dependencies: - '@types/react': 19.1.9 - '@types/react-dom@19.2.2(@types/react@19.2.2)': dependencies: '@types/react': 19.2.2 - '@types/react@19.1.9': - dependencies: - csstype: 3.1.3 - '@types/react@19.2.2': dependencies: csstype: 3.1.3 @@ -18494,8 +17430,6 @@ snapshots: ansis@4.2.0: {} - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -18534,10 +17468,6 @@ snapshots: argparse@2.0.1: {} - aria-hidden@1.2.6: - dependencies: - tslib: 2.8.1 - aria-query@5.3.2: {} array-flatten@1.1.1: {} @@ -19078,8 +18008,6 @@ snapshots: callsites@3.1.0: {} - camelcase-css@2.0.1: {} - camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -19173,10 +18101,6 @@ snapshots: cjs-module-lexer@1.4.3: {} - class-variance-authority@0.7.1: - dependencies: - clsx: 2.1.1 - clean-deep@3.4.0: dependencies: lodash.isempty: 4.4.0 @@ -19299,8 +18223,6 @@ snapshots: commander@2.20.3: {} - commander@4.1.1: {} - commander@7.2.0: {} commander@9.5.0: {} @@ -19704,8 +18626,6 @@ snapshots: detect-newline@3.1.0: {} - detect-node-es@1.1.0: {} - detect-node@2.1.0: {} detect-port@1.6.1: @@ -19783,8 +18703,6 @@ snapshots: dfa@1.2.0: {} - didyoumean@1.2.2: {} - diff-sequences@29.6.3: {} diff@4.0.2: {} @@ -20738,15 +19656,6 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.23.24(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - motion-dom: 12.23.23 - motion-utils: 12.23.6 - tslib: 2.8.1 - optionalDependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - fresh@0.5.2: {} from2@2.3.0: @@ -20830,8 +19739,6 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 - get-nonce@1.0.1: {} - get-package-name@2.2.0: {} get-package-type@0.1.0: {} @@ -22030,8 +20937,6 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@1.21.7: {} - jiti@2.4.2: {} jju@1.4.0: {} @@ -22467,10 +21372,6 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@0.468.0(react@19.0.0): - dependencies: - react: 19.0.0 - luxon@3.7.2: {} macos-release@3.4.0: {} @@ -23160,12 +22061,6 @@ snapshots: fast-equals: 3.0.3 micro-memoize: 4.2.0 - motion-dom@12.23.23: - dependencies: - motion-utils: 12.23.6 - - motion-utils@12.23.6: {} - move-file@3.1.0: dependencies: path-exists: 5.0.0 @@ -23197,12 +22092,6 @@ snapshots: mute-stream@0.0.8: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nan@2.23.1: optional: true @@ -23363,44 +22252,6 @@ snapshots: netlify-redirector@0.5.0: {} - next-plausible@3.12.5(next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.94.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - next: 15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.94.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - next-themes@0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.94.0): - dependencies: - '@next/env': 15.0.3 - '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.13 - busboy: 1.6.0 - caniuse-lite: 1.0.30001754 - postcss: 8.4.31 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - styled-jsx: 5.1.6(@babel/core@7.28.5)(babel-plugin-macros@3.1.0)(react@19.0.0) - optionalDependencies: - '@next/swc-darwin-arm64': 15.0.3 - '@next/swc-darwin-x64': 15.0.3 - '@next/swc-linux-arm64-gnu': 15.0.3 - '@next/swc-linux-arm64-musl': 15.0.3 - '@next/swc-linux-x64-gnu': 15.0.3 - '@next/swc-linux-x64-musl': 15.0.3 - '@next/swc-win32-arm64-msvc': 15.0.3 - '@next/swc-win32-x64-msvc': 15.0.3 - '@opentelemetry/api': 1.8.0 - sass: 1.94.0 - sharp: 0.33.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - next@15.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass@1.94.0): dependencies: '@next/env': 15.0.3 @@ -23644,10 +22495,6 @@ snapshots: transitivePeerDependencies: - debug - object-assign@4.1.1: {} - - object-hash@3.0.0: {} - object-inspect@1.13.4: {} obuf@1.1.2: {} @@ -24076,26 +22923,6 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.11 - postcss-import@15.1.0(postcss@8.4.49): - dependencies: - postcss: 8.4.49 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.11 - - postcss-js@4.1.0(postcss@8.4.49): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.49 - - postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@18.16.20)(typescript@5.8.3)): - dependencies: - lilconfig: 3.1.3 - yaml: 2.8.1 - optionalDependencies: - postcss: 8.4.49 - ts-node: 10.9.2(@types/node@18.16.20)(typescript@5.8.3) - postcss-loader@6.2.1(postcss@8.4.49)(webpack@5.99.9(esbuild@0.19.12)): dependencies: cosmiconfig: 7.1.0 @@ -24458,11 +23285,6 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@19.0.0(react@19.0.0): - dependencies: - react: 19.0.0 - scheduler: 0.25.0 - react-dom@19.2.0(react@19.2.0): dependencies: react: 19.2.0 @@ -24472,35 +23294,6 @@ snapshots: react-refresh@0.17.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.1.9)(react@19.0.0): - dependencies: - react: 19.0.0 - react-style-singleton: 2.2.3(@types/react@19.1.9)(react@19.0.0) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.1.9 - - react-remove-scroll@2.7.1(@types/react@19.1.9)(react@19.0.0): - dependencies: - react: 19.0.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.9)(react@19.0.0) - react-style-singleton: 2.2.3(@types/react@19.1.9)(react@19.0.0) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.9)(react@19.0.0) - use-sidecar: 1.1.3(@types/react@19.1.9)(react@19.0.0) - optionalDependencies: - '@types/react': 19.1.9 - - react-style-singleton@2.2.3(@types/react@19.1.9)(react@19.0.0): - dependencies: - get-nonce: 1.0.1 - react: 19.0.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.1.9 - - react@19.0.0: {} - react@19.2.0: {} read-cache@1.0.0: @@ -25049,8 +23842,6 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.25.0: {} - scheduler@0.27.0: {} schema-utils@3.3.0: @@ -25643,14 +24434,6 @@ snapshots: dependencies: inline-style-parser: 0.2.6 - styled-jsx@5.1.6(@babel/core@7.28.5)(babel-plugin-macros@3.1.0)(react@19.0.0): - dependencies: - client-only: 0.0.1 - react: 19.0.0 - optionalDependencies: - '@babel/core': 7.28.5 - babel-plugin-macros: 3.1.0 - styled-jsx@5.1.6(@babel/core@7.28.5)(babel-plugin-macros@3.1.0)(react@19.2.0): dependencies: client-only: 0.0.1 @@ -25682,16 +24465,6 @@ snapshots: transitivePeerDependencies: - supports-color - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - ts-interface-checker: 0.1.13 - suf-log@2.5.3: dependencies: s.color: 0.0.15 @@ -25763,39 +24536,6 @@ snapshots: system-architecture@0.1.0: {} - tailwind-merge@2.6.0: {} - - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.16.20)(typescript@5.8.3))): - dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@18.16.20)(typescript@5.8.3)) - - tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.16.20)(typescript@5.8.3)): - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.4.49 - postcss-import: 15.1.0(postcss@8.4.49) - postcss-js: 4.1.0(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@18.16.20)(typescript@5.8.3)) - postcss-nested: 6.2.0(postcss@8.4.49) - postcss-selector-parser: 6.1.2 - resolve: 1.22.11 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - tapable@2.3.0: {} tar-fs@2.1.4: @@ -25916,14 +24656,6 @@ snapshots: text-hex@1.0.0: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - thingies@2.5.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -26022,8 +24754,6 @@ snapshots: dependencies: typescript: 5.8.3 - ts-interface-checker@0.1.13: {} - ts-loader@9.5.4(typescript@5.8.3)(webpack@5.99.9(esbuild@0.19.12)): dependencies: chalk: 4.1.2 @@ -26359,21 +25089,6 @@ snapshots: urlpattern-polyfill@8.0.2: {} - use-callback-ref@1.3.3(@types/react@19.1.9)(react@19.0.0): - dependencies: - react: 19.0.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.1.9 - - use-sidecar@1.1.3(@types/react@19.1.9)(react@19.0.0): - dependencies: - detect-node-es: 1.1.0 - react: 19.0.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.1.9 - util-deprecate@1.0.2: {} utils-merge@1.0.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 989ee0e6a..1001471b9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,5 @@ packages: - 'pkgs/*' - - 'examples/playground' - '!pkgs/*/dist' - '!**/dist/**' diff --git a/scripts/snapshot-release.sh b/scripts/snapshot-release.sh index 5178f9235..354ad4262 100755 --- a/scripts/snapshot-release.sh +++ b/scripts/snapshot-release.sh @@ -249,7 +249,7 @@ echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━ echo -e "${BOLD}Building packages...${NC}" echo "" -if pnpm nx run-many -t build --exclude=playground ; then +if pnpm nx run-many -t build ; then echo -e "${GREEN}✓ Packages built successfully${NC}" else echo -e "${RED}✗ Build failed${NC}" diff --git a/tsconfig.json b/tsconfig.json index 9d3ff9e25..1015cbfe8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,9 +20,6 @@ }, { "path": "./pkgs/client" - }, - { - "path": "./examples/playground" } ] }