@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/README.md +31 -26
- package/dist/components.css +168 -49
- package/dist/components.css.map +1 -1
- package/dist/components.js +205 -99
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +207 -101
- package/dist/components.mjs.map +1 -1
- package/dist/index.d.mts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +85 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +85 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -9
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
|
-
|
|
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("
|
|
68
|
-
const segments = request.nextUrl.searchParams.get(
|
|
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("
|
|
78
|
-
const ab_testing = request.nextUrl.searchParams.get("
|
|
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 = (
|
|
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 = (
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0C;AAC1C,qBAAwB;AAEjB,SAAS,gBAAgB,SAAsB,UAAyB;AAH/E;AAII,QAAM,cAAc,YAAY,2BAAa,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,UAAM,wBAAQ;AAClC,WAAO,YAAY,IAAI,mBAAmB;AAAA,EAC9C;AAAA;AAKA,SAAsB,mBAAmB;AAAA;AACrC,UAAM,cAAc,UAAM,wBAAQ;AAClC,WAAO,YAAY,IAAI,gBAAgB;AAAA,EAC3C;AAAA;AAKA,SAAsB,mBAAmB;AAAA;AACrC,UAAM,cAAc,UAAM,wBAAQ;AAClC,WAAO,YAAY,IAAI,iBAAiB;AAAA,EAC5C;AAAA;AAKA,SAAsB,kBAAkB;AAAA;AACpC,QAAI,aAEA,CAAC;AAEL,UAAM,cAAc,UAAM,wBAAQ;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/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
|
-
|
|
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("
|
|
23
|
-
const segments = request.nextUrl.searchParams.get(
|
|
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("
|
|
33
|
-
const ab_testing = request.nextUrl.searchParams.get("
|
|
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 = (
|
|
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 = (
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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,
|
package/dist/index.mjs.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":";;;;;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.
|
|
4
|
-
"description": "A next.js package
|
|
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
|
-
"
|
|
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",
|