UNPKG

@preprio/prepr-nextjs

Version:

Next.js package for Prepr CMS preview functionality with advanced debugging and visual editing capabilities

1 lines 11.9 kB
{"version":3,"sources":["../../package.json","../../src/middleware/index.ts"],"names":["version","createPreprMiddleware","request","responseOrOptions","options","_a","_b","_c","_d","_e","response","finalOptions","NextResponse","value","key","referrer","ip","ipAddress","hutkCookie","cookie","segmentCookie","abCookie"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"@preprio/prepr-nextjs\",\n \"version\": \"2.1.3\",\n \"description\": \"Next.js package for Prepr CMS preview functionality with advanced debugging and visual editing capabilities\",\n \"main\": \"dist/react/index.cjs\",\n \"types\": \"./dist/react/index.d.ts\",\n \"module\": \"./dist/react/index.js\",\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"clean\": \"rm -rf dist\",\n \"check\": \"tsc --noEmit && eslint src --ext .ts,.tsx && prettier --check \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"fix\": \"eslint src --ext .ts,.tsx --fix && prettier --write \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"changeset\": \"changeset\",\n \"version\": \"changeset version\",\n \"release\": \"pnpm run build && changeset publish\",\n \"prepublishOnly\": \"pnpm run check && pnpm run build\"\n },\n \"exports\": {\n \"./middleware\": {\n \"import\": \"./dist/middleware/index.js\",\n \"types\": \"./dist/middleware/index.d.ts\",\n \"require\": \"./dist/middleware/index.cjs\"\n },\n \"./server\": {\n \"import\": \"./dist/server/index.js\",\n \"types\": \"./dist/server/index.d.ts\",\n \"require\": \"./dist/server/index.cjs\"\n },\n \"./react\": {\n \"import\": \"./dist/react/index.js\",\n \"types\": \"./dist/react/index.d.ts\",\n \"require\": \"./dist/react/index.cjs\"\n },\n \"./utils\": {\n \"import\": \"./dist/utils/index.js\",\n \"types\": \"./dist/utils/index.d.ts\",\n \"require\": \"./dist/utils/index.cjs\"\n },\n \"./types\": {\n \"import\": \"./dist/types/index.js\",\n \"types\": \"./dist/types/index.d.ts\",\n \"require\": \"./dist/types/index.cjs\"\n },\n \"./index.css\": {\n \"import\": \"./dist/index.css\",\n \"require\": \"./dist/index.css\"\n }\n },\n \"files\": [\n \"dist\",\n \"package.json\"\n ],\n \"keywords\": [\n \"prepr\",\n \"cms\",\n \"nextjs\",\n \"preview\",\n \"visual-editing\",\n \"headless-cms\",\n \"react\",\n \"typescript\",\n \"debug\",\n \"stega\"\n ],\n \"author\": \"Preprio\",\n \"license\": \"MIT\",\n \"packageManager\": \"pnpm@10.5.2\",\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.29.5\",\n \"@eslint/js\": \"^9.25.1\",\n \"@types/node\": \"^20.11.5\",\n \"@types/react\": \"19.1.0\",\n \"@types/react-dom\": \"19.1.2\",\n \"@typescript-eslint/eslint-plugin\": \"^8.31.1\",\n \"@typescript-eslint/parser\": \"^8.31.1\",\n \"autoprefixer\": \"^10.4.21\",\n \"cssnano\": \"^7.0.7\",\n \"eslint\": \"^9.25.1\",\n \"eslint-config-prettier\": \"^10.1.2\",\n \"eslint-plugin-prettier\": \"^5.2.6\",\n \"eslint-plugin-react\": \"^7.37.2\",\n \"eslint-plugin-react-hooks\": \"^5.0.0\",\n \"next\": \"15.3.1\",\n \"postcss\": \"^8\",\n \"prettier\": \"^3.5.3\",\n \"prettier-plugin-tailwindcss\": \"^0.5.12\",\n \"react\": \"^19.1.0\",\n \"react-dom\": \"^19.1.0\",\n \"tailwindcss\": \"^3.4.17\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\"\n },\n \"peerDependencies\": {\n \"next\": \"^16.0.3 || ^15.0.5 || ^15.1.9 || ^15.2.6 || ^15.3.6 || ^15.4.8 || ^15.5.7 || ^14.0.0 || ^13.0.0\",\n \"react\": \"^19.0.0 || ^18.0.0 || ^17.0.0 \",\n \"react-dom\": \"^19.0.0 || ^18.0.0 || ^17.0.0\"\n },\n \"dependencies\": {\n \"@headlessui/react\": \"^2.2.0\",\n \"@vercel/functions\": \"^2.0.0\",\n \"@vercel/stega\": \"^0.1.2\",\n \"clsx\": \"^2.1.1\",\n \"postcss-cli\": \"^11.0.1\",\n \"tailwind-merge\": \"^3.0.1\",\n \"zustand\": \"^5.0.8\"\n }\n}\n","import { ipAddress } from '@vercel/functions';\nimport { NextRequest, NextResponse } from 'next/server';\nimport { version } from '../../package.json';\n\nexport interface PreprMiddlewareOptions {\n preview?: boolean;\n}\n\n/**\n * Middleware to set Prepr headers for personalization.\n *\n * @overload\n * @param request - NextRequest object\n * @param options - Options object\n * @returns NextResponse with Prepr headers set\n */\nexport default function createPreprMiddleware(\n request: NextRequest,\n options?: PreprMiddlewareOptions\n): NextResponse;\n\n/**\n * Middleware to set Prepr headers for personalization.\n *\n * @overload\n * @param request - NextRequest object\n * @param response - NextResponse object to chain with\n * @param options - Options object\n * @returns NextResponse with Prepr headers set\n */\nexport default function createPreprMiddleware(\n request: NextRequest,\n response: NextResponse,\n options?: PreprMiddlewareOptions\n): NextResponse;\n\n/**\n * Implementation of createPreprMiddleware with function overloads\n */\nexport default function createPreprMiddleware(\n request: NextRequest,\n responseOrOptions?: NextResponse | PreprMiddlewareOptions,\n options?: PreprMiddlewareOptions\n): NextResponse {\n let response: NextResponse;\n let finalOptions: PreprMiddlewareOptions | undefined;\n\n // Handle overloads\n if (responseOrOptions && 'headers' in responseOrOptions) {\n // Second parameter is NextResponse\n response = responseOrOptions;\n finalOptions = options;\n } else {\n // Second parameter is options or undefined\n response = NextResponse.next();\n finalOptions = responseOrOptions as PreprMiddlewareOptions | undefined;\n }\n\n // Map over search params and set headers\n request.nextUrl.searchParams.forEach((value, key) => {\n switch (key) {\n case 'utm_source':\n response.headers.set('Prepr-Context-utm_source', value);\n break;\n case 'utm_medium':\n response.headers.set('Prepr-Context-utm_medium', value);\n break;\n case 'utm_term':\n response.headers.set('Prepr-Context-utm_term', value);\n break;\n case 'utm_content':\n response.headers.set('Prepr-Context-utm_content', value);\n break;\n case 'utm_campaign':\n response.headers.set('Prepr-Context-utm_campaign', value);\n break;\n }\n });\n\n // Set initial referral header\n const referrer = request.headers.get('referer');\n if (referrer) {\n response.headers.set('Prepr-Context-initial_referral', referrer);\n }\n\n // Set Prepr version header\n response.headers.set('Prepr-Package', version);\n\n let ip: string | null = ipAddress(request) || null;\n\n if (request.headers.get('Cf-Connecting-Ip')) {\n ip = request.headers.get('Cf-Connecting-Ip');\n }\n\n if (ip) {\n response.headers.set('Prepr-Visitor-IP', ip);\n }\n\n // Set HubSpot cookie header\n const hutkCookie = request.cookies.get('hubspotutk')?.value;\n if (hutkCookie) {\n response.headers.set('Prepr-Hubspot-Id', hutkCookie);\n }\n\n // Check for existing Prepr UID cookie or create a new one\n let cookie = request.cookies.get('__prepr_uid')?.value;\n if (!cookie) {\n cookie = crypto.randomUUID();\n response.cookies.set('__prepr_uid', cookie, {\n maxAge: 1 * 365 * 24 * 60, // Set for one year\n });\n response.headers.set('Prepr-Customer-Id-Created', 'true');\n }\n\n // Set the Prepr Customer ID header\n response.headers.set('Prepr-Customer-Id', cookie);\n\n // If preview mode is not enabled, return the response\n if (!finalOptions?.preview || process.env.PREPR_ENV !== 'preview') {\n return response;\n }\n\n // Respect preview mode toggle cookie from client\n const previewModeCookie = request.cookies.get('Prepr-Preview-Mode')?.value;\n const previewModeEnabled = previewModeCookie !== 'false';\n\n if (!previewModeEnabled) {\n // When preview mode is disabled, do not set preview headers\n return response;\n }\n\n // If preview mode is enabled, set additional headers\n response.headers.set('Prepr-Preview-Bar', 'true');\n\n // Set Prepr Preview Segment and AB test cookies\n const segmentCookie = request.cookies.get('Prepr-Segments')?.value;\n if (segmentCookie) {\n response.headers.set('Prepr-Segments', segmentCookie);\n }\n\n const abCookie = request.cookies.get('Prepr-ABtesting')?.value;\n if (abCookie) {\n response.headers.set('Prepr-ABtesting', abCookie);\n }\n\n // Set Prepr Preview Segment and AB test headers from query params\n request.nextUrl.searchParams.forEach((value, key) => {\n if (key === 'prepr_preview_ab') {\n response.headers.set('Prepr-ABtesting', value);\n response.cookies.set('Prepr-ABtesting', value);\n }\n\n if (key === 'prepr_preview_segment') {\n response.headers.set('Prepr-Segments', value);\n response.cookies.set('Prepr-Segments', value);\n }\n });\n\n return response;\n}\n"]}