@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.
@@ -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 };
@@ -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
+ }