diff --git a/package.json b/package.json index c78dda8ee0..927b215bbc 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,8 @@ "packages/sdk/react-native", "packages/sdk/react-native/example", "packages/sdk/vercel", + "packages/sdk/vercel/examples/complete", + "packages/sdk/vercel/examples/route-handler", "packages/sdk/akamai-base", "packages/sdk/akamai-base/example", "packages/sdk/akamai-edgekv", diff --git a/packages/sdk/vercel/examples/complete/.eslintrc.json b/packages/sdk/vercel/examples/complete/.eslintrc.json index a2569c2c7c..6828b19079 100644 --- a/packages/sdk/vercel/examples/complete/.eslintrc.json +++ b/packages/sdk/vercel/examples/complete/.eslintrc.json @@ -1,4 +1,3 @@ { - "root": true, - "extends": "next/core-web-vitals" + "extends": ["plugin:@next/next/recommended"] } diff --git a/packages/sdk/vercel/examples/complete/middleware.ts b/packages/sdk/vercel/examples/complete/middleware.ts index 807bd86e8a..e458226d24 100644 --- a/packages/sdk/vercel/examples/complete/middleware.ts +++ b/packages/sdk/vercel/examples/complete/middleware.ts @@ -8,14 +8,17 @@ export const config = { matcher: ['/', '/closed', '/favicon.ico'], }; -export async function middleware(req: NextRequest, context: NextFetchEvent) { +export async function middleware( + { headers, method, nextUrl, url }: NextRequest, + _context: NextFetchEvent, +) { // for demo purposes, warn when there is no EDGE_CONFIG or LAUNCHDARKLY_CLIENT_SIDE_ID if ( !process.env.EDGE_CONFIG || !process.env.LD_CLIENT_SIDE_ID || !parseConnectionString(process.env.EDGE_CONFIG) ) { - return NextResponse.rewrite(new URL('/missing-edge-config', request.url)); + return NextResponse.rewrite(new URL('/missing-edge-config', url)); } try { @@ -23,17 +26,17 @@ export async function middleware(req: NextRequest, context: NextFetchEvent) { const flagContext: LDMultiKindContext = { kind: 'multi', url: { - key: req.url, + key: url, }, method: { - key: req.method, + key: method, }, 'user-agent': { - key: req.headers.get('user-agent') || 'unknown', + key: headers.get('user-agent') || 'unknown', }, }; - const { pathname } = req.nextUrl; + const { pathname } = nextUrl; if (pathname === '/favicon.ico') { const hotDogFaviconEnabled = await client.variation( @@ -43,20 +46,20 @@ export async function middleware(req: NextRequest, context: NextFetchEvent) { ); return hotDogFaviconEnabled - ? NextResponse.rewrite(new URL('/hot-dog.ico', request.url)) + ? NextResponse.rewrite(new URL('/hot-dog.ico', url)) : NextResponse.next(); } const storeClosed = await client.variation('store-closed', flagContext, false); if (pathname === '/' && storeClosed) { - req.nextUrl.pathname = `/closed`; - return NextResponse.rewrite(new URL('/closed', req.url)); + nextUrl.pathname = `/closed`; + return NextResponse.rewrite(new URL('/closed', url)); } if (pathname === '/closed') { - req.nextUrl.pathname === '/'; - return NextResponse.redirect(new URL('/', req.url)); + nextUrl.pathname = '/'; + return NextResponse.redirect(new URL('/', url)); } return; diff --git a/packages/sdk/vercel/examples/complete/package.json b/packages/sdk/vercel/examples/complete/package.json index 4755f0b48b..37a9c6d7e3 100644 --- a/packages/sdk/vercel/examples/complete/package.json +++ b/packages/sdk/vercel/examples/complete/package.json @@ -10,16 +10,16 @@ "start": "next start" }, "dependencies": { - "@launchdarkly/vercel-server-sdk": "1.0.0", - "@vercel/edge-config": "0.1.10", + "@launchdarkly/vercel-server-sdk": "1.3.0", + "@vercel/edge-config": "^1.1.0", "launchdarkly-js-client-sdk": "^3.1.3", "launchdarkly-react-client-sdk": "^3.0.6", - "next": "canary", - "react": "latest", - "react-dom": "latest" + "next": "14.1.2", + "react": "18.2.0", + "react-dom": "18.2.0" }, "devDependencies": { - "@next/eslint-plugin-next": "^13.4.4", + "@next/eslint-plugin-next": "14.1.2", "@types/node": "^18.15.5", "@types/react": "latest", "autoprefixer": "^10.4.14", diff --git a/packages/sdk/vercel/examples/route-handler/next.config.js b/packages/sdk/vercel/examples/route-handler/next.config.js deleted file mode 100644 index 4436b22b5b..0000000000 --- a/packages/sdk/vercel/examples/route-handler/next.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - experimental: { - appDir: true, - }, -}; - -module.exports = nextConfig; diff --git a/packages/sdk/vercel/examples/route-handler/package.json b/packages/sdk/vercel/examples/route-handler/package.json index c10fc0b158..45332afee5 100644 --- a/packages/sdk/vercel/examples/route-handler/package.json +++ b/packages/sdk/vercel/examples/route-handler/package.json @@ -9,9 +9,9 @@ "lint": "next lint" }, "dependencies": { - "@launchdarkly/vercel-server-sdk": "1.0.0", - "@vercel/edge-config": "^0.2.1", - "next": "^13.4.4", + "@launchdarkly/vercel-server-sdk": "1.3.0", + "@vercel/edge-config": "^1.1.0", + "next": "14.1.2", "react": "^18.2.0", "react-dom": "18.2.0" }, diff --git a/packages/sdk/vercel/package.json b/packages/sdk/vercel/package.json index 12a86f32a7..74c4371dad 100644 --- a/packages/sdk/vercel/package.json +++ b/packages/sdk/vercel/package.json @@ -33,11 +33,11 @@ "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest --ci --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test && yarn doc" + "check": "yarn prettier && yarn lint && yarn build && yarn test" }, "dependencies": { "@launchdarkly/js-server-sdk-common-edge": "2.2.0", - "@vercel/edge-config": "^0.1.8", + "@vercel/edge-config": "^1.1.0", "crypto-js": "^4.1.1" }, "devDependencies": { diff --git a/packages/sdk/vercel/src/utils/mockEdgeConfigClient.ts b/packages/sdk/vercel/src/utils/mockEdgeConfigClient.ts index 6a62ba0066..9991d546a3 100644 --- a/packages/sdk/vercel/src/utils/mockEdgeConfigClient.ts +++ b/packages/sdk/vercel/src/utils/mockEdgeConfigClient.ts @@ -5,6 +5,13 @@ const mockEdgeConfigClient: EdgeConfigClient = { getAll: jest.fn(), digest: jest.fn(), has: jest.fn(), + connection: { + baseUrl: '', + id: '', + token: '', + version: '', + type: 'vercel', + }, }; export default mockEdgeConfigClient;