@preprio/toolkit 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -30,7 +30,7 @@ __export(astro_exports, {
30
30
  module.exports = __toCommonJS(astro_exports);
31
31
 
32
32
  // src/version.ts
33
- var VERSION = "0.4.0";
33
+ var VERSION = "0.4.2";
34
34
 
35
35
  // src/core/features.ts
36
36
  function isEnabled(config) {
@@ -120,6 +120,10 @@ async function getPreprEnvironmentSegments(token) {
120
120
  try {
121
121
  const response = await fetch(token, {
122
122
  headers: {
123
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
124
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
125
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
126
+ // still identify the toolbar by that string.
123
127
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
124
128
  "Content-Type": "application/json"
125
129
  },
@@ -235,7 +239,7 @@ function parseCookies(request) {
235
239
  }
236
240
  return cookies;
237
241
  }
238
- function processPreprRequest(request, opts) {
242
+ function processFrameworkRequest(request, opts, framework) {
239
243
  const requestHeaders = new Headers(request.headers);
240
244
  const responseCookies = [];
241
245
  const inboundPreprHeaders = [];
@@ -270,10 +274,10 @@ function processPreprRequest(request, opts) {
270
274
  if (userAgent) {
271
275
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
272
276
  }
273
- requestHeaders.set(
274
- "Prepr-Package",
275
- `@preprio/toolkit@${opts?.version ?? VERSION}`
276
- );
277
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
278
+ if (framework) packageParts.push(`framework=${framework}`);
279
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
280
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
277
281
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
278
282
  if (ip) {
279
283
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
@@ -358,9 +362,10 @@ function processPreprRequest(request, opts) {
358
362
 
359
363
  // src/astro/index.ts
360
364
  async function onPreprRequest(context, next, options) {
361
- const { requestHeaders, responseCookies } = processPreprRequest(
365
+ const { requestHeaders, responseCookies } = processFrameworkRequest(
362
366
  context.request,
363
- options
367
+ options,
368
+ "astro"
364
369
  );
365
370
  requestHeaders.forEach((value, key) => {
366
371
  context.request.headers.set(key, value);
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "0.4.0";
2
+ var VERSION = "0.4.2";
3
3
 
4
4
  // src/core/features.ts
5
5
  function isEnabled(config) {
@@ -89,6 +89,10 @@ async function getPreprEnvironmentSegments(token) {
89
89
  try {
90
90
  const response = await fetch(token, {
91
91
  headers: {
92
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
93
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
94
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
95
+ // still identify the toolbar by that string.
92
96
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
93
97
  "Content-Type": "application/json"
94
98
  },
@@ -204,7 +208,7 @@ function parseCookies(request) {
204
208
  }
205
209
  return cookies;
206
210
  }
207
- function processPreprRequest(request, opts) {
211
+ function processFrameworkRequest(request, opts, framework) {
208
212
  const requestHeaders = new Headers(request.headers);
209
213
  const responseCookies = [];
210
214
  const inboundPreprHeaders = [];
@@ -239,10 +243,10 @@ function processPreprRequest(request, opts) {
239
243
  if (userAgent) {
240
244
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
241
245
  }
242
- requestHeaders.set(
243
- "Prepr-Package",
244
- `@preprio/toolkit@${opts?.version ?? VERSION}`
245
- );
246
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
247
+ if (framework) packageParts.push(`framework=${framework}`);
248
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
249
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
246
250
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
247
251
  if (ip) {
248
252
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
@@ -327,9 +331,10 @@ function processPreprRequest(request, opts) {
327
331
 
328
332
  // src/astro/index.ts
329
333
  async function onPreprRequest(context, next, options) {
330
- const { requestHeaders, responseCookies } = processPreprRequest(
334
+ const { requestHeaders, responseCookies } = processFrameworkRequest(
331
335
  context.request,
332
- options
336
+ options,
337
+ "astro"
333
338
  );
334
339
  requestHeaders.forEach((value, key) => {
335
340
  context.request.headers.set(key, value);
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "0.4.0";
2
+ var VERSION = "0.4.2";
3
3
 
4
4
  // src/core/features.ts
5
5
  function isEnabled(config) {
@@ -655,6 +655,7 @@ function createStegaAutoClean(options) {
655
655
  const info = cleaned.get(textNode);
656
656
  const settled = stripText ? info?.cleaned : info?.original;
657
657
  if (info && textContent === settled) {
658
+ if (!info.decoded) return false;
658
659
  const shown = resolveEditTarget(textNode);
659
660
  if (!shown) return false;
660
661
  pendingHidden.delete(textNode);
@@ -666,13 +667,14 @@ function createStegaAutoClean(options) {
666
667
  const { cleaned: stripped, encoded } = vercelStegaSplit(textContent);
667
668
  if (!encoded || stripped === textContent) return false;
668
669
  const decoded = decodeStega(textContent);
669
- if (!decoded?.href) return false;
670
+ if (!decoded?.href && !stripText) return false;
670
671
  cleaned.set(textNode, {
671
672
  original: textContent,
672
673
  cleaned: stripped,
673
- decoded
674
+ decoded: decoded?.href ? decoded : null
674
675
  });
675
676
  if (stripText) textNode.textContent = stripped;
677
+ if (!decoded?.href) return false;
676
678
  const target = resolveEditTarget(textNode);
677
679
  if (target) {
678
680
  pendingHidden.delete(textNode);
@@ -709,7 +711,9 @@ function createStegaAutoClean(options) {
709
711
  if (mutation.type === "characterData" && mutation.target.nodeType === Node.TEXT_NODE) {
710
712
  const textNode = mutation.target;
711
713
  const info = cleaned.get(textNode);
712
- if (info && textNode.textContent === info.original) {
714
+ const text = textNode.textContent ?? "";
715
+ const settled = stripText ? info?.cleaned : info?.original;
716
+ if (text !== settled && vercelStegaSplit(text).encoded) {
713
717
  affected.add(textNode);
714
718
  }
715
719
  }
package/dist/index.cjs CHANGED
@@ -44,7 +44,7 @@ __export(src_exports, {
44
44
  module.exports = __toCommonJS(src_exports);
45
45
 
46
46
  // src/version.ts
47
- var VERSION = "0.4.0";
47
+ var VERSION = "0.4.2";
48
48
 
49
49
  // src/core/features.ts
50
50
  function isEnabled(config) {
@@ -456,6 +456,7 @@ function createStegaAutoClean(options) {
456
456
  const info = cleaned.get(textNode);
457
457
  const settled = stripText ? info?.cleaned : info?.original;
458
458
  if (info && textContent === settled) {
459
+ if (!info.decoded) return false;
459
460
  const shown = resolveEditTarget(textNode);
460
461
  if (!shown) return false;
461
462
  pendingHidden.delete(textNode);
@@ -467,13 +468,14 @@ function createStegaAutoClean(options) {
467
468
  const { cleaned: stripped, encoded } = (0, import_stega2.vercelStegaSplit)(textContent);
468
469
  if (!encoded || stripped === textContent) return false;
469
470
  const decoded = decodeStega(textContent);
470
- if (!decoded?.href) return false;
471
+ if (!decoded?.href && !stripText) return false;
471
472
  cleaned.set(textNode, {
472
473
  original: textContent,
473
474
  cleaned: stripped,
474
- decoded
475
+ decoded: decoded?.href ? decoded : null
475
476
  });
476
477
  if (stripText) textNode.textContent = stripped;
478
+ if (!decoded?.href) return false;
477
479
  const target = resolveEditTarget(textNode);
478
480
  if (target) {
479
481
  pendingHidden.delete(textNode);
@@ -510,7 +512,9 @@ function createStegaAutoClean(options) {
510
512
  if (mutation.type === "characterData" && mutation.target.nodeType === Node.TEXT_NODE) {
511
513
  const textNode = mutation.target;
512
514
  const info = cleaned.get(textNode);
513
- if (info && textNode.textContent === info.original) {
515
+ const text = textNode.textContent ?? "";
516
+ const settled = stripText ? info?.cleaned : info?.original;
517
+ if (text !== settled && (0, import_stega2.vercelStegaSplit)(text).encoded) {
514
518
  affected.add(textNode);
515
519
  }
516
520
  }
@@ -2386,6 +2390,10 @@ async function getPreprEnvironmentSegments(token) {
2386
2390
  try {
2387
2391
  const response = await fetch(token, {
2388
2392
  headers: {
2393
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
2394
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
2395
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
2396
+ // still identify the toolbar by that string.
2389
2397
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
2390
2398
  "Content-Type": "application/json"
2391
2399
  },
@@ -2477,6 +2485,9 @@ function parseCookies(request) {
2477
2485
  return cookies;
2478
2486
  }
2479
2487
  function processPreprRequest(request, opts) {
2488
+ return processFrameworkRequest(request, opts);
2489
+ }
2490
+ function processFrameworkRequest(request, opts, framework) {
2480
2491
  const requestHeaders = new Headers(request.headers);
2481
2492
  const responseCookies = [];
2482
2493
  const inboundPreprHeaders = [];
@@ -2511,10 +2522,10 @@ function processPreprRequest(request, opts) {
2511
2522
  if (userAgent) {
2512
2523
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
2513
2524
  }
2514
- requestHeaders.set(
2515
- "Prepr-Package",
2516
- `@preprio/toolkit@${opts?.version ?? VERSION}`
2517
- );
2525
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
2526
+ if (framework) packageParts.push(`framework=${framework}`);
2527
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
2528
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
2518
2529
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
2519
2530
  if (ip) {
2520
2531
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
package/dist/index.d.cts CHANGED
@@ -5,7 +5,7 @@ export { g as PreprEnvironment, h as PreprEventType, i as PreprFeatureConfig, j
5
5
  * Package version; must match package.json. Lives in its own leaf module so
6
6
  * core can import it without cycling through the barrel.
7
7
  */
8
- declare const VERSION = "0.4.0";
8
+ declare const VERSION = "0.4.2";
9
9
 
10
10
  /**
11
11
  * Resolve a `PreprFeatures` bag to plain booleans, defaulting every omitted key
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { g as PreprEnvironment, h as PreprEventType, i as PreprFeatureConfig, j
5
5
  * Package version; must match package.json. Lives in its own leaf module so
6
6
  * core can import it without cycling through the barrel.
7
7
  */
8
- declare const VERSION = "0.4.0";
8
+ declare const VERSION = "0.4.2";
9
9
 
10
10
  /**
11
11
  * Resolve a `PreprFeatures` bag to plain booleans, defaulting every omitted key
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  setTrackingParam,
19
19
  stegaClean,
20
20
  trackEvent
21
- } from "./chunk-XFRVWN3C.js";
21
+ } from "./chunk-72BQJDDK.js";
22
22
 
23
23
  // src/core/server.ts
24
24
  var PreprError = class extends Error {
@@ -120,6 +120,10 @@ async function getPreprEnvironmentSegments(token) {
120
120
  try {
121
121
  const response = await fetch(token, {
122
122
  headers: {
123
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
124
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
125
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
126
+ // still identify the toolbar by that string.
123
127
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
124
128
  "Content-Type": "application/json"
125
129
  },
@@ -211,6 +215,9 @@ function parseCookies(request) {
211
215
  return cookies;
212
216
  }
213
217
  function processPreprRequest(request, opts) {
218
+ return processFrameworkRequest(request, opts);
219
+ }
220
+ function processFrameworkRequest(request, opts, framework) {
214
221
  const requestHeaders = new Headers(request.headers);
215
222
  const responseCookies = [];
216
223
  const inboundPreprHeaders = [];
@@ -245,10 +252,10 @@ function processPreprRequest(request, opts) {
245
252
  if (userAgent) {
246
253
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
247
254
  }
248
- requestHeaders.set(
249
- "Prepr-Package",
250
- `@preprio/toolkit@${opts?.version ?? VERSION}`
251
- );
255
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
256
+ if (framework) packageParts.push(`framework=${framework}`);
257
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
258
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
252
259
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
253
260
  if (ip) {
254
261
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
@@ -432,6 +432,7 @@ function createStegaAutoClean(options) {
432
432
  const info = cleaned.get(textNode);
433
433
  const settled = stripText ? info?.cleaned : info?.original;
434
434
  if (info && textContent === settled) {
435
+ if (!info.decoded) return false;
435
436
  const shown = resolveEditTarget(textNode);
436
437
  if (!shown) return false;
437
438
  pendingHidden.delete(textNode);
@@ -443,13 +444,14 @@ function createStegaAutoClean(options) {
443
444
  const { cleaned: stripped, encoded } = (0, import_stega2.vercelStegaSplit)(textContent);
444
445
  if (!encoded || stripped === textContent) return false;
445
446
  const decoded = decodeStega(textContent);
446
- if (!decoded?.href) return false;
447
+ if (!decoded?.href && !stripText) return false;
447
448
  cleaned.set(textNode, {
448
449
  original: textContent,
449
450
  cleaned: stripped,
450
- decoded
451
+ decoded: decoded?.href ? decoded : null
451
452
  });
452
453
  if (stripText) textNode.textContent = stripped;
454
+ if (!decoded?.href) return false;
453
455
  const target = resolveEditTarget(textNode);
454
456
  if (target) {
455
457
  pendingHidden.delete(textNode);
@@ -486,7 +488,9 @@ function createStegaAutoClean(options) {
486
488
  if (mutation.type === "characterData" && mutation.target.nodeType === Node.TEXT_NODE) {
487
489
  const textNode = mutation.target;
488
490
  const info = cleaned.get(textNode);
489
- if (info && textNode.textContent === info.original) {
491
+ const text = textNode.textContent ?? "";
492
+ const settled = stripText ? info?.cleaned : info?.original;
493
+ if (text !== settled && (0, import_stega2.vercelStegaSplit)(text).encoded) {
490
494
  affected.add(textNode);
491
495
  }
492
496
  }
@@ -2266,7 +2270,7 @@ function createPreprPreview(opts = {}) {
2266
2270
  var import_react = require("react");
2267
2271
 
2268
2272
  // src/version.ts
2269
- var VERSION = "0.4.0";
2273
+ var VERSION = "0.4.2";
2270
2274
 
2271
2275
  // src/core/pixel.ts
2272
2276
  var PIXEL_SCRIPT_URL = "https://cdn.tracking.prepr.io/js/prepr.min.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  createPreprPreview,
4
4
  loadTrackingPixel
5
- } from "../chunk-XFRVWN3C.js";
5
+ } from "../chunk-72BQJDDK.js";
6
6
 
7
7
  // src/nextjs/components.ts
8
8
  import { usePathname, useRouter } from "next/navigation";
@@ -38,7 +38,7 @@ module.exports = __toCommonJS(nextjs_exports);
38
38
  var import_server = require("next/server");
39
39
 
40
40
  // src/version.ts
41
- var VERSION = "0.4.0";
41
+ var VERSION = "0.4.2";
42
42
 
43
43
  // src/core/constants.ts
44
44
  var COOKIE_PREVIEW_MODE = "Prepr-Preview-Mode";
@@ -100,7 +100,7 @@ function parseCookies(request) {
100
100
  }
101
101
  return cookies;
102
102
  }
103
- function processPreprRequest(request, opts) {
103
+ function processFrameworkRequest(request, opts, framework) {
104
104
  const requestHeaders = new Headers(request.headers);
105
105
  const responseCookies = [];
106
106
  const inboundPreprHeaders = [];
@@ -135,10 +135,10 @@ function processPreprRequest(request, opts) {
135
135
  if (userAgent) {
136
136
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
137
137
  }
138
- requestHeaders.set(
139
- "Prepr-Package",
140
- `@preprio/toolkit@${opts?.version ?? VERSION}`
141
- );
138
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
139
+ if (framework) packageParts.push(`framework=${framework}`);
140
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
141
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
142
142
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
143
143
  if (ip) {
144
144
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
@@ -231,9 +231,10 @@ function createPreprMiddleware(request, responseOrOptions, maybeOptions) {
231
231
  } else {
232
232
  options = responseOrOptions;
233
233
  }
234
- const { requestHeaders, responseCookies } = processPreprRequest(
234
+ const { requestHeaders, responseCookies } = processFrameworkRequest(
235
235
  request,
236
- options
236
+ options,
237
+ "nextjs"
237
238
  );
238
239
  const response = chainedResponse ?? import_server.NextResponse.next({ request: { headers: requestHeaders } });
239
240
  if (chainedResponse) {
@@ -364,6 +365,10 @@ async function getPreprEnvironmentSegments(token) {
364
365
  try {
365
366
  const response = await fetch(token, {
366
367
  headers: {
368
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
369
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
370
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
371
+ // still identify the toolbar by that string.
367
372
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
368
373
  "Content-Type": "application/json"
369
374
  },
@@ -2,7 +2,7 @@
2
2
  import { NextResponse } from "next/server";
3
3
 
4
4
  // src/version.ts
5
- var VERSION = "0.4.0";
5
+ var VERSION = "0.4.2";
6
6
 
7
7
  // src/core/constants.ts
8
8
  var COOKIE_PREVIEW_MODE = "Prepr-Preview-Mode";
@@ -64,7 +64,7 @@ function parseCookies(request) {
64
64
  }
65
65
  return cookies;
66
66
  }
67
- function processPreprRequest(request, opts) {
67
+ function processFrameworkRequest(request, opts, framework) {
68
68
  const requestHeaders = new Headers(request.headers);
69
69
  const responseCookies = [];
70
70
  const inboundPreprHeaders = [];
@@ -99,10 +99,10 @@ function processPreprRequest(request, opts) {
99
99
  if (userAgent) {
100
100
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
101
101
  }
102
- requestHeaders.set(
103
- "Prepr-Package",
104
- `@preprio/toolkit@${opts?.version ?? VERSION}`
105
- );
102
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
103
+ if (framework) packageParts.push(`framework=${framework}`);
104
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
105
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
106
106
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
107
107
  if (ip) {
108
108
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
@@ -195,9 +195,10 @@ function createPreprMiddleware(request, responseOrOptions, maybeOptions) {
195
195
  } else {
196
196
  options = responseOrOptions;
197
197
  }
198
- const { requestHeaders, responseCookies } = processPreprRequest(
198
+ const { requestHeaders, responseCookies } = processFrameworkRequest(
199
199
  request,
200
- options
200
+ options,
201
+ "nextjs"
201
202
  );
202
203
  const response = chainedResponse ?? NextResponse.next({ request: { headers: requestHeaders } });
203
204
  if (chainedResponse) {
@@ -328,6 +329,10 @@ async function getPreprEnvironmentSegments(token) {
328
329
  try {
329
330
  const response = await fetch(token, {
330
331
  headers: {
332
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
333
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
334
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
335
+ // still identify the toolbar by that string.
331
336
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
332
337
  "Content-Type": "application/json"
333
338
  },
@@ -35,7 +35,7 @@ __export(nuxt_exports, {
35
35
  module.exports = __toCommonJS(nuxt_exports);
36
36
 
37
37
  // src/version.ts
38
- var VERSION = "0.4.0";
38
+ var VERSION = "0.4.2";
39
39
 
40
40
  // src/core/constants.ts
41
41
  var COOKIE_PREVIEW_MODE = "Prepr-Preview-Mode";
@@ -111,7 +111,7 @@ function parseCookies(request) {
111
111
  }
112
112
  return cookies;
113
113
  }
114
- function processPreprRequest(request, opts) {
114
+ function processFrameworkRequest(request, opts, framework) {
115
115
  const requestHeaders = new Headers(request.headers);
116
116
  const responseCookies = [];
117
117
  const inboundPreprHeaders = [];
@@ -146,10 +146,10 @@ function processPreprRequest(request, opts) {
146
146
  if (userAgent) {
147
147
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
148
148
  }
149
- requestHeaders.set(
150
- "Prepr-Package",
151
- `@preprio/toolkit@${opts?.version ?? VERSION}`
152
- );
149
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
150
+ if (framework) packageParts.push(`framework=${framework}`);
151
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
152
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
153
153
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
154
154
  if (ip) {
155
155
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
@@ -245,9 +245,10 @@ function handlePreprRequest(event, options) {
245
245
  request.headers.set(key, value.join(", "));
246
246
  }
247
247
  }
248
- const { requestHeaders, responseCookies } = processPreprRequest(
248
+ const { requestHeaders, responseCookies } = processFrameworkRequest(
249
249
  request,
250
- options
250
+ options,
251
+ "nuxt"
251
252
  );
252
253
  requestHeaders.forEach((value, key) => {
253
254
  req.headers[key.toLowerCase()] = value;
@@ -362,6 +363,10 @@ async function getPreprEnvironmentSegments(token) {
362
363
  try {
363
364
  const response = await fetch(token, {
364
365
  headers: {
366
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
367
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
368
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
369
+ // still identify the toolbar by that string.
365
370
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
366
371
  "Content-Type": "application/json"
367
372
  },
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "0.4.0";
2
+ var VERSION = "0.4.2";
3
3
 
4
4
  // src/core/constants.ts
5
5
  var COOKIE_PREVIEW_MODE = "Prepr-Preview-Mode";
@@ -75,7 +75,7 @@ function parseCookies(request) {
75
75
  }
76
76
  return cookies;
77
77
  }
78
- function processPreprRequest(request, opts) {
78
+ function processFrameworkRequest(request, opts, framework) {
79
79
  const requestHeaders = new Headers(request.headers);
80
80
  const responseCookies = [];
81
81
  const inboundPreprHeaders = [];
@@ -110,10 +110,10 @@ function processPreprRequest(request, opts) {
110
110
  if (userAgent) {
111
111
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
112
112
  }
113
- requestHeaders.set(
114
- "Prepr-Package",
115
- `@preprio/toolkit@${opts?.version ?? VERSION}`
116
- );
113
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
114
+ if (framework) packageParts.push(`framework=${framework}`);
115
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
116
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
117
117
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
118
118
  if (ip) {
119
119
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
@@ -209,9 +209,10 @@ function handlePreprRequest(event, options) {
209
209
  request.headers.set(key, value.join(", "));
210
210
  }
211
211
  }
212
- const { requestHeaders, responseCookies } = processPreprRequest(
212
+ const { requestHeaders, responseCookies } = processFrameworkRequest(
213
213
  request,
214
- options
214
+ options,
215
+ "nuxt"
215
216
  );
216
217
  requestHeaders.forEach((value, key) => {
217
218
  req.headers[key.toLowerCase()] = value;
@@ -326,6 +327,10 @@ async function getPreprEnvironmentSegments(token) {
326
327
  try {
327
328
  const response = await fetch(token, {
328
329
  headers: {
330
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
331
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
332
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
333
+ // still identify the toolbar by that string.
329
334
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
330
335
  "Content-Type": "application/json"
331
336
  },
@@ -431,6 +431,7 @@ function createStegaAutoClean(options) {
431
431
  const info = cleaned.get(textNode);
432
432
  const settled = stripText ? info?.cleaned : info?.original;
433
433
  if (info && textContent === settled) {
434
+ if (!info.decoded) return false;
434
435
  const shown = resolveEditTarget(textNode);
435
436
  if (!shown) return false;
436
437
  pendingHidden.delete(textNode);
@@ -442,13 +443,14 @@ function createStegaAutoClean(options) {
442
443
  const { cleaned: stripped, encoded } = (0, import_stega2.vercelStegaSplit)(textContent);
443
444
  if (!encoded || stripped === textContent) return false;
444
445
  const decoded = decodeStega(textContent);
445
- if (!decoded?.href) return false;
446
+ if (!decoded?.href && !stripText) return false;
446
447
  cleaned.set(textNode, {
447
448
  original: textContent,
448
449
  cleaned: stripped,
449
- decoded
450
+ decoded: decoded?.href ? decoded : null
450
451
  });
451
452
  if (stripText) textNode.textContent = stripped;
453
+ if (!decoded?.href) return false;
452
454
  const target = resolveEditTarget(textNode);
453
455
  if (target) {
454
456
  pendingHidden.delete(textNode);
@@ -485,7 +487,9 @@ function createStegaAutoClean(options) {
485
487
  if (mutation.type === "characterData" && mutation.target.nodeType === Node.TEXT_NODE) {
486
488
  const textNode = mutation.target;
487
489
  const info = cleaned.get(textNode);
488
- if (info && textNode.textContent === info.original) {
490
+ const text = textNode.textContent ?? "";
491
+ const settled = stripText ? info?.cleaned : info?.original;
492
+ if (text !== settled && (0, import_stega2.vercelStegaSplit)(text).encoded) {
489
493
  affected.add(textNode);
490
494
  }
491
495
  }
@@ -2262,7 +2266,7 @@ function createPreprPreview(opts = {}) {
2262
2266
  }
2263
2267
 
2264
2268
  // src/version.ts
2265
- var VERSION = "0.4.0";
2269
+ var VERSION = "0.4.2";
2266
2270
 
2267
2271
  // src/core/pixel.ts
2268
2272
  var PIXEL_SCRIPT_URL = "https://cdn.tracking.prepr.io/js/prepr.min.js";
@@ -407,6 +407,7 @@ function createStegaAutoClean(options) {
407
407
  const info = cleaned.get(textNode);
408
408
  const settled = stripText ? info?.cleaned : info?.original;
409
409
  if (info && textContent === settled) {
410
+ if (!info.decoded) return false;
410
411
  const shown = resolveEditTarget(textNode);
411
412
  if (!shown) return false;
412
413
  pendingHidden.delete(textNode);
@@ -418,13 +419,14 @@ function createStegaAutoClean(options) {
418
419
  const { cleaned: stripped, encoded } = vercelStegaSplit(textContent);
419
420
  if (!encoded || stripped === textContent) return false;
420
421
  const decoded = decodeStega(textContent);
421
- if (!decoded?.href) return false;
422
+ if (!decoded?.href && !stripText) return false;
422
423
  cleaned.set(textNode, {
423
424
  original: textContent,
424
425
  cleaned: stripped,
425
- decoded
426
+ decoded: decoded?.href ? decoded : null
426
427
  });
427
428
  if (stripText) textNode.textContent = stripped;
429
+ if (!decoded?.href) return false;
428
430
  const target = resolveEditTarget(textNode);
429
431
  if (target) {
430
432
  pendingHidden.delete(textNode);
@@ -461,7 +463,9 @@ function createStegaAutoClean(options) {
461
463
  if (mutation.type === "characterData" && mutation.target.nodeType === Node.TEXT_NODE) {
462
464
  const textNode = mutation.target;
463
465
  const info = cleaned.get(textNode);
464
- if (info && textNode.textContent === info.original) {
466
+ const text = textNode.textContent ?? "";
467
+ const settled = stripText ? info?.cleaned : info?.original;
468
+ if (text !== settled && vercelStegaSplit(text).encoded) {
465
469
  affected.add(textNode);
466
470
  }
467
471
  }
@@ -2238,7 +2242,7 @@ function createPreprPreview(opts = {}) {
2238
2242
  }
2239
2243
 
2240
2244
  // src/version.ts
2241
- var VERSION = "0.4.0";
2245
+ var VERSION = "0.4.2";
2242
2246
 
2243
2247
  // src/core/pixel.ts
2244
2248
  var PIXEL_SCRIPT_URL = "https://cdn.tracking.prepr.io/js/prepr.min.js";
@@ -35,7 +35,7 @@ __export(sveltekit_exports, {
35
35
  module.exports = __toCommonJS(sveltekit_exports);
36
36
 
37
37
  // src/version.ts
38
- var VERSION = "0.4.0";
38
+ var VERSION = "0.4.2";
39
39
 
40
40
  // src/core/constants.ts
41
41
  var COOKIE_PREVIEW_MODE = "Prepr-Preview-Mode";
@@ -111,7 +111,7 @@ function parseCookies(request) {
111
111
  }
112
112
  return cookies;
113
113
  }
114
- function processPreprRequest(request, opts) {
114
+ function processFrameworkRequest(request, opts, framework) {
115
115
  const requestHeaders = new Headers(request.headers);
116
116
  const responseCookies = [];
117
117
  const inboundPreprHeaders = [];
@@ -146,10 +146,10 @@ function processPreprRequest(request, opts) {
146
146
  if (userAgent) {
147
147
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
148
148
  }
149
- requestHeaders.set(
150
- "Prepr-Package",
151
- `@preprio/toolkit@${opts?.version ?? VERSION}`
152
- );
149
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
150
+ if (framework) packageParts.push(`framework=${framework}`);
151
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
152
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
153
153
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
154
154
  if (ip) {
155
155
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
@@ -236,9 +236,10 @@ function processPreprRequest(request, opts) {
236
236
  var PREPR_LOCALS_KEY = "prepr";
237
237
  function preprHandle(options) {
238
238
  return async ({ event, resolve }) => {
239
- const { requestHeaders, responseCookies } = processPreprRequest(
239
+ const { requestHeaders, responseCookies } = processFrameworkRequest(
240
240
  event.request,
241
- options
241
+ options,
242
+ "sveltekit"
242
243
  );
243
244
  requestHeaders.forEach((value, key) => {
244
245
  event.request.headers.set(key, value);
@@ -358,6 +359,10 @@ async function getPreprEnvironmentSegments(token) {
358
359
  try {
359
360
  const response = await fetch(token, {
360
361
  headers: {
362
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
363
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
364
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
365
+ // still identify the toolbar by that string.
361
366
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
362
367
  "Content-Type": "application/json"
363
368
  },
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "0.4.0";
2
+ var VERSION = "0.4.2";
3
3
 
4
4
  // src/core/constants.ts
5
5
  var COOKIE_PREVIEW_MODE = "Prepr-Preview-Mode";
@@ -75,7 +75,7 @@ function parseCookies(request) {
75
75
  }
76
76
  return cookies;
77
77
  }
78
- function processPreprRequest(request, opts) {
78
+ function processFrameworkRequest(request, opts, framework) {
79
79
  const requestHeaders = new Headers(request.headers);
80
80
  const responseCookies = [];
81
81
  const inboundPreprHeaders = [];
@@ -110,10 +110,10 @@ function processPreprRequest(request, opts) {
110
110
  if (userAgent) {
111
111
  requestHeaders.set("Prepr-User-Agent", sanitizeHeaderValue(userAgent));
112
112
  }
113
- requestHeaders.set(
114
- "Prepr-Package",
115
- `@preprio/toolkit@${opts?.version ?? VERSION}`
116
- );
113
+ const packageParts = [`@preprio/toolkit@${opts?.version ?? VERSION}`];
114
+ if (framework) packageParts.push(`framework=${framework}`);
115
+ packageParts.push(`preview=${opts?.preview ? "true" : "false"}`);
116
+ requestHeaders.set("Prepr-Package", packageParts.join("; "));
117
117
  const ip = request.headers.get("Cf-Connecting-Ip") ?? request.headers.get("x-real-ip");
118
118
  if (ip) {
119
119
  requestHeaders.set("Prepr-Visitor-IP", sanitizeHeaderValue(ip));
@@ -200,9 +200,10 @@ function processPreprRequest(request, opts) {
200
200
  var PREPR_LOCALS_KEY = "prepr";
201
201
  function preprHandle(options) {
202
202
  return async ({ event, resolve }) => {
203
- const { requestHeaders, responseCookies } = processPreprRequest(
203
+ const { requestHeaders, responseCookies } = processFrameworkRequest(
204
204
  event.request,
205
- options
205
+ options,
206
+ "sveltekit"
206
207
  );
207
208
  requestHeaders.forEach((value, key) => {
208
209
  event.request.headers.set(key, value);
@@ -322,6 +323,10 @@ async function getPreprEnvironmentSegments(token) {
322
323
  try {
323
324
  const response = await fetch(token, {
324
325
  headers: {
326
+ "Prepr-Package": `@preprio/toolkit@${VERSION}`,
327
+ // Duplicates the version in Prepr-Package. It keeps the User-Agent
328
+ // format used by `@preprio/prepr-nextjs`, for Prepr API consumers that
329
+ // still identify the toolbar by that string.
325
330
  "User-Agent": `Prepr-Preview-Bar/${VERSION}`,
326
331
  "Content-Type": "application/json"
327
332
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@preprio/toolkit",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Prepr personalization, A/B testing and preview toolkit for React, Next.js, Nuxt, Astro, SvelteKit and Express",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Prepr B.V. (https://prepr.io)",