@preprio/prepr-nextjs 2.0.0-alpha.10 → 2.0.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/index.ts","../../package.json","../../src/middleware/index.ts"],"names":["package_default","createPreprMiddleware","request","responseOrOptions","options","_a","_b","_c","_d","response","finalOptions","NextResponse","value","key","referrer","ip","ipAddress","hutkCookie","cookie","segmentCookie","abCookie","PreprError","message","code","context","originalError","getPreprHeader","name","__async","headers","getPreprUUID","getActiveSegment","getActiveVariant","getPreprHeaders","preprHeaders","validatePreprToken","token","isPreviewMode","getPreprEnvironmentSegments","validation","getPackageVersion","json","error","getPreviewBarProps","data","activeSegment","activeVariant"],"mappings":"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","file":"index.cjs","sourcesContent":["import { headers } from 'next/headers';\nimport {\n PreprPreviewBarProps,\n PreprSegment,\n PreprHeaderName,\n PreprErrorCode,\n} from '../types';\nimport pjson from '../../package.json';\nimport createPreprMiddleware from '../middleware';\n\n/**\n * Custom error class for Prepr-related errors\n */\nexport class PreprError extends Error {\n constructor(\n message: string,\n public readonly code: PreprErrorCode,\n public readonly context?: string,\n public readonly originalError?: Error\n ) {\n super(message);\n this.name = 'PreprError';\n }\n}\n\n/**\n * Internal helper to get a specific Prepr header value\n * @param name - The header name to retrieve\n * @returns The header value or null if not found\n */\nasync function getPreprHeader(name: PreprHeaderName): Promise<string | null> {\n const headersList = await headers();\n return headersList.get(name);\n}\n\n/**\n * Returns the Prepr Customer ID from the headers\n * @returns Prepr Customer ID\n */\nexport async function getPreprUUID(): Promise<string | null> {\n return getPreprHeader('prepr-customer-id');\n}\n\n/**\n * Returns the active segment from the headers\n * @returns Active segment\n */\nexport async function getActiveSegment(): Promise<string | null> {\n return getPreprHeader('Prepr-Segments');\n}\n\n/**\n * Returns the active variant from the headers\n * @returns Active variant\n */\nexport async function getActiveVariant(): Promise<string | null> {\n return getPreprHeader('Prepr-ABtesting');\n}\n\n/**\n * Helper function to retrieve all Prepr headers\n * @returns Object with Prepr headers\n */\nexport async function getPreprHeaders(): Promise<Record<string, string>> {\n const preprHeaders: Record<string, string> = {};\n const headersList = await headers();\n\n headersList.forEach((value, key) => {\n if (key.startsWith('prepr') || key.startsWith('Prepr')) {\n preprHeaders[key] = value;\n }\n });\n\n return preprHeaders;\n}\n\n/**\n * Validates a Prepr GraphQL token\n * @param token - The token to validate\n * @returns Validation result with error details if invalid\n */\nexport function validatePreprToken(token: string): {\n valid: boolean;\n error?: string;\n} {\n if (!token) {\n return { valid: false, error: 'Token is required' };\n }\n if (!token.startsWith('https://')) {\n return { valid: false, error: 'Token must be a valid HTTPS URL' };\n }\n return { valid: true };\n}\n\n/**\n * Checks if the current environment is in preview mode\n * @returns True if in preview mode\n */\nexport function isPreviewMode(): boolean {\n return process.env.PREPR_ENV === 'preview';\n}\n\n/**\n * Fetches the segments from the Prepr API\n * @param token Prepr GraphQL URL with scope 'segments'\n * @returns Array of PreprSegment\n * @throws PreprError if the request fails\n */\nexport async function getPreprEnvironmentSegments(\n token: string\n): Promise<PreprSegment[]> {\n const validation = validatePreprToken(token);\n if (!validation.valid) {\n throw new PreprError(\n validation.error!,\n 'INVALID_TOKEN',\n 'getPreprEnvironmentSegments'\n );\n }\n\n try {\n const response = await fetch(token, {\n headers: {\n 'User-Agent': `Prepr-Preview-Bar/${getPackageVersion()}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n body: JSON.stringify({\n query: `{\n _Segments {\n _id\n name\n }\n }`,\n }),\n });\n\n if (!response.ok) {\n throw new PreprError(\n `HTTP ${response.status}: ${response.statusText}`,\n 'HTTP_ERROR',\n 'getPreprEnvironmentSegments'\n );\n }\n\n const json = await response.json();\n\n if (!json || !json.data || !json.data._Segments) {\n throw new PreprError(\n 'Invalid response format from Prepr API',\n 'INVALID_RESPONSE',\n 'getPreprEnvironmentSegments'\n );\n }\n\n return json.data._Segments as PreprSegment[];\n } catch (error) {\n if (error instanceof PreprError) {\n throw error;\n }\n throw new PreprError(\n 'Failed to fetch segments from Prepr API',\n 'FETCH_ERROR',\n 'getPreprEnvironmentSegments',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n}\n\n/**\n * Fetches all the necessary previewbar props\n * @param token Prepr GraphQL URL with scope 'segments'\n * @returns Object with activeSegment, activeVariant and data\n */\nexport async function getPreviewBarProps(\n token: string\n): Promise<PreprPreviewBarProps> {\n let data: PreprSegment[] = [];\n let activeSegment: string | null = null;\n let activeVariant: string | null = null;\n\n // Prevent unnecessary function calling in production\n if (isPreviewMode()) {\n try {\n data = await getPreprEnvironmentSegments(token);\n activeSegment = await getActiveSegment();\n activeVariant = await getActiveVariant();\n } catch (error) {\n // In preview mode, we should still return props even if API fails\n console.error('Failed to fetch preview bar props:', error);\n // Return empty data to prevent preview bar from crashing\n data = [];\n }\n }\n\n return {\n activeSegment,\n activeVariant,\n data,\n };\n}\n\nfunction getPackageVersion() {\n return pjson.version;\n}\n\nexport { createPreprMiddleware };\n","{\n \"name\": \"@preprio/prepr-nextjs\",\n \"version\": \"2.0.0-alpha.10\",\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 \"dev:css\": \"postcss ./src/globals.css -o ./src/output.css --watch\",\n \"build:css\": \"NODE_ENV=production postcss ./src/globals.css -o ./dist/index.css\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"clean\": \"rm -rf dist\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"release\": \"node scripts/release.js\",\n \"check\": \"npm run type-check && npm run lint:check && npm run format:check\",\n \"type-check\": \"tsc --noEmit\",\n \"lint\": \"eslint src --ext .ts,.tsx --fix\",\n \"lint:check\": \"eslint src --ext .ts,.tsx\",\n \"prepublishOnly\": \"npm run check && npm 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 \"./contexts\": {\n \"import\": \"./dist/contexts/index.js\",\n \"types\": \"./dist/contexts/index.d.ts\",\n \"require\": \"./dist/contexts/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 \"@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\": \"^15.0.0 || ^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 }\n}\n","import { ipAddress } from '@vercel/functions';\nimport { NextRequest, NextResponse } from 'next/server';\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 if (!process.env.PREPR_GRAPHQL_URL) {\n console.error('PREPR_GRAPHQL_URL is not set');\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 IP address header\n const ip = ipAddress(request);\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 // 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"]}
1
+ {"version":3,"sources":["../../src/server/index.ts","../../package.json","../../src/middleware/index.ts"],"names":["package_default","createPreprMiddleware","request","responseOrOptions","options","_a","_b","_c","_d","response","finalOptions","NextResponse","value","key","referrer","ip","ipAddress","hutkCookie","cookie","segmentCookie","abCookie","PreprError","message","code","context","originalError","getPreprHeader","name","__async","headers","getPreprUUID","getActiveSegment","getActiveVariant","getPreprHeaders","preprHeaders","validatePreprToken","token","isPreviewMode","extractAccessToken","graphqlUrl","url","pathParts","e","getPreprEnvironmentSegments","validation","getPackageVersion","json","error","getToolbarProps","data","activeSegment","activeVariant"],"mappings":"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","file":"index.cjs","sourcesContent":["import { headers } from 'next/headers';\nimport {\n PreprToolbarProps,\n PreprSegment,\n PreprHeaderName,\n PreprErrorCode,\n} from '../types';\nimport pjson from '../../package.json';\nimport createPreprMiddleware from '../middleware';\n\n/**\n * Custom error class for Prepr-related errors\n */\nexport class PreprError extends Error {\n constructor(\n message: string,\n public readonly code: PreprErrorCode,\n public readonly context?: string,\n public readonly originalError?: Error\n ) {\n super(message);\n this.name = 'PreprError';\n }\n}\n\n/**\n * Internal helper to get a specific Prepr header value\n * @param name - The header name to retrieve\n * @returns The header value or null if not found\n */\nasync function getPreprHeader(name: PreprHeaderName): Promise<string | null> {\n const headersList = await headers();\n return headersList.get(name);\n}\n\n/**\n * Returns the Prepr Customer ID from the headers\n * @returns Prepr Customer ID\n */\nexport async function getPreprUUID(): Promise<string | null> {\n return getPreprHeader('prepr-customer-id');\n}\n\n/**\n * Returns the active segment from the headers\n * @returns Active segment\n */\nexport async function getActiveSegment(): Promise<string | null> {\n return getPreprHeader('Prepr-Segments');\n}\n\n/**\n * Returns the active variant from the headers\n * @returns Active variant\n */\nexport async function getActiveVariant(): Promise<string | null> {\n return getPreprHeader('Prepr-ABtesting');\n}\n\n/**\n * Helper function to retrieve all Prepr headers\n * @returns Object with Prepr headers\n */\nexport async function getPreprHeaders(): Promise<Record<string, string>> {\n const preprHeaders: Record<string, string> = {};\n const headersList = await headers();\n\n headersList.forEach((value, key) => {\n if (key.startsWith('prepr') || key.startsWith('Prepr')) {\n preprHeaders[key] = value;\n }\n });\n\n return preprHeaders;\n}\n\n/**\n * Validates a Prepr GraphQL token\n * @param token - The token to validate\n * @returns Validation result with error details if invalid\n */\nexport function validatePreprToken(token: string): {\n valid: boolean;\n error?: string;\n} {\n if (!token) {\n return { valid: false, error: 'Token is required' };\n }\n if (!token.startsWith('https://')) {\n return { valid: false, error: 'Token must be a valid HTTPS URL' };\n }\n return { valid: true };\n}\n\n/**\n * Checks if the current environment is in preview mode\n * @returns True if in preview mode\n */\nexport function isPreviewMode(): boolean {\n return process.env.PREPR_ENV === 'preview';\n}\n\n/**\n * Extracts the access token from a Prepr GraphQL URL\n * @param graphqlUrl - The full Prepr GraphQL URL\n * @returns The access token or null if invalid\n * @example\n * ```typescript\n * const token = extractAccessToken('https://graphql.prepr.io/abc123')\n * // Returns: 'abc123'\n * ```\n */\nexport function extractAccessToken(graphqlUrl: string): string | null {\n if (!graphqlUrl) return null;\n\n try {\n const url = new URL(graphqlUrl);\n if (url.hostname !== 'graphql.prepr.io') return null;\n\n const pathParts = url.pathname.split('/');\n const token = pathParts[pathParts.length - 1];\n\n return token && token.length > 0 ? token : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Fetches the segments from the Prepr API\n * @param token Prepr GraphQL URL with scope 'segments'\n * @returns Array of PreprSegment\n * @throws PreprError if the request fails\n */\nexport async function getPreprEnvironmentSegments(\n token: string\n): Promise<PreprSegment[]> {\n const validation = validatePreprToken(token);\n if (!validation.valid) {\n throw new PreprError(\n validation.error!,\n 'INVALID_TOKEN',\n 'getPreprEnvironmentSegments'\n );\n }\n\n try {\n const response = await fetch(token, {\n headers: {\n 'User-Agent': `Prepr-Preview-Bar/${getPackageVersion()}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n body: JSON.stringify({\n query: `{\n _Segments {\n _id\n name\n }\n }`,\n }),\n });\n\n if (!response.ok) {\n throw new PreprError(\n `HTTP ${response.status}: ${response.statusText}`,\n 'HTTP_ERROR',\n 'getPreprEnvironmentSegments'\n );\n }\n\n const json = await response.json();\n\n if (!json || !json.data || !json.data._Segments) {\n throw new PreprError(\n 'Invalid response format from Prepr API',\n 'INVALID_RESPONSE',\n 'getPreprEnvironmentSegments'\n );\n }\n\n return json.data._Segments as PreprSegment[];\n } catch (error) {\n if (error instanceof PreprError) {\n throw error;\n }\n throw new PreprError(\n 'Failed to fetch segments from Prepr API',\n 'FETCH_ERROR',\n 'getPreprEnvironmentSegments',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n}\n\n/**\n * Fetches all the necessary previewbar props\n * @param token Prepr GraphQL URL with scope 'segments'\n * @returns Object with activeSegment, activeVariant and data\n */\nexport async function getToolbarProps(\n token: string\n): Promise<PreprToolbarProps> {\n let data: PreprSegment[] = [];\n let activeSegment: string | null = null;\n let activeVariant: string | null = null;\n\n // Prevent unnecessary function calling in production\n if (isPreviewMode()) {\n try {\n data = await getPreprEnvironmentSegments(token);\n activeSegment = await getActiveSegment();\n activeVariant = await getActiveVariant();\n } catch (error) {\n // In preview mode, we should still return props even if API fails\n console.error('Failed to fetch toolbar props:', error);\n // Return empty data to prevent toolbar from crashing\n data = [];\n }\n }\n\n return {\n activeSegment,\n activeVariant,\n data,\n };\n}\n\nfunction getPackageVersion() {\n return pjson.version;\n}\n\nexport { createPreprMiddleware };\n","{\n \"name\": \"@preprio/prepr-nextjs\",\n \"version\": \"2.0.0-alpha.11\",\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 \"dev:css\": \"postcss ./src/globals.css -o ./src/output.css --watch\",\n \"build:css\": \"NODE_ENV=production postcss ./src/globals.css -o ./dist/index.css\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"clean\": \"rm -rf dist\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"release\": \"node scripts/release.js\",\n \"check\": \"npm run type-check && npm run lint:check && npm run format:check\",\n \"type-check\": \"tsc --noEmit\",\n \"lint\": \"eslint src --ext .ts,.tsx --fix\",\n \"lint:check\": \"eslint src --ext .ts,.tsx\",\n \"prepublishOnly\": \"npm run check && npm 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 \"./contexts\": {\n \"import\": \"./dist/contexts/index.js\",\n \"types\": \"./dist/contexts/index.d.ts\",\n \"require\": \"./dist/contexts/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 \"@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\": \"^15.0.0 || ^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 }\n}\n","import { ipAddress } from '@vercel/functions';\nimport { NextRequest, NextResponse } from 'next/server';\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 if (!process.env.PREPR_GRAPHQL_URL) {\n console.error('PREPR_GRAPHQL_URL is not set');\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 IP address header\n const ip = ipAddress(request);\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 // 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"]}
@@ -1,4 +1,4 @@
1
- import { PreprErrorCode, PreprSegment, PreprPreviewBarProps } from '../types/index.cjs';
1
+ import { PreprErrorCode, PreprSegment, PreprToolbarProps } from '../types/index.cjs';
2
2
  export { default as createPreprMiddleware } from '../middleware/index.cjs';
3
3
  import 'next/server';
4
4
 
@@ -45,6 +45,17 @@ declare function validatePreprToken(token: string): {
45
45
  * @returns True if in preview mode
46
46
  */
47
47
  declare function isPreviewMode(): boolean;
48
+ /**
49
+ * Extracts the access token from a Prepr GraphQL URL
50
+ * @param graphqlUrl - The full Prepr GraphQL URL
51
+ * @returns The access token or null if invalid
52
+ * @example
53
+ * ```typescript
54
+ * const token = extractAccessToken('https://graphql.prepr.io/abc123')
55
+ * // Returns: 'abc123'
56
+ * ```
57
+ */
58
+ declare function extractAccessToken(graphqlUrl: string): string | null;
48
59
  /**
49
60
  * Fetches the segments from the Prepr API
50
61
  * @param token Prepr GraphQL URL with scope 'segments'
@@ -57,6 +68,6 @@ declare function getPreprEnvironmentSegments(token: string): Promise<PreprSegmen
57
68
  * @param token Prepr GraphQL URL with scope 'segments'
58
69
  * @returns Object with activeSegment, activeVariant and data
59
70
  */
60
- declare function getPreviewBarProps(token: string): Promise<PreprPreviewBarProps>;
71
+ declare function getToolbarProps(token: string): Promise<PreprToolbarProps>;
61
72
 
62
- export { PreprError, getActiveSegment, getActiveVariant, getPreprEnvironmentSegments, getPreprHeaders, getPreprUUID, getPreviewBarProps, isPreviewMode, validatePreprToken };
73
+ export { PreprError, extractAccessToken, getActiveSegment, getActiveVariant, getPreprEnvironmentSegments, getPreprHeaders, getPreprUUID, getToolbarProps, isPreviewMode, validatePreprToken };
@@ -1,4 +1,4 @@
1
- import { PreprErrorCode, PreprSegment, PreprPreviewBarProps } from '../types/index.js';
1
+ import { PreprErrorCode, PreprSegment, PreprToolbarProps } from '../types/index.js';
2
2
  export { default as createPreprMiddleware } from '../middleware/index.js';
3
3
  import 'next/server';
4
4
 
@@ -45,6 +45,17 @@ declare function validatePreprToken(token: string): {
45
45
  * @returns True if in preview mode
46
46
  */
47
47
  declare function isPreviewMode(): boolean;
48
+ /**
49
+ * Extracts the access token from a Prepr GraphQL URL
50
+ * @param graphqlUrl - The full Prepr GraphQL URL
51
+ * @returns The access token or null if invalid
52
+ * @example
53
+ * ```typescript
54
+ * const token = extractAccessToken('https://graphql.prepr.io/abc123')
55
+ * // Returns: 'abc123'
56
+ * ```
57
+ */
58
+ declare function extractAccessToken(graphqlUrl: string): string | null;
48
59
  /**
49
60
  * Fetches the segments from the Prepr API
50
61
  * @param token Prepr GraphQL URL with scope 'segments'
@@ -57,6 +68,6 @@ declare function getPreprEnvironmentSegments(token: string): Promise<PreprSegmen
57
68
  * @param token Prepr GraphQL URL with scope 'segments'
58
69
  * @returns Object with activeSegment, activeVariant and data
59
70
  */
60
- declare function getPreviewBarProps(token: string): Promise<PreprPreviewBarProps>;
71
+ declare function getToolbarProps(token: string): Promise<PreprToolbarProps>;
61
72
 
62
- export { PreprError, getActiveSegment, getActiveVariant, getPreprEnvironmentSegments, getPreprHeaders, getPreprUUID, getPreviewBarProps, isPreviewMode, validatePreprToken };
73
+ export { PreprError, extractAccessToken, getActiveSegment, getActiveVariant, getPreprEnvironmentSegments, getPreprHeaders, getPreprUUID, getToolbarProps, isPreviewMode, validatePreprToken };
@@ -1,7 +1,7 @@
1
- export{a as createPreprMiddleware}from'../chunk-LVXDK2EY.js';import {c as c$1}from'../chunk-E7ATRJ2F.js';import {headers}from'next/headers';var c={version:"2.0.0-alpha.10"};var n=class extends Error{constructor(e,t,a,h){super(e);this.code=t;this.context=a;this.originalError=h;this.name="PreprError";}};function o(r){return c$1(this,null,function*(){return (yield headers()).get(r)})}function E(){return c$1(this,null,function*(){return o("prepr-customer-id")})}function u(){return c$1(this,null,function*(){return o("Prepr-Segments")})}function m(){return c$1(this,null,function*(){return o("Prepr-ABtesting")})}function S(){return c$1(this,null,function*(){let r={};return (yield headers()).forEach((e,t)=>{(t.startsWith("prepr")||t.startsWith("Prepr"))&&(r[t]=e);}),r})}function g(r){return r?r.startsWith("https://")?{valid:true}:{valid:false,error:"Token must be a valid HTTPS URL"}:{valid:false,error:"Token is required"}}function x(){return process.env.PREPR_ENV==="preview"}function P(r){return c$1(this,null,function*(){let s=g(r);if(!s.valid)throw new n(s.error,"INVALID_TOKEN","getPreprEnvironmentSegments");try{let e=yield fetch(r,{headers:{"User-Agent":`Prepr-Preview-Bar/${f()}`,"Content-Type":"application/json"},method:"POST",body:JSON.stringify({query:`{
1
+ export{a as createPreprMiddleware}from'../chunk-LVXDK2EY.js';import {c as c$1}from'../chunk-E7ATRJ2F.js';import {headers}from'next/headers';var c={version:"2.0.0-alpha.11"};var n=class extends Error{constructor(e,t,a,h){super(e);this.code=t;this.context=a;this.originalError=h;this.name="PreprError";}};function o(r){return c$1(this,null,function*(){return (yield headers()).get(r)})}function E(){return c$1(this,null,function*(){return o("prepr-customer-id")})}function u(){return c$1(this,null,function*(){return o("Prepr-Segments")})}function m(){return c$1(this,null,function*(){return o("Prepr-ABtesting")})}function S(){return c$1(this,null,function*(){let r={};return (yield headers()).forEach((e,t)=>{(t.startsWith("prepr")||t.startsWith("Prepr"))&&(r[t]=e);}),r})}function g(r){return r?r.startsWith("https://")?{valid:true}:{valid:false,error:"Token must be a valid HTTPS URL"}:{valid:false,error:"Token is required"}}function x(){return process.env.PREPR_ENV==="preview"}function b(r){if(!r)return null;try{let s=new URL(r);if(s.hostname!=="graphql.prepr.io")return null;let e=s.pathname.split("/"),t=e[e.length-1];return t&&t.length>0?t:null}catch(s){return null}}function P(r){return c$1(this,null,function*(){let s=g(r);if(!s.valid)throw new n(s.error,"INVALID_TOKEN","getPreprEnvironmentSegments");try{let e=yield fetch(r,{headers:{"User-Agent":`Prepr-Preview-Bar/${f()}`,"Content-Type":"application/json"},method:"POST",body:JSON.stringify({query:`{
2
2
  _Segments {
3
3
  _id
4
4
  name
5
5
  }
6
- }`})});if(!e.ok)throw new n(`HTTP ${e.status}: ${e.statusText}`,"HTTP_ERROR","getPreprEnvironmentSegments");let t=yield e.json();if(!t||!t.data||!t.data._Segments)throw new n("Invalid response format from Prepr API","INVALID_RESPONSE","getPreprEnvironmentSegments");return t.data._Segments}catch(e){throw e instanceof n?e:new n("Failed to fetch segments from Prepr API","FETCH_ERROR","getPreprEnvironmentSegments",e instanceof Error?e:new Error(String(e)))}})}function b(r){return c$1(this,null,function*(){let s=[],e=null,t=null;if(x())try{s=yield P(r),e=yield u(),t=yield m();}catch(a){console.error("Failed to fetch preview bar props:",a),s=[];}return {activeSegment:e,activeVariant:t,data:s}})}function f(){return c.version}export{n as PreprError,u as getActiveSegment,m as getActiveVariant,P as getPreprEnvironmentSegments,S as getPreprHeaders,E as getPreprUUID,b as getPreviewBarProps,x as isPreviewMode,g as validatePreprToken};//# sourceMappingURL=index.js.map
6
+ }`})});if(!e.ok)throw new n(`HTTP ${e.status}: ${e.statusText}`,"HTTP_ERROR","getPreprEnvironmentSegments");let t=yield e.json();if(!t||!t.data||!t.data._Segments)throw new n("Invalid response format from Prepr API","INVALID_RESPONSE","getPreprEnvironmentSegments");return t.data._Segments}catch(e){throw e instanceof n?e:new n("Failed to fetch segments from Prepr API","FETCH_ERROR","getPreprEnvironmentSegments",e instanceof Error?e:new Error(String(e)))}})}function T(r){return c$1(this,null,function*(){let s=[],e=null,t=null;if(x())try{s=yield P(r),e=yield u(),t=yield m();}catch(a){console.error("Failed to fetch toolbar props:",a),s=[];}return {activeSegment:e,activeVariant:t,data:s}})}function f(){return c.version}export{n as PreprError,b as extractAccessToken,u as getActiveSegment,m as getActiveVariant,P as getPreprEnvironmentSegments,S as getPreprHeaders,E as getPreprUUID,T as getToolbarProps,x as isPreviewMode,g as validatePreprToken};//# sourceMappingURL=index.js.map
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../src/server/index.ts"],"names":["package_default","PreprError","message","code","context","originalError","getPreprHeader","name","__async","headers","getPreprUUID","getActiveSegment","getActiveVariant","getPreprHeaders","preprHeaders","value","key","validatePreprToken","token","isPreviewMode","getPreprEnvironmentSegments","validation","response","getPackageVersion","json","error","getPreviewBarProps","data","activeSegment","activeVariant"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@preprio/prepr-nextjs\",\n \"version\": \"2.0.0-alpha.10\",\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 \"dev:css\": \"postcss ./src/globals.css -o ./src/output.css --watch\",\n \"build:css\": \"NODE_ENV=production postcss ./src/globals.css -o ./dist/index.css\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"clean\": \"rm -rf dist\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"release\": \"node scripts/release.js\",\n \"check\": \"npm run type-check && npm run lint:check && npm run format:check\",\n \"type-check\": \"tsc --noEmit\",\n \"lint\": \"eslint src --ext .ts,.tsx --fix\",\n \"lint:check\": \"eslint src --ext .ts,.tsx\",\n \"prepublishOnly\": \"npm run check && npm 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 \"./contexts\": {\n \"import\": \"./dist/contexts/index.js\",\n \"types\": \"./dist/contexts/index.d.ts\",\n \"require\": \"./dist/contexts/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 \"@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\": \"^15.0.0 || ^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 }\n}\n","import { headers } from 'next/headers';\nimport {\n PreprPreviewBarProps,\n PreprSegment,\n PreprHeaderName,\n PreprErrorCode,\n} from '../types';\nimport pjson from '../../package.json';\nimport createPreprMiddleware from '../middleware';\n\n/**\n * Custom error class for Prepr-related errors\n */\nexport class PreprError extends Error {\n constructor(\n message: string,\n public readonly code: PreprErrorCode,\n public readonly context?: string,\n public readonly originalError?: Error\n ) {\n super(message);\n this.name = 'PreprError';\n }\n}\n\n/**\n * Internal helper to get a specific Prepr header value\n * @param name - The header name to retrieve\n * @returns The header value or null if not found\n */\nasync function getPreprHeader(name: PreprHeaderName): Promise<string | null> {\n const headersList = await headers();\n return headersList.get(name);\n}\n\n/**\n * Returns the Prepr Customer ID from the headers\n * @returns Prepr Customer ID\n */\nexport async function getPreprUUID(): Promise<string | null> {\n return getPreprHeader('prepr-customer-id');\n}\n\n/**\n * Returns the active segment from the headers\n * @returns Active segment\n */\nexport async function getActiveSegment(): Promise<string | null> {\n return getPreprHeader('Prepr-Segments');\n}\n\n/**\n * Returns the active variant from the headers\n * @returns Active variant\n */\nexport async function getActiveVariant(): Promise<string | null> {\n return getPreprHeader('Prepr-ABtesting');\n}\n\n/**\n * Helper function to retrieve all Prepr headers\n * @returns Object with Prepr headers\n */\nexport async function getPreprHeaders(): Promise<Record<string, string>> {\n const preprHeaders: Record<string, string> = {};\n const headersList = await headers();\n\n headersList.forEach((value, key) => {\n if (key.startsWith('prepr') || key.startsWith('Prepr')) {\n preprHeaders[key] = value;\n }\n });\n\n return preprHeaders;\n}\n\n/**\n * Validates a Prepr GraphQL token\n * @param token - The token to validate\n * @returns Validation result with error details if invalid\n */\nexport function validatePreprToken(token: string): {\n valid: boolean;\n error?: string;\n} {\n if (!token) {\n return { valid: false, error: 'Token is required' };\n }\n if (!token.startsWith('https://')) {\n return { valid: false, error: 'Token must be a valid HTTPS URL' };\n }\n return { valid: true };\n}\n\n/**\n * Checks if the current environment is in preview mode\n * @returns True if in preview mode\n */\nexport function isPreviewMode(): boolean {\n return process.env.PREPR_ENV === 'preview';\n}\n\n/**\n * Fetches the segments from the Prepr API\n * @param token Prepr GraphQL URL with scope 'segments'\n * @returns Array of PreprSegment\n * @throws PreprError if the request fails\n */\nexport async function getPreprEnvironmentSegments(\n token: string\n): Promise<PreprSegment[]> {\n const validation = validatePreprToken(token);\n if (!validation.valid) {\n throw new PreprError(\n validation.error!,\n 'INVALID_TOKEN',\n 'getPreprEnvironmentSegments'\n );\n }\n\n try {\n const response = await fetch(token, {\n headers: {\n 'User-Agent': `Prepr-Preview-Bar/${getPackageVersion()}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n body: JSON.stringify({\n query: `{\n _Segments {\n _id\n name\n }\n }`,\n }),\n });\n\n if (!response.ok) {\n throw new PreprError(\n `HTTP ${response.status}: ${response.statusText}`,\n 'HTTP_ERROR',\n 'getPreprEnvironmentSegments'\n );\n }\n\n const json = await response.json();\n\n if (!json || !json.data || !json.data._Segments) {\n throw new PreprError(\n 'Invalid response format from Prepr API',\n 'INVALID_RESPONSE',\n 'getPreprEnvironmentSegments'\n );\n }\n\n return json.data._Segments as PreprSegment[];\n } catch (error) {\n if (error instanceof PreprError) {\n throw error;\n }\n throw new PreprError(\n 'Failed to fetch segments from Prepr API',\n 'FETCH_ERROR',\n 'getPreprEnvironmentSegments',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n}\n\n/**\n * Fetches all the necessary previewbar props\n * @param token Prepr GraphQL URL with scope 'segments'\n * @returns Object with activeSegment, activeVariant and data\n */\nexport async function getPreviewBarProps(\n token: string\n): Promise<PreprPreviewBarProps> {\n let data: PreprSegment[] = [];\n let activeSegment: string | null = null;\n let activeVariant: string | null = null;\n\n // Prevent unnecessary function calling in production\n if (isPreviewMode()) {\n try {\n data = await getPreprEnvironmentSegments(token);\n activeSegment = await getActiveSegment();\n activeVariant = await getActiveVariant();\n } catch (error) {\n // In preview mode, we should still return props even if API fails\n console.error('Failed to fetch preview bar props:', error);\n // Return empty data to prevent preview bar from crashing\n data = [];\n }\n }\n\n return {\n activeSegment,\n activeVariant,\n data,\n };\n}\n\nfunction getPackageVersion() {\n return pjson.version;\n}\n\nexport { createPreprMiddleware };\n"]}
1
+ {"version":3,"sources":["../../package.json","../../src/server/index.ts"],"names":["package_default","PreprError","message","code","context","originalError","getPreprHeader","name","__async","headers","getPreprUUID","getActiveSegment","getActiveVariant","getPreprHeaders","preprHeaders","value","key","validatePreprToken","token","isPreviewMode","extractAccessToken","graphqlUrl","url","pathParts","e","getPreprEnvironmentSegments","validation","response","getPackageVersion","json","error","getToolbarProps","data","activeSegment","activeVariant"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@preprio/prepr-nextjs\",\n \"version\": \"2.0.0-alpha.11\",\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 \"dev:css\": \"postcss ./src/globals.css -o ./src/output.css --watch\",\n \"build:css\": \"NODE_ENV=production postcss ./src/globals.css -o ./dist/index.css\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"clean\": \"rm -rf dist\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx,js,jsx,json,md}\\\"\",\n \"release\": \"node scripts/release.js\",\n \"check\": \"npm run type-check && npm run lint:check && npm run format:check\",\n \"type-check\": \"tsc --noEmit\",\n \"lint\": \"eslint src --ext .ts,.tsx --fix\",\n \"lint:check\": \"eslint src --ext .ts,.tsx\",\n \"prepublishOnly\": \"npm run check && npm 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 \"./contexts\": {\n \"import\": \"./dist/contexts/index.js\",\n \"types\": \"./dist/contexts/index.d.ts\",\n \"require\": \"./dist/contexts/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 \"@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\": \"^15.0.0 || ^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 }\n}\n","import { headers } from 'next/headers';\nimport {\n PreprToolbarProps,\n PreprSegment,\n PreprHeaderName,\n PreprErrorCode,\n} from '../types';\nimport pjson from '../../package.json';\nimport createPreprMiddleware from '../middleware';\n\n/**\n * Custom error class for Prepr-related errors\n */\nexport class PreprError extends Error {\n constructor(\n message: string,\n public readonly code: PreprErrorCode,\n public readonly context?: string,\n public readonly originalError?: Error\n ) {\n super(message);\n this.name = 'PreprError';\n }\n}\n\n/**\n * Internal helper to get a specific Prepr header value\n * @param name - The header name to retrieve\n * @returns The header value or null if not found\n */\nasync function getPreprHeader(name: PreprHeaderName): Promise<string | null> {\n const headersList = await headers();\n return headersList.get(name);\n}\n\n/**\n * Returns the Prepr Customer ID from the headers\n * @returns Prepr Customer ID\n */\nexport async function getPreprUUID(): Promise<string | null> {\n return getPreprHeader('prepr-customer-id');\n}\n\n/**\n * Returns the active segment from the headers\n * @returns Active segment\n */\nexport async function getActiveSegment(): Promise<string | null> {\n return getPreprHeader('Prepr-Segments');\n}\n\n/**\n * Returns the active variant from the headers\n * @returns Active variant\n */\nexport async function getActiveVariant(): Promise<string | null> {\n return getPreprHeader('Prepr-ABtesting');\n}\n\n/**\n * Helper function to retrieve all Prepr headers\n * @returns Object with Prepr headers\n */\nexport async function getPreprHeaders(): Promise<Record<string, string>> {\n const preprHeaders: Record<string, string> = {};\n const headersList = await headers();\n\n headersList.forEach((value, key) => {\n if (key.startsWith('prepr') || key.startsWith('Prepr')) {\n preprHeaders[key] = value;\n }\n });\n\n return preprHeaders;\n}\n\n/**\n * Validates a Prepr GraphQL token\n * @param token - The token to validate\n * @returns Validation result with error details if invalid\n */\nexport function validatePreprToken(token: string): {\n valid: boolean;\n error?: string;\n} {\n if (!token) {\n return { valid: false, error: 'Token is required' };\n }\n if (!token.startsWith('https://')) {\n return { valid: false, error: 'Token must be a valid HTTPS URL' };\n }\n return { valid: true };\n}\n\n/**\n * Checks if the current environment is in preview mode\n * @returns True if in preview mode\n */\nexport function isPreviewMode(): boolean {\n return process.env.PREPR_ENV === 'preview';\n}\n\n/**\n * Extracts the access token from a Prepr GraphQL URL\n * @param graphqlUrl - The full Prepr GraphQL URL\n * @returns The access token or null if invalid\n * @example\n * ```typescript\n * const token = extractAccessToken('https://graphql.prepr.io/abc123')\n * // Returns: 'abc123'\n * ```\n */\nexport function extractAccessToken(graphqlUrl: string): string | null {\n if (!graphqlUrl) return null;\n\n try {\n const url = new URL(graphqlUrl);\n if (url.hostname !== 'graphql.prepr.io') return null;\n\n const pathParts = url.pathname.split('/');\n const token = pathParts[pathParts.length - 1];\n\n return token && token.length > 0 ? token : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Fetches the segments from the Prepr API\n * @param token Prepr GraphQL URL with scope 'segments'\n * @returns Array of PreprSegment\n * @throws PreprError if the request fails\n */\nexport async function getPreprEnvironmentSegments(\n token: string\n): Promise<PreprSegment[]> {\n const validation = validatePreprToken(token);\n if (!validation.valid) {\n throw new PreprError(\n validation.error!,\n 'INVALID_TOKEN',\n 'getPreprEnvironmentSegments'\n );\n }\n\n try {\n const response = await fetch(token, {\n headers: {\n 'User-Agent': `Prepr-Preview-Bar/${getPackageVersion()}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n body: JSON.stringify({\n query: `{\n _Segments {\n _id\n name\n }\n }`,\n }),\n });\n\n if (!response.ok) {\n throw new PreprError(\n `HTTP ${response.status}: ${response.statusText}`,\n 'HTTP_ERROR',\n 'getPreprEnvironmentSegments'\n );\n }\n\n const json = await response.json();\n\n if (!json || !json.data || !json.data._Segments) {\n throw new PreprError(\n 'Invalid response format from Prepr API',\n 'INVALID_RESPONSE',\n 'getPreprEnvironmentSegments'\n );\n }\n\n return json.data._Segments as PreprSegment[];\n } catch (error) {\n if (error instanceof PreprError) {\n throw error;\n }\n throw new PreprError(\n 'Failed to fetch segments from Prepr API',\n 'FETCH_ERROR',\n 'getPreprEnvironmentSegments',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n}\n\n/**\n * Fetches all the necessary previewbar props\n * @param token Prepr GraphQL URL with scope 'segments'\n * @returns Object with activeSegment, activeVariant and data\n */\nexport async function getToolbarProps(\n token: string\n): Promise<PreprToolbarProps> {\n let data: PreprSegment[] = [];\n let activeSegment: string | null = null;\n let activeVariant: string | null = null;\n\n // Prevent unnecessary function calling in production\n if (isPreviewMode()) {\n try {\n data = await getPreprEnvironmentSegments(token);\n activeSegment = await getActiveSegment();\n activeVariant = await getActiveVariant();\n } catch (error) {\n // In preview mode, we should still return props even if API fails\n console.error('Failed to fetch toolbar props:', error);\n // Return empty data to prevent toolbar from crashing\n data = [];\n }\n }\n\n return {\n activeSegment,\n activeVariant,\n data,\n };\n}\n\nfunction getPackageVersion() {\n return pjson.version;\n}\n\nexport { createPreprMiddleware };\n"]}
@@ -2,10 +2,10 @@ interface PreprSegment {
2
2
  readonly _id: string;
3
3
  readonly name: string;
4
4
  }
5
- interface PreprPreviewBarOptions {
5
+ interface PreprToolbarOptions {
6
6
  readonly debug?: boolean;
7
7
  }
8
- interface PreprPreviewBarProps {
8
+ interface PreprToolbarProps {
9
9
  readonly activeSegment: string | null;
10
10
  readonly activeVariant: string | null;
11
11
  readonly data: readonly PreprSegment[];
@@ -31,4 +31,4 @@ interface PreprHeaders {
31
31
  }
32
32
  type PreprErrorCode = 'INVALID_TOKEN' | 'MISSING_TOKEN' | 'HTTP_ERROR' | 'FETCH_ERROR' | 'INVALID_RESPONSE' | 'CONTEXT_ERROR';
33
33
 
34
- export type { PreprEnvironment, PreprErrorCode, PreprEventType, PreprHeaderName, PreprHeaders, PreprPreviewBarOptions, PreprPreviewBarProps, PreprSegment, PreprVariant };
34
+ export type { PreprEnvironment, PreprErrorCode, PreprEventType, PreprHeaderName, PreprHeaders, PreprSegment, PreprToolbarOptions, PreprToolbarProps, PreprVariant };
@@ -2,10 +2,10 @@ interface PreprSegment {
2
2
  readonly _id: string;
3
3
  readonly name: string;
4
4
  }
5
- interface PreprPreviewBarOptions {
5
+ interface PreprToolbarOptions {
6
6
  readonly debug?: boolean;
7
7
  }
8
- interface PreprPreviewBarProps {
8
+ interface PreprToolbarProps {
9
9
  readonly activeSegment: string | null;
10
10
  readonly activeVariant: string | null;
11
11
  readonly data: readonly PreprSegment[];
@@ -31,4 +31,4 @@ interface PreprHeaders {
31
31
  }
32
32
  type PreprErrorCode = 'INVALID_TOKEN' | 'MISSING_TOKEN' | 'HTTP_ERROR' | 'FETCH_ERROR' | 'INVALID_RESPONSE' | 'CONTEXT_ERROR';
33
33
 
34
- export type { PreprEnvironment, PreprErrorCode, PreprEventType, PreprHeaderName, PreprHeaders, PreprPreviewBarOptions, PreprPreviewBarProps, PreprSegment, PreprVariant };
34
+ export type { PreprEnvironment, PreprErrorCode, PreprEventType, PreprHeaderName, PreprHeaders, PreprSegment, PreprToolbarOptions, PreprToolbarProps, PreprVariant };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@preprio/prepr-nextjs",
3
- "version": "2.0.0-alpha.10",
3
+ "version": "2.0.0-alpha.11",
4
4
  "description": "Next.js package for Prepr CMS preview functionality with advanced debugging and visual editing capabilities",
5
5
  "main": "dist/react/index.cjs",
6
6
  "types": "./dist/react/index.d.ts",