@preprio/prepr-nextjs 2.0.0 → 2.0.2
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.
- package/dist/{chunk-QZTUT4DH.js → chunk-YKY3OKYG.js} +2 -2
- package/dist/{chunk-QZTUT4DH.js.map → chunk-YKY3OKYG.js.map} +1 -1
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/middleware/index.cjs +1 -1
- package/dist/middleware/index.cjs.map +1 -1
- package/dist/middleware/index.js +1 -1
- package/dist/react/index.cjs +2 -2
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +2 -2
- package/dist/react/index.js.map +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
package/dist/server/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var headers=require('next/headers'),functions=require('@vercel/functions'),server=require('next/server');var a=(r,s,t)=>new Promise((e,n)=>{var l=i=>{try{d(t.next(i));}catch(c){n(c);}},u=i=>{try{d(t.throw(i));}catch(c){n(c);}},d=i=>i.done?e(i.value):Promise.resolve(i.value).then(l,u);d((t=t.apply(r,s)).next());});var y="2.0.
|
|
1
|
+
'use strict';var headers=require('next/headers'),functions=require('@vercel/functions'),server=require('next/server');var a=(r,s,t)=>new Promise((e,n)=>{var l=i=>{try{d(t.next(i));}catch(c){n(c);}},u=i=>{try{d(t.throw(i));}catch(c){n(c);}},d=i=>i.done?e(i.value):Promise.resolve(i.value).then(l,u);d((t=t.apply(r,s)).next());});var y="2.0.2";var _={version:y};function R(r,s,t){var x,f,h,w;let e,n;s&&"headers"in s?(e=s,n=t):(e=server.NextResponse.next(),n=s),process.env.PREPR_GRAPHQL_URL||console.error("PREPR_GRAPHQL_URL is not set"),r.nextUrl.searchParams.forEach((o,m)=>{switch(m){case "utm_source":e.headers.set("Prepr-Context-utm_source",o);break;case "utm_medium":e.headers.set("Prepr-Context-utm_medium",o);break;case "utm_term":e.headers.set("Prepr-Context-utm_term",o);break;case "utm_content":e.headers.set("Prepr-Context-utm_content",o);break;case "utm_campaign":e.headers.set("Prepr-Context-utm_campaign",o);break}});let l=r.headers.get("referer");l&&e.headers.set("Prepr-Context-initial_referral",l),e.headers.set("Prepr-Package",y);let u=functions.ipAddress(r);u&&e.headers.set("Prepr-Visitor-IP",u);let d=(x=r.cookies.get("hubspotutk"))==null?void 0:x.value;d&&e.headers.set("Prepr-Hubspot-Id",d);let i=(f=r.cookies.get("__prepr_uid"))==null?void 0:f.value;if(i||(i=crypto.randomUUID(),e.cookies.set("__prepr_uid",i,{maxAge:1*365*24*60}),e.headers.set("Prepr-Customer-Id-Created","true")),e.headers.set("Prepr-Customer-Id",i),!(n!=null&&n.preview)||process.env.PREPR_ENV!=="preview")return e;e.headers.set("Prepr-Preview-Bar","true");let c=(h=r.cookies.get("Prepr-Segments"))==null?void 0:h.value;c&&e.headers.set("Prepr-Segments",c);let P=(w=r.cookies.get("Prepr-ABtesting"))==null?void 0:w.value;return P&&e.headers.set("Prepr-ABtesting",P),r.nextUrl.searchParams.forEach((o,m)=>{m==="prepr_preview_ab"&&(e.headers.set("Prepr-ABtesting",o),e.cookies.set("Prepr-ABtesting",o)),m==="prepr_preview_segment"&&(e.headers.set("Prepr-Segments",o),e.cookies.set("Prepr-Segments",o));}),e}var p=class extends Error{constructor(t,e,n,l){super(t);this.code=e;this.context=n;this.originalError=l;this.name="PreprError";}};function g(r){return a(this,null,function*(){return (yield headers.headers()).get(r)})}function F(){return a(this,null,function*(){return g("prepr-customer-id")})}function j(){return a(this,null,function*(){return g("Prepr-Segments")})}function S(){return a(this,null,function*(){return g("Prepr-ABtesting")})}function W(){return a(this,null,function*(){let r={};return (yield headers.headers()).forEach((t,e)=>{(e.startsWith("prepr")||e.startsWith("Prepr"))&&(r[e]=t);}),r})}function N(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 T(){return process.env.PREPR_ENV==="preview"}function $(r){if(!r)return null;try{let s=new URL(r);if(s.hostname!=="graphql.prepr.io")return null;let t=s.pathname.split("/"),e=t[t.length-1];return e&&e.length>0?e:null}catch(s){return null}}function A(r){return a(this,null,function*(){let s=N(r);if(!s.valid)throw new p(s.error,"INVALID_TOKEN","getPreprEnvironmentSegments");try{let t=yield fetch(r,{headers:{"User-Agent":`Prepr-Preview-Bar/${C()}`,"Content-Type":"application/json"},method:"POST",body:JSON.stringify({query:`{
|
|
2
2
|
_Segments {
|
|
3
3
|
_id
|
|
4
4
|
name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/index.ts","../../package.json","../../src/middleware/index.ts"],"names":["version","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\",\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\": \"^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';\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 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 Prepr version header\n response.headers.set('Prepr-Package', version);\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":["version","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.2\",\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\": \"^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';\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 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 Prepr version header\n response.headers.set('Prepr-Package', version);\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"]}
|
package/dist/server/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {a}from'../chunk-
|
|
1
|
+
import {a}from'../chunk-YKY3OKYG.js';export{b as createPreprMiddleware}from'../chunk-YKY3OKYG.js';import {c}from'../chunk-E7ATRJ2F.js';import {headers}from'next/headers';var s=class extends Error{constructor(r,t,a,h){super(r);this.code=t;this.context=a;this.originalError=h;this.name="PreprError";}};function i(e){return c(this,null,function*(){return (yield headers()).get(e)})}function S(){return c(this,null,function*(){return i("prepr-customer-id")})}function g(){return c(this,null,function*(){return i("Prepr-Segments")})}function u(){return c(this,null,function*(){return i("Prepr-ABtesting")})}function T(){return c(this,null,function*(){let e={};return (yield headers()).forEach((r,t)=>{(t.startsWith("prepr")||t.startsWith("Prepr"))&&(e[t]=r);}),e})}function P(e){return e?e.startsWith("https://")?{valid:true}:{valid:false,error:"Token must be a valid HTTPS URL"}:{valid:false,error:"Token is required"}}function m(){return process.env.PREPR_ENV==="preview"}function x(e){if(!e)return null;try{let n=new URL(e);if(n.hostname!=="graphql.prepr.io")return null;let r=n.pathname.split("/"),t=r[r.length-1];return t&&t.length>0?t:null}catch(n){return null}}function d(e){return c(this,null,function*(){let n=P(e);if(!n.valid)throw new s(n.error,"INVALID_TOKEN","getPreprEnvironmentSegments");try{let r=yield fetch(e,{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
|
package/dist/utils/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var clsx=require('clsx'),tailwindMerge=require('tailwind-merge');var D=Object.defineProperty,x=Object.defineProperties;var
|
|
1
|
+
'use strict';var clsx=require('clsx'),tailwindMerge=require('tailwind-merge');var D=Object.defineProperty,x=Object.defineProperties;var w=Object.getOwnPropertyDescriptors;var f=Object.getOwnPropertySymbols;var v=Object.prototype.hasOwnProperty,y=Object.prototype.propertyIsEnumerable;var T=(r,t,e)=>t in r?D(r,t,{enumerable:true,configurable:true,writable:true,value:e}):r[t]=e,u=(r,t)=>{for(var e in t||(t={}))v.call(t,e)&&T(r,e,t[e]);if(f)for(var e of f(t))y.call(t,e)&&T(r,e,t[e]);return r},h=(r,t)=>x(r,w(t));var E={DECODE_FAILED:"STEGA_DECODE_FAILED",INVALID_FORMAT:"STEGA_INVALID_FORMAT",DOM_MANIPULATION_FAILED:"DOM_MANIPULATION_FAILED",CONTEXT_NOT_FOUND:"CONTEXT_NOT_FOUND"};function p(r,t,e,n){return {type:r,context:t,message:e.message,timestamp:new Date().toISOString(),stack:e.stack,additionalData:n}}function M(r,t,e){let n=p(E.DECODE_FAILED,t,r,e);return console.error("Stega Error:",n),process.env.NODE_ENV,n}function s(r,t){let e=p(E.DOM_MANIPULATION_FAILED,t,r);return console.error("DOM Error:",e),e}function I(r){let t=new Error(`${r} must be used within its provider`),e=p(E.CONTEXT_NOT_FOUND,r,t);throw console.error("Context Error:",e),t}var b=class{static createElement(t,e){try{let n=document.createElement(t);return n.className=e,n}catch(n){throw s(n,"createElement"),n}}static appendToBody(t){try{document.body.appendChild(t);}catch(e){throw s(e,"appendToBody"),e}}static removeFromBody(t){try{t.parentNode&&t.parentNode.removeChild(t);}catch(e){throw s(e,"removeFromBody"),e}}static setElementStyles(t,e){try{Object.entries(e).forEach(([n,o])=>{t.style.setProperty(n,o);});}catch(n){throw s(n,"setElementStyles"),n}}static getElementRect(t){try{return t.getBoundingClientRect()}catch(e){throw s(e,"getElementRect"),e}}static isElementInViewport(t){try{let e=this.getElementRect(t);return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}catch(e){return s(e,"isElementInViewport"),false}}static calculateDistance(t,e,n,o){return Math.sqrt(Math.pow(n-t,2)+Math.pow(o-e,2))}static findClosestElement(t,e,n){try{let o=null,i=1/0;return n.forEach(c=>{let a=this.getElementRect(c),m=this.calculateDistance(t,e,a.left+a.width/2,a.top+a.height/2);m<i&&(i=m,o=c);}),o}catch(o){return s(o,"findClosestElement"),null}}static addEventListener(t,e,n,o){try{t.addEventListener(e,n,o);}catch(i){throw s(i,"addEventListener"),i}}static removeEventListener(t,e,n,o){try{t.removeEventListener(e,n,o);}catch(i){throw s(i,"removeEventListener"),i}}};var d=class r{constructor(t){this.options=u({prefix:"[Prepr]"},t);}isEnabled(){var t,e;return this.options.enabled!==void 0?this.options.enabled:(e=(t=l==null?void 0:l.options)==null?void 0:t.enabled)!=null?e:false}log(t,...e){if(!this.isEnabled())return;let n=this.options.prefix;console.log(`${n} ${t}`,...e);}warn(t,...e){if(!this.isEnabled())return;let n=this.options.prefix;console.warn(`${n} ${t}`,...e);}error(t,...e){if(!this.isEnabled())return;let n=this.options.prefix;console.error(`${n} ${t}`,...e);}scope(t){return new r(h(u({},this.options),{prefix:`${this.options.prefix}[${t}]`}))}},l=null;function C(r=false){l=new d({enabled:r});}function g(){return l||(l=new d({enabled:false})),l}function S(r,...t){g().log(r,...t);}function H(r,...t){g().warn(r,...t);}function P(r,...t){g().error(r,...t);}function $(r){return new d({prefix:`[Prepr][${r}]`})}function k(r,t){let e=null,n=0,o=(...i)=>{let c=Date.now(),a=c-n;a>=t?(r(...i),n=c):(e&&clearTimeout(e),e=setTimeout(()=>{r(...i),n=Date.now(),e=null;},t-a));};return o.cancel=()=>{e&&(clearTimeout(e),e=null);},o}function U(r,t){let e=null,n=(...o)=>{e&&clearTimeout(e),e=setTimeout(()=>{r(...o),e=null;},t);};return n.cancel=()=>{e&&(clearTimeout(e),e=null);},n}function B(r,t=1e3){let e=null,n=0;return ()=>{let o=Date.now();return (!e||o-n>t)&&(e=document.querySelectorAll(r),n=o),e}}function G(...r){return tailwindMerge.twMerge(clsx.clsx(r))}function J(r,t){if(typeof window!="undefined"){let e=u({name:"prepr_preview_bar",event:r},t);window.dispatchEvent(new CustomEvent("prepr_preview_bar",{detail:e})),window.parent&&window.parent!==window&&window.parent.postMessage(e,"*");}}exports.DOMService=b;exports.StegaError=E;exports.cn=G;exports.createElementCache=B;exports.createErrorInfo=p;exports.createScopedLogger=$;exports.debounce=U;exports.debugError=P;exports.debugLog=S;exports.debugWarn=H;exports.getDebugLogger=g;exports.handleContextError=I;exports.handleDOMError=s;exports.handleStegaError=M;exports.initDebugLogger=C;exports.sendPreprEvent=J;exports.throttle=k;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/utils/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/errors.ts","../../src/utils/dom.ts","../../src/utils/debug.ts","../../src/utils/performance.ts","../../src/utils/index.ts"],"names":["StegaError","createErrorInfo","type","context","error","additionalData","handleStegaError","errorInfo","handleDOMError","handleContextError","contextName","DOMService","tag","className","element","styles","property","value","rect","x1","y1","x2","y2","pointX","pointY","elements","closestElement","minDistance","distance","event","handler","options","DebugLogger","_DebugLogger","__spreadValues","_a","_b","globalDebugLogger","message","args","prefix","scopeName","__spreadProps","initDebugLogger","enabled","getDebugLogger","debugLog","debugWarn","debugError","createScopedLogger","throttle","func","delay","timeoutId","lastExecTime","throttledFunc","currentTime","timeSinceLastExec","debounce","debouncedFunc","createElementCache","query","ttl","cache","lastCacheTime","now","cn","inputs","twMerge","clsx","sendPreprEvent","data"],"mappings":"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","file":"index.cjs","sourcesContent":["export const StegaError = {\n DECODE_FAILED: 'STEGA_DECODE_FAILED',\n INVALID_FORMAT: 'STEGA_INVALID_FORMAT',\n DOM_MANIPULATION_FAILED: 'DOM_MANIPULATION_FAILED',\n CONTEXT_NOT_FOUND: 'CONTEXT_NOT_FOUND',\n} as const;\n\nexport type StegaErrorType = (typeof StegaError)[keyof typeof StegaError];\n\n// Define specific types for error additional data\nexport interface ErrorAdditionalData {\n input?: string;\n element?: HTMLElement;\n context?: string;\n [key: string]: string | HTMLElement | undefined;\n}\n\nexport interface ErrorInfo {\n type: StegaErrorType;\n context: string;\n message: string;\n timestamp: string;\n stack?: string;\n additionalData?: ErrorAdditionalData;\n}\n\nexport function createErrorInfo(\n type: StegaErrorType,\n context: string,\n error: Error,\n additionalData?: ErrorAdditionalData\n): ErrorInfo {\n return {\n type,\n context,\n message: error.message,\n timestamp: new Date().toISOString(),\n stack: error.stack,\n additionalData,\n };\n}\n\nexport function handleStegaError(\n error: Error,\n context: string,\n additionalData?: ErrorAdditionalData\n) {\n const errorInfo = createErrorInfo(\n StegaError.DECODE_FAILED,\n context,\n error,\n additionalData\n );\n\n console.error('Stega Error:', errorInfo);\n\n // In production, you might want to send this to an error tracking service\n if (process.env.NODE_ENV === 'production') {\n // sendToErrorTrackingService(errorInfo);\n }\n\n return errorInfo;\n}\n\nexport function handleDOMError(error: Error, context: string) {\n const errorInfo = createErrorInfo(\n StegaError.DOM_MANIPULATION_FAILED,\n context,\n error\n );\n\n console.error('DOM Error:', errorInfo);\n return errorInfo;\n}\n\nexport function handleContextError(contextName: string) {\n const error = new Error(`${contextName} must be used within its provider`);\n const errorInfo = createErrorInfo(\n StegaError.CONTEXT_NOT_FOUND,\n contextName,\n error\n );\n\n console.error('Context Error:', errorInfo);\n throw error;\n}\n","import { handleDOMError } from './errors';\n\nexport class DOMService {\n /**\n * Creates an HTML element with specified tag and class name\n */\n static createElement(tag: string, className: string): HTMLElement {\n try {\n const element = document.createElement(tag);\n element.className = className;\n return element;\n } catch (error) {\n handleDOMError(error as Error, 'createElement');\n throw error;\n }\n }\n\n /**\n * Appends an element to the document body\n */\n static appendToBody(element: HTMLElement): void {\n try {\n document.body.appendChild(element);\n } catch (error) {\n handleDOMError(error as Error, 'appendToBody');\n throw error;\n }\n }\n\n /**\n * Removes an element from the document body\n */\n static removeFromBody(element: HTMLElement): void {\n try {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n } catch (error) {\n handleDOMError(error as Error, 'removeFromBody');\n throw error;\n }\n }\n\n /**\n * Sets multiple CSS properties on an element\n */\n static setElementStyles(\n element: HTMLElement,\n styles: Record<string, string>\n ): void {\n try {\n Object.entries(styles).forEach(([property, value]) => {\n element.style.setProperty(property, value);\n });\n } catch (error) {\n handleDOMError(error as Error, 'setElementStyles');\n throw error;\n }\n }\n\n /**\n * Gets the bounding rectangle of an element\n */\n static getElementRect(element: HTMLElement): DOMRect {\n try {\n return element.getBoundingClientRect();\n } catch (error) {\n handleDOMError(error as Error, 'getElementRect');\n throw error;\n }\n }\n\n /**\n * Checks if an element is in the viewport\n */\n static isElementInViewport(element: HTMLElement): boolean {\n try {\n const rect = this.getElementRect(element);\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <=\n (window.innerWidth || document.documentElement.clientWidth)\n );\n } catch (error) {\n handleDOMError(error as Error, 'isElementInViewport');\n return false;\n }\n }\n\n /**\n * Calculates distance between two points\n */\n static calculateDistance(\n x1: number,\n y1: number,\n x2: number,\n y2: number\n ): number {\n return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n }\n\n /**\n * Finds the closest element to a point from a list of elements\n */\n static findClosestElement(\n pointX: number,\n pointY: number,\n elements: NodeListOf<Element>\n ): HTMLElement | null {\n try {\n let closestElement: HTMLElement | null = null;\n let minDistance = Infinity;\n\n elements.forEach(element => {\n const rect = this.getElementRect(element as HTMLElement);\n const distance = this.calculateDistance(\n pointX,\n pointY,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2\n );\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element as HTMLElement;\n }\n });\n\n return closestElement;\n } catch (error) {\n handleDOMError(error as Error, 'findClosestElement');\n return null;\n }\n }\n\n /**\n * Safely adds event listeners\n */\n static addEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n ): void {\n try {\n element.addEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'addEventListener');\n throw error;\n }\n }\n\n /**\n * Safely removes event listeners\n */\n static removeEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: EventListenerOptions\n ): void {\n try {\n element.removeEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'removeEventListener');\n throw error;\n }\n }\n}\n","/**\n * Debug utility for Prepr Next.js package\n * Provides centralized debug logging with performance optimizations\n */\n\n// Define specific types for debug arguments\nexport type DebugArg = string | number | boolean | null | undefined | object;\n\ninterface DebugOptions {\n enabled?: boolean;\n prefix?: string;\n}\n\nclass DebugLogger {\n private options: DebugOptions;\n\n constructor(options: DebugOptions) {\n this.options = {\n prefix: '[Prepr]',\n ...options,\n };\n }\n\n /**\n * Check if debug is enabled - checks both local and global state\n */\n private isEnabled(): boolean {\n // If this logger has a local enabled state, use it\n if (this.options.enabled !== undefined) {\n return this.options.enabled;\n }\n\n // Otherwise, check the global logger state\n return globalDebugLogger?.options?.enabled ?? false;\n }\n\n /**\n * Log a debug message if debug is enabled\n */\n log(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.log(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug warning if debug is enabled\n */\n warn(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.warn(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug error if debug is enabled\n */\n error(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.error(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Create a scoped logger with additional context\n */\n scope(scopeName: string): DebugLogger {\n return new DebugLogger({\n ...this.options,\n prefix: `${this.options.prefix}[${scopeName}]`,\n });\n }\n}\n\n// Global debug instance\nlet globalDebugLogger: DebugLogger | null = null;\n\n/**\n * Initialize the debug logger\n */\nexport function initDebugLogger(enabled: boolean = false): void {\n globalDebugLogger = new DebugLogger({ enabled });\n}\n\n/**\n * Get the debug logger instance\n */\nexport function getDebugLogger(): DebugLogger {\n if (!globalDebugLogger) {\n // Fallback to disabled logger if not initialized\n globalDebugLogger = new DebugLogger({ enabled: false });\n }\n return globalDebugLogger;\n}\n\n/**\n * Convenience function for logging\n */\nexport function debugLog(message: string, ...args: DebugArg[]): void {\n getDebugLogger().log(message, ...args);\n}\n\n/**\n * Convenience function for warning\n */\nexport function debugWarn(message: string, ...args: DebugArg[]): void {\n getDebugLogger().warn(message, ...args);\n}\n\n/**\n * Convenience function for errors\n */\nexport function debugError(message: string, ...args: DebugArg[]): void {\n getDebugLogger().error(message, ...args);\n}\n\n/**\n * Create a scoped debug logger that dynamically checks global debug state\n */\nexport function createScopedLogger(scopeName: string): DebugLogger {\n // Create a scoped logger without its own enabled state\n // This allows it to dynamically check the global logger state\n return new DebugLogger({\n prefix: `[Prepr][${scopeName}]`,\n });\n}\n","// Performance utilities\n\n/**\n * Throttled function with cancellation support\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): void;\n cancel(): void;\n}\n\n/**\n * Improved throttle function with better memory management and cancellation\n * @param func - The function to throttle\n * @param delay - The delay in milliseconds\n * @returns Throttled function with cancel method\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n let lastExecTime = 0;\n\n const throttledFunc = ((...args: Parameters<T>) => {\n const currentTime = Date.now();\n const timeSinceLastExec = currentTime - lastExecTime;\n\n if (timeSinceLastExec >= delay) {\n func(...args);\n lastExecTime = currentTime;\n } else {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n lastExecTime = Date.now();\n timeoutId = null;\n }, delay - timeSinceLastExec);\n }\n }) as ThrottledFunction<T>;\n\n throttledFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttledFunc;\n}\n\n/**\n * Debounce function with cancellation support\n * @param func - The function to debounce\n * @param delay - The delay in milliseconds\n * @returns Debounced function with cancel method\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n\n const debouncedFunc = ((...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n timeoutId = null;\n }, delay);\n }) as ThrottledFunction<T>;\n\n debouncedFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debouncedFunc;\n}\n\n// Simple DOM element cache for querySelectorAll\nexport function createElementCache<T extends Element = Element>(\n query: string,\n ttl: number = 1000\n) {\n let cache: NodeListOf<T> | null = null;\n let lastCacheTime = 0;\n return () => {\n const now = Date.now();\n if (!cache || now - lastCacheTime > ttl) {\n cache = document.querySelectorAll<T>(query);\n lastCacheTime = now;\n }\n return cache;\n };\n}\n","import { ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { PreprEventType } from '../types';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// Define specific types for Prepr events\nexport interface PreprEventData {\n readonly segment?: string;\n readonly variant?: string;\n readonly editMode?: boolean;\n readonly [key: string]: string | boolean | number | undefined;\n}\n\n/**\n * Sends a Prepr event to the parent window\n * @param event - The event type to send\n * @param data - Optional event data\n */\nexport function sendPreprEvent(\n event: PreprEventType,\n data?: PreprEventData\n): void {\n if (typeof window !== 'undefined' && window.parent) {\n window.parent.postMessage(\n {\n name: 'prepr_preview_bar',\n event,\n ...data,\n },\n '*'\n );\n }\n}\n\n// Export error handling utilities\nexport * from './errors';\n\n// Export DOM service\nexport * from './dom';\n\n// Export debug utilities\nexport * from './debug';\n\n// Export performance utilities\nexport * from './performance';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/errors.ts","../../src/utils/dom.ts","../../src/utils/debug.ts","../../src/utils/performance.ts","../../src/utils/index.ts"],"names":["StegaError","createErrorInfo","type","context","error","additionalData","handleStegaError","errorInfo","handleDOMError","handleContextError","contextName","DOMService","tag","className","element","styles","property","value","rect","x1","y1","x2","y2","pointX","pointY","elements","closestElement","minDistance","distance","event","handler","options","DebugLogger","_DebugLogger","__spreadValues","_a","_b","globalDebugLogger","message","args","prefix","scopeName","__spreadProps","initDebugLogger","enabled","getDebugLogger","debugLog","debugWarn","debugError","createScopedLogger","throttle","func","delay","timeoutId","lastExecTime","throttledFunc","currentTime","timeSinceLastExec","debounce","debouncedFunc","createElementCache","query","ttl","cache","lastCacheTime","now","cn","inputs","twMerge","clsx","sendPreprEvent","data"],"mappings":"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","file":"index.cjs","sourcesContent":["export const StegaError = {\n DECODE_FAILED: 'STEGA_DECODE_FAILED',\n INVALID_FORMAT: 'STEGA_INVALID_FORMAT',\n DOM_MANIPULATION_FAILED: 'DOM_MANIPULATION_FAILED',\n CONTEXT_NOT_FOUND: 'CONTEXT_NOT_FOUND',\n} as const;\n\nexport type StegaErrorType = (typeof StegaError)[keyof typeof StegaError];\n\n// Define specific types for error additional data\nexport interface ErrorAdditionalData {\n input?: string;\n element?: HTMLElement;\n context?: string;\n [key: string]: string | HTMLElement | undefined;\n}\n\nexport interface ErrorInfo {\n type: StegaErrorType;\n context: string;\n message: string;\n timestamp: string;\n stack?: string;\n additionalData?: ErrorAdditionalData;\n}\n\nexport function createErrorInfo(\n type: StegaErrorType,\n context: string,\n error: Error,\n additionalData?: ErrorAdditionalData\n): ErrorInfo {\n return {\n type,\n context,\n message: error.message,\n timestamp: new Date().toISOString(),\n stack: error.stack,\n additionalData,\n };\n}\n\nexport function handleStegaError(\n error: Error,\n context: string,\n additionalData?: ErrorAdditionalData\n) {\n const errorInfo = createErrorInfo(\n StegaError.DECODE_FAILED,\n context,\n error,\n additionalData\n );\n\n console.error('Stega Error:', errorInfo);\n\n // In production, you might want to send this to an error tracking service\n if (process.env.NODE_ENV === 'production') {\n // sendToErrorTrackingService(errorInfo);\n }\n\n return errorInfo;\n}\n\nexport function handleDOMError(error: Error, context: string) {\n const errorInfo = createErrorInfo(\n StegaError.DOM_MANIPULATION_FAILED,\n context,\n error\n );\n\n console.error('DOM Error:', errorInfo);\n return errorInfo;\n}\n\nexport function handleContextError(contextName: string) {\n const error = new Error(`${contextName} must be used within its provider`);\n const errorInfo = createErrorInfo(\n StegaError.CONTEXT_NOT_FOUND,\n contextName,\n error\n );\n\n console.error('Context Error:', errorInfo);\n throw error;\n}\n","import { handleDOMError } from './errors';\n\nexport class DOMService {\n /**\n * Creates an HTML element with specified tag and class name\n */\n static createElement(tag: string, className: string): HTMLElement {\n try {\n const element = document.createElement(tag);\n element.className = className;\n return element;\n } catch (error) {\n handleDOMError(error as Error, 'createElement');\n throw error;\n }\n }\n\n /**\n * Appends an element to the document body\n */\n static appendToBody(element: HTMLElement): void {\n try {\n document.body.appendChild(element);\n } catch (error) {\n handleDOMError(error as Error, 'appendToBody');\n throw error;\n }\n }\n\n /**\n * Removes an element from the document body\n */\n static removeFromBody(element: HTMLElement): void {\n try {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n } catch (error) {\n handleDOMError(error as Error, 'removeFromBody');\n throw error;\n }\n }\n\n /**\n * Sets multiple CSS properties on an element\n */\n static setElementStyles(\n element: HTMLElement,\n styles: Record<string, string>\n ): void {\n try {\n Object.entries(styles).forEach(([property, value]) => {\n element.style.setProperty(property, value);\n });\n } catch (error) {\n handleDOMError(error as Error, 'setElementStyles');\n throw error;\n }\n }\n\n /**\n * Gets the bounding rectangle of an element\n */\n static getElementRect(element: HTMLElement): DOMRect {\n try {\n return element.getBoundingClientRect();\n } catch (error) {\n handleDOMError(error as Error, 'getElementRect');\n throw error;\n }\n }\n\n /**\n * Checks if an element is in the viewport\n */\n static isElementInViewport(element: HTMLElement): boolean {\n try {\n const rect = this.getElementRect(element);\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <=\n (window.innerWidth || document.documentElement.clientWidth)\n );\n } catch (error) {\n handleDOMError(error as Error, 'isElementInViewport');\n return false;\n }\n }\n\n /**\n * Calculates distance between two points\n */\n static calculateDistance(\n x1: number,\n y1: number,\n x2: number,\n y2: number\n ): number {\n return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n }\n\n /**\n * Finds the closest element to a point from a list of elements\n */\n static findClosestElement(\n pointX: number,\n pointY: number,\n elements: NodeListOf<Element>\n ): HTMLElement | null {\n try {\n let closestElement: HTMLElement | null = null;\n let minDistance = Infinity;\n\n elements.forEach(element => {\n const rect = this.getElementRect(element as HTMLElement);\n const distance = this.calculateDistance(\n pointX,\n pointY,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2\n );\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element as HTMLElement;\n }\n });\n\n return closestElement;\n } catch (error) {\n handleDOMError(error as Error, 'findClosestElement');\n return null;\n }\n }\n\n /**\n * Safely adds event listeners\n */\n static addEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n ): void {\n try {\n element.addEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'addEventListener');\n throw error;\n }\n }\n\n /**\n * Safely removes event listeners\n */\n static removeEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: EventListenerOptions\n ): void {\n try {\n element.removeEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'removeEventListener');\n throw error;\n }\n }\n}\n","/**\n * Debug utility for Prepr Next.js package\n * Provides centralized debug logging with performance optimizations\n */\n\n// Define specific types for debug arguments\nexport type DebugArg = string | number | boolean | null | undefined | object;\n\ninterface DebugOptions {\n enabled?: boolean;\n prefix?: string;\n}\n\nclass DebugLogger {\n private options: DebugOptions;\n\n constructor(options: DebugOptions) {\n this.options = {\n prefix: '[Prepr]',\n ...options,\n };\n }\n\n /**\n * Check if debug is enabled - checks both local and global state\n */\n private isEnabled(): boolean {\n // If this logger has a local enabled state, use it\n if (this.options.enabled !== undefined) {\n return this.options.enabled;\n }\n\n // Otherwise, check the global logger state\n return globalDebugLogger?.options?.enabled ?? false;\n }\n\n /**\n * Log a debug message if debug is enabled\n */\n log(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.log(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug warning if debug is enabled\n */\n warn(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.warn(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug error if debug is enabled\n */\n error(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.error(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Create a scoped logger with additional context\n */\n scope(scopeName: string): DebugLogger {\n return new DebugLogger({\n ...this.options,\n prefix: `${this.options.prefix}[${scopeName}]`,\n });\n }\n}\n\n// Global debug instance\nlet globalDebugLogger: DebugLogger | null = null;\n\n/**\n * Initialize the debug logger\n */\nexport function initDebugLogger(enabled: boolean = false): void {\n globalDebugLogger = new DebugLogger({ enabled });\n}\n\n/**\n * Get the debug logger instance\n */\nexport function getDebugLogger(): DebugLogger {\n if (!globalDebugLogger) {\n // Fallback to disabled logger if not initialized\n globalDebugLogger = new DebugLogger({ enabled: false });\n }\n return globalDebugLogger;\n}\n\n/**\n * Convenience function for logging\n */\nexport function debugLog(message: string, ...args: DebugArg[]): void {\n getDebugLogger().log(message, ...args);\n}\n\n/**\n * Convenience function for warning\n */\nexport function debugWarn(message: string, ...args: DebugArg[]): void {\n getDebugLogger().warn(message, ...args);\n}\n\n/**\n * Convenience function for errors\n */\nexport function debugError(message: string, ...args: DebugArg[]): void {\n getDebugLogger().error(message, ...args);\n}\n\n/**\n * Create a scoped debug logger that dynamically checks global debug state\n */\nexport function createScopedLogger(scopeName: string): DebugLogger {\n // Create a scoped logger without its own enabled state\n // This allows it to dynamically check the global logger state\n return new DebugLogger({\n prefix: `[Prepr][${scopeName}]`,\n });\n}\n","// Performance utilities\n\n/**\n * Throttled function with cancellation support\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): void;\n cancel(): void;\n}\n\n/**\n * Improved throttle function with better memory management and cancellation\n * @param func - The function to throttle\n * @param delay - The delay in milliseconds\n * @returns Throttled function with cancel method\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n let lastExecTime = 0;\n\n const throttledFunc = ((...args: Parameters<T>) => {\n const currentTime = Date.now();\n const timeSinceLastExec = currentTime - lastExecTime;\n\n if (timeSinceLastExec >= delay) {\n func(...args);\n lastExecTime = currentTime;\n } else {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n lastExecTime = Date.now();\n timeoutId = null;\n }, delay - timeSinceLastExec);\n }\n }) as ThrottledFunction<T>;\n\n throttledFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttledFunc;\n}\n\n/**\n * Debounce function with cancellation support\n * @param func - The function to debounce\n * @param delay - The delay in milliseconds\n * @returns Debounced function with cancel method\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n\n const debouncedFunc = ((...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n timeoutId = null;\n }, delay);\n }) as ThrottledFunction<T>;\n\n debouncedFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debouncedFunc;\n}\n\n// Simple DOM element cache for querySelectorAll\nexport function createElementCache<T extends Element = Element>(\n query: string,\n ttl: number = 1000\n) {\n let cache: NodeListOf<T> | null = null;\n let lastCacheTime = 0;\n return () => {\n const now = Date.now();\n if (!cache || now - lastCacheTime > ttl) {\n cache = document.querySelectorAll<T>(query);\n lastCacheTime = now;\n }\n return cache;\n };\n}\n","import { ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { PreprEventType } from '../types';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// Define specific types for Prepr events\nexport interface PreprEventData {\n readonly segment?: string;\n readonly variant?: string;\n readonly editMode?: boolean;\n readonly [key: string]: string | boolean | number | undefined;\n}\n\n/**\n * Sends a Prepr event to both the current window and parent window\n * @param event - The event type to send\n * @param data - Optional event data\n */\nexport function sendPreprEvent(\n event: PreprEventType,\n data?: PreprEventData\n): void {\n if (typeof window !== 'undefined') {\n const message = {\n name: 'prepr_preview_bar',\n event,\n ...data,\n };\n\n // Send to current window for local event handling\n window.dispatchEvent(\n new CustomEvent('prepr_preview_bar', { detail: message })\n );\n\n // Send to parent window if available\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(message, '*');\n }\n }\n}\n\n// Export error handling utilities\nexport * from './errors';\n\n// Export DOM service\nexport * from './dom';\n\n// Export debug utilities\nexport * from './debug';\n\n// Export performance utilities\nexport * from './performance';\n"]}
|
package/dist/utils/index.d.cts
CHANGED
|
@@ -159,7 +159,7 @@ interface PreprEventData {
|
|
|
159
159
|
readonly [key: string]: string | boolean | number | undefined;
|
|
160
160
|
}
|
|
161
161
|
/**
|
|
162
|
-
* Sends a Prepr event to the parent window
|
|
162
|
+
* Sends a Prepr event to both the current window and parent window
|
|
163
163
|
* @param event - The event type to send
|
|
164
164
|
* @param data - Optional event data
|
|
165
165
|
*/
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -159,7 +159,7 @@ interface PreprEventData {
|
|
|
159
159
|
readonly [key: string]: string | boolean | number | undefined;
|
|
160
160
|
}
|
|
161
161
|
/**
|
|
162
|
-
* Sends a Prepr event to the parent window
|
|
162
|
+
* Sends a Prepr event to both the current window and parent window
|
|
163
163
|
* @param event - The event type to send
|
|
164
164
|
* @param data - Optional event data
|
|
165
165
|
*/
|
package/dist/utils/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {a,b}from'../chunk-E7ATRJ2F.js';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';var E={DECODE_FAILED:"STEGA_DECODE_FAILED",INVALID_FORMAT:"STEGA_INVALID_FORMAT",DOM_MANIPULATION_FAILED:"DOM_MANIPULATION_FAILED",CONTEXT_NOT_FOUND:"CONTEXT_NOT_FOUND"};function p(n,t,e,r){return {type:n,context:t,message:e.message,timestamp:new Date().toISOString(),stack:e.stack,additionalData:r}}function D(n,t,e){let r=p(E.DECODE_FAILED,t,n,e);return console.error("Stega Error:",r),process.env.NODE_ENV,r}function s(n,t){let e=p(E.DOM_MANIPULATION_FAILED,t,n);return console.error("DOM Error:",e),e}function x(n){let t=new Error(`${n} must be used within its provider`),e=p(E.CONTEXT_NOT_FOUND,n,t);throw console.error("Context Error:",e),t}var T=class{static createElement(t,e){try{let r=document.createElement(t);return r.className=e,r}catch(r){throw s(r,"createElement"),r}}static appendToBody(t){try{document.body.appendChild(t);}catch(e){throw s(e,"appendToBody"),e}}static removeFromBody(t){try{t.parentNode&&t.parentNode.removeChild(t);}catch(e){throw s(e,"removeFromBody"),e}}static setElementStyles(t,e){try{Object.entries(e).forEach(([r,o])=>{t.style.setProperty(r,o);});}catch(r){throw s(r,"setElementStyles"),r}}static getElementRect(t){try{return t.getBoundingClientRect()}catch(e){throw s(e,"getElementRect"),e}}static isElementInViewport(t){try{let e=this.getElementRect(t);return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}catch(e){return s(e,"isElementInViewport"),false}}static calculateDistance(t,e,r,o){return Math.sqrt(Math.pow(r-t,2)+Math.pow(o-e,2))}static findClosestElement(t,e,r){try{let o=null,i=1/0;return r.forEach(c=>{let a=this.getElementRect(c),m=this.calculateDistance(t,e,a.left+a.width/2,a.top+a.height/2);m<i&&(i=m,o=c);}),o}catch(o){return s(o,"findClosestElement"),null}}static addEventListener(t,e,r,o){try{t.addEventListener(e,r,o);}catch(i){throw s(i,"addEventListener"),i}}static removeEventListener(t,e,r,o){try{t.removeEventListener(e,r,o);}catch(i){throw s(i,"removeEventListener"),i}}};var d=class n{constructor(t){this.options=a({prefix:"[Prepr]"},t);}isEnabled(){var t,e;return this.options.enabled!==void 0?this.options.enabled:(e=(t=l==null?void 0:l.options)==null?void 0:t.enabled)!=null?e:false}log(t,...e){if(!this.isEnabled())return;let r=this.options.prefix;console.log(`${r} ${t}`,...e);}warn(t,...e){if(!this.isEnabled())return;let r=this.options.prefix;console.warn(`${r} ${t}`,...e);}error(t,...e){if(!this.isEnabled())return;let r=this.options.prefix;console.error(`${r} ${t}`,...e);}scope(t){return new n(b(a({},this.options),{prefix:`${this.options.prefix}[${t}]`}))}},l=null;function
|
|
1
|
+
import {a,b}from'../chunk-E7ATRJ2F.js';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';var E={DECODE_FAILED:"STEGA_DECODE_FAILED",INVALID_FORMAT:"STEGA_INVALID_FORMAT",DOM_MANIPULATION_FAILED:"DOM_MANIPULATION_FAILED",CONTEXT_NOT_FOUND:"CONTEXT_NOT_FOUND"};function p(n,t,e,r){return {type:n,context:t,message:e.message,timestamp:new Date().toISOString(),stack:e.stack,additionalData:r}}function D(n,t,e){let r=p(E.DECODE_FAILED,t,n,e);return console.error("Stega Error:",r),process.env.NODE_ENV,r}function s(n,t){let e=p(E.DOM_MANIPULATION_FAILED,t,n);return console.error("DOM Error:",e),e}function x(n){let t=new Error(`${n} must be used within its provider`),e=p(E.CONTEXT_NOT_FOUND,n,t);throw console.error("Context Error:",e),t}var T=class{static createElement(t,e){try{let r=document.createElement(t);return r.className=e,r}catch(r){throw s(r,"createElement"),r}}static appendToBody(t){try{document.body.appendChild(t);}catch(e){throw s(e,"appendToBody"),e}}static removeFromBody(t){try{t.parentNode&&t.parentNode.removeChild(t);}catch(e){throw s(e,"removeFromBody"),e}}static setElementStyles(t,e){try{Object.entries(e).forEach(([r,o])=>{t.style.setProperty(r,o);});}catch(r){throw s(r,"setElementStyles"),r}}static getElementRect(t){try{return t.getBoundingClientRect()}catch(e){throw s(e,"getElementRect"),e}}static isElementInViewport(t){try{let e=this.getElementRect(t);return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}catch(e){return s(e,"isElementInViewport"),false}}static calculateDistance(t,e,r,o){return Math.sqrt(Math.pow(r-t,2)+Math.pow(o-e,2))}static findClosestElement(t,e,r){try{let o=null,i=1/0;return r.forEach(c=>{let a=this.getElementRect(c),m=this.calculateDistance(t,e,a.left+a.width/2,a.top+a.height/2);m<i&&(i=m,o=c);}),o}catch(o){return s(o,"findClosestElement"),null}}static addEventListener(t,e,r,o){try{t.addEventListener(e,r,o);}catch(i){throw s(i,"addEventListener"),i}}static removeEventListener(t,e,r,o){try{t.removeEventListener(e,r,o);}catch(i){throw s(i,"removeEventListener"),i}}};var d=class n{constructor(t){this.options=a({prefix:"[Prepr]"},t);}isEnabled(){var t,e;return this.options.enabled!==void 0?this.options.enabled:(e=(t=l==null?void 0:l.options)==null?void 0:t.enabled)!=null?e:false}log(t,...e){if(!this.isEnabled())return;let r=this.options.prefix;console.log(`${r} ${t}`,...e);}warn(t,...e){if(!this.isEnabled())return;let r=this.options.prefix;console.warn(`${r} ${t}`,...e);}error(t,...e){if(!this.isEnabled())return;let r=this.options.prefix;console.error(`${r} ${t}`,...e);}scope(t){return new n(b(a({},this.options),{prefix:`${this.options.prefix}[${t}]`}))}},l=null;function L(n=false){l=new d({enabled:n});}function g(){return l||(l=new d({enabled:false})),l}function O(n,...t){g().log(n,...t);}function A(n,...t){g().warn(n,...t);}function M(n,...t){g().error(n,...t);}function I(n){return new d({prefix:`[Prepr][${n}]`})}function F(n,t){let e=null,r=0,o=(...i)=>{let c=Date.now(),a=c-r;a>=t?(n(...i),r=c):(e&&clearTimeout(e),e=setTimeout(()=>{n(...i),r=Date.now(),e=null;},t-a));};return o.cancel=()=>{e&&(clearTimeout(e),e=null);},o}function C(n,t){let e=null,r=(...o)=>{e&&clearTimeout(e),e=setTimeout(()=>{n(...o),e=null;},t);};return r.cancel=()=>{e&&(clearTimeout(e),e=null);},r}function S(n,t=1e3){let e=null,r=0;return ()=>{let o=Date.now();return (!e||o-r>t)&&(e=document.querySelectorAll(n),r=o),e}}function V(...n){return twMerge(clsx(n))}function k(n,t){if(typeof window!="undefined"){let e=a({name:"prepr_preview_bar",event:n},t);window.dispatchEvent(new CustomEvent("prepr_preview_bar",{detail:e})),window.parent&&window.parent!==window&&window.parent.postMessage(e,"*");}}export{T as DOMService,E as StegaError,V as cn,S as createElementCache,p as createErrorInfo,I as createScopedLogger,C as debounce,M as debugError,O as debugLog,A as debugWarn,g as getDebugLogger,x as handleContextError,s as handleDOMError,D as handleStegaError,L as initDebugLogger,k as sendPreprEvent,F as throttle};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/errors.ts","../../src/utils/dom.ts","../../src/utils/debug.ts","../../src/utils/performance.ts","../../src/utils/index.ts"],"names":["StegaError","createErrorInfo","type","context","error","additionalData","handleStegaError","errorInfo","handleDOMError","handleContextError","contextName","DOMService","tag","className","element","styles","property","value","rect","x1","y1","x2","y2","pointX","pointY","elements","closestElement","minDistance","distance","event","handler","options","DebugLogger","_DebugLogger","__spreadValues","_a","_b","globalDebugLogger","message","args","prefix","scopeName","__spreadProps","initDebugLogger","enabled","getDebugLogger","debugLog","debugWarn","debugError","createScopedLogger","throttle","func","delay","timeoutId","lastExecTime","throttledFunc","currentTime","timeSinceLastExec","debounce","debouncedFunc","createElementCache","query","ttl","cache","lastCacheTime","now","cn","inputs","twMerge","clsx","sendPreprEvent","data"],"mappings":"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","file":"index.js","sourcesContent":["export const StegaError = {\n DECODE_FAILED: 'STEGA_DECODE_FAILED',\n INVALID_FORMAT: 'STEGA_INVALID_FORMAT',\n DOM_MANIPULATION_FAILED: 'DOM_MANIPULATION_FAILED',\n CONTEXT_NOT_FOUND: 'CONTEXT_NOT_FOUND',\n} as const;\n\nexport type StegaErrorType = (typeof StegaError)[keyof typeof StegaError];\n\n// Define specific types for error additional data\nexport interface ErrorAdditionalData {\n input?: string;\n element?: HTMLElement;\n context?: string;\n [key: string]: string | HTMLElement | undefined;\n}\n\nexport interface ErrorInfo {\n type: StegaErrorType;\n context: string;\n message: string;\n timestamp: string;\n stack?: string;\n additionalData?: ErrorAdditionalData;\n}\n\nexport function createErrorInfo(\n type: StegaErrorType,\n context: string,\n error: Error,\n additionalData?: ErrorAdditionalData\n): ErrorInfo {\n return {\n type,\n context,\n message: error.message,\n timestamp: new Date().toISOString(),\n stack: error.stack,\n additionalData,\n };\n}\n\nexport function handleStegaError(\n error: Error,\n context: string,\n additionalData?: ErrorAdditionalData\n) {\n const errorInfo = createErrorInfo(\n StegaError.DECODE_FAILED,\n context,\n error,\n additionalData\n );\n\n console.error('Stega Error:', errorInfo);\n\n // In production, you might want to send this to an error tracking service\n if (process.env.NODE_ENV === 'production') {\n // sendToErrorTrackingService(errorInfo);\n }\n\n return errorInfo;\n}\n\nexport function handleDOMError(error: Error, context: string) {\n const errorInfo = createErrorInfo(\n StegaError.DOM_MANIPULATION_FAILED,\n context,\n error\n );\n\n console.error('DOM Error:', errorInfo);\n return errorInfo;\n}\n\nexport function handleContextError(contextName: string) {\n const error = new Error(`${contextName} must be used within its provider`);\n const errorInfo = createErrorInfo(\n StegaError.CONTEXT_NOT_FOUND,\n contextName,\n error\n );\n\n console.error('Context Error:', errorInfo);\n throw error;\n}\n","import { handleDOMError } from './errors';\n\nexport class DOMService {\n /**\n * Creates an HTML element with specified tag and class name\n */\n static createElement(tag: string, className: string): HTMLElement {\n try {\n const element = document.createElement(tag);\n element.className = className;\n return element;\n } catch (error) {\n handleDOMError(error as Error, 'createElement');\n throw error;\n }\n }\n\n /**\n * Appends an element to the document body\n */\n static appendToBody(element: HTMLElement): void {\n try {\n document.body.appendChild(element);\n } catch (error) {\n handleDOMError(error as Error, 'appendToBody');\n throw error;\n }\n }\n\n /**\n * Removes an element from the document body\n */\n static removeFromBody(element: HTMLElement): void {\n try {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n } catch (error) {\n handleDOMError(error as Error, 'removeFromBody');\n throw error;\n }\n }\n\n /**\n * Sets multiple CSS properties on an element\n */\n static setElementStyles(\n element: HTMLElement,\n styles: Record<string, string>\n ): void {\n try {\n Object.entries(styles).forEach(([property, value]) => {\n element.style.setProperty(property, value);\n });\n } catch (error) {\n handleDOMError(error as Error, 'setElementStyles');\n throw error;\n }\n }\n\n /**\n * Gets the bounding rectangle of an element\n */\n static getElementRect(element: HTMLElement): DOMRect {\n try {\n return element.getBoundingClientRect();\n } catch (error) {\n handleDOMError(error as Error, 'getElementRect');\n throw error;\n }\n }\n\n /**\n * Checks if an element is in the viewport\n */\n static isElementInViewport(element: HTMLElement): boolean {\n try {\n const rect = this.getElementRect(element);\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <=\n (window.innerWidth || document.documentElement.clientWidth)\n );\n } catch (error) {\n handleDOMError(error as Error, 'isElementInViewport');\n return false;\n }\n }\n\n /**\n * Calculates distance between two points\n */\n static calculateDistance(\n x1: number,\n y1: number,\n x2: number,\n y2: number\n ): number {\n return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n }\n\n /**\n * Finds the closest element to a point from a list of elements\n */\n static findClosestElement(\n pointX: number,\n pointY: number,\n elements: NodeListOf<Element>\n ): HTMLElement | null {\n try {\n let closestElement: HTMLElement | null = null;\n let minDistance = Infinity;\n\n elements.forEach(element => {\n const rect = this.getElementRect(element as HTMLElement);\n const distance = this.calculateDistance(\n pointX,\n pointY,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2\n );\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element as HTMLElement;\n }\n });\n\n return closestElement;\n } catch (error) {\n handleDOMError(error as Error, 'findClosestElement');\n return null;\n }\n }\n\n /**\n * Safely adds event listeners\n */\n static addEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n ): void {\n try {\n element.addEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'addEventListener');\n throw error;\n }\n }\n\n /**\n * Safely removes event listeners\n */\n static removeEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: EventListenerOptions\n ): void {\n try {\n element.removeEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'removeEventListener');\n throw error;\n }\n }\n}\n","/**\n * Debug utility for Prepr Next.js package\n * Provides centralized debug logging with performance optimizations\n */\n\n// Define specific types for debug arguments\nexport type DebugArg = string | number | boolean | null | undefined | object;\n\ninterface DebugOptions {\n enabled?: boolean;\n prefix?: string;\n}\n\nclass DebugLogger {\n private options: DebugOptions;\n\n constructor(options: DebugOptions) {\n this.options = {\n prefix: '[Prepr]',\n ...options,\n };\n }\n\n /**\n * Check if debug is enabled - checks both local and global state\n */\n private isEnabled(): boolean {\n // If this logger has a local enabled state, use it\n if (this.options.enabled !== undefined) {\n return this.options.enabled;\n }\n\n // Otherwise, check the global logger state\n return globalDebugLogger?.options?.enabled ?? false;\n }\n\n /**\n * Log a debug message if debug is enabled\n */\n log(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.log(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug warning if debug is enabled\n */\n warn(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.warn(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug error if debug is enabled\n */\n error(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.error(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Create a scoped logger with additional context\n */\n scope(scopeName: string): DebugLogger {\n return new DebugLogger({\n ...this.options,\n prefix: `${this.options.prefix}[${scopeName}]`,\n });\n }\n}\n\n// Global debug instance\nlet globalDebugLogger: DebugLogger | null = null;\n\n/**\n * Initialize the debug logger\n */\nexport function initDebugLogger(enabled: boolean = false): void {\n globalDebugLogger = new DebugLogger({ enabled });\n}\n\n/**\n * Get the debug logger instance\n */\nexport function getDebugLogger(): DebugLogger {\n if (!globalDebugLogger) {\n // Fallback to disabled logger if not initialized\n globalDebugLogger = new DebugLogger({ enabled: false });\n }\n return globalDebugLogger;\n}\n\n/**\n * Convenience function for logging\n */\nexport function debugLog(message: string, ...args: DebugArg[]): void {\n getDebugLogger().log(message, ...args);\n}\n\n/**\n * Convenience function for warning\n */\nexport function debugWarn(message: string, ...args: DebugArg[]): void {\n getDebugLogger().warn(message, ...args);\n}\n\n/**\n * Convenience function for errors\n */\nexport function debugError(message: string, ...args: DebugArg[]): void {\n getDebugLogger().error(message, ...args);\n}\n\n/**\n * Create a scoped debug logger that dynamically checks global debug state\n */\nexport function createScopedLogger(scopeName: string): DebugLogger {\n // Create a scoped logger without its own enabled state\n // This allows it to dynamically check the global logger state\n return new DebugLogger({\n prefix: `[Prepr][${scopeName}]`,\n });\n}\n","// Performance utilities\n\n/**\n * Throttled function with cancellation support\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): void;\n cancel(): void;\n}\n\n/**\n * Improved throttle function with better memory management and cancellation\n * @param func - The function to throttle\n * @param delay - The delay in milliseconds\n * @returns Throttled function with cancel method\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n let lastExecTime = 0;\n\n const throttledFunc = ((...args: Parameters<T>) => {\n const currentTime = Date.now();\n const timeSinceLastExec = currentTime - lastExecTime;\n\n if (timeSinceLastExec >= delay) {\n func(...args);\n lastExecTime = currentTime;\n } else {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n lastExecTime = Date.now();\n timeoutId = null;\n }, delay - timeSinceLastExec);\n }\n }) as ThrottledFunction<T>;\n\n throttledFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttledFunc;\n}\n\n/**\n * Debounce function with cancellation support\n * @param func - The function to debounce\n * @param delay - The delay in milliseconds\n * @returns Debounced function with cancel method\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n\n const debouncedFunc = ((...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n timeoutId = null;\n }, delay);\n }) as ThrottledFunction<T>;\n\n debouncedFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debouncedFunc;\n}\n\n// Simple DOM element cache for querySelectorAll\nexport function createElementCache<T extends Element = Element>(\n query: string,\n ttl: number = 1000\n) {\n let cache: NodeListOf<T> | null = null;\n let lastCacheTime = 0;\n return () => {\n const now = Date.now();\n if (!cache || now - lastCacheTime > ttl) {\n cache = document.querySelectorAll<T>(query);\n lastCacheTime = now;\n }\n return cache;\n };\n}\n","import { ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { PreprEventType } from '../types';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// Define specific types for Prepr events\nexport interface PreprEventData {\n readonly segment?: string;\n readonly variant?: string;\n readonly editMode?: boolean;\n readonly [key: string]: string | boolean | number | undefined;\n}\n\n/**\n * Sends a Prepr event to the parent window\n * @param event - The event type to send\n * @param data - Optional event data\n */\nexport function sendPreprEvent(\n event: PreprEventType,\n data?: PreprEventData\n): void {\n if (typeof window !== 'undefined' && window.parent) {\n window.parent.postMessage(\n {\n name: 'prepr_preview_bar',\n event,\n ...data,\n },\n '*'\n );\n }\n}\n\n// Export error handling utilities\nexport * from './errors';\n\n// Export DOM service\nexport * from './dom';\n\n// Export debug utilities\nexport * from './debug';\n\n// Export performance utilities\nexport * from './performance';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/errors.ts","../../src/utils/dom.ts","../../src/utils/debug.ts","../../src/utils/performance.ts","../../src/utils/index.ts"],"names":["StegaError","createErrorInfo","type","context","error","additionalData","handleStegaError","errorInfo","handleDOMError","handleContextError","contextName","DOMService","tag","className","element","styles","property","value","rect","x1","y1","x2","y2","pointX","pointY","elements","closestElement","minDistance","distance","event","handler","options","DebugLogger","_DebugLogger","__spreadValues","_a","_b","globalDebugLogger","message","args","prefix","scopeName","__spreadProps","initDebugLogger","enabled","getDebugLogger","debugLog","debugWarn","debugError","createScopedLogger","throttle","func","delay","timeoutId","lastExecTime","throttledFunc","currentTime","timeSinceLastExec","debounce","debouncedFunc","createElementCache","query","ttl","cache","lastCacheTime","now","cn","inputs","twMerge","clsx","sendPreprEvent","data"],"mappings":"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","file":"index.js","sourcesContent":["export const StegaError = {\n DECODE_FAILED: 'STEGA_DECODE_FAILED',\n INVALID_FORMAT: 'STEGA_INVALID_FORMAT',\n DOM_MANIPULATION_FAILED: 'DOM_MANIPULATION_FAILED',\n CONTEXT_NOT_FOUND: 'CONTEXT_NOT_FOUND',\n} as const;\n\nexport type StegaErrorType = (typeof StegaError)[keyof typeof StegaError];\n\n// Define specific types for error additional data\nexport interface ErrorAdditionalData {\n input?: string;\n element?: HTMLElement;\n context?: string;\n [key: string]: string | HTMLElement | undefined;\n}\n\nexport interface ErrorInfo {\n type: StegaErrorType;\n context: string;\n message: string;\n timestamp: string;\n stack?: string;\n additionalData?: ErrorAdditionalData;\n}\n\nexport function createErrorInfo(\n type: StegaErrorType,\n context: string,\n error: Error,\n additionalData?: ErrorAdditionalData\n): ErrorInfo {\n return {\n type,\n context,\n message: error.message,\n timestamp: new Date().toISOString(),\n stack: error.stack,\n additionalData,\n };\n}\n\nexport function handleStegaError(\n error: Error,\n context: string,\n additionalData?: ErrorAdditionalData\n) {\n const errorInfo = createErrorInfo(\n StegaError.DECODE_FAILED,\n context,\n error,\n additionalData\n );\n\n console.error('Stega Error:', errorInfo);\n\n // In production, you might want to send this to an error tracking service\n if (process.env.NODE_ENV === 'production') {\n // sendToErrorTrackingService(errorInfo);\n }\n\n return errorInfo;\n}\n\nexport function handleDOMError(error: Error, context: string) {\n const errorInfo = createErrorInfo(\n StegaError.DOM_MANIPULATION_FAILED,\n context,\n error\n );\n\n console.error('DOM Error:', errorInfo);\n return errorInfo;\n}\n\nexport function handleContextError(contextName: string) {\n const error = new Error(`${contextName} must be used within its provider`);\n const errorInfo = createErrorInfo(\n StegaError.CONTEXT_NOT_FOUND,\n contextName,\n error\n );\n\n console.error('Context Error:', errorInfo);\n throw error;\n}\n","import { handleDOMError } from './errors';\n\nexport class DOMService {\n /**\n * Creates an HTML element with specified tag and class name\n */\n static createElement(tag: string, className: string): HTMLElement {\n try {\n const element = document.createElement(tag);\n element.className = className;\n return element;\n } catch (error) {\n handleDOMError(error as Error, 'createElement');\n throw error;\n }\n }\n\n /**\n * Appends an element to the document body\n */\n static appendToBody(element: HTMLElement): void {\n try {\n document.body.appendChild(element);\n } catch (error) {\n handleDOMError(error as Error, 'appendToBody');\n throw error;\n }\n }\n\n /**\n * Removes an element from the document body\n */\n static removeFromBody(element: HTMLElement): void {\n try {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n } catch (error) {\n handleDOMError(error as Error, 'removeFromBody');\n throw error;\n }\n }\n\n /**\n * Sets multiple CSS properties on an element\n */\n static setElementStyles(\n element: HTMLElement,\n styles: Record<string, string>\n ): void {\n try {\n Object.entries(styles).forEach(([property, value]) => {\n element.style.setProperty(property, value);\n });\n } catch (error) {\n handleDOMError(error as Error, 'setElementStyles');\n throw error;\n }\n }\n\n /**\n * Gets the bounding rectangle of an element\n */\n static getElementRect(element: HTMLElement): DOMRect {\n try {\n return element.getBoundingClientRect();\n } catch (error) {\n handleDOMError(error as Error, 'getElementRect');\n throw error;\n }\n }\n\n /**\n * Checks if an element is in the viewport\n */\n static isElementInViewport(element: HTMLElement): boolean {\n try {\n const rect = this.getElementRect(element);\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <=\n (window.innerWidth || document.documentElement.clientWidth)\n );\n } catch (error) {\n handleDOMError(error as Error, 'isElementInViewport');\n return false;\n }\n }\n\n /**\n * Calculates distance between two points\n */\n static calculateDistance(\n x1: number,\n y1: number,\n x2: number,\n y2: number\n ): number {\n return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n }\n\n /**\n * Finds the closest element to a point from a list of elements\n */\n static findClosestElement(\n pointX: number,\n pointY: number,\n elements: NodeListOf<Element>\n ): HTMLElement | null {\n try {\n let closestElement: HTMLElement | null = null;\n let minDistance = Infinity;\n\n elements.forEach(element => {\n const rect = this.getElementRect(element as HTMLElement);\n const distance = this.calculateDistance(\n pointX,\n pointY,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2\n );\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element as HTMLElement;\n }\n });\n\n return closestElement;\n } catch (error) {\n handleDOMError(error as Error, 'findClosestElement');\n return null;\n }\n }\n\n /**\n * Safely adds event listeners\n */\n static addEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n ): void {\n try {\n element.addEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'addEventListener');\n throw error;\n }\n }\n\n /**\n * Safely removes event listeners\n */\n static removeEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: EventListenerOptions\n ): void {\n try {\n element.removeEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'removeEventListener');\n throw error;\n }\n }\n}\n","/**\n * Debug utility for Prepr Next.js package\n * Provides centralized debug logging with performance optimizations\n */\n\n// Define specific types for debug arguments\nexport type DebugArg = string | number | boolean | null | undefined | object;\n\ninterface DebugOptions {\n enabled?: boolean;\n prefix?: string;\n}\n\nclass DebugLogger {\n private options: DebugOptions;\n\n constructor(options: DebugOptions) {\n this.options = {\n prefix: '[Prepr]',\n ...options,\n };\n }\n\n /**\n * Check if debug is enabled - checks both local and global state\n */\n private isEnabled(): boolean {\n // If this logger has a local enabled state, use it\n if (this.options.enabled !== undefined) {\n return this.options.enabled;\n }\n\n // Otherwise, check the global logger state\n return globalDebugLogger?.options?.enabled ?? false;\n }\n\n /**\n * Log a debug message if debug is enabled\n */\n log(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.log(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug warning if debug is enabled\n */\n warn(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.warn(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug error if debug is enabled\n */\n error(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.error(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Create a scoped logger with additional context\n */\n scope(scopeName: string): DebugLogger {\n return new DebugLogger({\n ...this.options,\n prefix: `${this.options.prefix}[${scopeName}]`,\n });\n }\n}\n\n// Global debug instance\nlet globalDebugLogger: DebugLogger | null = null;\n\n/**\n * Initialize the debug logger\n */\nexport function initDebugLogger(enabled: boolean = false): void {\n globalDebugLogger = new DebugLogger({ enabled });\n}\n\n/**\n * Get the debug logger instance\n */\nexport function getDebugLogger(): DebugLogger {\n if (!globalDebugLogger) {\n // Fallback to disabled logger if not initialized\n globalDebugLogger = new DebugLogger({ enabled: false });\n }\n return globalDebugLogger;\n}\n\n/**\n * Convenience function for logging\n */\nexport function debugLog(message: string, ...args: DebugArg[]): void {\n getDebugLogger().log(message, ...args);\n}\n\n/**\n * Convenience function for warning\n */\nexport function debugWarn(message: string, ...args: DebugArg[]): void {\n getDebugLogger().warn(message, ...args);\n}\n\n/**\n * Convenience function for errors\n */\nexport function debugError(message: string, ...args: DebugArg[]): void {\n getDebugLogger().error(message, ...args);\n}\n\n/**\n * Create a scoped debug logger that dynamically checks global debug state\n */\nexport function createScopedLogger(scopeName: string): DebugLogger {\n // Create a scoped logger without its own enabled state\n // This allows it to dynamically check the global logger state\n return new DebugLogger({\n prefix: `[Prepr][${scopeName}]`,\n });\n}\n","// Performance utilities\n\n/**\n * Throttled function with cancellation support\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): void;\n cancel(): void;\n}\n\n/**\n * Improved throttle function with better memory management and cancellation\n * @param func - The function to throttle\n * @param delay - The delay in milliseconds\n * @returns Throttled function with cancel method\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n let lastExecTime = 0;\n\n const throttledFunc = ((...args: Parameters<T>) => {\n const currentTime = Date.now();\n const timeSinceLastExec = currentTime - lastExecTime;\n\n if (timeSinceLastExec >= delay) {\n func(...args);\n lastExecTime = currentTime;\n } else {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n lastExecTime = Date.now();\n timeoutId = null;\n }, delay - timeSinceLastExec);\n }\n }) as ThrottledFunction<T>;\n\n throttledFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttledFunc;\n}\n\n/**\n * Debounce function with cancellation support\n * @param func - The function to debounce\n * @param delay - The delay in milliseconds\n * @returns Debounced function with cancel method\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n\n const debouncedFunc = ((...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n timeoutId = null;\n }, delay);\n }) as ThrottledFunction<T>;\n\n debouncedFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debouncedFunc;\n}\n\n// Simple DOM element cache for querySelectorAll\nexport function createElementCache<T extends Element = Element>(\n query: string,\n ttl: number = 1000\n) {\n let cache: NodeListOf<T> | null = null;\n let lastCacheTime = 0;\n return () => {\n const now = Date.now();\n if (!cache || now - lastCacheTime > ttl) {\n cache = document.querySelectorAll<T>(query);\n lastCacheTime = now;\n }\n return cache;\n };\n}\n","import { ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { PreprEventType } from '../types';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// Define specific types for Prepr events\nexport interface PreprEventData {\n readonly segment?: string;\n readonly variant?: string;\n readonly editMode?: boolean;\n readonly [key: string]: string | boolean | number | undefined;\n}\n\n/**\n * Sends a Prepr event to both the current window and parent window\n * @param event - The event type to send\n * @param data - Optional event data\n */\nexport function sendPreprEvent(\n event: PreprEventType,\n data?: PreprEventData\n): void {\n if (typeof window !== 'undefined') {\n const message = {\n name: 'prepr_preview_bar',\n event,\n ...data,\n };\n\n // Send to current window for local event handling\n window.dispatchEvent(\n new CustomEvent('prepr_preview_bar', { detail: message })\n );\n\n // Send to parent window if available\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(message, '*');\n }\n }\n}\n\n// Export error handling utilities\nexport * from './errors';\n\n// Export DOM service\nexport * from './dom';\n\n// Export debug utilities\nexport * from './debug';\n\n// Export performance utilities\nexport * from './performance';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@preprio/prepr-nextjs",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
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",
|