@replohq/sdk 0.11.0 → 0.14.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.
Files changed (46) hide show
  1. package/_vendor/replo-utils/lib/json.mjs +2 -42
  2. package/_vendor/replo-utils/lib/misc.mjs +3 -0
  3. package/_vendor/schemas/contentCollection.d.ts +231 -0
  4. package/_vendor/schemas/contentCollection.mjs +2 -0
  5. package/_vendor/schemas/contentEntry.d.ts +53 -0
  6. package/_vendor/schemas/contentEntry.mjs +3 -0
  7. package/_vendor/schemas/contentFrontmatter.d.ts +18 -0
  8. package/_vendor/schemas/contentManifest.d.ts +44 -0
  9. package/_vendor/schemas/contentManifest.mjs +197 -0
  10. package/_vendor/schemas/generated/consent.d.ts +2 -2
  11. package/_vendor/schemas/money.mjs +2 -0
  12. package/_vendor/schemas/routing/locale.mjs +2 -0
  13. package/_vendor/schemas/routing/rules.mjs +2 -0
  14. package/analytics/get-analytics-sinks.js +5 -1
  15. package/analytics/get-analytics-sinks.js.map +2 -2
  16. package/analytics/sinks/converge-sink.d.ts +21 -0
  17. package/analytics/sinks/converge-sink.js +51 -0
  18. package/analytics/sinks/converge-sink.js.map +7 -0
  19. package/analytics/sinks/northbeam-sink.d.ts +20 -0
  20. package/analytics/sinks/northbeam-sink.js +41 -0
  21. package/analytics/sinks/northbeam-sink.js.map +7 -0
  22. package/cart/cart-actions.js +13 -10
  23. package/cart/cart-actions.js.map +2 -2
  24. package/cart/cart-provider.js +5 -4
  25. package/cart/cart-provider.js.map +2 -2
  26. package/cart/gateways/cart-constants.d.ts +14 -0
  27. package/cart/gateways/cart-constants.js +23 -1
  28. package/cart/gateways/cart-constants.js.map +2 -2
  29. package/cart/utils/cart-utils.d.ts +8 -0
  30. package/cart/utils/cart-utils.js +13 -1
  31. package/cart/utils/cart-utils.js.map +2 -2
  32. package/cart/utils/cookie-cart-persistence.js +4 -21
  33. package/cart/utils/cookie-cart-persistence.js.map +2 -2
  34. package/chunk-AL3F36PH.mjs +1514 -0
  35. package/chunk-GV5FY7ZZ.mjs +89 -0
  36. package/chunk-I23U2PUI.mjs +151 -0
  37. package/chunk-IQ5GRTXO.mjs +182 -0
  38. package/chunk-VKO7P3ED.mjs +41 -0
  39. package/consent/script-snippets.js +19 -1
  40. package/consent/script-snippets.js.map +2 -2
  41. package/consent/types.d.ts +2 -2
  42. package/content.d.ts +126 -0
  43. package/content.js +594 -0
  44. package/content.js.map +7 -0
  45. package/lib/buildMetadata.js +3 -3
  46. package/package.json +12 -4
