@preprio/prepr-nextjs 1.0.0-beta.9 → 1.0.1

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/index.js CHANGED
@@ -49,23 +49,62 @@ __export(src_exports, {
49
49
  });
50
50
  module.exports = __toCommonJS(src_exports);
51
51
  var import_server = require("next/server");
52
+ var import_functions = require("@vercel/functions");
52
53
  var import_headers = require("next/headers");
53
54
  function PreprMiddleware(request, response) {
54
- var _a, _b, _c;
55
+ var _a, _b, _c, _d;
55
56
  const newResponse = response || import_server.NextResponse.next();
56
- let cookie = (_a = request.cookies.get("__prepr_uid")) == null ? void 0 : _a.value;
57
+ const utm_source = request.nextUrl.searchParams.get("utm_source");
58
+ const utm_medium = request.nextUrl.searchParams.get("utm_medium");
59
+ const utm_term = request.nextUrl.searchParams.get("utm_term");
60
+ const utm_content = request.nextUrl.searchParams.get("utm_content");
61
+ const utm_campaign = request.nextUrl.searchParams.get("utm_campaign");
62
+ const initial_referral = request.headers.get("referer");
63
+ const ip = (0, import_functions.ipAddress)(request);
64
+ if (ip) {
65
+ newResponse.headers.set("Prepr-Visitor-IP", ip);
66
+ }
67
+ const hutkCookie = (_a = request.cookies.get("hubspotutk")) == null ? void 0 : _a.value;
68
+ if (utm_source) {
69
+ newResponse.headers.set("Prepr-Context-utm_source", utm_source);
70
+ }
71
+ if (utm_medium) {
72
+ newResponse.headers.set("Prepr-Context-utm_medium", utm_medium);
73
+ }
74
+ if (utm_term) {
75
+ newResponse.headers.set("Prepr-Context-utm_term", utm_term);
76
+ }
77
+ if (utm_content) {
78
+ newResponse.headers.set("Prepr-Context-utm_content", utm_content);
79
+ }
80
+ if (utm_campaign) {
81
+ newResponse.headers.set("Prepr-Context-utm_campaign", utm_campaign);
82
+ }
83
+ if (hutkCookie) {
84
+ newResponse.headers.set("Prepr-Hubspot-Id", hutkCookie);
85
+ }
86
+ if (initial_referral) {
87
+ newResponse.headers.set(
88
+ "prepr-context-initial_referral",
89
+ initial_referral
90
+ );
91
+ }
92
+ let cookie = (_b = request.cookies.get("__prepr_uid")) == null ? void 0 : _b.value;
57
93
  if (!cookie) {
58
94
  cookie = crypto.randomUUID();
59
95
  newResponse.cookies.set("__prepr_uid", cookie, {
60
96
  maxAge: 1 * 365 * 24 * 60
61
97
  // Set for one year
62
98
  });
99
+ newResponse.headers.set("Prepr-Customer-Id-Created", "true");
63
100
  }
64
101
  newResponse.headers.set("Prepr-Customer-Id", cookie);
65
102
  if (process.env.PREPR_ENV === "preview") {
66
103
  newResponse.headers.set("Prepr-Preview-Bar", "true");
67
- if (request.nextUrl.searchParams.has("segments")) {
68
- const segments = request.nextUrl.searchParams.get("segments");
104
+ if (request.nextUrl.searchParams.has("prepr_preview_segment")) {
105
+ const segments = request.nextUrl.searchParams.get(
106
+ "prepr_preview_segment"
107
+ );
69
108
  if (segments) {
70
109
  newResponse.headers.set("Prepr-Segments", segments);
71
110
  newResponse.cookies.set("Prepr-Segments", segments, {
@@ -74,8 +113,8 @@ function PreprMiddleware(request, response) {
74
113
  });
75
114
  }
76
115
  }
77
- if (request.nextUrl.searchParams.has("a-b-testing")) {
78
- const ab_testing = request.nextUrl.searchParams.get("a-b-testing");
116
+ if (request.nextUrl.searchParams.has("prepr_preview_ab")) {
117
+ const ab_testing = request.nextUrl.searchParams.get("prepr_preview_ab");
79
118
  let value = ab_testing == null ? void 0 : ab_testing.toUpperCase();
80
119
  if (value === "B") {
81
120
  value = "B";
@@ -88,11 +127,11 @@ function PreprMiddleware(request, response) {
88
127
  // Set for one year
89
128
  });
90
129
  }
91
- const segmentCookie = (_b = request.cookies.get("Prepr-Segments")) == null ? void 0 : _b.value;
130
+ const segmentCookie = (_c = request.cookies.get("Prepr-Segments")) == null ? void 0 : _c.value;
92
131
  if (segmentCookie) {
93
132
  newResponse.headers.set("Prepr-Segments", segmentCookie);
94
133
  }
95
- const abCookie = (_c = request.cookies.get("Prepr-ABtesting")) == null ? void 0 : _c.value;
134
+ const abCookie = (_d = request.cookies.get("Prepr-ABtesting")) == null ? void 0 : _d.value;
96
135
  if (abCookie) {
97
136
  newResponse.headers.set("Prepr-ABtesting", abCookie);
98
137
  }
@@ -131,20 +170,49 @@ function getPreprHeaders() {
131
170
  }
132
171
  function getPreprEnvironmentSegments(token) {
133
172
  return __async(this, null, function* () {
134
- const response = yield fetch("https://api.eu1.prepr.io/segments", {
135
- headers: {
136
- Authorization: `Bearer ${token}`,
137
- "User-Agent": "Prepr-Preview-Bar/1.0"
173
+ try {
174
+ const response = yield fetch("https://api.eu1.prepr.io/segments", {
175
+ headers: {
176
+ Authorization: `Bearer ${token}`,
177
+ "User-Agent": "Prepr-Preview-Bar/1.0"
178
+ }
179
+ });
180
+ try {
181
+ return yield response.json();
182
+ } catch (jsonError) {
183
+ console.error("Error parsing JSON, please contact Prepr support");
184
+ return {
185
+ total: 0,
186
+ skip: 0,
187
+ limit: 0,
188
+ items: []
189
+ };
138
190
  }
139
- });
140
- return response.json();
191
+ } catch (error) {
192
+ console.error("Error fetching segments:", error);
193
+ return {
194
+ total: 0,
195
+ skip: 0,
196
+ limit: 0,
197
+ items: []
198
+ };
199
+ }
141
200
  });
142
201
  }
143
202
  function getPreviewBarProps(token) {
144
203
  return __async(this, null, function* () {
145
- const data = yield getPreprEnvironmentSegments(token);
146
- const activeSegment = yield getActiveSegment();
147
- const activeVariant = yield getActiveVariant();
204
+ let data = {
205
+ total: 0,
206
+ skip: 0,
207
+ limit: 0,
208
+ items: []
209
+ };
210
+ let activeSegment, activeVariant;
211
+ if (process.env.PREPR_ENV === "preview") {
212
+ data = yield getPreprEnvironmentSegments(token);
213
+ activeSegment = yield getActiveSegment();
214
+ activeVariant = yield getActiveVariant();
215
+ }
148
216
  return {
149
217
  activeSegment,
150
218
  activeVariant,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport { headers } from 'next/headers'\n\nexport function PreprMiddleware(request: NextRequest, response?: NextResponse) {\n const newResponse = response || NextResponse.next()\n\n let cookie = request.cookies.get('__prepr_uid')?.value\n\n if (!cookie) {\n cookie = crypto.randomUUID()\n newResponse.cookies.set('__prepr_uid', cookie, {\n maxAge: 1 * 365 * 24 * 60, // Set for one year\n })\n }\n\n newResponse.headers.set('Prepr-Customer-Id', cookie)\n\n if (process.env.PREPR_ENV === 'preview') {\n newResponse.headers.set('Prepr-Preview-Bar', 'true')\n\n if (request.nextUrl.searchParams.has('segments')) {\n const segments = request.nextUrl.searchParams.get('segments')\n\n if (segments) {\n newResponse.headers.set('Prepr-Segments', segments)\n newResponse.cookies.set('Prepr-Segments', segments, {\n maxAge: 60, // Set for one year\n })\n }\n }\n\n if (request.nextUrl.searchParams.has('a-b-testing')) {\n const ab_testing = request.nextUrl.searchParams.get('a-b-testing')\n let value = ab_testing?.toUpperCase()\n if (value === 'B') {\n value = 'B'\n } else {\n value = 'A'\n }\n newResponse.headers.set('Prepr-ABtesting', value)\n newResponse.cookies.set('Prepr-ABtesting', value, {\n maxAge: 60, // Set for one year\n })\n }\n\n const segmentCookie = request.cookies.get('Prepr-Segments')?.value\n if (segmentCookie) {\n newResponse.headers.set('Prepr-Segments', segmentCookie)\n }\n\n const abCookie = request.cookies.get('Prepr-ABtesting')?.value\n if (abCookie) {\n newResponse.headers.set('Prepr-ABtesting', abCookie)\n }\n }\n\n return newResponse\n}\n\n/**\n * Returns the Prepr Customer ID from the headers\n */\nexport async function getPreprUUID() {\n const headersList = await headers()\n return headersList.get('prepr-customer-id')\n}\n\n/**\n * Retuns the active segment from the headers\n */\nexport async function getActiveSegment() {\n const headersList = await headers()\n return headersList.get('Prepr-Segments')\n}\n\n/**\n * Returns the active variant from the headers\n */\nexport async function getActiveVariant() {\n const headersList = await headers()\n return headersList.get('Prepr-ABtesting')\n}\n\n/**\n * Helper function to retrieve Prepr headers (will filter out customer ID if in preview mode)\n */\nexport async function getPreprHeaders() {\n let newHeaders: {\n [key: string]: string\n } = {}\n\n const headersList = await headers()\n\n headersList.forEach((value, key) => {\n if (key.startsWith('prepr')) {\n newHeaders[key] = value\n }\n })\n\n return newHeaders\n}\n\nexport type PreprSegment = {\n id: string\n created_on: string\n changed_on: string\n synced_on: string\n label: string\n reference_id: string\n body: string\n query: string\n count: number\n}\n\nexport type PreprSegmentsResponse = {\n total: number\n skip: number\n limit: number\n items: PreprSegment[]\n}\n\n/**\n * Fetches the segments from the Prepr API\n * @param token Prepr access token with scope 'segments'\n * @returns Object with total, skip, limit and items\n */\nexport async function getPreprEnvironmentSegments(\n token: string\n): Promise<PreprSegmentsResponse> {\n const response = await fetch('https://api.eu1.prepr.io/segments', {\n headers: {\n Authorization: `Bearer ${token}`,\n 'User-Agent': 'Prepr-Preview-Bar/1.0',\n },\n })\n\n return response.json()\n}\n\n/**\n * Fetches all the necessary previewbar props\n * @param token Prepr access token with scope 'segments'\n * @returns Object with activeSegment, activeVariant and data\n */\nexport async function getPreviewBarProps(token: string): Promise<{\n activeSegment: string | null\n activeVariant: string | null\n data: PreprSegmentsResponse\n}> {\n const data = await getPreprEnvironmentSegments(token)\n const activeSegment = await getActiveSegment()\n const activeVariant = await getActiveVariant()\n\n return {\n activeSegment,\n activeVariant,\n data,\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { NextResponse } from 'next/server'\nimport { ipAddress } from '@vercel/functions'\nimport { headers } from 'next/headers'\n\n/**\n *\n * @param request NextRequest object\n * @param response optional NextResponse object\n */\nexport function PreprMiddleware(request: any, response?: NextResponse) {\n const newResponse = response || NextResponse.next()\n\n const utm_source = request.nextUrl.searchParams.get('utm_source')\n const utm_medium = request.nextUrl.searchParams.get('utm_medium')\n const utm_term = request.nextUrl.searchParams.get('utm_term')\n const utm_content = request.nextUrl.searchParams.get('utm_content')\n const utm_campaign = request.nextUrl.searchParams.get('utm_campaign')\n const initial_referral = request.headers.get('referer')\n\n const ip = ipAddress(request)\n\n if (ip) {\n newResponse.headers.set('Prepr-Visitor-IP', ip)\n }\n\n const hutkCookie = request.cookies.get('hubspotutk')?.value\n\n if (utm_source) {\n newResponse.headers.set('Prepr-Context-utm_source', utm_source)\n }\n\n if (utm_medium) {\n newResponse.headers.set('Prepr-Context-utm_medium', utm_medium)\n }\n\n if (utm_term) {\n newResponse.headers.set('Prepr-Context-utm_term', utm_term)\n }\n\n if (utm_content) {\n newResponse.headers.set('Prepr-Context-utm_content', utm_content)\n }\n\n if (utm_campaign) {\n newResponse.headers.set('Prepr-Context-utm_campaign', utm_campaign)\n }\n\n if (hutkCookie) {\n newResponse.headers.set('Prepr-Hubspot-Id', hutkCookie)\n }\n\n if (initial_referral) {\n newResponse.headers.set(\n 'prepr-context-initial_referral',\n initial_referral\n )\n }\n\n let cookie = request.cookies.get('__prepr_uid')?.value\n\n if (!cookie) {\n cookie = crypto.randomUUID()\n newResponse.cookies.set('__prepr_uid', cookie, {\n maxAge: 1 * 365 * 24 * 60, // Set for one year\n })\n newResponse.headers.set('Prepr-Customer-Id-Created', 'true')\n }\n\n newResponse.headers.set('Prepr-Customer-Id', cookie)\n\n if (process.env.PREPR_ENV === 'preview') {\n newResponse.headers.set('Prepr-Preview-Bar', 'true')\n\n if (request.nextUrl.searchParams.has('prepr_preview_segment')) {\n const segments = request.nextUrl.searchParams.get(\n 'prepr_preview_segment'\n )\n\n if (segments) {\n newResponse.headers.set('Prepr-Segments', segments)\n newResponse.cookies.set('Prepr-Segments', segments, {\n maxAge: 60, // Set for one year\n })\n }\n }\n\n if (request.nextUrl.searchParams.has('prepr_preview_ab')) {\n const ab_testing =\n request.nextUrl.searchParams.get('prepr_preview_ab')\n let value = ab_testing?.toUpperCase()\n if (value === 'B') {\n value = 'B'\n } else {\n value = 'A'\n }\n\n newResponse.headers.set('Prepr-ABtesting', value)\n newResponse.cookies.set('Prepr-ABtesting', value, {\n maxAge: 60, // Set for one year\n })\n }\n\n const segmentCookie = request.cookies.get('Prepr-Segments')?.value\n if (segmentCookie) {\n newResponse.headers.set('Prepr-Segments', segmentCookie)\n }\n\n const abCookie = request.cookies.get('Prepr-ABtesting')?.value\n if (abCookie) {\n newResponse.headers.set('Prepr-ABtesting', abCookie)\n }\n }\n\n return newResponse\n}\n\n/**\n * Returns the Prepr Customer ID from the headers\n */\nexport async function getPreprUUID() {\n const headersList = await headers()\n return headersList.get('prepr-customer-id')\n}\n\n/**\n * Retuns the active segment from the headers\n */\nexport async function getActiveSegment() {\n const headersList = await headers()\n return headersList.get('Prepr-Segments')\n}\n\n/**\n * Returns the active variant from the headers\n */\nexport async function getActiveVariant() {\n const headersList = await headers()\n return headersList.get('Prepr-ABtesting')\n}\n\n/**\n * Helper function to retrieve Prepr headers (will filter out customer ID if in preview mode)\n */\nexport async function getPreprHeaders() {\n let newHeaders: {\n [key: string]: string\n } = {}\n\n const headersList = await headers()\n\n headersList.forEach((value, key) => {\n if (key.startsWith('prepr')) {\n newHeaders[key] = value\n }\n })\n\n return newHeaders\n}\n\nexport type PreprSegment = {\n id: string\n created_on: string\n changed_on: string\n synced_on: string\n label: string\n reference_id: string\n body: string\n query: string\n count: number\n}\n\nexport type PreprSegmentsResponse = {\n total: number\n skip: number\n limit: number\n items: PreprSegment[]\n}\n\n/**\n * Fetches the segments from the Prepr API\n * @param token Prepr access token with scope 'segments'\n * @returns Object with total, skip, limit and items\n */\nexport async function getPreprEnvironmentSegments(\n token: string\n): Promise<PreprSegmentsResponse> {\n try {\n const response = await fetch('https://api.eu1.prepr.io/segments', {\n headers: {\n Authorization: `Bearer ${token}`,\n 'User-Agent': 'Prepr-Preview-Bar/1.0',\n },\n })\n try {\n return await response.json()\n } catch (jsonError) {\n console.error('Error parsing JSON, please contact Prepr support')\n return {\n total: 0,\n skip: 0,\n limit: 0,\n items: [],\n }\n }\n } catch (error) {\n console.error('Error fetching segments:', error)\n return {\n total: 0,\n skip: 0,\n limit: 0,\n items: [],\n }\n }\n}\n\n/**\n * Fetches all the necessary previewbar props\n * @param token Prepr access token with scope 'segments'\n * @returns Object with activeSegment, activeVariant and data\n */\nexport async function getPreviewBarProps(token: string): Promise<{\n activeSegment: string | null\n activeVariant: string | null\n data: PreprSegmentsResponse\n}> {\n let data: PreprSegmentsResponse = {\n total: 0,\n skip: 0,\n limit: 0,\n items: [],\n }\n let activeSegment, activeVariant\n\n // Prevent unnecessary function calling in production\n if (process.env.PREPR_ENV === 'preview') {\n data = await getPreprEnvironmentSegments(token)\n activeSegment = await getActiveSegment()\n activeVariant = await getActiveVariant()\n }\n\n return {\n activeSegment,\n activeVariant,\n data,\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -4,23 +4,62 @@ import {
4
4
 
5
5
  // src/index.ts
6
6
  import { NextResponse } from "next/server";
7
+ import { ipAddress } from "@vercel/functions";
7
8
  import { headers } from "next/headers";
8
9
  function PreprMiddleware(request, response) {
9
- var _a, _b, _c;
10
+ var _a, _b, _c, _d;
10
11
  const newResponse = response || NextResponse.next();
11
- let cookie = (_a = request.cookies.get("__prepr_uid")) == null ? void 0 : _a.value;
12
+ const utm_source = request.nextUrl.searchParams.get("utm_source");
13
+ const utm_medium = request.nextUrl.searchParams.get("utm_medium");
14
+ const utm_term = request.nextUrl.searchParams.get("utm_term");
15
+ const utm_content = request.nextUrl.searchParams.get("utm_content");
16
+ const utm_campaign = request.nextUrl.searchParams.get("utm_campaign");
17
+ const initial_referral = request.headers.get("referer");
18
+ const ip = ipAddress(request);
19
+ if (ip) {
20
+ newResponse.headers.set("Prepr-Visitor-IP", ip);
21
+ }
22
+ const hutkCookie = (_a = request.cookies.get("hubspotutk")) == null ? void 0 : _a.value;
23
+ if (utm_source) {
24
+ newResponse.headers.set("Prepr-Context-utm_source", utm_source);
25
+ }
26
+ if (utm_medium) {
27
+ newResponse.headers.set("Prepr-Context-utm_medium", utm_medium);
28
+ }
29
+ if (utm_term) {
30
+ newResponse.headers.set("Prepr-Context-utm_term", utm_term);
31
+ }
32
+ if (utm_content) {
33
+ newResponse.headers.set("Prepr-Context-utm_content", utm_content);
34
+ }
35
+ if (utm_campaign) {
36
+ newResponse.headers.set("Prepr-Context-utm_campaign", utm_campaign);
37
+ }
38
+ if (hutkCookie) {
39
+ newResponse.headers.set("Prepr-Hubspot-Id", hutkCookie);
40
+ }
41
+ if (initial_referral) {
42
+ newResponse.headers.set(
43
+ "prepr-context-initial_referral",
44
+ initial_referral
45
+ );
46
+ }
47
+ let cookie = (_b = request.cookies.get("__prepr_uid")) == null ? void 0 : _b.value;
12
48
  if (!cookie) {
13
49
  cookie = crypto.randomUUID();
14
50
  newResponse.cookies.set("__prepr_uid", cookie, {
15
51
  maxAge: 1 * 365 * 24 * 60
16
52
  // Set for one year
17
53
  });
54
+ newResponse.headers.set("Prepr-Customer-Id-Created", "true");
18
55
  }
19
56
  newResponse.headers.set("Prepr-Customer-Id", cookie);
20
57
  if (process.env.PREPR_ENV === "preview") {
21
58
  newResponse.headers.set("Prepr-Preview-Bar", "true");
22
- if (request.nextUrl.searchParams.has("segments")) {
23
- const segments = request.nextUrl.searchParams.get("segments");
59
+ if (request.nextUrl.searchParams.has("prepr_preview_segment")) {
60
+ const segments = request.nextUrl.searchParams.get(
61
+ "prepr_preview_segment"
62
+ );
24
63
  if (segments) {
25
64
  newResponse.headers.set("Prepr-Segments", segments);
26
65
  newResponse.cookies.set("Prepr-Segments", segments, {
@@ -29,8 +68,8 @@ function PreprMiddleware(request, response) {
29
68
  });
30
69
  }
31
70
  }
32
- if (request.nextUrl.searchParams.has("a-b-testing")) {
33
- const ab_testing = request.nextUrl.searchParams.get("a-b-testing");
71
+ if (request.nextUrl.searchParams.has("prepr_preview_ab")) {
72
+ const ab_testing = request.nextUrl.searchParams.get("prepr_preview_ab");
34
73
  let value = ab_testing == null ? void 0 : ab_testing.toUpperCase();
35
74
  if (value === "B") {
36
75
  value = "B";
@@ -43,11 +82,11 @@ function PreprMiddleware(request, response) {
43
82
  // Set for one year
44
83
  });
45
84
  }
46
- const segmentCookie = (_b = request.cookies.get("Prepr-Segments")) == null ? void 0 : _b.value;
85
+ const segmentCookie = (_c = request.cookies.get("Prepr-Segments")) == null ? void 0 : _c.value;
47
86
  if (segmentCookie) {
48
87
  newResponse.headers.set("Prepr-Segments", segmentCookie);
49
88
  }
50
- const abCookie = (_c = request.cookies.get("Prepr-ABtesting")) == null ? void 0 : _c.value;
89
+ const abCookie = (_d = request.cookies.get("Prepr-ABtesting")) == null ? void 0 : _d.value;
51
90
  if (abCookie) {
52
91
  newResponse.headers.set("Prepr-ABtesting", abCookie);
53
92
  }
@@ -86,20 +125,49 @@ function getPreprHeaders() {
86
125
  }
87
126
  function getPreprEnvironmentSegments(token) {
88
127
  return __async(this, null, function* () {
89
- const response = yield fetch("https://api.eu1.prepr.io/segments", {
90
- headers: {
91
- Authorization: `Bearer ${token}`,
92
- "User-Agent": "Prepr-Preview-Bar/1.0"
128
+ try {
129
+ const response = yield fetch("https://api.eu1.prepr.io/segments", {
130
+ headers: {
131
+ Authorization: `Bearer ${token}`,
132
+ "User-Agent": "Prepr-Preview-Bar/1.0"
133
+ }
134
+ });
135
+ try {
136
+ return yield response.json();
137
+ } catch (jsonError) {
138
+ console.error("Error parsing JSON, please contact Prepr support");
139
+ return {
140
+ total: 0,
141
+ skip: 0,
142
+ limit: 0,
143
+ items: []
144
+ };
93
145
  }
94
- });
95
- return response.json();
146
+ } catch (error) {
147
+ console.error("Error fetching segments:", error);
148
+ return {
149
+ total: 0,
150
+ skip: 0,
151
+ limit: 0,
152
+ items: []
153
+ };
154
+ }
96
155
  });
97
156
  }
98
157
  function getPreviewBarProps(token) {
99
158
  return __async(this, null, function* () {
100
- const data = yield getPreprEnvironmentSegments(token);
101
- const activeSegment = yield getActiveSegment();
102
- const activeVariant = yield getActiveVariant();
159
+ let data = {
160
+ total: 0,
161
+ skip: 0,
162
+ limit: 0,
163
+ items: []
164
+ };
165
+ let activeSegment, activeVariant;
166
+ if (process.env.PREPR_ENV === "preview") {
167
+ data = yield getPreprEnvironmentSegments(token);
168
+ activeSegment = yield getActiveSegment();
169
+ activeVariant = yield getActiveVariant();
170
+ }
103
171
  return {
104
172
  activeSegment,
105
173
  activeVariant,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport { headers } from 'next/headers'\n\nexport function PreprMiddleware(request: NextRequest, response?: NextResponse) {\n const newResponse = response || NextResponse.next()\n\n let cookie = request.cookies.get('__prepr_uid')?.value\n\n if (!cookie) {\n cookie = crypto.randomUUID()\n newResponse.cookies.set('__prepr_uid', cookie, {\n maxAge: 1 * 365 * 24 * 60, // Set for one year\n })\n }\n\n newResponse.headers.set('Prepr-Customer-Id', cookie)\n\n if (process.env.PREPR_ENV === 'preview') {\n newResponse.headers.set('Prepr-Preview-Bar', 'true')\n\n if (request.nextUrl.searchParams.has('segments')) {\n const segments = request.nextUrl.searchParams.get('segments')\n\n if (segments) {\n newResponse.headers.set('Prepr-Segments', segments)\n newResponse.cookies.set('Prepr-Segments', segments, {\n maxAge: 60, // Set for one year\n })\n }\n }\n\n if (request.nextUrl.searchParams.has('a-b-testing')) {\n const ab_testing = request.nextUrl.searchParams.get('a-b-testing')\n let value = ab_testing?.toUpperCase()\n if (value === 'B') {\n value = 'B'\n } else {\n value = 'A'\n }\n newResponse.headers.set('Prepr-ABtesting', value)\n newResponse.cookies.set('Prepr-ABtesting', value, {\n maxAge: 60, // Set for one year\n })\n }\n\n const segmentCookie = request.cookies.get('Prepr-Segments')?.value\n if (segmentCookie) {\n newResponse.headers.set('Prepr-Segments', segmentCookie)\n }\n\n const abCookie = request.cookies.get('Prepr-ABtesting')?.value\n if (abCookie) {\n newResponse.headers.set('Prepr-ABtesting', abCookie)\n }\n }\n\n return newResponse\n}\n\n/**\n * Returns the Prepr Customer ID from the headers\n */\nexport async function getPreprUUID() {\n const headersList = await headers()\n return headersList.get('prepr-customer-id')\n}\n\n/**\n * Retuns the active segment from the headers\n */\nexport async function getActiveSegment() {\n const headersList = await headers()\n return headersList.get('Prepr-Segments')\n}\n\n/**\n * Returns the active variant from the headers\n */\nexport async function getActiveVariant() {\n const headersList = await headers()\n return headersList.get('Prepr-ABtesting')\n}\n\n/**\n * Helper function to retrieve Prepr headers (will filter out customer ID if in preview mode)\n */\nexport async function getPreprHeaders() {\n let newHeaders: {\n [key: string]: string\n } = {}\n\n const headersList = await headers()\n\n headersList.forEach((value, key) => {\n if (key.startsWith('prepr')) {\n newHeaders[key] = value\n }\n })\n\n return newHeaders\n}\n\nexport type PreprSegment = {\n id: string\n created_on: string\n changed_on: string\n synced_on: string\n label: string\n reference_id: string\n body: string\n query: string\n count: number\n}\n\nexport type PreprSegmentsResponse = {\n total: number\n skip: number\n limit: number\n items: PreprSegment[]\n}\n\n/**\n * Fetches the segments from the Prepr API\n * @param token Prepr access token with scope 'segments'\n * @returns Object with total, skip, limit and items\n */\nexport async function getPreprEnvironmentSegments(\n token: string\n): Promise<PreprSegmentsResponse> {\n const response = await fetch('https://api.eu1.prepr.io/segments', {\n headers: {\n Authorization: `Bearer ${token}`,\n 'User-Agent': 'Prepr-Preview-Bar/1.0',\n },\n })\n\n return response.json()\n}\n\n/**\n * Fetches all the necessary previewbar props\n * @param token Prepr access token with scope 'segments'\n * @returns Object with activeSegment, activeVariant and data\n */\nexport async function getPreviewBarProps(token: string): Promise<{\n activeSegment: string | null\n activeVariant: string | null\n data: PreprSegmentsResponse\n}> {\n const data = await getPreprEnvironmentSegments(token)\n const activeSegment = await getActiveSegment()\n const activeVariant = await getActiveVariant()\n\n return {\n activeSegment,\n activeVariant,\n data,\n }\n}\n"],"mappings":";;;;;AAAA,SAAsB,oBAAoB;AAC1C,SAAS,eAAe;AAEjB,SAAS,gBAAgB,SAAsB,UAAyB;AAH/E;AAII,QAAM,cAAc,YAAY,aAAa,KAAK;AAElD,MAAI,UAAS,aAAQ,QAAQ,IAAI,aAAa,MAAjC,mBAAoC;AAEjD,MAAI,CAAC,QAAQ;AACT,aAAS,OAAO,WAAW;AAC3B,gBAAY,QAAQ,IAAI,eAAe,QAAQ;AAAA,MAC3C,QAAQ,IAAI,MAAM,KAAK;AAAA;AAAA,IAC3B,CAAC;AAAA,EACL;AAEA,cAAY,QAAQ,IAAI,qBAAqB,MAAM;AAEnD,MAAI,QAAQ,IAAI,cAAc,WAAW;AACrC,gBAAY,QAAQ,IAAI,qBAAqB,MAAM;AAEnD,QAAI,QAAQ,QAAQ,aAAa,IAAI,UAAU,GAAG;AAC9C,YAAM,WAAW,QAAQ,QAAQ,aAAa,IAAI,UAAU;AAE5D,UAAI,UAAU;AACV,oBAAY,QAAQ,IAAI,kBAAkB,QAAQ;AAClD,oBAAY,QAAQ,IAAI,kBAAkB,UAAU;AAAA,UAChD,QAAQ;AAAA;AAAA,QACZ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,QAAI,QAAQ,QAAQ,aAAa,IAAI,aAAa,GAAG;AACjD,YAAM,aAAa,QAAQ,QAAQ,aAAa,IAAI,aAAa;AACjE,UAAI,QAAQ,yCAAY;AACxB,UAAI,UAAU,KAAK;AACf,gBAAQ;AAAA,MACZ,OAAO;AACH,gBAAQ;AAAA,MACZ;AACA,kBAAY,QAAQ,IAAI,mBAAmB,KAAK;AAChD,kBAAY,QAAQ,IAAI,mBAAmB,OAAO;AAAA,QAC9C,QAAQ;AAAA;AAAA,MACZ,CAAC;AAAA,IACL;AAEA,UAAM,iBAAgB,aAAQ,QAAQ,IAAI,gBAAgB,MAApC,mBAAuC;AAC7D,QAAI,eAAe;AACf,kBAAY,QAAQ,IAAI,kBAAkB,aAAa;AAAA,IAC3D;AAEA,UAAM,YAAW,aAAQ,QAAQ,IAAI,iBAAiB,MAArC,mBAAwC;AACzD,QAAI,UAAU;AACV,kBAAY,QAAQ,IAAI,mBAAmB,QAAQ;AAAA,IACvD;AAAA,EACJ;AAEA,SAAO;AACX;AAKA,SAAsB,eAAe;AAAA;AACjC,UAAM,cAAc,MAAM,QAAQ;AAClC,WAAO,YAAY,IAAI,mBAAmB;AAAA,EAC9C;AAAA;AAKA,SAAsB,mBAAmB;AAAA;AACrC,UAAM,cAAc,MAAM,QAAQ;AAClC,WAAO,YAAY,IAAI,gBAAgB;AAAA,EAC3C;AAAA;AAKA,SAAsB,mBAAmB;AAAA;AACrC,UAAM,cAAc,MAAM,QAAQ;AAClC,WAAO,YAAY,IAAI,iBAAiB;AAAA,EAC5C;AAAA;AAKA,SAAsB,kBAAkB;AAAA;AACpC,QAAI,aAEA,CAAC;AAEL,UAAM,cAAc,MAAM,QAAQ;AAElC,gBAAY,QAAQ,CAAC,OAAO,QAAQ;AAChC,UAAI,IAAI,WAAW,OAAO,GAAG;AACzB,mBAAW,GAAG,IAAI;AAAA,MACtB;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX;AAAA;AA0BA,SAAsB,4BAClB,OAC8B;AAAA;AAC9B,UAAM,WAAW,MAAM,MAAM,qCAAqC;AAAA,MAC9D,SAAS;AAAA,QACL,eAAe,UAAU,KAAK;AAAA,QAC9B,cAAc;AAAA,MAClB;AAAA,IACJ,CAAC;AAED,WAAO,SAAS,KAAK;AAAA,EACzB;AAAA;AAOA,SAAsB,mBAAmB,OAItC;AAAA;AACC,UAAM,OAAO,MAAM,4BAA4B,KAAK;AACpD,UAAM,gBAAgB,MAAM,iBAAiB;AAC7C,UAAM,gBAAgB,MAAM,iBAAiB;AAE7C,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { NextResponse } from 'next/server'\nimport { ipAddress } from '@vercel/functions'\nimport { headers } from 'next/headers'\n\n/**\n *\n * @param request NextRequest object\n * @param response optional NextResponse object\n */\nexport function PreprMiddleware(request: any, response?: NextResponse) {\n const newResponse = response || NextResponse.next()\n\n const utm_source = request.nextUrl.searchParams.get('utm_source')\n const utm_medium = request.nextUrl.searchParams.get('utm_medium')\n const utm_term = request.nextUrl.searchParams.get('utm_term')\n const utm_content = request.nextUrl.searchParams.get('utm_content')\n const utm_campaign = request.nextUrl.searchParams.get('utm_campaign')\n const initial_referral = request.headers.get('referer')\n\n const ip = ipAddress(request)\n\n if (ip) {\n newResponse.headers.set('Prepr-Visitor-IP', ip)\n }\n\n const hutkCookie = request.cookies.get('hubspotutk')?.value\n\n if (utm_source) {\n newResponse.headers.set('Prepr-Context-utm_source', utm_source)\n }\n\n if (utm_medium) {\n newResponse.headers.set('Prepr-Context-utm_medium', utm_medium)\n }\n\n if (utm_term) {\n newResponse.headers.set('Prepr-Context-utm_term', utm_term)\n }\n\n if (utm_content) {\n newResponse.headers.set('Prepr-Context-utm_content', utm_content)\n }\n\n if (utm_campaign) {\n newResponse.headers.set('Prepr-Context-utm_campaign', utm_campaign)\n }\n\n if (hutkCookie) {\n newResponse.headers.set('Prepr-Hubspot-Id', hutkCookie)\n }\n\n if (initial_referral) {\n newResponse.headers.set(\n 'prepr-context-initial_referral',\n initial_referral\n )\n }\n\n let cookie = request.cookies.get('__prepr_uid')?.value\n\n if (!cookie) {\n cookie = crypto.randomUUID()\n newResponse.cookies.set('__prepr_uid', cookie, {\n maxAge: 1 * 365 * 24 * 60, // Set for one year\n })\n newResponse.headers.set('Prepr-Customer-Id-Created', 'true')\n }\n\n newResponse.headers.set('Prepr-Customer-Id', cookie)\n\n if (process.env.PREPR_ENV === 'preview') {\n newResponse.headers.set('Prepr-Preview-Bar', 'true')\n\n if (request.nextUrl.searchParams.has('prepr_preview_segment')) {\n const segments = request.nextUrl.searchParams.get(\n 'prepr_preview_segment'\n )\n\n if (segments) {\n newResponse.headers.set('Prepr-Segments', segments)\n newResponse.cookies.set('Prepr-Segments', segments, {\n maxAge: 60, // Set for one year\n })\n }\n }\n\n if (request.nextUrl.searchParams.has('prepr_preview_ab')) {\n const ab_testing =\n request.nextUrl.searchParams.get('prepr_preview_ab')\n let value = ab_testing?.toUpperCase()\n if (value === 'B') {\n value = 'B'\n } else {\n value = 'A'\n }\n\n newResponse.headers.set('Prepr-ABtesting', value)\n newResponse.cookies.set('Prepr-ABtesting', value, {\n maxAge: 60, // Set for one year\n })\n }\n\n const segmentCookie = request.cookies.get('Prepr-Segments')?.value\n if (segmentCookie) {\n newResponse.headers.set('Prepr-Segments', segmentCookie)\n }\n\n const abCookie = request.cookies.get('Prepr-ABtesting')?.value\n if (abCookie) {\n newResponse.headers.set('Prepr-ABtesting', abCookie)\n }\n }\n\n return newResponse\n}\n\n/**\n * Returns the Prepr Customer ID from the headers\n */\nexport async function getPreprUUID() {\n const headersList = await headers()\n return headersList.get('prepr-customer-id')\n}\n\n/**\n * Retuns the active segment from the headers\n */\nexport async function getActiveSegment() {\n const headersList = await headers()\n return headersList.get('Prepr-Segments')\n}\n\n/**\n * Returns the active variant from the headers\n */\nexport async function getActiveVariant() {\n const headersList = await headers()\n return headersList.get('Prepr-ABtesting')\n}\n\n/**\n * Helper function to retrieve Prepr headers (will filter out customer ID if in preview mode)\n */\nexport async function getPreprHeaders() {\n let newHeaders: {\n [key: string]: string\n } = {}\n\n const headersList = await headers()\n\n headersList.forEach((value, key) => {\n if (key.startsWith('prepr')) {\n newHeaders[key] = value\n }\n })\n\n return newHeaders\n}\n\nexport type PreprSegment = {\n id: string\n created_on: string\n changed_on: string\n synced_on: string\n label: string\n reference_id: string\n body: string\n query: string\n count: number\n}\n\nexport type PreprSegmentsResponse = {\n total: number\n skip: number\n limit: number\n items: PreprSegment[]\n}\n\n/**\n * Fetches the segments from the Prepr API\n * @param token Prepr access token with scope 'segments'\n * @returns Object with total, skip, limit and items\n */\nexport async function getPreprEnvironmentSegments(\n token: string\n): Promise<PreprSegmentsResponse> {\n try {\n const response = await fetch('https://api.eu1.prepr.io/segments', {\n headers: {\n Authorization: `Bearer ${token}`,\n 'User-Agent': 'Prepr-Preview-Bar/1.0',\n },\n })\n try {\n return await response.json()\n } catch (jsonError) {\n console.error('Error parsing JSON, please contact Prepr support')\n return {\n total: 0,\n skip: 0,\n limit: 0,\n items: [],\n }\n }\n } catch (error) {\n console.error('Error fetching segments:', error)\n return {\n total: 0,\n skip: 0,\n limit: 0,\n items: [],\n }\n }\n}\n\n/**\n * Fetches all the necessary previewbar props\n * @param token Prepr access token with scope 'segments'\n * @returns Object with activeSegment, activeVariant and data\n */\nexport async function getPreviewBarProps(token: string): Promise<{\n activeSegment: string | null\n activeVariant: string | null\n data: PreprSegmentsResponse\n}> {\n let data: PreprSegmentsResponse = {\n total: 0,\n skip: 0,\n limit: 0,\n items: [],\n }\n let activeSegment, activeVariant\n\n // Prevent unnecessary function calling in production\n if (process.env.PREPR_ENV === 'preview') {\n data = await getPreprEnvironmentSegments(token)\n activeSegment = await getActiveSegment()\n activeVariant = await getActiveVariant()\n }\n\n return {\n activeSegment,\n activeVariant,\n data,\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@preprio/prepr-nextjs",
3
- "version": "1.0.0-beta.9",
4
- "description": "A next.js package with code snippets to use with Prepr",
3
+ "version": "1.0.1",
4
+ "description": "A next.js package containing helper functions and a preview bar to use in combination with Prepr",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "module": "./dist/index.mjs",
@@ -11,14 +11,14 @@
11
11
  ],
12
12
  "exports": {
13
13
  ".": {
14
+ "types": "./dist/index.d.ts",
14
15
  "import": "./dist/index.js",
15
- "require": "./dist/index.js",
16
- "types": "./dist/index.d.ts"
16
+ "require": "./dist/index.js"
17
17
  },
18
18
  "./components": {
19
+ "types": "./dist/components.d.ts",
19
20
  "import": "./dist/components.js",
20
- "require": "./dist/components.js",
21
- "types": "./dist/components.d.ts"
21
+ "require": "./dist/components.js"
22
22
  },
23
23
  "./dist/components.css": {
24
24
  "import": "./dist/components.css",
@@ -33,7 +33,7 @@
33
33
  "build": "tsup",
34
34
  "dev": "tsup --watch"
35
35
  },
36
- "author": "",
36
+ "author": "Prepr",
37
37
  "license": "ISC",
38
38
  "devDependencies": {
39
39
  "@types/react": "^18.3.3",
@@ -47,11 +47,15 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "@headlessui/react": "^2.1.8",
50
+ "@vercel/functions": "^1.6.0",
50
51
  "classnames": "^2.5.1",
51
- "next": "14.2.10",
52
+ "clsx": "^2.1.1",
53
+ "micromatch": "^4.0.8",
54
+ "next": "^14.2.10",
52
55
  "react": "^18.3.1",
53
56
  "react-dom": "^18.3.1",
54
- "react-icons": "^5.3.0"
57
+ "react-icons": "^5.3.0",
58
+ "rollup": "^4.22.4"
55
59
  },
56
60
  "repository": {
57
61
  "type": "git",