@preprio/prepr-nextjs 1.0.0-beta.0
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 +135 -0
- package/dist/chunk-IQXHJV5O.mjs +25 -0
- package/dist/chunk-IQXHJV5O.mjs.map +1 -0
- package/dist/components.css +326 -0
- package/dist/components.css.map +1 -0
- package/dist/components.d.mts +9 -0
- package/dist/components.d.ts +9 -0
- package/dist/components.js +270 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +243 -0
- package/dist/components.mjs.map +1 -0
- package/dist/index.d.mts +62 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +119 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +68 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
declare function PreprMiddleware(request: NextRequest, response?: NextResponse): NextResponse<unknown>;
|
|
4
|
+
/**
|
|
5
|
+
* Returns the Prepr Customer ID from the headers
|
|
6
|
+
*/
|
|
7
|
+
declare function getPreprUUID(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Retuns the active segment from the headers
|
|
10
|
+
*/
|
|
11
|
+
declare function getActiveSegment(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Returns the active variant from the headers
|
|
14
|
+
*/
|
|
15
|
+
declare function getActiveVariant(): string;
|
|
16
|
+
/**
|
|
17
|
+
* Helper function to only retrieve Prepr preview headers
|
|
18
|
+
*/
|
|
19
|
+
declare function getPreviewHeaders(): {
|
|
20
|
+
[key: string]: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Helper function to retrieve Prepr headers (will filter out customer ID if in preview mode)
|
|
24
|
+
*/
|
|
25
|
+
declare function getPreprHeaders(): {
|
|
26
|
+
[key: string]: string;
|
|
27
|
+
};
|
|
28
|
+
type PreprSegment = {
|
|
29
|
+
id: string;
|
|
30
|
+
created_on: string;
|
|
31
|
+
changed_on: string;
|
|
32
|
+
synced_on: string;
|
|
33
|
+
label: string;
|
|
34
|
+
reference_id: string;
|
|
35
|
+
body: string;
|
|
36
|
+
query: string;
|
|
37
|
+
count: number;
|
|
38
|
+
};
|
|
39
|
+
type PreprSegmentsResponse = {
|
|
40
|
+
total: number;
|
|
41
|
+
skip: number;
|
|
42
|
+
limit: number;
|
|
43
|
+
items: PreprSegment[];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Fetches the segments from the Prepr API
|
|
47
|
+
* @param token Prepr access token with scope 'segments'
|
|
48
|
+
* @returns Object with total, skip, limit and items
|
|
49
|
+
*/
|
|
50
|
+
declare function getPreprEnvironmentSegments(token: string): Promise<PreprSegmentsResponse>;
|
|
51
|
+
/**
|
|
52
|
+
* Fetches all the necessary previewbar props
|
|
53
|
+
* @param token Prepr access token with scope 'segments'
|
|
54
|
+
* @returns Object with activeSegment, activeVariant and data
|
|
55
|
+
*/
|
|
56
|
+
declare function getPreviewBarProps(token: string): Promise<{
|
|
57
|
+
activeSegment: string | null;
|
|
58
|
+
activeVariant: string | null;
|
|
59
|
+
data: PreprSegmentsResponse;
|
|
60
|
+
}>;
|
|
61
|
+
|
|
62
|
+
export { PreprMiddleware, type PreprSegment, type PreprSegmentsResponse, getActiveSegment, getActiveVariant, getPreprEnvironmentSegments, getPreprHeaders, getPreprUUID, getPreviewBarProps, getPreviewHeaders };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
declare function PreprMiddleware(request: NextRequest, response?: NextResponse): NextResponse<unknown>;
|
|
4
|
+
/**
|
|
5
|
+
* Returns the Prepr Customer ID from the headers
|
|
6
|
+
*/
|
|
7
|
+
declare function getPreprUUID(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Retuns the active segment from the headers
|
|
10
|
+
*/
|
|
11
|
+
declare function getActiveSegment(): string;
|
|
12
|
+
/**
|
|
13
|
+
* Returns the active variant from the headers
|
|
14
|
+
*/
|
|
15
|
+
declare function getActiveVariant(): string;
|
|
16
|
+
/**
|
|
17
|
+
* Helper function to only retrieve Prepr preview headers
|
|
18
|
+
*/
|
|
19
|
+
declare function getPreviewHeaders(): {
|
|
20
|
+
[key: string]: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Helper function to retrieve Prepr headers (will filter out customer ID if in preview mode)
|
|
24
|
+
*/
|
|
25
|
+
declare function getPreprHeaders(): {
|
|
26
|
+
[key: string]: string;
|
|
27
|
+
};
|
|
28
|
+
type PreprSegment = {
|
|
29
|
+
id: string;
|
|
30
|
+
created_on: string;
|
|
31
|
+
changed_on: string;
|
|
32
|
+
synced_on: string;
|
|
33
|
+
label: string;
|
|
34
|
+
reference_id: string;
|
|
35
|
+
body: string;
|
|
36
|
+
query: string;
|
|
37
|
+
count: number;
|
|
38
|
+
};
|
|
39
|
+
type PreprSegmentsResponse = {
|
|
40
|
+
total: number;
|
|
41
|
+
skip: number;
|
|
42
|
+
limit: number;
|
|
43
|
+
items: PreprSegment[];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Fetches the segments from the Prepr API
|
|
47
|
+
* @param token Prepr access token with scope 'segments'
|
|
48
|
+
* @returns Object with total, skip, limit and items
|
|
49
|
+
*/
|
|
50
|
+
declare function getPreprEnvironmentSegments(token: string): Promise<PreprSegmentsResponse>;
|
|
51
|
+
/**
|
|
52
|
+
* Fetches all the necessary previewbar props
|
|
53
|
+
* @param token Prepr access token with scope 'segments'
|
|
54
|
+
* @returns Object with activeSegment, activeVariant and data
|
|
55
|
+
*/
|
|
56
|
+
declare function getPreviewBarProps(token: string): Promise<{
|
|
57
|
+
activeSegment: string | null;
|
|
58
|
+
activeVariant: string | null;
|
|
59
|
+
data: PreprSegmentsResponse;
|
|
60
|
+
}>;
|
|
61
|
+
|
|
62
|
+
export { PreprMiddleware, type PreprSegment, type PreprSegmentsResponse, getActiveSegment, getActiveVariant, getPreprEnvironmentSegments, getPreprHeaders, getPreprUUID, getPreviewBarProps, getPreviewHeaders };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var __async = (__this, __arguments, generator) => {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
var fulfilled = (value) => {
|
|
21
|
+
try {
|
|
22
|
+
step(generator.next(value));
|
|
23
|
+
} catch (e) {
|
|
24
|
+
reject(e);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
var rejected = (value) => {
|
|
28
|
+
try {
|
|
29
|
+
step(generator.throw(value));
|
|
30
|
+
} catch (e) {
|
|
31
|
+
reject(e);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
35
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/index.ts
|
|
40
|
+
var src_exports = {};
|
|
41
|
+
__export(src_exports, {
|
|
42
|
+
PreprMiddleware: () => PreprMiddleware,
|
|
43
|
+
getActiveSegment: () => getActiveSegment,
|
|
44
|
+
getActiveVariant: () => getActiveVariant,
|
|
45
|
+
getPreprEnvironmentSegments: () => getPreprEnvironmentSegments,
|
|
46
|
+
getPreprHeaders: () => getPreprHeaders,
|
|
47
|
+
getPreprUUID: () => getPreprUUID,
|
|
48
|
+
getPreviewBarProps: () => getPreviewBarProps,
|
|
49
|
+
getPreviewHeaders: () => getPreviewHeaders
|
|
50
|
+
});
|
|
51
|
+
module.exports = __toCommonJS(src_exports);
|
|
52
|
+
var import_server = require("next/server");
|
|
53
|
+
var import_headers = require("next/headers");
|
|
54
|
+
function PreprMiddleware(request, response) {
|
|
55
|
+
var _a, _b, _c;
|
|
56
|
+
const newResponse = response || import_server.NextResponse.next();
|
|
57
|
+
let cookie = (_a = request.cookies.get("__prepr_uid")) == null ? void 0 : _a.value;
|
|
58
|
+
if (!cookie) {
|
|
59
|
+
cookie = crypto.randomUUID();
|
|
60
|
+
newResponse.cookies.set("__prepr_uid", cookie, {
|
|
61
|
+
maxAge: 1 * 365 * 24 * 60
|
|
62
|
+
// Set for one year
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
newResponse.headers.set("Prepr-Customer-Id", cookie);
|
|
66
|
+
if (process.env.PREPR_ENV === "preview") {
|
|
67
|
+
if (request.nextUrl.searchParams.has("segments")) {
|
|
68
|
+
const segments = request.nextUrl.searchParams.get("segments");
|
|
69
|
+
if (segments) {
|
|
70
|
+
newResponse.headers.set("Prepr-Segments", segments);
|
|
71
|
+
newResponse.cookies.set("Prepr-Segments", segments, {
|
|
72
|
+
maxAge: 60
|
|
73
|
+
// Set for one year
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (request.nextUrl.searchParams.has("a-b-testing")) {
|
|
78
|
+
const ab_testing = request.nextUrl.searchParams.get("a-b-testing");
|
|
79
|
+
let value = ab_testing == null ? void 0 : ab_testing.toUpperCase();
|
|
80
|
+
if (value === "B") {
|
|
81
|
+
value = "B";
|
|
82
|
+
} else {
|
|
83
|
+
value = "A";
|
|
84
|
+
}
|
|
85
|
+
newResponse.headers.set("Prepr-ABtesting", value);
|
|
86
|
+
newResponse.cookies.set("Prepr-ABtesting", value, {
|
|
87
|
+
maxAge: 60
|
|
88
|
+
// Set for one year
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const segmentCookie = (_b = request.cookies.get("Prepr-Segments")) == null ? void 0 : _b.value;
|
|
92
|
+
if (segmentCookie) {
|
|
93
|
+
newResponse.headers.set("Prepr-Segments", segmentCookie);
|
|
94
|
+
}
|
|
95
|
+
const abCookie = (_c = request.cookies.get("Prepr-ABtesting")) == null ? void 0 : _c.value;
|
|
96
|
+
if (abCookie) {
|
|
97
|
+
newResponse.headers.set("Prepr-ABtesting", abCookie);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return newResponse;
|
|
101
|
+
}
|
|
102
|
+
function getPreprUUID() {
|
|
103
|
+
return (0, import_headers.headers)().get("prepr-customer-id");
|
|
104
|
+
}
|
|
105
|
+
function getActiveSegment() {
|
|
106
|
+
return (0, import_headers.headers)().get("Prepr-Segments");
|
|
107
|
+
}
|
|
108
|
+
function getActiveVariant() {
|
|
109
|
+
return (0, import_headers.headers)().get("Prepr-ABtesting");
|
|
110
|
+
}
|
|
111
|
+
function getPreviewHeaders() {
|
|
112
|
+
let newHeaders = {};
|
|
113
|
+
(0, import_headers.headers)().forEach((value, key) => {
|
|
114
|
+
if (key.startsWith("prepr") && key !== "prepr-customer-id") {
|
|
115
|
+
newHeaders[key] = value;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return newHeaders;
|
|
119
|
+
}
|
|
120
|
+
function getPreprHeaders() {
|
|
121
|
+
let newHeaders = {};
|
|
122
|
+
if (process.env.PREPR_ENV !== "preview") {
|
|
123
|
+
newHeaders["prepr-customer-id"] = (0, import_headers.headers)().get("prepr-customer-id") || "";
|
|
124
|
+
} else {
|
|
125
|
+
(0, import_headers.headers)().forEach((value, key) => {
|
|
126
|
+
if (key.startsWith("prepr") && key !== "prepr-customer-id") {
|
|
127
|
+
newHeaders[key] = value;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return newHeaders;
|
|
132
|
+
}
|
|
133
|
+
function getPreprEnvironmentSegments(token) {
|
|
134
|
+
return __async(this, null, function* () {
|
|
135
|
+
const response = yield fetch("https://api.eu1.prepr.io/segments", {
|
|
136
|
+
headers: {
|
|
137
|
+
Authorization: `Bearer ${token}`
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
return response.json();
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function getPreviewBarProps(token) {
|
|
144
|
+
return __async(this, null, function* () {
|
|
145
|
+
const data = yield getPreprEnvironmentSegments(token);
|
|
146
|
+
const activeSegment = getActiveSegment();
|
|
147
|
+
const activeVariant = getActiveVariant();
|
|
148
|
+
return {
|
|
149
|
+
activeSegment,
|
|
150
|
+
activeVariant,
|
|
151
|
+
data
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
156
|
+
0 && (module.exports = {
|
|
157
|
+
PreprMiddleware,
|
|
158
|
+
getActiveSegment,
|
|
159
|
+
getActiveVariant,
|
|
160
|
+
getPreprEnvironmentSegments,
|
|
161
|
+
getPreprHeaders,
|
|
162
|
+
getPreprUUID,
|
|
163
|
+
getPreviewBarProps,
|
|
164
|
+
getPreviewHeaders
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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 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 function getPreprUUID() {\n return headers().get('prepr-customer-id')\n}\n\n/**\n * Retuns the active segment from the headers\n */\nexport function getActiveSegment() {\n return headers().get('Prepr-Segments')\n}\n\n/**\n * Returns the active variant from the headers\n */\nexport function getActiveVariant() {\n return headers().get('Prepr-ABtesting')\n}\n\n/**\n * Helper function to only retrieve Prepr preview headers\n */\nexport function getPreviewHeaders() {\n let newHeaders: {\n [key: string]: string\n } = {}\n headers().forEach((value, key) => {\n if (key.startsWith('prepr') && key !== 'prepr-customer-id') {\n newHeaders[key] = value\n }\n })\n\n return newHeaders\n}\n\n/**\n * Helper function to retrieve Prepr headers (will filter out customer ID if in preview mode)\n */\nexport function getPreprHeaders() {\n let newHeaders: {\n [key: string]: string\n } = {}\n\n if (process.env.PREPR_ENV !== 'preview') {\n newHeaders['prepr-customer-id'] =\n headers().get('prepr-customer-id') || ''\n } else {\n headers().forEach((value, key) => {\n if (key.startsWith('prepr') && key !== 'prepr-customer-id') {\n newHeaders[key] = value\n }\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(token: string): Promise<PreprSegmentsResponse> {\n const response = await fetch('https://api.eu1.prepr.io/segments', {\n headers: {\n Authorization: `Bearer ${token}`,\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 = getActiveSegment()\n const activeVariant = getActiveVariant()\n\n return {\n activeSegment,\n activeVariant,\n data\n }\n}"],"mappings":"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","names":[]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__async
|
|
3
|
+
} from "./chunk-IQXHJV5O.mjs";
|
|
4
|
+
|
|
5
|
+
// src/index.ts
|
|
6
|
+
import { NextResponse } from "next/server";
|
|
7
|
+
import { headers } from "next/headers";
|
|
8
|
+
function PreprMiddleware(request, response) {
|
|
9
|
+
var _a, _b, _c;
|
|
10
|
+
const newResponse = response || NextResponse.next();
|
|
11
|
+
let cookie = (_a = request.cookies.get("__prepr_uid")) == null ? void 0 : _a.value;
|
|
12
|
+
if (!cookie) {
|
|
13
|
+
cookie = crypto.randomUUID();
|
|
14
|
+
newResponse.cookies.set("__prepr_uid", cookie, {
|
|
15
|
+
maxAge: 1 * 365 * 24 * 60
|
|
16
|
+
// Set for one year
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
newResponse.headers.set("Prepr-Customer-Id", cookie);
|
|
20
|
+
if (process.env.PREPR_ENV === "preview") {
|
|
21
|
+
if (request.nextUrl.searchParams.has("segments")) {
|
|
22
|
+
const segments = request.nextUrl.searchParams.get("segments");
|
|
23
|
+
if (segments) {
|
|
24
|
+
newResponse.headers.set("Prepr-Segments", segments);
|
|
25
|
+
newResponse.cookies.set("Prepr-Segments", segments, {
|
|
26
|
+
maxAge: 60
|
|
27
|
+
// Set for one year
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (request.nextUrl.searchParams.has("a-b-testing")) {
|
|
32
|
+
const ab_testing = request.nextUrl.searchParams.get("a-b-testing");
|
|
33
|
+
let value = ab_testing == null ? void 0 : ab_testing.toUpperCase();
|
|
34
|
+
if (value === "B") {
|
|
35
|
+
value = "B";
|
|
36
|
+
} else {
|
|
37
|
+
value = "A";
|
|
38
|
+
}
|
|
39
|
+
newResponse.headers.set("Prepr-ABtesting", value);
|
|
40
|
+
newResponse.cookies.set("Prepr-ABtesting", value, {
|
|
41
|
+
maxAge: 60
|
|
42
|
+
// Set for one year
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
const segmentCookie = (_b = request.cookies.get("Prepr-Segments")) == null ? void 0 : _b.value;
|
|
46
|
+
if (segmentCookie) {
|
|
47
|
+
newResponse.headers.set("Prepr-Segments", segmentCookie);
|
|
48
|
+
}
|
|
49
|
+
const abCookie = (_c = request.cookies.get("Prepr-ABtesting")) == null ? void 0 : _c.value;
|
|
50
|
+
if (abCookie) {
|
|
51
|
+
newResponse.headers.set("Prepr-ABtesting", abCookie);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return newResponse;
|
|
55
|
+
}
|
|
56
|
+
function getPreprUUID() {
|
|
57
|
+
return headers().get("prepr-customer-id");
|
|
58
|
+
}
|
|
59
|
+
function getActiveSegment() {
|
|
60
|
+
return headers().get("Prepr-Segments");
|
|
61
|
+
}
|
|
62
|
+
function getActiveVariant() {
|
|
63
|
+
return headers().get("Prepr-ABtesting");
|
|
64
|
+
}
|
|
65
|
+
function getPreviewHeaders() {
|
|
66
|
+
let newHeaders = {};
|
|
67
|
+
headers().forEach((value, key) => {
|
|
68
|
+
if (key.startsWith("prepr") && key !== "prepr-customer-id") {
|
|
69
|
+
newHeaders[key] = value;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
return newHeaders;
|
|
73
|
+
}
|
|
74
|
+
function getPreprHeaders() {
|
|
75
|
+
let newHeaders = {};
|
|
76
|
+
if (process.env.PREPR_ENV !== "preview") {
|
|
77
|
+
newHeaders["prepr-customer-id"] = headers().get("prepr-customer-id") || "";
|
|
78
|
+
} else {
|
|
79
|
+
headers().forEach((value, key) => {
|
|
80
|
+
if (key.startsWith("prepr") && key !== "prepr-customer-id") {
|
|
81
|
+
newHeaders[key] = value;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return newHeaders;
|
|
86
|
+
}
|
|
87
|
+
function getPreprEnvironmentSegments(token) {
|
|
88
|
+
return __async(this, null, function* () {
|
|
89
|
+
const response = yield fetch("https://api.eu1.prepr.io/segments", {
|
|
90
|
+
headers: {
|
|
91
|
+
Authorization: `Bearer ${token}`
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return response.json();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function getPreviewBarProps(token) {
|
|
98
|
+
return __async(this, null, function* () {
|
|
99
|
+
const data = yield getPreprEnvironmentSegments(token);
|
|
100
|
+
const activeSegment = getActiveSegment();
|
|
101
|
+
const activeVariant = getActiveVariant();
|
|
102
|
+
return {
|
|
103
|
+
activeSegment,
|
|
104
|
+
activeVariant,
|
|
105
|
+
data
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
export {
|
|
110
|
+
PreprMiddleware,
|
|
111
|
+
getActiveSegment,
|
|
112
|
+
getActiveVariant,
|
|
113
|
+
getPreprEnvironmentSegments,
|
|
114
|
+
getPreprHeaders,
|
|
115
|
+
getPreprUUID,
|
|
116
|
+
getPreviewBarProps,
|
|
117
|
+
getPreviewHeaders
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +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 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 function getPreprUUID() {\n return headers().get('prepr-customer-id')\n}\n\n/**\n * Retuns the active segment from the headers\n */\nexport function getActiveSegment() {\n return headers().get('Prepr-Segments')\n}\n\n/**\n * Returns the active variant from the headers\n */\nexport function getActiveVariant() {\n return headers().get('Prepr-ABtesting')\n}\n\n/**\n * Helper function to only retrieve Prepr preview headers\n */\nexport function getPreviewHeaders() {\n let newHeaders: {\n [key: string]: string\n } = {}\n headers().forEach((value, key) => {\n if (key.startsWith('prepr') && key !== 'prepr-customer-id') {\n newHeaders[key] = value\n }\n })\n\n return newHeaders\n}\n\n/**\n * Helper function to retrieve Prepr headers (will filter out customer ID if in preview mode)\n */\nexport function getPreprHeaders() {\n let newHeaders: {\n [key: string]: string\n } = {}\n\n if (process.env.PREPR_ENV !== 'preview') {\n newHeaders['prepr-customer-id'] =\n headers().get('prepr-customer-id') || ''\n } else {\n headers().forEach((value, key) => {\n if (key.startsWith('prepr') && key !== 'prepr-customer-id') {\n newHeaders[key] = value\n }\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(token: string): Promise<PreprSegmentsResponse> {\n const response = await fetch('https://api.eu1.prepr.io/segments', {\n headers: {\n Authorization: `Bearer ${token}`,\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 = getActiveSegment()\n const activeVariant = getActiveVariant()\n\n return {\n activeSegment,\n activeVariant,\n data\n }\n}"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@preprio/prepr-nextjs",
|
|
3
|
+
"version": "1.0.0-beta.0",
|
|
4
|
+
"description": "A next.js package with code snippets to use with Prepr",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"package.json"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"require": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./components": {
|
|
19
|
+
"import": "./dist/components.js",
|
|
20
|
+
"require": "./dist/components.js",
|
|
21
|
+
"types": "./dist/components.d.ts"
|
|
22
|
+
},
|
|
23
|
+
"./dist/components.css": {
|
|
24
|
+
"import": "./dist/components.css",
|
|
25
|
+
"require": "./dist/components.css"
|
|
26
|
+
},
|
|
27
|
+
"./dist/main.css": {
|
|
28
|
+
"import": "./dist/main.css",
|
|
29
|
+
"require": "./dist/main.css"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsup",
|
|
34
|
+
"dev": "tsup --watch"
|
|
35
|
+
},
|
|
36
|
+
"author": "",
|
|
37
|
+
"license": "ISC",
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/react": "^18.3.3",
|
|
40
|
+
"autoprefixer": "^10.4.20",
|
|
41
|
+
"postcss": "^8.4.47",
|
|
42
|
+
"prettier": "3.3.3",
|
|
43
|
+
"tailwindcss": "^3.4.13",
|
|
44
|
+
"ts-node": "^10.9.2",
|
|
45
|
+
"tsup": "^8.2.4",
|
|
46
|
+
"typescript": "^5.5.4"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@headlessui/react": "^2.1.8",
|
|
50
|
+
"classnames": "^2.5.1",
|
|
51
|
+
"next": "^14.2.5",
|
|
52
|
+
"react": "^18.3.1",
|
|
53
|
+
"react-dom": "^18.3.1",
|
|
54
|
+
"react-icons": "^5.3.0"
|
|
55
|
+
},
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "git+https://github.com/preprio/prepr-nextjs.git"
|
|
59
|
+
},
|
|
60
|
+
"keywords": [
|
|
61
|
+
"prepr",
|
|
62
|
+
"nextjs"
|
|
63
|
+
],
|
|
64
|
+
"bugs": {
|
|
65
|
+
"url": "https://github.com/preprio/prepr-nextjs/issues"
|
|
66
|
+
},
|
|
67
|
+
"homepage": "https://github.com/preprio/prepr-nextjs#readme"
|
|
68
|
+
}
|