@@ -0,0 +1,89 @@
1
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObject.js
2
+ function isObject(value) {
3
+ var type = typeof value;
4
+ return value != null && (type == "object" || type == "function");
5
+ }
6
+ var isObject_default = isObject;
7
+
8
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArray.js
9
+ var isArray = Array.isArray;
10
+ var isArray_default = isArray;
11
+
12
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_freeGlobal.js
13
+ var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
14
+ var freeGlobal_default = freeGlobal;
15
+
16
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_root.js
17
+ var freeSelf = typeof self == "object" && self && self.Object === Object && self;
18
+ var root = freeGlobal_default || freeSelf || Function("return this")();
19
+ var root_default = root;
20
+
21
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Symbol.js
22
+ var Symbol = root_default.Symbol;
23
+ var Symbol_default = Symbol;
24
+
25
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getRawTag.js
26
+ var objectProto = Object.prototype;
27
+ var hasOwnProperty = objectProto.hasOwnProperty;
28
+ var nativeObjectToString = objectProto.toString;
29
+ var symToStringTag = Symbol_default ? Symbol_default.toStringTag : void 0;
30
+ function getRawTag(value) {
31
+ var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];
32
+ try {
33
+ value[symToStringTag] = void 0;
34
+ var unmasked = true;
35
+ } catch (e) {
36
+ }
37
+ var result = nativeObjectToString.call(value);
38
+ if (unmasked) {
39
+ if (isOwn) {
40
+ value[symToStringTag] = tag;
41
+ } else {
42
+ delete value[symToStringTag];
43
+ }
44
+ }
45
+ return result;
46
+ }
47
+ var getRawTag_default = getRawTag;
48
+
49
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_objectToString.js
50
+ var objectProto2 = Object.prototype;
51
+ var nativeObjectToString2 = objectProto2.toString;
52
+ function objectToString(value) {
53
+ return nativeObjectToString2.call(value);
54
+ }
55
+ var objectToString_default = objectToString;
56
+
57
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetTag.js
58
+ var nullTag = "[object Null]";
59
+ var undefinedTag = "[object Undefined]";
60
+ var symToStringTag2 = Symbol_default ? Symbol_default.toStringTag : void 0;
61
+ function baseGetTag(value) {
62
+ if (value == null) {
63
+ return value === void 0 ? undefinedTag : nullTag;
64
+ }
65
+ return symToStringTag2 && symToStringTag2 in Object(value) ? getRawTag_default(value) : objectToString_default(value);
66
+ }
67
+ var baseGetTag_default = baseGetTag;
68
+
69
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObjectLike.js
70
+ function isObjectLike(value) {
71
+ return value != null && typeof value == "object";
72
+ }
73
+ var isObjectLike_default = isObjectLike;
74
+
75
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isNumber.js
76
+ var numberTag = "[object Number]";
77
+ function isNumber(value) {
78
+ return typeof value == "number" || isObjectLike_default(value) && baseGetTag_default(value) == numberTag;
79
+ }
80
+ var isNumber_default = isNumber;
81
+
82
+ // ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isString.js
83
+ var stringTag = "[object String]";
84
+ function isString(value) {
85
+ return typeof value == "string" || !isArray_default(value) && isObjectLike_default(value) && baseGetTag_default(value) == stringTag;
86
+ }
87
+ var isString_default = isString;
88
+
89
+ export { Symbol_default, baseGetTag_default, freeGlobal_default, isArray_default, isNumber_default, isObjectLike_default, isObject_default, isString_default, root_default };
@@ -0,0 +1,151 @@
1
+ import { CONTENT_SEO_VALUE_KEYS, CONTENT_RELATED_VALUE_STORAGE_KEY, CONTENT_PRIVATE_VALUE_KEYS, contentEntryStatusSchema, isContentPrivateValueKey, getContentFieldValueSchema } from './chunk-IQ5GRTXO.mjs';
2
+ import { stringify, parseDocument } from 'yaml';
3
+ import { z } from 'zod';
4
+
5
+ var frontmatterDataSchema = z.record(z.string(), z.unknown());
6
+ var CONTENT_FRONTMATTER_PATTERN = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/u;
7
+ function parseContentFrontmatterYaml(yamlText) {
8
+ try {
9
+ const document = parseDocument(yamlText, {
10
+ merge: false,
11
+ schema: "core",
12
+ strict: true,
13
+ uniqueKeys: true
14
+ });
15
+ if (document.errors.length > 0) {
16
+ return null;
17
+ }
18
+ const parsed = frontmatterDataSchema.safeParse(
19
+ document.toJS({ maxAliasCount: 20 })
20
+ );
21
+ return parsed.success ? parsed.data : null;
22
+ } catch {
23
+ return null;
24
+ }
25
+ }
26
+ function parseContentFrontmatter(raw) {
27
+ const match = raw.match(CONTENT_FRONTMATTER_PATTERN);
28
+ if (!match) {
29
+ return null;
30
+ }
31
+ const values = parseContentFrontmatterYaml(match[1] ?? "");
32
+ if (values === null) {
33
+ return null;
34
+ }
35
+ return {
36
+ values,
37
+ body: raw.slice(match[0].length).replace(/^\r?\n/u, "")
38
+ };
39
+ }
40
+ var CONTENT_MANAGED_ENTRY_VALUE_KEYS = [
41
+ "slug",
42
+ "title",
43
+ "status",
44
+ "author",
45
+ "authorInitials",
46
+ "excerpt",
47
+ "coverImage",
48
+ "coverImageAlt",
49
+ "tags",
50
+ "updatedAt",
51
+ "publishedAt",
52
+ "archivedAt",
53
+ ...CONTENT_SEO_VALUE_KEYS,
54
+ CONTENT_RELATED_VALUE_STORAGE_KEY,
55
+ ...CONTENT_PRIVATE_VALUE_KEYS
56
+ ];
57
+ var contentEntryFrontmatterSchema = z.object({
58
+ slug: z.unknown().optional(),
59
+ title: z.string().nullish(),
60
+ status: contentEntryStatusSchema,
61
+ author: z.string().nullish(),
62
+ authorInitials: z.string().nullish(),
63
+ excerpt: z.string().nullish(),
64
+ coverImage: z.string().nullish(),
65
+ coverImageAlt: z.string().nullish(),
66
+ tags: z.array(z.string()).nullish(),
67
+ updatedAt: z.string().nullish(),
68
+ publishedAt: z.string().nullish(),
69
+ archivedAt: z.string().nullish(),
70
+ seoTitle: z.string().nullish(),
71
+ seoDescription: z.string().nullish(),
72
+ related: z.array(z.string()).nullish(),
73
+ scratchpad: z.unknown().optional(),
74
+ backlinks: z.unknown().optional()
75
+ }).passthrough();
76
+ function parseContentEntryDocument(raw) {
77
+ const frontmatter = parseContentFrontmatter(raw);
78
+ if (!frontmatter) {
79
+ return {
80
+ status: "invalid",
81
+ message: "Entry frontmatter is missing or contains invalid YAML."
82
+ };
83
+ }
84
+ const parsedValues = contentEntryFrontmatterSchema.safeParse(
85
+ frontmatter.values
86
+ );
87
+ if (!parsedValues.success) {
88
+ const issue = parsedValues.error.issues[0];
89
+ const field = issue?.path.join(".");
90
+ return {
91
+ status: "invalid",
92
+ message: `${field ? `Invalid ${field}: ` : ""}${issue?.message ?? "Invalid entry fields."}`
93
+ };
94
+ }
95
+ return {
96
+ status: "ready",
97
+ document: {
98
+ values: parsedValues.data,
99
+ body: frontmatter.body
100
+ }
101
+ };
102
+ }
103
+ function serializeContentEntryDocument({
104
+ values,
105
+ body
106
+ }) {
107
+ const yamlText = stringify(values).replace(/\n+$/u, "");
108
+ const normalizedBody = `${body.replace(/\s+$/u, "")}
109
+ `;
110
+ return `---
111
+ ${yamlText}
112
+ ---
113
+
114
+ ${normalizedBody}`;
115
+ }
116
+ function getContentRenderableEntryValues({
117
+ document,
118
+ slug
119
+ }) {
120
+ const publicFrontmatterValues = Object.fromEntries(
121
+ Object.entries(document.values).filter(([fieldId]) => {
122
+ return !isContentPrivateValueKey(fieldId);
123
+ })
124
+ );
125
+ return {
126
+ ...publicFrontmatterValues,
127
+ relatedContent: publicFrontmatterValues[CONTENT_RELATED_VALUE_STORAGE_KEY] ?? [],
128
+ body: document.body,
129
+ slug
130
+ };
131
+ }
132
+ function getContentEntryFieldValidationIssues({
133
+ fields,
134
+ values,
135
+ requireRequiredFields
136
+ }) {
137
+ return fields.flatMap((field) => {
138
+ if (!field.enabled || isContentPrivateValueKey(field.id)) {
139
+ return [];
140
+ }
141
+ const value = values[field.id];
142
+ const isMissing = value === void 0 || value === null || value === "";
143
+ if (isMissing) {
144
+ return requireRequiredFields && field.required ? [{ fieldId: field.id, message: "Required value is missing." }] : [];
145
+ }
146
+ const parsedValue = getContentFieldValueSchema(field.type).safeParse(value);
147
+ return parsedValue.success ? [] : [{ fieldId: field.id, message: "Value has the wrong format." }];
148
+ });
149
+ }
150
+
151
+ export { CONTENT_MANAGED_ENTRY_VALUE_KEYS, contentEntryFrontmatterSchema, getContentEntryFieldValidationIssues, getContentRenderableEntryValues, parseContentEntryDocument, serializeContentEntryDocument };
@@ -0,0 +1,182 @@
1
+ import { z } from 'zod';
2
+
3
+ // ../schemas/contentCollection.ts
4
+ var CONTENT_MANIFEST_FILENAME = "content-manifest.generated.json";
5
+ var CONTENT_DIRNAME = "content";
6
+ var CONTENT_COLLECTION_SCHEMA_FILENAME = "_collection.json";
7
+ var CONTENT_ENTRY_FILE_EXTENSION = ".mdx";
8
+ var CONTENT_RELATED_VALUE_STORAGE_KEY = "related";
9
+ var CONTENT_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
10
+ var CONTENT_MAX_SLUG_LENGTH = 100;
11
+ var contentSlugSchema = z.string().min(1).max(CONTENT_MAX_SLUG_LENGTH).regex(CONTENT_SLUG_PATTERN);
12
+ function isValidContentSlug(slug) {
13
+ return contentSlugSchema.safeParse(slug).success;
14
+ }
15
+ var CONTENT_ENTRY_STATUSES = [
16
+ "draft",
17
+ "published",
18
+ "archived"
19
+ ];
20
+ var contentEntryStatusSchema = z.enum(CONTENT_ENTRY_STATUSES);
21
+ function isContentEntryPubliclyVisible({
22
+ status,
23
+ archivedAt,
24
+ allowDrafts
25
+ }) {
26
+ if (archivedAt !== null && archivedAt !== void 0) {
27
+ return false;
28
+ }
29
+ return status === "published" || allowDrafts && status === "draft";
30
+ }
31
+ var contentCollectionFieldTypeSchema = z.enum([
32
+ "short-text",
33
+ "long-text",
34
+ "rich-text",
35
+ "image",
36
+ "tags",
37
+ "related",
38
+ "date",
39
+ "url",
40
+ "status",
41
+ "boolean"
42
+ ]);
43
+ var contentCollectionColorSchema = z.enum([
44
+ "seashell",
45
+ "yellow",
46
+ "lightGreen",
47
+ "darkGreen",
48
+ "lightPink",
49
+ "magenta",
50
+ "purple",
51
+ "blue"
52
+ ]);
53
+ var contentCollectionFieldSchema = z.object({
54
+ id: z.string().min(1).max(128),
55
+ label: z.string().min(1).max(200),
56
+ type: contentCollectionFieldTypeSchema,
57
+ required: z.boolean(),
58
+ enabled: z.boolean(),
59
+ helpText: z.string().optional(),
60
+ builtin: z.boolean()
61
+ });
62
+ var contentCollectionFileSchema = z.object({
63
+ name: z.string().min(1).max(200),
64
+ description: z.string(),
65
+ icon: z.string().min(1),
66
+ color: contentCollectionColorSchema,
67
+ tags: z.array(z.string()),
68
+ fields: z.array(contentCollectionFieldSchema).max(200),
69
+ archivedAt: z.iso.datetime().nullish(),
70
+ hasListingPage: z.boolean().optional()
71
+ }).passthrough();
72
+ function isSafeContentUrl(value, { image }) {
73
+ try {
74
+ const url = new URL(value, "https://content.local");
75
+ return image ? url.protocol === "http:" || url.protocol === "https:" : ["http:", "https:", "mailto:", "tel:"].includes(url.protocol);
76
+ } catch {
77
+ return false;
78
+ }
79
+ }
80
+ function getContentFieldValueSchema(fieldType) {
81
+ if (fieldType === "short-text" || fieldType === "long-text" || fieldType === "rich-text") {
82
+ return z.string();
83
+ }
84
+ if (fieldType === "image") {
85
+ return z.string().refine((value) => isSafeContentUrl(value, { image: true }));
86
+ }
87
+ if (fieldType === "tags" || fieldType === "related") {
88
+ return z.array(z.string());
89
+ }
90
+ if (fieldType === "date") {
91
+ return z.string().refine((value) => !Number.isNaN(Date.parse(value)));
92
+ }
93
+ if (fieldType === "url") {
94
+ return z.string().refine((value) => isSafeContentUrl(value, { image: false }));
95
+ }
96
+ if (fieldType === "status") {
97
+ return contentEntryStatusSchema;
98
+ }
99
+ return z.boolean();
100
+ }
101
+ var CONTENT_RESERVED_COLLECTION_SLUGS = ["api", "new"];
102
+ var CONTENT_RESERVED_ENTRY_SLUGS = ["new"];
103
+ var reservedEntrySlugSet = new Set(
104
+ CONTENT_RESERVED_ENTRY_SLUGS
105
+ );
106
+ function isContentReservedEntrySlug(slug) {
107
+ return reservedEntrySlugSet.has(slug);
108
+ }
109
+ var CONTENT_BUILTIN_FIELD_ROLES = {
110
+ title: "content",
111
+ author: "content",
112
+ excerpt: "content",
113
+ coverImage: "content",
114
+ body: "content",
115
+ tags: "content",
116
+ relatedContent: "content",
117
+ slug: "publishing",
118
+ status: "publishing",
119
+ publishedAt: "publishing"
120
+ };
121
+ var CONTENT_SEO_VALUE_KEYS = ["seoTitle", "seoDescription"];
122
+ var CONTENT_PRIVATE_VALUE_KEYS = ["scratchpad", "backlinks"];
123
+ var CONTENT_COUPLED_VALUE_PARENTS = {
124
+ coverImageAlt: "coverImage",
125
+ authorInitials: "author"
126
+ };
127
+ var privateValueKeySet = new Set(
128
+ CONTENT_PRIVATE_VALUE_KEYS
129
+ );
130
+ var seoValueKeySet = new Set(CONTENT_SEO_VALUE_KEYS);
131
+ var reservedCollectionSlugSet = new Set(
132
+ CONTENT_RESERVED_COLLECTION_SLUGS
133
+ );
134
+ function formatContentEntryRef({
135
+ collectionSlug,
136
+ entrySlug
137
+ }) {
138
+ return `${collectionSlug}/${entrySlug}`;
139
+ }
140
+ function parseContentEntryRef(ref) {
141
+ const normalized = ref.replace(/^content\//u, "").replace(/\.mdx$/u, "");
142
+ const segments = normalized.split("/");
143
+ if (segments.length !== 2) {
144
+ return null;
145
+ }
146
+ const [collectionSlug, entrySlug] = segments;
147
+ if (!collectionSlug || !entrySlug) {
148
+ return null;
149
+ }
150
+ return { collectionSlug, entrySlug };
151
+ }
152
+ function isContentPrivateValueKey(key) {
153
+ return privateValueKeySet.has(key);
154
+ }
155
+ function isContentSeoValueKey(key) {
156
+ return seoValueKeySet.has(key);
157
+ }
158
+ function isContentReservedCollectionSlug(slug) {
159
+ return reservedCollectionSlugSet.has(slug);
160
+ }
161
+ function getContentFieldRole(fieldId) {
162
+ if (isContentSeoValueKey(fieldId)) {
163
+ return "seo";
164
+ }
165
+ if (isContentPrivateValueKey(fieldId)) {
166
+ return "private";
167
+ }
168
+ const builtinRoles = CONTENT_BUILTIN_FIELD_ROLES;
169
+ return builtinRoles[fieldId] ?? "content";
170
+ }
171
+ function getPublishedContentFields(fields) {
172
+ return fields.filter((field) => {
173
+ return field.enabled && getContentFieldRole(field.id) !== "private";
174
+ });
175
+ }
176
+ function getOrderedContentFields(fields) {
177
+ return fields.filter((field) => {
178
+ return field.enabled && getContentFieldRole(field.id) === "content";
179
+ });
180
+ }
181
+
182
+ export { CONTENT_BUILTIN_FIELD_ROLES, CONTENT_COLLECTION_SCHEMA_FILENAME, CONTENT_COUPLED_VALUE_PARENTS, CONTENT_DIRNAME, CONTENT_ENTRY_FILE_EXTENSION, CONTENT_ENTRY_STATUSES, CONTENT_MANIFEST_FILENAME, CONTENT_MAX_SLUG_LENGTH, CONTENT_PRIVATE_VALUE_KEYS, CONTENT_RELATED_VALUE_STORAGE_KEY, CONTENT_RESERVED_COLLECTION_SLUGS, CONTENT_RESERVED_ENTRY_SLUGS, CONTENT_SEO_VALUE_KEYS, CONTENT_SLUG_PATTERN, contentCollectionColorSchema, contentCollectionFieldSchema, contentCollectionFieldTypeSchema, contentCollectionFileSchema, contentEntryStatusSchema, contentSlugSchema, formatContentEntryRef, getContentFieldRole, getContentFieldValueSchema, getOrderedContentFields, getPublishedContentFields, isContentEntryPubliclyVisible, isContentPrivateValueKey, isContentReservedCollectionSlug, isContentReservedEntrySlug, isContentSeoValueKey, isSafeContentUrl, isValidContentSlug, parseContentEntryRef };
@@ -0,0 +1,41 @@
1
+ // ../replo-utils/lib/object.ts
2
+ function omit(obj, keysToOmit) {
3
+ const result = { ...obj };
4
+ for (const key of keysToOmit) {
5
+ delete result[key];
6
+ }
7
+ return result;
8
+ }
9
+
10
+ // ../replo-utils/lib/json.ts
11
+ function parseJsonOrNull(json) {
12
+ try {
13
+ return JSON.parse(json);
14
+ } catch {
15
+ return null;
16
+ }
17
+ }
18
+ function omitJsonObjectFieldsOrNull({
19
+ json,
20
+ fields
21
+ }) {
22
+ const parsedJson = parseJsonOrNull(json);
23
+ if (typeof parsedJson !== "object" || parsedJson === null || Array.isArray(parsedJson)) {
24
+ return null;
25
+ }
26
+ return jsonStringifyOrNull(
27
+ omit(Object.fromEntries(Object.entries(parsedJson)), fields)
28
+ );
29
+ }
30
+ function jsonStringifyOrNull(value) {
31
+ if (value === null || value === void 0) {
32
+ return null;
33
+ }
34
+ try {
35
+ return JSON.stringify(value);
36
+ } catch {
37
+ return null;
38
+ }
39
+ }
40
+
41
+ export { jsonStringifyOrNull, omitJsonObjectFieldsOrNull, parseJsonOrNull };
@@ -110,10 +110,28 @@ gtag('config', '${id}');`
110
110
  },
111
111
  Northbeam: {
112
112
  defaultConsent: ["analytics", "marketing"],
113
+ // No trackPageViewInitial self-fire: NorthbeamSink owns every pageview
114
+ // (initial + soft navigations) via the NavigationTracker broadcast.
113
115
  buildTags: (id) => [
114
116
  {
115
117
  kind: "inline",
116
- body: `(function(){var t;(n=t=t||{}).A="identify",n.B="trackPageView",n.C="fireEmailCaptureEvent",n.D="fireCustomGoal",n.E="firePurchaseEvent",n.F="trackPageViewInitial",n.G="fireSlimPurchaseEvent",n.H="identifyCustomerId";var n="https://j.northbeam.io/ota-sp/${id}.js";function r(n){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];i.push({fnName:n,args:e})}var e,i=[],a=((e={})[t.F]=function(n){r(t.F,n)},(a={_q:i})[t.A]=function(n,e){return r(t.A,n,e)},a[t.B]=function(){return r(t.B)},a[t.C]=function(n,e){return r(t.C,n,e)},a[t.D]=function(n,e){return r(t.D,n,e)},a[t.E]=function(n){return r(t.E,n)},a[t.G]=function(n){return r(t.G,n)},a[t.H]=function(n,e){return r(t.H,n,e)},Object.assign(function(n){for(var e=[],t=1;t<arguments.length;t++)e.push(arguments[t]);return r.apply(null,[n].concat(e))},a));window.Northbeam=a,(a=document.createElement("script")).async=!0,a.src=n,document.head.appendChild(a),e.trackPageViewInitial(window.location.href);})()`
118
+ body: `(function(){var t;(n=t=t||{}).A="identify",n.B="trackPageView",n.C="fireEmailCaptureEvent",n.D="fireCustomGoal",n.E="firePurchaseEvent",n.F="trackPageViewInitial",n.G="fireSlimPurchaseEvent",n.H="identifyCustomerId";var n="https://j.northbeam.io/ota-sp/${id}.js";function r(n){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];i.push({fnName:n,args:e})}var e,i=[],a=((e={})[t.F]=function(n){r(t.F,n)},(a={_q:i})[t.A]=function(n,e){return r(t.A,n,e)},a[t.B]=function(){return r(t.B)},a[t.C]=function(n,e){return r(t.C,n,e)},a[t.D]=function(n,e){return r(t.D,n,e)},a[t.E]=function(n){return r(t.E,n)},a[t.G]=function(n){return r(t.G,n)},a[t.H]=function(n,e){return r(t.H,n,e)},Object.assign(function(n){for(var e=[],t=1;t<arguments.length;t++)e.push(arguments[t]);return r.apply(null,[n].concat(e))},a));window.Northbeam=a,(a=document.createElement("script")).async=!0,a.src=n,document.head.appendChild(a);})()`
119
+ }
120
+ ]
121
+ },
122
+ Converge: {
123
+ defaultConsent: ["analytics", "marketing"],
124
+ // No $page_load self-fire: ConvergeSink owns every pageview (initial +
125
+ // soft navigations) via the NavigationTracker broadcast.
126
+ buildTags: (id) => [
127
+ {
128
+ kind: "external",
129
+ src: `https://static.runconverge.com/pixels/${id}.js`,
130
+ attributes: { async: "true" }
131
+ },
132
+ {
133
+ kind: "inline",
134
+ body: `window.cvg||(c=window.cvg=function(){c.process?c.process.apply(c,arguments):c.queue.push(arguments)},c.queue=[]);`
117
135
  }
