diff --git a/.env.example b/.env.example index 21583b1..0e11b25 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,19 @@ +# WalletConnect project ID for Web3 wallet connections (used in SIWE) NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID= + +# Secret key for NextAuth.js session encryption and JWT signing NEXTAUTH_SECRET= -PATTERN_CORE_ENDPOINT= +# Whether to trust the host for authentication +# https://authjs.dev/getting-started/deployment#auth_trust_host AUTH_TRUST_HOST= + +# Endpoint URL for the Pattern Core API service +PATTERN_CORE_ENDPOINT= + +# API token for Axiom logging service NEXT_PUBLIC_AXIOM_TOKEN= +# Dataset name for Axiom logging service NEXT_PUBLIC_AXIOM_DATASET= + +# Connection string of Vercel Edge Store +EDGE_CONFIG= diff --git a/lib/flags.ts b/lib/flags.ts new file mode 100644 index 0000000..6938f92 --- /dev/null +++ b/lib/flags.ts @@ -0,0 +1,10 @@ +import { edgeConfigAdapter } from '@flags-sdk/edge-config'; +import { flag } from 'flags/next'; + +/** + * @example + * export const someFlag = flag({ + * adapter: edgeConfigAdapter(), + * key: 'some-flag', + * }); + */ diff --git a/next-env.d.ts b/next-env.d.ts index 40c3d68..1b3be08 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/package.json b/package.json index 37663cd..4c5db60 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@codemirror/state": "^6.5.0", "@codemirror/theme-one-dark": "^6.1.2", "@codemirror/view": "^6.35.3", + "@flags-sdk/edge-config": "^0.1.0", "@radix-ui/react-alert-dialog": "^1.1.2", "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", @@ -37,6 +38,7 @@ "@tanstack/react-query": "^5.66.9", "@vercel/analytics": "^1.3.1", "@vercel/blob": "^0.24.1", + "@vercel/edge-config": "^1.4.0", "@vercel/postgres": "^0.10.0", "@wagmi/core": "^2.16.4", "ai": "4.1.44", @@ -50,6 +52,7 @@ "dotenv": "^16.4.5", "drizzle-orm": "^0.34.0", "fast-deep-equal": "^3.1.3", + "flags": "^3.2.0", "framer-motion": "^11.3.19", "geist": "^1.3.1", "lucide-react": "^0.446.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3580263..1f0fe15 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,6 +31,9 @@ importers: '@codemirror/view': specifier: ^6.35.3 version: 6.35.3 + '@flags-sdk/edge-config': + specifier: ^0.1.0 + version: 0.1.0(@opentelemetry/api@1.9.0) '@radix-ui/react-alert-dialog': specifier: ^1.1.2 version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) @@ -79,6 +82,9 @@ importers: '@vercel/blob': specifier: ^0.24.1 version: 0.24.1 + '@vercel/edge-config': + specifier: ^1.4.0 + version: 1.4.0(@opentelemetry/api@1.9.0) '@vercel/postgres': specifier: ^0.10.0 version: 0.10.0(utf-8-validate@5.0.10) @@ -118,6 +124,9 @@ importers: fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 + flags: + specifier: ^3.2.0 + version: 3.2.0(@opentelemetry/api@1.9.0)(next@15.3.0-canary.31(@opentelemetry/api@1.9.0)(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021))(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) framer-motion: specifier: ^11.3.19 version: 11.11.10(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) @@ -647,6 +656,13 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 + '@edge-runtime/cookies@5.0.2': + resolution: + { + integrity: sha512-Sd8LcWpZk/SWEeKGE8LT6gMm5MGfX/wm+GPnh1eBEtCpya3vYqn37wYknwAHw92ONoyyREl1hJwxV/Qx2DWNOg==, + } + engines: { node: '>=16' } + '@emnapi/runtime@1.4.1': resolution: { @@ -1413,6 +1429,12 @@ packages: } engines: { node: '>=14' } + '@flags-sdk/edge-config@0.1.0': + resolution: + { + integrity: sha512-AZqfglcUZ57MFJ6u7BAfAXEesNz1O8vmBdT7xLXG682WqSn8g/mDw3eTCIuj3ltqEoFpURm2HhXxplJC6++leA==, + } + '@floating-ui/core@1.6.8': resolution: { @@ -3078,6 +3100,24 @@ packages: } engines: { node: '>=16.14' } + '@vercel/edge-config-fs@0.1.0': + resolution: + { + integrity: sha512-NRIBwfcS0bUoUbRWlNGetqjvLSwgYH/BqKqDN7vK1g32p7dN96k0712COgaz6VFizAm9b0g6IG6hR6+hc0KCPg==, + } + + '@vercel/edge-config@1.4.0': + resolution: + { + integrity: sha512-69Wg5gw9DzwnyUmnjToSeLRm1nm8mCPgN0kflX8EHRHyqvzH80wPem5A8rI2LXPb2Y9tJNoqN3vXPcQhS2Wh5g==, + } + engines: { node: '>=14.6' } + peerDependencies: + '@opentelemetry/api': ^1.7.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@vercel/postgres@0.10.0': resolution: { @@ -4851,6 +4891,29 @@ packages: } engines: { node: '>=10' } + flags@3.2.0: + resolution: + { + integrity: sha512-rmJHXg4ijRgWNf/OdEGbd3FaqMwvKlcrtelKwTtPCzsNWuian9Tz+wXU+3XSO3ljqlpQYyzMgdwz3CBs/5DtZA==, + } + peerDependencies: + '@opentelemetry/api': ^1.7.0 + '@sveltejs/kit': '*' + next: '*' + react: '*' + react-dom: '*' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + react: + optional: true + react-dom: + optional: true + flat-cache@3.2.0: resolution: { @@ -8882,6 +8945,8 @@ snapshots: dependencies: '@noble/ciphers': 1.2.1 + '@edge-runtime/cookies@5.0.2': {} + '@emnapi/runtime@1.4.1': dependencies: tslib: 2.8.0 @@ -9208,6 +9273,12 @@ snapshots: '@fastify/busboy@2.1.1': {} + '@flags-sdk/edge-config@0.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@vercel/edge-config': 1.4.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - '@opentelemetry/api' + '@floating-ui/core@1.6.8': dependencies: '@floating-ui/utils': 0.2.8 @@ -10584,6 +10655,14 @@ snapshots: is-buffer: 2.0.5 undici: 5.28.4 + '@vercel/edge-config-fs@0.1.0': {} + + '@vercel/edge-config@1.4.0(@opentelemetry/api@1.9.0)': + dependencies: + '@vercel/edge-config-fs': 0.1.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@vercel/postgres@0.10.0(utf-8-validate@5.0.10)': dependencies: '@neondatabase/serverless': 0.9.5 @@ -12260,6 +12339,16 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + flags@3.2.0(@opentelemetry/api@1.9.0)(next@15.3.0-canary.31(@opentelemetry/api@1.9.0)(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021))(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021): + dependencies: + '@edge-runtime/cookies': 5.0.2 + jose: 5.9.6 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + next: 15.3.0-canary.31(@opentelemetry/api@1.9.0)(react-dom@19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021))(react@19.0.0-rc-45804af1-20241021) + react: 19.0.0-rc-45804af1-20241021 + react-dom: 19.0.0-rc-45804af1-20241021(react@19.0.0-rc-45804af1-20241021) + flat-cache@3.2.0: dependencies: flatted: 3.3.1