118
136
  ]
119
137
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../consent/script-snippets.ts"],
4
- "sourcesContent": ["import type {\n ConsentCategory,\n ReploScriptType,\n ScriptTagDescriptor,\n} from \"schemas/generated/consent\";\n\n// Identifier providers: those whose script the runtime synthesizes from an ID.\n// `snippet` (pasted whole) and `custom` carry their own bodies instead.\n// Cookiebot's loader is built by its consent-platform preset, not here.\ntype ProviderType = Exclude<\n ReploScriptType,\n \"custom\" | \"snippet\" | \"consentPlatform\" | \"Cookiebot\"\n>;\n\n/**\n * Runtime-safe per-provider data for the consent system. This is the subset of\n * the website-builder miniapp's `scriptConstants.ts` that must ship in the\n * customer site bundle: how to materialize each provider's script tags, and the\n * default consent category that gates it. Miniapp-only concerns (LLM detection\n * schemas, logos, marketing copy) intentionally stay in the miniapp.\n *\n * Unlike the miniapp's `buildSnippet`, which returns a JSX *string* for the\n * agent to paste into `layout.tsx`, this returns structured descriptors so the\n * runtime can inject real DOM nodes (inline `<script>` bodies set via React's\n * `dangerouslySetInnerHTML` never execute).\n */\ntype ProviderSnippet = {\n defaultConsent: ConsentCategory[];\n buildTags: (identifier: string) => ScriptTagDescriptor[];\n};\n\n/**\n * NOTE (Ryan, 2026-05-28, REPL-27515): `defaultConsent` is net-new,\n * legally-sensitive categorization that does not exist elsewhere in the repo.\n * These are conservative defaults a customer can override per entry via\n * `requiredConsent`; container/CDP providers that fan out to multiple vendors\n * (GTM, Segment) require the union of categories they can serve.\n */\nconst PROVIDER_SNIPPETS: Record<ProviderType, ProviderSnippet> = {\n GA4: {\n defaultConsent: [\"analytics\"],\n buildTags: (id) => [\n {\n kind: \"external\",\n src: `https://www.googletagmanager.com/gtag/js?id=${id}`,\n },\n {\n kind: \"inline\",\n body: `window.dataLayer = window.dataLayer || [];\\nfunction gtag(){dataLayer.push(arguments);}\\ngtag('js', new Date());\\ngtag('config', '${id}');`,\n },\n ],\n },\n GoogleTagManager: {\n defaultConsent: [\"analytics\", \"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','${id}');`,\n },\n ],\n },\n Meta: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,document,'script','https://connect.facebook.net/en_US/fbevents.js');fbq('init','${id}');fbq('track','PageView');`,\n },\n ],\n },\n TikTok: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(w,d,t){w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=[\"page\",\"track\",\"identify\",\"instances\",\"debug\",\"on\",\"off\",\"once\",\"ready\",\"alias\",\"group\",\"enableCookie\",\"disableCookie\",\"holdConsent\",\"revokeConsent\",\"grantConsent\"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e};ttq.load=function(e,n){var r=\"https://analytics.tiktok.com/i18n/pixel/events.js\",o=n&&n.partner;ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=r,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};var a=document.createElement(\"script\");a.type=\"text/javascript\",a.async=!0,a.src=r+\"?sdkid=\"+e+\"&lib=\"+t;var s=document.getElementsByTagName(\"script\")[0];s.parentNode.insertBefore(a,s)};ttq.load('${id}');ttq.page();}(window,document,'ttq');`,\n },\n ],\n },\n Pinterest: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(e){if(!window.pintrk){window.pintrk=function(){window.pintrk.queue.push(Array.prototype.slice.call(arguments))};var n=window.pintrk;n.queue=[],n.version=\"3.0\";var t=document.createElement(\"script\");t.async=!0,t.src=e;var r=document.getElementsByTagName(\"script\")[0];r.parentNode.insertBefore(t,r)}}(\"https://s.pinimg.com/ct/core.js\");pintrk('load','${id}');pintrk('page');`,\n },\n ],\n },\n Reddit: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(w,d){if(!w.rdt){var p=w.rdt=function(){p.sendEvent?p.sendEvent.apply(p,arguments):p.callQueue.push(arguments)};p.callQueue=[];var t=d.createElement(\"script\");t.src=\"https://www.redditstatic.com/ads/pixel.js\",t.async=!0;var s=d.getElementsByTagName(\"script\")[0];s.parentNode.insertBefore(t,s)}}(window,document);rdt('init','${id}');rdt('track','PageVisit');`,\n },\n ],\n },\n Snapchat: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(e,t,n){if(e.snaptr)return;var a=e.snaptr=function(){a.handleRequest?a.handleRequest.apply(a,arguments):a.queue.push(arguments)};a.queue=[];var s='script';var r=t.createElement(s);r.async=!0;r.src=n;var u=t.getElementsByTagName(s)[0];u.parentNode.insertBefore(r,u);})(window,document,'https://sc-static.net/scevent.min.js');snaptr('init','${id}',{});snaptr('track','PAGE_VIEW');`,\n },\n ],\n },\n Hotjar: {\n defaultConsent: [\"analytics\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(h,o,t,j,a,r){h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};h._hjSettings={hjid:${id},hjsv:6};a=o.getElementsByTagName('head')[0];r=o.createElement('script');r.async=1;r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;a.appendChild(r);})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');`,\n },\n ],\n },\n MicrosoftClarity: {\n defaultConsent: [\"analytics\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(c,l,a,r,i,t,y){c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};t=l.createElement(r);t.async=1;t.src=\"https://www.clarity.ms/tag/\"+i;y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);})(window,document,\"clarity\",\"script\",\"${id}\");`,\n },\n ],\n },\n Contentsquare: {\n defaultConsent: [\"analytics\"],\n // The UXA tag is a single async external script keyed by the 13-char tag id;\n // it bootstraps the Contentsquare `_uxa` queue itself once loaded.\n buildTags: (id) => [\n {\n kind: \"external\",\n src: `https://t.contentsquare.net/uxa/${id}.js`,\n attributes: { async: \"true\" },\n },\n ],\n },\n Segment: {\n defaultConsent: [\"analytics\", \"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(){var i=\"analytics\",analytics=window[i]=window[i]||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error(\"Segment snippet included twice.\");else{analytics.invoked=!0;analytics.methods=[\"trackSubmit\",\"trackClick\",\"trackLink\",\"trackForm\",\"pageview\",\"identify\",\"reset\",\"group\",\"track\",\"ready\",\"alias\",\"debug\",\"page\",\"screen\",\"once\",\"off\",\"on\",\"addSourceMiddleware\",\"addIntegrationMiddleware\",\"setAnonymousId\",\"addDestinationMiddleware\",\"register\"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e<analytics.methods.length;e++){var key=analytics.methods[e];analytics[key]=analytics.factory(key)}analytics.load=function(key,e){var t=document.createElement(\"script\");t.type=\"text/javascript\";t.async=!0;t.src=\"https://cdn.segment.com/analytics.js/v1/\"+key+\"/analytics.min.js\";var n=document.getElementsByTagName(\"script\")[0];n.parentNode.insertBefore(t,n);analytics._loadOptions=e};analytics._writeKey=\"${id}\";analytics.SNIPPET_VERSION=\"5.2.0\";analytics.load(\"${id}\");analytics.page();}}();`,\n },\n ],\n },\n Northbeam: {\n defaultConsent: [\"analytics\", \"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(){var t;(n=t=t||{}).A=\"identify\",n.B=\"trackPageView\",n.C=\"fireEmailCaptureEvent\",n.D=\"fireCustomGoal\",n.E=\"firePurchaseEvent\",n.F=\"trackPageViewInitial\",n.G=\"fireSlimPurchaseEvent\",n.H=\"identifyCustomerId\";var n=\"https://j.northbeam.io/ota-sp/${id}.js\";function r(n){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];i.push({fnName:n,args:e})}var e,i=[],a=((e={})[t.F]=function(n){r(t.F,n)},(a={_q:i})[t.A]=function(n,e){return r(t.A,n,e)},a[t.B]=function(){return r(t.B)},a[t.C]=function(n,e){return r(t.C,n,e)},a[t.D]=function(n,e){return r(t.D,n,e)},a[t.E]=function(n){return r(t.E,n)},a[t.G]=function(n){return r(t.G,n)},a[t.H]=function(n,e){return r(t.H,n,e)},Object.assign(function(n){for(var e=[],t=1;t<arguments.length;t++)e.push(arguments[t]);return r.apply(null,[n].concat(e))},a));window.Northbeam=a,(a=document.createElement(\"script\")).async=!0,a.src=n,document.head.appendChild(a),e.trackPageViewInitial(window.location.href);})()`,\n },\n ],\n },\n Gorgias: {\n // Support chat stores the visitor's chat session, which is a functional\n // preference rather than analytics or ad tracking.\n defaultConsent: [\"preferences\"],\n // The id attribute matches Gorgias's official v3 install snippet; their\n // customization scripts and support tooling look the tag up by that id.\n buildTags: (id) => [\n {\n kind: \"external\",\n src: `https://config.gorgias.chat/bundle-loader/${id}`,\n attributes: { id: \"gorgias-chat-widget-install-v3\" },\n },\n ],\n },\n};\n\n/**\n * Snippet providers don't synthesize tags (the user pastes the provider-issued\n * snippet as the entry's `body`), but they still get a first-class default\n * consent categorization like identifier providers.\n */\n/**\n * Returns the structured tag descriptors for a named provider. A single provider\n * can produce multiple tags (e.g. GA4 = external loader + inline config), which\n * the runtime injects in order.\n */\nexport function buildScriptTags({\n type,\n identifier,\n}: {\n type: ProviderType;\n identifier: string;\n}): ScriptTagDescriptor[] {\n return PROVIDER_SNIPPETS[type].buildTags(identifier);\n}\n\n/**\n * The default consent categories that gate an identifier-provider script when an\n * entry does not specify `requiredConsent`. `snippet` and `custom` entries carry\n * `requiredConsent` explicitly (the runtime has no default for them), so this is\n * only consulted for identifier providers. Overridable per entry by the customer.\n */\nexport function defaultConsentFor(type: ProviderType): ConsentCategory[] {\n return PROVIDER_SNIPPETS[type].defaultConsent;\n}\n"],
5
- "mappings": "AAsCA,MAAM,oBAA2D;AAAA,EAC/D,KAAK;AAAA,IACH,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,KAAK,+CAA+C,EAAE;AAAA,MACxD;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA;AAAA;AAAA,kBAAqI,EAAE;AAAA,MAC/I;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,gBAAgB,CAAC,aAAa,WAAW;AAAA,IACzC,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,sUAAsU,EAAE;AAAA,MAChV;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,uYAAuY,EAAE;AAAA,MACjZ;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,+7BAA+7B,EAAE;AAAA,MACz8B;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,0WAA0W,EAAE;AAAA,MACpX;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,gVAAgV,EAAE;AAAA,MAC1V;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,+VAA+V,EAAE;AAAA,MACzW;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,yGAAyG,EAAE;AAAA,MACnH;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,iQAAiQ,EAAE;AAAA,MAC3Q;AAAA,IACF;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb,gBAAgB,CAAC,WAAW;AAAA;AAAA;AAAA,IAG5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,KAAK,mCAAmC,EAAE;AAAA,QAC1C,YAAY,EAAE,OAAO,OAAO;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,gBAAgB,CAAC,aAAa,WAAW;AAAA,IACzC,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,iiCAAiiC,EAAE,uDAAuD,EAAE;AAAA,MACpmC;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,gBAAgB,CAAC,aAAa,WAAW;AAAA,IACzC,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,gQAAgQ,EAAE;AAAA,MAC1Q;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA;AAAA;AAAA,IAGP,gBAAgB,CAAC,aAAa;AAAA;AAAA;AAAA,IAG9B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,KAAK,6CAA6C,EAAE;AAAA,QACpD,YAAY,EAAE,IAAI,iCAAiC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF;AAYO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,GAG0B;AACxB,SAAO,kBAAkB,IAAI,EAAE,UAAU,UAAU;AACrD;AAQO,SAAS,kBAAkB,MAAuC;AACvE,SAAO,kBAAkB,IAAI,EAAE;AACjC;",
4
+ "sourcesContent": ["import type {\n ConsentCategory,\n ReploScriptType,\n ScriptTagDescriptor,\n} from \"schemas/generated/consent\";\n\n// Identifier providers: those whose script the runtime synthesizes from an ID.\n// `snippet` (pasted whole) and `custom` carry their own bodies instead.\n// Cookiebot's loader is built by its consent-platform preset, not here.\ntype ProviderType = Exclude<\n ReploScriptType,\n \"custom\" | \"snippet\" | \"consentPlatform\" | \"Cookiebot\"\n>;\n\n/**\n * Runtime-safe per-provider data for the consent system. This is the subset of\n * the website-builder miniapp's `scriptConstants.ts` that must ship in the\n * customer site bundle: how to materialize each provider's script tags, and the\n * default consent category that gates it. Miniapp-only concerns (LLM detection\n * schemas, logos, marketing copy) intentionally stay in the miniapp.\n *\n * Unlike the miniapp's `buildSnippet`, which returns a JSX *string* for the\n * agent to paste into `layout.tsx`, this returns structured descriptors so the\n * runtime can inject real DOM nodes (inline `<script>` bodies set via React's\n * `dangerouslySetInnerHTML` never execute).\n */\ntype ProviderSnippet = {\n defaultConsent: ConsentCategory[];\n buildTags: (identifier: string) => ScriptTagDescriptor[];\n};\n\n/**\n * NOTE (Ryan, 2026-05-28, REPL-27515): `defaultConsent` is net-new,\n * legally-sensitive categorization that does not exist elsewhere in the repo.\n * These are conservative defaults a customer can override per entry via\n * `requiredConsent`; container/CDP providers that fan out to multiple vendors\n * (GTM, Segment) require the union of categories they can serve.\n */\nconst PROVIDER_SNIPPETS: Record<ProviderType, ProviderSnippet> = {\n GA4: {\n defaultConsent: [\"analytics\"],\n buildTags: (id) => [\n {\n kind: \"external\",\n src: `https://www.googletagmanager.com/gtag/js?id=${id}`,\n },\n {\n kind: \"inline\",\n body: `window.dataLayer = window.dataLayer || [];\\nfunction gtag(){dataLayer.push(arguments);}\\ngtag('js', new Date());\\ngtag('config', '${id}');`,\n },\n ],\n },\n GoogleTagManager: {\n defaultConsent: [\"analytics\", \"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','${id}');`,\n },\n ],\n },\n Meta: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,document,'script','https://connect.facebook.net/en_US/fbevents.js');fbq('init','${id}');fbq('track','PageView');`,\n },\n ],\n },\n TikTok: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(w,d,t){w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=[\"page\",\"track\",\"identify\",\"instances\",\"debug\",\"on\",\"off\",\"once\",\"ready\",\"alias\",\"group\",\"enableCookie\",\"disableCookie\",\"holdConsent\",\"revokeConsent\",\"grantConsent\"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e};ttq.load=function(e,n){var r=\"https://analytics.tiktok.com/i18n/pixel/events.js\",o=n&&n.partner;ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=r,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};var a=document.createElement(\"script\");a.type=\"text/javascript\",a.async=!0,a.src=r+\"?sdkid=\"+e+\"&lib=\"+t;var s=document.getElementsByTagName(\"script\")[0];s.parentNode.insertBefore(a,s)};ttq.load('${id}');ttq.page();}(window,document,'ttq');`,\n },\n ],\n },\n Pinterest: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(e){if(!window.pintrk){window.pintrk=function(){window.pintrk.queue.push(Array.prototype.slice.call(arguments))};var n=window.pintrk;n.queue=[],n.version=\"3.0\";var t=document.createElement(\"script\");t.async=!0,t.src=e;var r=document.getElementsByTagName(\"script\")[0];r.parentNode.insertBefore(t,r)}}(\"https://s.pinimg.com/ct/core.js\");pintrk('load','${id}');pintrk('page');`,\n },\n ],\n },\n Reddit: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(w,d){if(!w.rdt){var p=w.rdt=function(){p.sendEvent?p.sendEvent.apply(p,arguments):p.callQueue.push(arguments)};p.callQueue=[];var t=d.createElement(\"script\");t.src=\"https://www.redditstatic.com/ads/pixel.js\",t.async=!0;var s=d.getElementsByTagName(\"script\")[0];s.parentNode.insertBefore(t,s)}}(window,document);rdt('init','${id}');rdt('track','PageVisit');`,\n },\n ],\n },\n Snapchat: {\n defaultConsent: [\"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(e,t,n){if(e.snaptr)return;var a=e.snaptr=function(){a.handleRequest?a.handleRequest.apply(a,arguments):a.queue.push(arguments)};a.queue=[];var s='script';var r=t.createElement(s);r.async=!0;r.src=n;var u=t.getElementsByTagName(s)[0];u.parentNode.insertBefore(r,u);})(window,document,'https://sc-static.net/scevent.min.js');snaptr('init','${id}',{});snaptr('track','PAGE_VIEW');`,\n },\n ],\n },\n Hotjar: {\n defaultConsent: [\"analytics\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(h,o,t,j,a,r){h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};h._hjSettings={hjid:${id},hjsv:6};a=o.getElementsByTagName('head')[0];r=o.createElement('script');r.async=1;r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;a.appendChild(r);})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');`,\n },\n ],\n },\n MicrosoftClarity: {\n defaultConsent: [\"analytics\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(c,l,a,r,i,t,y){c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};t=l.createElement(r);t.async=1;t.src=\"https://www.clarity.ms/tag/\"+i;y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);})(window,document,\"clarity\",\"script\",\"${id}\");`,\n },\n ],\n },\n Contentsquare: {\n defaultConsent: [\"analytics\"],\n // The UXA tag is a single async external script keyed by the 13-char tag id;\n // it bootstraps the Contentsquare `_uxa` queue itself once loaded.\n buildTags: (id) => [\n {\n kind: \"external\",\n src: `https://t.contentsquare.net/uxa/${id}.js`,\n attributes: { async: \"true\" },\n },\n ],\n },\n Segment: {\n defaultConsent: [\"analytics\", \"marketing\"],\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `!function(){var i=\"analytics\",analytics=window[i]=window[i]||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error(\"Segment snippet included twice.\");else{analytics.invoked=!0;analytics.methods=[\"trackSubmit\",\"trackClick\",\"trackLink\",\"trackForm\",\"pageview\",\"identify\",\"reset\",\"group\",\"track\",\"ready\",\"alias\",\"debug\",\"page\",\"screen\",\"once\",\"off\",\"on\",\"addSourceMiddleware\",\"addIntegrationMiddleware\",\"setAnonymousId\",\"addDestinationMiddleware\",\"register\"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e<analytics.methods.length;e++){var key=analytics.methods[e];analytics[key]=analytics.factory(key)}analytics.load=function(key,e){var t=document.createElement(\"script\");t.type=\"text/javascript\";t.async=!0;t.src=\"https://cdn.segment.com/analytics.js/v1/\"+key+\"/analytics.min.js\";var n=document.getElementsByTagName(\"script\")[0];n.parentNode.insertBefore(t,n);analytics._loadOptions=e};analytics._writeKey=\"${id}\";analytics.SNIPPET_VERSION=\"5.2.0\";analytics.load(\"${id}\");analytics.page();}}();`,\n },\n ],\n },\n Northbeam: {\n defaultConsent: [\"analytics\", \"marketing\"],\n // No trackPageViewInitial self-fire: NorthbeamSink owns every pageview\n // (initial + soft navigations) via the NavigationTracker broadcast.\n buildTags: (id) => [\n {\n kind: \"inline\",\n body: `(function(){var t;(n=t=t||{}).A=\"identify\",n.B=\"trackPageView\",n.C=\"fireEmailCaptureEvent\",n.D=\"fireCustomGoal\",n.E=\"firePurchaseEvent\",n.F=\"trackPageViewInitial\",n.G=\"fireSlimPurchaseEvent\",n.H=\"identifyCustomerId\";var n=\"https://j.northbeam.io/ota-sp/${id}.js\";function r(n){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];i.push({fnName:n,args:e})}var e,i=[],a=((e={})[t.F]=function(n){r(t.F,n)},(a={_q:i})[t.A]=function(n,e){return r(t.A,n,e)},a[t.B]=function(){return r(t.B)},a[t.C]=function(n,e){return r(t.C,n,e)},a[t.D]=function(n,e){return r(t.D,n,e)},a[t.E]=function(n){return r(t.E,n)},a[t.G]=function(n){return r(t.G,n)},a[t.H]=function(n,e){return r(t.H,n,e)},Object.assign(function(n){for(var e=[],t=1;t<arguments.length;t++)e.push(arguments[t]);return r.apply(null,[n].concat(e))},a));window.Northbeam=a,(a=document.createElement(\"script\")).async=!0,a.src=n,document.head.appendChild(a);})()`,\n },\n ],\n },\n Converge: {\n defaultConsent: [\"analytics\", \"marketing\"],\n // No $page_load self-fire: ConvergeSink owns every pageview (initial +\n // soft navigations) via the NavigationTracker broadcast.\n buildTags: (id) => [\n {\n kind: \"external\",\n src: `https://static.runconverge.com/pixels/${id}.js`,\n attributes: { async: \"true\" },\n },\n {\n kind: \"inline\",\n body: `window.cvg||(c=window.cvg=function(){c.process?c.process.apply(c,arguments):c.queue.push(arguments)},c.queue=[]);`,\n },\n ],\n },\n Gorgias: {\n // Support chat stores the visitor's chat session, which is a functional\n // preference rather than analytics or ad tracking.\n defaultConsent: [\"preferences\"],\n // The id attribute matches Gorgias's official v3 install snippet; their\n // customization scripts and support tooling look the tag up by that id.\n buildTags: (id) => [\n {\n kind: \"external\",\n src: `https://config.gorgias.chat/bundle-loader/${id}`,\n attributes: { id: \"gorgias-chat-widget-install-v3\" },\n },\n ],\n },\n};\n\n/**\n * Snippet providers don't synthesize tags (the user pastes the provider-issued\n * snippet as the entry's `body`), but they still get a first-class default\n * consent categorization like identifier providers.\n */\n/**\n * Returns the structured tag descriptors for a named provider. A single provider\n * can produce multiple tags (e.g. GA4 = external loader + inline config), which\n * the runtime injects in order.\n */\nexport function buildScriptTags({\n type,\n identifier,\n}: {\n type: ProviderType;\n identifier: string;\n}): ScriptTagDescriptor[] {\n return PROVIDER_SNIPPETS[type].buildTags(identifier);\n}\n\n/**\n * The default consent categories that gate an identifier-provider script when an\n * entry does not specify `requiredConsent`. `snippet` and `custom` entries carry\n * `requiredConsent` explicitly (the runtime has no default for them), so this is\n * only consulted for identifier providers. Overridable per entry by the customer.\n */\nexport function defaultConsentFor(type: ProviderType): ConsentCategory[] {\n return PROVIDER_SNIPPETS[type].defaultConsent;\n}\n"],
5
+ "mappings": "AAsCA,MAAM,oBAA2D;AAAA,EAC/D,KAAK;AAAA,IACH,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,KAAK,+CAA+C,EAAE;AAAA,MACxD;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA;AAAA;AAAA,kBAAqI,EAAE;AAAA,MAC/I;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,gBAAgB,CAAC,aAAa,WAAW;AAAA,IACzC,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,sUAAsU,EAAE;AAAA,MAChV;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,uYAAuY,EAAE;AAAA,MACjZ;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,+7BAA+7B,EAAE;AAAA,MACz8B;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,0WAA0W,EAAE;AAAA,MACpX;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,gVAAgV,EAAE;AAAA,MAC1V;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,+VAA+V,EAAE;AAAA,MACzW;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,yGAAyG,EAAE;AAAA,MACnH;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,gBAAgB,CAAC,WAAW;AAAA,IAC5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,iQAAiQ,EAAE;AAAA,MAC3Q;AAAA,IACF;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb,gBAAgB,CAAC,WAAW;AAAA;AAAA;AAAA,IAG5B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,KAAK,mCAAmC,EAAE;AAAA,QAC1C,YAAY,EAAE,OAAO,OAAO;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,gBAAgB,CAAC,aAAa,WAAW;AAAA,IACzC,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,iiCAAiiC,EAAE,uDAAuD,EAAE;AAAA,MACpmC;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,gBAAgB,CAAC,aAAa,WAAW;AAAA;AAAA;AAAA,IAGzC,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,MAAM,gQAAgQ,EAAE;AAAA,MAC1Q;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,gBAAgB,CAAC,aAAa,WAAW;AAAA;AAAA;AAAA,IAGzC,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,KAAK,yCAAyC,EAAE;AAAA,QAChD,YAAY,EAAE,OAAO,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA;AAAA;AAAA,IAGP,gBAAgB,CAAC,aAAa;AAAA;AAAA;AAAA,IAG9B,WAAW,CAAC,OAAO;AAAA,MACjB;AAAA,QACE,MAAM;AAAA,QACN,KAAK,6CAA6C,EAAE;AAAA,QACpD,YAAY,EAAE,IAAI,iCAAiC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF;AAYO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,GAG0B;AACxB,SAAO,kBAAkB,IAAI,EAAE,UAAU,UAAU;AACrD;AAQO,SAAS,kBAAkB,MAAuC;AACvE,SAAO,kBAAkB,IAAI,EAAE;AACjC;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- export type ReploScriptType = "GA4" | "GoogleTagManager" | "Meta" | "TikTok" | "Pinterest" | "Reddit" | "Snapchat" | "Hotjar" | "MicrosoftClarity" | "Contentsquare" | "Segment" | "Northbeam" | "Gorgias" | "Cookiebot" | "snippet" | "custom" | "consentPlatform";
1
+ export type ReploScriptType = "GA4" | "GoogleTagManager" | "Meta" | "TikTok" | "Pinterest" | "Reddit" | "Snapchat" | "Hotjar" | "MicrosoftClarity" | "Contentsquare" | "Segment" | "Northbeam" | "Gorgias" | "Converge" | "Cookiebot" | "snippet" | "custom" | "consentPlatform";
2
2
  export type ConsentCategory = "necessary" | "analytics" | "marketing" | "preferences" | "sale_of_data";
3
3
  export type ConsentMode = "off" | "simple" | "per-category";
4
4
  declare module "react" {
@@ -17,7 +17,7 @@ export type ScriptTagDescriptor = {
17
17
  body: string;
18
18
  };
19
19
  export type ReploScriptEntry = {
20
- type: "GA4" | "GoogleTagManager" | "Meta" | "TikTok" | "Pinterest" | "Reddit" | "Snapchat" | "Hotjar" | "MicrosoftClarity" | "Contentsquare" | "Segment" | "Northbeam" | "Gorgias" | "Cookiebot";
20
+ type: "GA4" | "GoogleTagManager" | "Meta" | "TikTok" | "Pinterest" | "Reddit" | "Snapchat" | "Hotjar" | "MicrosoftClarity" | "Contentsquare" | "Segment" | "Northbeam" | "Gorgias" | "Converge" | "Cookiebot";
21
21
  identifier: string;
22
22
  requiredConsent?: ConsentCategory[];
23
23
  } | {