@guidelytech/shared 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-XJXXVV3C.js → chunk-7PWYIAJI.js} +30 -1
- package/dist/chunk-7PWYIAJI.js.map +1 -0
- package/dist/index.cjs +74 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +231 -645
- package/dist/index.d.ts +231 -645
- package/dist/index.js +49 -10
- package/dist/index.js.map +1 -1
- package/dist/runtime-CAtOOY7X.d.cts +3047 -0
- package/dist/runtime-CAtOOY7X.d.ts +3047 -0
- package/dist/runtime.cjs +35 -0
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.d.cts +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +13 -1
- package/package.json +3 -3
- package/dist/chunk-OLWGMDRX.js +0 -729
- package/dist/chunk-OLWGMDRX.js.map +0 -1
- package/dist/chunk-TGIUEYXM.js +0 -1937
- package/dist/chunk-TGIUEYXM.js.map +0 -1
- package/dist/chunk-UW6NRYRY.js +0 -809
- package/dist/chunk-UW6NRYRY.js.map +0 -1
- package/dist/chunk-XJXXVV3C.js.map +0 -1
- package/dist/runtime-BM5cztmJ.d.cts +0 -5234
- package/dist/runtime-BM5cztmJ.d.ts +0 -5234
- package/dist/runtime-BeSHQtNX.d.cts +0 -5263
- package/dist/runtime-BeSHQtNX.d.ts +0 -5263
package/dist/chunk-UW6NRYRY.js
DELETED
|
@@ -1,809 +0,0 @@
|
|
|
1
|
-
// src/utils.ts
|
|
2
|
-
function fnv1a(input) {
|
|
3
|
-
let h = 2166136261;
|
|
4
|
-
for (let i = 0; i < input.length; i++) {
|
|
5
|
-
h ^= input.charCodeAt(i);
|
|
6
|
-
h = Math.imul(h, 16777619) >>> 0;
|
|
7
|
-
}
|
|
8
|
-
return h >>> 0;
|
|
9
|
-
}
|
|
10
|
-
function rolloutBucket(subject, salt) {
|
|
11
|
-
return fnv1a(`${salt}:${subject}`) % 100;
|
|
12
|
-
}
|
|
13
|
-
function slugify(input) {
|
|
14
|
-
return input.toLowerCase().trim().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "untitled";
|
|
15
|
-
}
|
|
16
|
-
var ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
17
|
-
function randomId(size = 16) {
|
|
18
|
-
const g = typeof globalThis !== "undefined" ? globalThis : {};
|
|
19
|
-
let bytes;
|
|
20
|
-
if (g.crypto && typeof g.crypto.getRandomValues === "function") {
|
|
21
|
-
bytes = new Uint8Array(size);
|
|
22
|
-
g.crypto.getRandomValues(bytes);
|
|
23
|
-
} else {
|
|
24
|
-
bytes = new Uint8Array(size);
|
|
25
|
-
for (let i = 0; i < size; i++) bytes[i] = Math.floor(Math.random() * 256);
|
|
26
|
-
}
|
|
27
|
-
let out = "";
|
|
28
|
-
for (let i = 0; i < size; i++) out += ALPHABET[bytes[i] % ALPHABET.length];
|
|
29
|
-
return out;
|
|
30
|
-
}
|
|
31
|
-
function isPlainObject(v) {
|
|
32
|
-
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
33
|
-
}
|
|
34
|
-
function getPath(obj, path) {
|
|
35
|
-
if (!path) return obj;
|
|
36
|
-
let cur = obj;
|
|
37
|
-
for (const part of path.split(".")) {
|
|
38
|
-
if (cur == null) return void 0;
|
|
39
|
-
cur = cur[part];
|
|
40
|
-
}
|
|
41
|
-
return cur;
|
|
42
|
-
}
|
|
43
|
-
function clamp(n, min, max) {
|
|
44
|
-
return Math.min(max, Math.max(min, n));
|
|
45
|
-
}
|
|
46
|
-
function matchUrlPattern(pattern, url) {
|
|
47
|
-
if (!pattern) return true;
|
|
48
|
-
if (pattern === url) return true;
|
|
49
|
-
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, "__GLOBSTAR__").replace(/\*/g, "[^/]*").replace(/__GLOBSTAR__/g, ".*");
|
|
50
|
-
const re = new RegExp(`^${escaped}$`);
|
|
51
|
-
return re.test(url) || re.test(stripOrigin(url));
|
|
52
|
-
}
|
|
53
|
-
function stripOrigin(url) {
|
|
54
|
-
try {
|
|
55
|
-
const u = new URL(url);
|
|
56
|
-
return u.pathname + u.search + u.hash;
|
|
57
|
-
} catch {
|
|
58
|
-
return url;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
function safeRegExp(source, flags = "i") {
|
|
62
|
-
if (!source || source.length > 200) return null;
|
|
63
|
-
try {
|
|
64
|
-
return new RegExp(source, flags);
|
|
65
|
-
} catch {
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// src/platform.ts
|
|
71
|
-
var PLATFORMS = ["web", "ios", "android"];
|
|
72
|
-
var DEFAULT_PLATFORMS = ["web"];
|
|
73
|
-
function guidePlatforms(config) {
|
|
74
|
-
return Array.isArray(config.platforms) ? [...config.platforms] : [...DEFAULT_PLATFORMS];
|
|
75
|
-
}
|
|
76
|
-
function supportsPlatform(config, platform) {
|
|
77
|
-
return guidePlatforms(config).includes(platform);
|
|
78
|
-
}
|
|
79
|
-
var GUIDELY_ID_ATTRIBUTE = "data-guidely-id";
|
|
80
|
-
function guidelyIdFromSelector(value) {
|
|
81
|
-
const v = (value ?? "").trim();
|
|
82
|
-
if (!v) return null;
|
|
83
|
-
if (/^[A-Za-z0-9_][A-Za-z0-9_\-:.]*$/.test(v)) return v;
|
|
84
|
-
const hash = v.match(/^#([A-Za-z0-9_][A-Za-z0-9_\-:.]*)$/);
|
|
85
|
-
if (hash) return hash[1];
|
|
86
|
-
const attr = v.match(/^(?:[a-z][a-z0-9]*)?\[\s*data-(?:guidely-id|testid|tour)\s*=\s*(["']?)([^"'\]]+)\1\s*\]$/i);
|
|
87
|
-
if (attr) return attr[2].trim();
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
function screenPath(screen) {
|
|
91
|
-
const s = (screen ?? "").trim();
|
|
92
|
-
if (!s) return "/";
|
|
93
|
-
return s.startsWith("/") ? s : `/${s}`;
|
|
94
|
-
}
|
|
95
|
-
function compareVersions(a, b) {
|
|
96
|
-
const sa = a == null ? "" : String(a).trim().replace(/^v/i, "");
|
|
97
|
-
const sb = b == null ? "" : String(b).trim().replace(/^v/i, "");
|
|
98
|
-
if (!sa || !sb) return null;
|
|
99
|
-
const pa = sa.split(/[.+-]/);
|
|
100
|
-
const pb = sb.split(/[.+-]/);
|
|
101
|
-
const n = Math.max(pa.length, pb.length);
|
|
102
|
-
for (let i = 0; i < n; i++) {
|
|
103
|
-
const x = pa[i] ?? "0";
|
|
104
|
-
const y = pb[i] ?? "0";
|
|
105
|
-
const nx = /^\d+$/.test(x) ? Number(x) : NaN;
|
|
106
|
-
const ny = /^\d+$/.test(y) ? Number(y) : NaN;
|
|
107
|
-
if (!Number.isNaN(nx) && !Number.isNaN(ny)) {
|
|
108
|
-
if (nx !== ny) return nx < ny ? -1 : 1;
|
|
109
|
-
} else if (x !== y) {
|
|
110
|
-
return x < y ? -1 : 1;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return 0;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// src/widgets.ts
|
|
117
|
-
function isQuestionVisible(q, answers) {
|
|
118
|
-
if (!q.showWhen) return true;
|
|
119
|
-
const actual = answers[q.showWhen.questionId];
|
|
120
|
-
if (actual === void 0) return false;
|
|
121
|
-
const expected = q.showWhen.value;
|
|
122
|
-
switch (q.showWhen.op) {
|
|
123
|
-
case "equals":
|
|
124
|
-
return Array.isArray(actual) ? actual.includes(String(expected)) : String(actual) === String(expected);
|
|
125
|
-
case "lte":
|
|
126
|
-
return Number(actual) <= Number(expected);
|
|
127
|
-
case "gte":
|
|
128
|
-
return Number(actual) >= Number(expected);
|
|
129
|
-
case "in": {
|
|
130
|
-
const list = Array.isArray(expected) ? expected : [String(expected)];
|
|
131
|
-
return Array.isArray(actual) ? actual.some((a) => list.includes(a)) : list.includes(String(actual));
|
|
132
|
-
}
|
|
133
|
-
default:
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
function isChecklistComplete(config, progress) {
|
|
138
|
-
const done = new Set(progress.completedTaskIds);
|
|
139
|
-
return config.tasks.filter((t) => t.required).every((t) => done.has(t.id));
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// src/targeting-eval.ts
|
|
143
|
-
var RULE_OPERATORS = [
|
|
144
|
-
"equals",
|
|
145
|
-
"not_equals",
|
|
146
|
-
"contains",
|
|
147
|
-
"not_contains",
|
|
148
|
-
"starts_with",
|
|
149
|
-
"ends_with",
|
|
150
|
-
"exists",
|
|
151
|
-
"not_exists",
|
|
152
|
-
"gt",
|
|
153
|
-
"gte",
|
|
154
|
-
"lt",
|
|
155
|
-
"lte",
|
|
156
|
-
"in",
|
|
157
|
-
"not_in",
|
|
158
|
-
"regex",
|
|
159
|
-
"is_true",
|
|
160
|
-
"is_false",
|
|
161
|
-
"before",
|
|
162
|
-
"after"
|
|
163
|
-
];
|
|
164
|
-
var RULE_FIELDS = [
|
|
165
|
-
"user.attribute",
|
|
166
|
-
"account.attribute",
|
|
167
|
-
"user.role",
|
|
168
|
-
"user.plan",
|
|
169
|
-
"user.identified",
|
|
170
|
-
"url.path",
|
|
171
|
-
"url.full",
|
|
172
|
-
"url.query",
|
|
173
|
-
"device.type",
|
|
174
|
-
"device.browser",
|
|
175
|
-
"device.os",
|
|
176
|
-
"visitor.firstVisit",
|
|
177
|
-
"visitor.returning",
|
|
178
|
-
"event.seen",
|
|
179
|
-
"guide.completed",
|
|
180
|
-
"guide.dismissed",
|
|
181
|
-
"guide.seen",
|
|
182
|
-
"checklist.completed",
|
|
183
|
-
"audience.member",
|
|
184
|
-
"datetime.now",
|
|
185
|
-
"datetime.dayOfWeek",
|
|
186
|
-
"datetime.hour",
|
|
187
|
-
"rollout.percentage",
|
|
188
|
-
"environment",
|
|
189
|
-
"locale",
|
|
190
|
-
"app.platform",
|
|
191
|
-
"app.screen",
|
|
192
|
-
"app.version"
|
|
193
|
-
];
|
|
194
|
-
function isRuleGroup(r) {
|
|
195
|
-
return r.rules !== void 0;
|
|
196
|
-
}
|
|
197
|
-
function emptyRuleGroup(id = "root") {
|
|
198
|
-
return { id, op: "and", rules: [] };
|
|
199
|
-
}
|
|
200
|
-
function has(set, v) {
|
|
201
|
-
if (!set) return false;
|
|
202
|
-
return set instanceof Set ? set.has(v) : set.includes(v);
|
|
203
|
-
}
|
|
204
|
-
function resolveField(rule, ctx) {
|
|
205
|
-
switch (rule.field) {
|
|
206
|
-
case "user.attribute":
|
|
207
|
-
return rule.key ? getPath(ctx.userAttributes, rule.key) : void 0;
|
|
208
|
-
case "account.attribute":
|
|
209
|
-
return rule.key ? getPath(ctx.accountAttributes, rule.key) : void 0;
|
|
210
|
-
case "user.role":
|
|
211
|
-
return ctx.userAttributes.role;
|
|
212
|
-
case "user.plan":
|
|
213
|
-
return ctx.userAttributes.plan ?? ctx.accountAttributes.plan;
|
|
214
|
-
case "user.identified":
|
|
215
|
-
return !!ctx.userId;
|
|
216
|
-
case "url.path":
|
|
217
|
-
return ctx.path;
|
|
218
|
-
case "url.full":
|
|
219
|
-
return ctx.url;
|
|
220
|
-
case "url.query":
|
|
221
|
-
return rule.key ? ctx.query[rule.key] : void 0;
|
|
222
|
-
case "device.type":
|
|
223
|
-
return ctx.device.type;
|
|
224
|
-
case "device.browser":
|
|
225
|
-
return ctx.device.browser;
|
|
226
|
-
case "device.os":
|
|
227
|
-
return ctx.device.os;
|
|
228
|
-
case "visitor.firstVisit":
|
|
229
|
-
return ctx.firstVisit;
|
|
230
|
-
case "visitor.returning":
|
|
231
|
-
return !ctx.firstVisit;
|
|
232
|
-
case "event.seen":
|
|
233
|
-
return rule.key ? has(ctx.eventsSeen, rule.key) : false;
|
|
234
|
-
case "guide.completed":
|
|
235
|
-
return rule.key ? has(ctx.completedGuides, rule.key) : false;
|
|
236
|
-
case "guide.dismissed":
|
|
237
|
-
return rule.key ? has(ctx.dismissedGuides, rule.key) : false;
|
|
238
|
-
case "guide.seen":
|
|
239
|
-
return rule.key ? has(ctx.seenGuides, rule.key) : false;
|
|
240
|
-
case "checklist.completed":
|
|
241
|
-
return rule.key ? has(ctx.completedChecklists, rule.key) : false;
|
|
242
|
-
case "audience.member":
|
|
243
|
-
return rule.key ? has(ctx.audienceIds, rule.key) : false;
|
|
244
|
-
case "datetime.now":
|
|
245
|
-
return ctx.now.toISOString();
|
|
246
|
-
case "datetime.dayOfWeek":
|
|
247
|
-
return ctx.now.getDay();
|
|
248
|
-
case "datetime.hour":
|
|
249
|
-
return ctx.now.getHours();
|
|
250
|
-
case "rollout.percentage":
|
|
251
|
-
return rolloutBucket(ctx.userId || ctx.anonymousId, ctx.rolloutSalt || "guidely");
|
|
252
|
-
case "environment":
|
|
253
|
-
return ctx.environment;
|
|
254
|
-
case "locale":
|
|
255
|
-
return ctx.locale;
|
|
256
|
-
case "app.platform":
|
|
257
|
-
return ctx.platform ?? "web";
|
|
258
|
-
case "app.screen":
|
|
259
|
-
return ctx.screen;
|
|
260
|
-
case "app.version":
|
|
261
|
-
return ctx.appVersion;
|
|
262
|
-
default:
|
|
263
|
-
return void 0;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
function toNumber(v) {
|
|
267
|
-
if (typeof v === "number") return v;
|
|
268
|
-
if (typeof v === "string" && v.trim() !== "" && !Number.isNaN(Number(v))) return Number(v);
|
|
269
|
-
if (v instanceof Date) return v.getTime();
|
|
270
|
-
return null;
|
|
271
|
-
}
|
|
272
|
-
function toDateMs(v) {
|
|
273
|
-
if (v instanceof Date) return v.getTime();
|
|
274
|
-
if (typeof v === "string") {
|
|
275
|
-
const t = Date.parse(v);
|
|
276
|
-
return Number.isNaN(t) ? null : t;
|
|
277
|
-
}
|
|
278
|
-
if (typeof v === "number") return v;
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
|
-
function compare(op, actual, expected) {
|
|
282
|
-
switch (op) {
|
|
283
|
-
case "exists":
|
|
284
|
-
return actual !== void 0 && actual !== null && actual !== "";
|
|
285
|
-
case "not_exists":
|
|
286
|
-
return actual === void 0 || actual === null || actual === "";
|
|
287
|
-
case "is_true":
|
|
288
|
-
return actual === true || actual === "true";
|
|
289
|
-
case "is_false":
|
|
290
|
-
return actual === false || actual === "false";
|
|
291
|
-
case "equals":
|
|
292
|
-
if (typeof actual === "boolean") return String(actual) === String(expected);
|
|
293
|
-
return String(actual ?? "") === String(expected ?? "");
|
|
294
|
-
case "not_equals":
|
|
295
|
-
return String(actual ?? "") !== String(expected ?? "");
|
|
296
|
-
case "contains":
|
|
297
|
-
return typeof actual === "string" && actual.toLowerCase().includes(String(expected ?? "").toLowerCase());
|
|
298
|
-
case "not_contains":
|
|
299
|
-
return !(typeof actual === "string" && actual.toLowerCase().includes(String(expected ?? "").toLowerCase()));
|
|
300
|
-
case "starts_with":
|
|
301
|
-
return typeof actual === "string" && actual.startsWith(String(expected ?? ""));
|
|
302
|
-
case "ends_with":
|
|
303
|
-
return typeof actual === "string" && actual.endsWith(String(expected ?? ""));
|
|
304
|
-
case "gt":
|
|
305
|
-
case "gte":
|
|
306
|
-
case "lt":
|
|
307
|
-
case "lte": {
|
|
308
|
-
const a = toNumber(actual);
|
|
309
|
-
const b = toNumber(expected);
|
|
310
|
-
if (a === null || b === null) return false;
|
|
311
|
-
return op === "gt" ? a > b : op === "gte" ? a >= b : op === "lt" ? a < b : a <= b;
|
|
312
|
-
}
|
|
313
|
-
case "in": {
|
|
314
|
-
const list = Array.isArray(expected) ? expected : String(expected ?? "").split(",").map((s) => s.trim());
|
|
315
|
-
return list.includes(String(actual ?? ""));
|
|
316
|
-
}
|
|
317
|
-
case "not_in": {
|
|
318
|
-
const list = Array.isArray(expected) ? expected : String(expected ?? "").split(",").map((s) => s.trim());
|
|
319
|
-
return !list.includes(String(actual ?? ""));
|
|
320
|
-
}
|
|
321
|
-
case "regex": {
|
|
322
|
-
const re = safeRegExp(String(expected ?? ""));
|
|
323
|
-
return !!re && typeof actual === "string" && re.test(actual);
|
|
324
|
-
}
|
|
325
|
-
case "before": {
|
|
326
|
-
const a = toDateMs(actual);
|
|
327
|
-
const b = toDateMs(expected);
|
|
328
|
-
return a !== null && b !== null && a < b;
|
|
329
|
-
}
|
|
330
|
-
case "after": {
|
|
331
|
-
const a = toDateMs(actual);
|
|
332
|
-
const b = toDateMs(expected);
|
|
333
|
-
return a !== null && b !== null && a > b;
|
|
334
|
-
}
|
|
335
|
-
default:
|
|
336
|
-
return false;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
function evaluateRule(rule, ctx) {
|
|
340
|
-
let result;
|
|
341
|
-
if (rule.field === "url.path" || rule.field === "url.full" || rule.field === "app.screen") {
|
|
342
|
-
const actual = String(resolveField(rule, ctx) ?? "");
|
|
343
|
-
if (rule.op === "equals") result = matchUrlPattern(String(rule.value ?? ""), actual);
|
|
344
|
-
else if (rule.op === "not_equals") result = !matchUrlPattern(String(rule.value ?? ""), actual);
|
|
345
|
-
else result = compare(rule.op, actual, rule.value);
|
|
346
|
-
} else if (rule.field === "app.version" && ["equals", "not_equals", "gt", "gte", "lt", "lte"].includes(rule.op)) {
|
|
347
|
-
const c = compareVersions(resolveField(rule, ctx), rule.value);
|
|
348
|
-
if (c === null) result = rule.op === "not_equals";
|
|
349
|
-
else result = rule.op === "equals" ? c === 0 : rule.op === "not_equals" ? c !== 0 : rule.op === "gt" ? c > 0 : rule.op === "gte" ? c >= 0 : rule.op === "lt" ? c < 0 : c <= 0;
|
|
350
|
-
} else {
|
|
351
|
-
result = compare(rule.op, resolveField(rule, ctx), rule.value);
|
|
352
|
-
}
|
|
353
|
-
return rule.negate ? !result : result;
|
|
354
|
-
}
|
|
355
|
-
function evaluateRules(group, ctx) {
|
|
356
|
-
if (!group || group.rules.length === 0) return group?.negate ? false : true;
|
|
357
|
-
const results = group.rules.map((r) => isRuleGroup(r) ? evaluateRules(r, ctx) : evaluateRule(r, ctx));
|
|
358
|
-
const value = group.op === "and" ? results.every(Boolean) : results.some(Boolean);
|
|
359
|
-
return group.negate ? !value : value;
|
|
360
|
-
}
|
|
361
|
-
var SERVER_ASSISTED_FIELDS = ["audience.member", "guide.completed", "guide.dismissed", "guide.seen", "checklist.completed"];
|
|
362
|
-
var GUIDE_VISIBILITIES = ["everyone", "identified", "anonymous"];
|
|
363
|
-
function withVisibility(targeting, visibility) {
|
|
364
|
-
if (!visibility || visibility === "everyone") return targeting;
|
|
365
|
-
return { id: "visibility", op: "and", rules: [{ id: "visibility-rule", field: "user.identified", op: visibility === "identified" ? "is_true" : "is_false" }, targeting] };
|
|
366
|
-
}
|
|
367
|
-
function describeRule(rule) {
|
|
368
|
-
const subject = rule.key ? `${rule.field}[${rule.key}]` : rule.field;
|
|
369
|
-
const v = Array.isArray(rule.value) ? rule.value.join(", ") : rule.value === void 0 ? "" : String(rule.value);
|
|
370
|
-
return `${rule.negate ? "NOT " : ""}${subject} ${rule.op.replace(/_/g, " ")}${v ? ` "${v}"` : ""}`;
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// src/events-util.ts
|
|
374
|
-
var SENSITIVE_PROPERTY_PATTERN = /(password|passwd|secret|token|credit|card|cvv|ssn|iban)/i;
|
|
375
|
-
var MAX_PROPERTY_BYTES = 8 * 1024;
|
|
376
|
-
function sanitizeProperties(props) {
|
|
377
|
-
if (!props) return {};
|
|
378
|
-
const out = {};
|
|
379
|
-
let size = 0;
|
|
380
|
-
for (const [k, v] of Object.entries(props)) {
|
|
381
|
-
if (SENSITIVE_PROPERTY_PATTERN.test(k)) continue;
|
|
382
|
-
if (typeof v === "function" || typeof v === "symbol") continue;
|
|
383
|
-
const str = typeof v === "string" ? v : JSON.stringify(v ?? null);
|
|
384
|
-
size += k.length + (str?.length ?? 0);
|
|
385
|
-
if (size > MAX_PROPERTY_BYTES) break;
|
|
386
|
-
out[k.slice(0, 100)] = typeof v === "string" ? v.slice(0, 1e3) : v;
|
|
387
|
-
}
|
|
388
|
-
return out;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
// src/errors.ts
|
|
392
|
-
var MAX_STACK_FRAMES = 30;
|
|
393
|
-
var V8 = /^\s*at (?:(.+?) \()?((?:[a-z][\w+.-]*:)?[^\s()]+?):(\d+):(\d+)\)?\s*$/i;
|
|
394
|
-
var GECKO = /^\s*(.*?)@(.+?):(\d+):(\d+)\s*$/;
|
|
395
|
-
function parseStack(stack, max = MAX_STACK_FRAMES) {
|
|
396
|
-
if (!stack || typeof stack !== "string") return [];
|
|
397
|
-
const frames = [];
|
|
398
|
-
for (const raw of stack.split("\n")) {
|
|
399
|
-
if (frames.length >= max) break;
|
|
400
|
-
const line = raw.slice(0, 1e3);
|
|
401
|
-
const m = V8.exec(line) ?? GECKO.exec(line);
|
|
402
|
-
if (!m) continue;
|
|
403
|
-
const fn = (m[1] || "").trim();
|
|
404
|
-
frames.push({ fn: fn ? fn.slice(0, 200) : void 0, file: m[2]?.slice(0, 500), line: Number(m[3]), col: Number(m[4]) });
|
|
405
|
-
}
|
|
406
|
-
return frames;
|
|
407
|
-
}
|
|
408
|
-
function normalizeErrorMessage(message) {
|
|
409
|
-
return (message || "").slice(0, 500).replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, "<uuid>").replace(/(["'`]).*?\1/g, "<str>").replace(/\b0x[0-9a-f]+\b/gi, "<hex>").replace(/\d+(\.\d+)?/g, "<n>").replace(/\s+/g, " ").trim();
|
|
410
|
-
}
|
|
411
|
-
function normalizeFrameFile(file) {
|
|
412
|
-
if (!file) return "";
|
|
413
|
-
let path = file;
|
|
414
|
-
try {
|
|
415
|
-
path = new URL(file).pathname;
|
|
416
|
-
} catch {
|
|
417
|
-
path = file.replace(/[?#].*$/, "");
|
|
418
|
-
}
|
|
419
|
-
return path.replace(/[.-][0-9a-f]{6,}(?=\.\w+$)/i, "").replace(/\/\d+\//g, "/<n>/");
|
|
420
|
-
}
|
|
421
|
-
var SOURCEMAP_MAX_FILE_BYTES = 25 * 1024 * 1024;
|
|
422
|
-
var SOURCEMAP_MAX_FILES_PER_UPLOAD = 200;
|
|
423
|
-
function fingerprintError(input) {
|
|
424
|
-
const top = (input.frames ?? []).find((f) => f.file);
|
|
425
|
-
const frameKey = input.original ? `src:${input.original.source}:${input.original.name || "?"}` : top ? `${normalizeFrameFile(top.file)}:${top.fn || "?"}` : "";
|
|
426
|
-
const key = [input.type || "Error", normalizeErrorMessage(input.message || ""), frameKey].join("|");
|
|
427
|
-
const a = fnv1a(key).toString(16).padStart(8, "0");
|
|
428
|
-
const b = fnv1a(`guidely:${key}`).toString(16).padStart(8, "0");
|
|
429
|
-
return a + b;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
// src/complaints-limits.ts
|
|
433
|
-
var COMPLAINT_STATUSES = ["open", "in_review", "resolved"];
|
|
434
|
-
var COMPLAINT_EVENTS = ["complaint.filed", "complaint.status_changed", "complaint.replied", "complaint.resolved"];
|
|
435
|
-
var COMPLAINT_FIELD_TYPES = ["text", "choice"];
|
|
436
|
-
var MAX_COMPLAINT_FIELDS = 8;
|
|
437
|
-
var MAX_COMPLAINT_CHOICES = 12;
|
|
438
|
-
var MAX_COMPLAINT_LENGTH = 4e3;
|
|
439
|
-
var MAX_COMPLAINT_ANSWER_LENGTH = 500;
|
|
440
|
-
var MAX_COMPLAINT_ATTACHMENT_BYTES = 2 * 1024 * 1024;
|
|
441
|
-
var complaintReference = (number) => `CMP-${number}`;
|
|
442
|
-
|
|
443
|
-
// src/network.ts
|
|
444
|
-
var NETWORK_PLUGIN = "guidely/network@1";
|
|
445
|
-
var WS_MAX_MESSAGES_PER_SOCKET = 200;
|
|
446
|
-
var WS_MAX_MESSAGE_BYTES = 2048;
|
|
447
|
-
var SENSITIVE_HEADER_PATTERN = /^(authorization|proxy-authorization|cookie|set-cookie|x-api-key|x-auth-token|x-csrf-token|x-xsrf-token|x-guidely-key|x-guidely-conversation)$/i;
|
|
448
|
-
var SENSITIVE_PARAM_PATTERN = /(token|key|secret|password|passwd|pwd|auth|session|code|sig|signature|credential|ssn|card|cvv|iban)/i;
|
|
449
|
-
|
|
450
|
-
// src/media.ts
|
|
451
|
-
var MEDIA_IMAGE_TYPES = ["image/png", "image/jpeg", "image/gif", "image/webp"];
|
|
452
|
-
var MEDIA_VIDEO_TYPES = ["video/mp4", "video/webm"];
|
|
453
|
-
var MEDIA_FILE_TYPES = ["application/pdf"];
|
|
454
|
-
var MEDIA_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
|
|
455
|
-
var MEDIA_VIDEO_MAX_BYTES = 200 * 1024 * 1024;
|
|
456
|
-
var MEDIA_FILE_MAX_BYTES = 50 * 1024 * 1024;
|
|
457
|
-
var MEDIA_MAX_BYTES = Math.max(MEDIA_IMAGE_MAX_BYTES, MEDIA_VIDEO_MAX_BYTES, MEDIA_FILE_MAX_BYTES);
|
|
458
|
-
function isMediaContentType(type) {
|
|
459
|
-
return mediaKind(type) !== null;
|
|
460
|
-
}
|
|
461
|
-
function isVideoContentType(type) {
|
|
462
|
-
return MEDIA_VIDEO_TYPES.includes(type);
|
|
463
|
-
}
|
|
464
|
-
function mediaKind(type) {
|
|
465
|
-
if (MEDIA_IMAGE_TYPES.includes(type)) return "image";
|
|
466
|
-
if (MEDIA_VIDEO_TYPES.includes(type)) return "video";
|
|
467
|
-
if (MEDIA_FILE_TYPES.includes(type)) return "file";
|
|
468
|
-
return null;
|
|
469
|
-
}
|
|
470
|
-
function mediaMaxBytes(type) {
|
|
471
|
-
const kind = mediaKind(type);
|
|
472
|
-
return kind === "video" ? MEDIA_VIDEO_MAX_BYTES : kind === "file" ? MEDIA_FILE_MAX_BYTES : MEDIA_IMAGE_MAX_BYTES;
|
|
473
|
-
}
|
|
474
|
-
var FILE_LINK_CLASS = "gd-file";
|
|
475
|
-
var PDF_BLOCK_CLASS = "gd-pdf";
|
|
476
|
-
var PDF_PAGES_CLASS = "gd-pdf-pages";
|
|
477
|
-
var PDF_MAX_PAGES = 40;
|
|
478
|
-
function isFileLink(className, href) {
|
|
479
|
-
return !!className && className.split(/\s+/).includes(FILE_LINK_CLASS) && isSafeMediaUrl(href);
|
|
480
|
-
}
|
|
481
|
-
var YOUTUBE_ID = /^[A-Za-z0-9_-]{11}$/;
|
|
482
|
-
var VIMEO_ID = /^\d{1,12}$/;
|
|
483
|
-
var VIMEO_HASH = /^[0-9a-f]{6,20}$/i;
|
|
484
|
-
var LOOM_ID = /^[0-9a-f]{32}$/i;
|
|
485
|
-
var WISTIA_ID = /^[a-z0-9]{10}$/i;
|
|
486
|
-
function parseUrl(input) {
|
|
487
|
-
const s = input.trim();
|
|
488
|
-
if (!s) return null;
|
|
489
|
-
try {
|
|
490
|
-
const u = new URL(/^[a-z][a-z0-9+.-]*:/i.test(s) ? s : `https://${s}`);
|
|
491
|
-
if (u.protocol !== "https:" && u.protocol !== "http:") return null;
|
|
492
|
-
if (u.username || u.password || u.port && u.port !== "443" && u.port !== "80") return null;
|
|
493
|
-
return u;
|
|
494
|
-
} catch {
|
|
495
|
-
return null;
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
function parseStart(v) {
|
|
499
|
-
if (!v) return 0;
|
|
500
|
-
if (/^\d+$/.test(v)) return Math.min(Number(v), 86400);
|
|
501
|
-
const m = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/.exec(v);
|
|
502
|
-
if (!m || !m[0]) return 0;
|
|
503
|
-
return Math.min(Number(m[1] ?? 0) * 3600 + Number(m[2] ?? 0) * 60 + Number(m[3] ?? 0), 86400);
|
|
504
|
-
}
|
|
505
|
-
function youtube(id, start) {
|
|
506
|
-
if (!YOUTUBE_ID.test(id)) return null;
|
|
507
|
-
return {
|
|
508
|
-
provider: "youtube",
|
|
509
|
-
src: `https://www.youtube-nocookie.com/embed/${id}${start ? `?start=${start}` : ""}`,
|
|
510
|
-
watchUrl: `https://www.youtube.com/watch?v=${id}${start ? `&t=${start}s` : ""}`,
|
|
511
|
-
title: "YouTube video"
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
function vimeo(id, hash) {
|
|
515
|
-
if (!VIMEO_ID.test(id) || hash !== null && !VIMEO_HASH.test(hash)) return null;
|
|
516
|
-
const h = hash ? hash.toLowerCase() : null;
|
|
517
|
-
return { provider: "vimeo", src: `https://player.vimeo.com/video/${id}${h ? `?h=${h}` : ""}`, watchUrl: `https://vimeo.com/${id}${h ? `/${h}` : ""}`, title: "Vimeo video" };
|
|
518
|
-
}
|
|
519
|
-
function toEmbedUrl(input) {
|
|
520
|
-
const u = parseUrl(input);
|
|
521
|
-
if (!u) return null;
|
|
522
|
-
const host = u.hostname.toLowerCase().replace(/^www\./, "");
|
|
523
|
-
const parts = u.pathname.split("/").filter(Boolean);
|
|
524
|
-
switch (host) {
|
|
525
|
-
case "youtube.com":
|
|
526
|
-
case "m.youtube.com":
|
|
527
|
-
case "youtube-nocookie.com": {
|
|
528
|
-
const start = parseStart(u.searchParams.get("start") ?? u.searchParams.get("t"));
|
|
529
|
-
if (parts[0] === "watch" && parts.length === 1) return youtube(u.searchParams.get("v") ?? "", start);
|
|
530
|
-
if ((parts[0] === "embed" || parts[0] === "shorts" || parts[0] === "live") && parts.length === 2) return youtube(parts[1], start);
|
|
531
|
-
return null;
|
|
532
|
-
}
|
|
533
|
-
case "youtu.be":
|
|
534
|
-
return parts.length === 1 ? youtube(parts[0], parseStart(u.searchParams.get("t") ?? u.searchParams.get("start"))) : null;
|
|
535
|
-
case "vimeo.com":
|
|
536
|
-
if (parts.length === 1) return vimeo(parts[0], null);
|
|
537
|
-
if (parts.length === 2 && VIMEO_ID.test(parts[0])) return vimeo(parts[0], parts[1]);
|
|
538
|
-
return null;
|
|
539
|
-
case "player.vimeo.com":
|
|
540
|
-
return parts[0] === "video" && parts.length === 2 ? vimeo(parts[1], u.searchParams.get("h")) : null;
|
|
541
|
-
case "loom.com":
|
|
542
|
-
if ((parts[0] === "share" || parts[0] === "embed") && parts.length === 2 && LOOM_ID.test(parts[1])) {
|
|
543
|
-
const id = parts[1].toLowerCase();
|
|
544
|
-
return { provider: "loom", src: `https://www.loom.com/embed/${id}`, watchUrl: `https://www.loom.com/share/${id}`, title: "Loom video" };
|
|
545
|
-
}
|
|
546
|
-
return null;
|
|
547
|
-
default: {
|
|
548
|
-
let id;
|
|
549
|
-
if (host === "fast.wistia.net" || host === "fast.wistia.com") id = parts[0] === "embed" && parts[1] === "iframe" && parts.length === 3 ? parts[2] : void 0;
|
|
550
|
-
else if (host === "wi.st" || host === "wistia.com" || /^[a-z0-9-]+\.wistia\.com$/.test(host)) id = parts[0] === "medias" && parts.length === 2 ? parts[1] : void 0;
|
|
551
|
-
if (!id || !WISTIA_ID.test(id)) return null;
|
|
552
|
-
return { provider: "wistia", src: `https://fast.wistia.net/embed/iframe/${id}`, watchUrl: `https://fast.wistia.net/embed/iframe/${id}`, title: "Wistia video" };
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
function isAllowedEmbedSrc(src) {
|
|
557
|
-
if (!src) return false;
|
|
558
|
-
return toEmbedUrl(src)?.src === src;
|
|
559
|
-
}
|
|
560
|
-
var EMBED_IFRAME_ATTRS = {
|
|
561
|
-
allow: "fullscreen; picture-in-picture; encrypted-media",
|
|
562
|
-
allowfullscreen: "",
|
|
563
|
-
loading: "lazy",
|
|
564
|
-
referrerpolicy: "strict-origin-when-cross-origin",
|
|
565
|
-
sandbox: "allow-scripts allow-same-origin allow-presentation allow-popups allow-popups-to-escape-sandbox"
|
|
566
|
-
};
|
|
567
|
-
var VIDEO_ATTRS = { controls: "", preload: "metadata", playsinline: "" };
|
|
568
|
-
function isSafeMediaUrl(url) {
|
|
569
|
-
if (!url) return false;
|
|
570
|
-
try {
|
|
571
|
-
const u = new URL(url);
|
|
572
|
-
return (u.protocol === "https:" || u.protocol === "http:") && !u.username && !u.password;
|
|
573
|
-
} catch {
|
|
574
|
-
return false;
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
// src/resource-center.ts
|
|
579
|
-
var MAX_COLLECTION_DEPTH = 3;
|
|
580
|
-
function matchesAudiences(required, member) {
|
|
581
|
-
if (!required || required.length === 0) return true;
|
|
582
|
-
if (!member) return false;
|
|
583
|
-
const has2 = member instanceof Set ? (id) => member.has(id) : (id) => member.includes(id);
|
|
584
|
-
return required.some(has2);
|
|
585
|
-
}
|
|
586
|
-
function resourceCenterSections(collections, articles, member) {
|
|
587
|
-
const byId = new Map(collections.map((c) => [c.id, c]));
|
|
588
|
-
const children = /* @__PURE__ */ new Map();
|
|
589
|
-
for (const c of collections) {
|
|
590
|
-
const parent = c.parentId && c.parentId !== c.id && byId.has(c.parentId) ? c.parentId : null;
|
|
591
|
-
const list = children.get(parent) ?? [];
|
|
592
|
-
list.push(c);
|
|
593
|
-
children.set(parent, list);
|
|
594
|
-
}
|
|
595
|
-
for (const list of children.values()) list.sort((a, b) => a.order - b.order || a.name.localeCompare(b.name));
|
|
596
|
-
const direct = /* @__PURE__ */ new Map();
|
|
597
|
-
const uncategorized = [];
|
|
598
|
-
for (const a of articles) {
|
|
599
|
-
if (!matchesAudiences(a.audienceIds, member)) continue;
|
|
600
|
-
if (a.collectionId && byId.has(a.collectionId)) {
|
|
601
|
-
const list = direct.get(a.collectionId) ?? [];
|
|
602
|
-
list.push(a);
|
|
603
|
-
direct.set(a.collectionId, list);
|
|
604
|
-
} else uncategorized.push(a);
|
|
605
|
-
}
|
|
606
|
-
const sections = [];
|
|
607
|
-
const seen = /* @__PURE__ */ new Set();
|
|
608
|
-
const visit = (c, path) => {
|
|
609
|
-
if (seen.has(c.id)) return;
|
|
610
|
-
seen.add(c.id);
|
|
611
|
-
if (!matchesAudiences(c.audienceIds, member)) return;
|
|
612
|
-
const here = [...path, c.name];
|
|
613
|
-
const list = direct.get(c.id);
|
|
614
|
-
if (list?.length) sections.push({ collection: c, path: here, depth: here.length - 1, articles: list });
|
|
615
|
-
for (const child of children.get(c.id) ?? []) visit(child, here);
|
|
616
|
-
};
|
|
617
|
-
for (const root of children.get(null) ?? []) visit(root, []);
|
|
618
|
-
if (uncategorized.length) sections.push({ collection: null, path: [], depth: 0, articles: uncategorized });
|
|
619
|
-
return sections;
|
|
620
|
-
}
|
|
621
|
-
function isArticleListed(collections, article, member) {
|
|
622
|
-
if (!matchesAudiences(article.audienceIds, member)) return false;
|
|
623
|
-
const byId = new Map(collections.map((c) => [c.id, c]));
|
|
624
|
-
let cur = article.collectionId ? byId.get(article.collectionId) : void 0;
|
|
625
|
-
for (let guard = 0; cur && guard <= MAX_COLLECTION_DEPTH * 4; guard++) {
|
|
626
|
-
if (!matchesAudiences(cur.audienceIds, member)) return false;
|
|
627
|
-
cur = cur.parentId ? byId.get(cur.parentId) : void 0;
|
|
628
|
-
}
|
|
629
|
-
return true;
|
|
630
|
-
}
|
|
631
|
-
var ARTICLE_VISIBILITIES = ["everyone", "identified"];
|
|
632
|
-
var LOGGED_IN_AUDIENCE = "$identified";
|
|
633
|
-
function servedArticleAudiences(audienceIds, visibility) {
|
|
634
|
-
return visibility === "identified" && audienceIds.length === 0 ? [LOGGED_IN_AUDIENCE] : [...audienceIds];
|
|
635
|
-
}
|
|
636
|
-
function visitorAudiences(audienceIds, identified) {
|
|
637
|
-
const ids = audienceIds.filter((id) => id !== LOGGED_IN_AUDIENCE);
|
|
638
|
-
return identified ? [...ids, LOGGED_IN_AUDIENCE] : ids;
|
|
639
|
-
}
|
|
640
|
-
function visibleArticleIds(collections, articles, member) {
|
|
641
|
-
return new Set(resourceCenterSections(collections, articles, member).flatMap((s) => s.articles.map((a) => a.id)));
|
|
642
|
-
}
|
|
643
|
-
var SHOW_ME_CLASS = "gd-show-me";
|
|
644
|
-
var SHOW_ME_HREF_PREFIX = "#guidely-show-me:";
|
|
645
|
-
var SHOW_ME_KEY = /^[A-Za-z0-9_-]{1,64}$/;
|
|
646
|
-
function showMeHref(guideKey) {
|
|
647
|
-
return `${SHOW_ME_HREF_PREFIX}${guideKey}`;
|
|
648
|
-
}
|
|
649
|
-
function showMeKeyFromHref(href) {
|
|
650
|
-
if (!href || !href.startsWith(SHOW_ME_HREF_PREFIX)) return null;
|
|
651
|
-
const key = href.slice(SHOW_ME_HREF_PREFIX.length);
|
|
652
|
-
return SHOW_ME_KEY.test(key) ? key : null;
|
|
653
|
-
}
|
|
654
|
-
function showMeKeys(html) {
|
|
655
|
-
const out = [];
|
|
656
|
-
for (const m of (html ?? "").matchAll(/href="#guidely-show-me:([A-Za-z0-9_-]{1,64})"/g)) if (!out.includes(m[1])) out.push(m[1]);
|
|
657
|
-
return out.slice(0, 10);
|
|
658
|
-
}
|
|
659
|
-
function hasVideoMedia(html) {
|
|
660
|
-
return /<(video|iframe)\b/i.test(html ?? "");
|
|
661
|
-
}
|
|
662
|
-
var words = (s) => s.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [];
|
|
663
|
-
function matchesHelpQuery(text, query) {
|
|
664
|
-
const q = query.trim().toLowerCase();
|
|
665
|
-
if (!q) return true;
|
|
666
|
-
const hay = text.toLowerCase();
|
|
667
|
-
if (hay.includes(q)) return true;
|
|
668
|
-
const terms = words(q);
|
|
669
|
-
if (!terms.length) return false;
|
|
670
|
-
const have = words(hay);
|
|
671
|
-
return terms.every((t) => have.some((w) => w.startsWith(t) || t.length > 3 && t.endsWith("s") && w.startsWith(t.slice(0, -1))));
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
// src/howto-limits.ts
|
|
675
|
-
var CAPTURE_PARAM = "guidely_capture";
|
|
676
|
-
var CAPTURE_SCREENSHOT_MAX_BYTES = 8 * 1024 * 1024;
|
|
677
|
-
|
|
678
|
-
// src/page.ts
|
|
679
|
-
var PATH_ID_PATTERN = "/([0-9]+|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|[0-9a-f]{12,})(?=[/?]|$)";
|
|
680
|
-
function foldPathIds(path) {
|
|
681
|
-
return path.replace(new RegExp(PATH_ID_PATTERN, "gi"), "/:id");
|
|
682
|
-
}
|
|
683
|
-
var GENERIC_SEGMENTS = /* @__PURE__ */ new Set(["", ":id", "app", "apps", "dashboard", "home", "index", "main", "new", "edit", "view", "show", "details", "detail", "overview", "list", "all", "page", "pages", "en", "v1", "v2"]);
|
|
684
|
-
function segmentsOf(path) {
|
|
685
|
-
const clean = foldPathIds((path.split(/[?#]/)[0] || "/").toLowerCase());
|
|
686
|
-
return clean.split("/").map((s) => s.replace(/\.(html?|php|aspx?)$/, "")).filter((s) => !GENERIC_SEGMENTS.has(s) && /[a-z]/.test(s) && s.length <= 40);
|
|
687
|
-
}
|
|
688
|
-
function pageTerms(path) {
|
|
689
|
-
const words2 = segmentsOf(path).flatMap((s) => s.split(/[-_.+\s]+/).filter((w) => w.length > 1 && /[a-z]/.test(w)));
|
|
690
|
-
return [...new Set(words2)].slice(0, 8);
|
|
691
|
-
}
|
|
692
|
-
function pageLabel(path) {
|
|
693
|
-
const last = segmentsOf(path).at(-1);
|
|
694
|
-
if (!last) return null;
|
|
695
|
-
const words2 = last.split(/[-_.+\s]+/).filter(Boolean);
|
|
696
|
-
if (!words2.length) return null;
|
|
697
|
-
const label = words2.join(" ");
|
|
698
|
-
return label.charAt(0).toUpperCase() + label.slice(1);
|
|
699
|
-
}
|
|
700
|
-
function firstNameFromTraits(traits) {
|
|
701
|
-
if (!traits) return null;
|
|
702
|
-
const pick = (v) => typeof v === "string" ? v.trim() : "";
|
|
703
|
-
const first = pick(traits.firstName) || pick(traits.first_name) || pick(traits.firstname) || pick(traits.name).split(/\s+/)[0] || "";
|
|
704
|
-
if (!first || first.length > 40 || first.includes("@") || !/\p{L}/u.test(first)) return null;
|
|
705
|
-
return first;
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
export {
|
|
709
|
-
fnv1a,
|
|
710
|
-
rolloutBucket,
|
|
711
|
-
slugify,
|
|
712
|
-
randomId,
|
|
713
|
-
isPlainObject,
|
|
714
|
-
getPath,
|
|
715
|
-
clamp,
|
|
716
|
-
matchUrlPattern,
|
|
717
|
-
stripOrigin,
|
|
718
|
-
safeRegExp,
|
|
719
|
-
PLATFORMS,
|
|
720
|
-
DEFAULT_PLATFORMS,
|
|
721
|
-
guidePlatforms,
|
|
722
|
-
supportsPlatform,
|
|
723
|
-
GUIDELY_ID_ATTRIBUTE,
|
|
724
|
-
guidelyIdFromSelector,
|
|
725
|
-
screenPath,
|
|
726
|
-
compareVersions,
|
|
727
|
-
isQuestionVisible,
|
|
728
|
-
isChecklistComplete,
|
|
729
|
-
RULE_OPERATORS,
|
|
730
|
-
RULE_FIELDS,
|
|
731
|
-
isRuleGroup,
|
|
732
|
-
emptyRuleGroup,
|
|
733
|
-
compare,
|
|
734
|
-
evaluateRule,
|
|
735
|
-
evaluateRules,
|
|
736
|
-
SERVER_ASSISTED_FIELDS,
|
|
737
|
-
GUIDE_VISIBILITIES,
|
|
738
|
-
withVisibility,
|
|
739
|
-
describeRule,
|
|
740
|
-
SENSITIVE_PROPERTY_PATTERN,
|
|
741
|
-
MAX_PROPERTY_BYTES,
|
|
742
|
-
sanitizeProperties,
|
|
743
|
-
MAX_STACK_FRAMES,
|
|
744
|
-
parseStack,
|
|
745
|
-
normalizeErrorMessage,
|
|
746
|
-
normalizeFrameFile,
|
|
747
|
-
SOURCEMAP_MAX_FILE_BYTES,
|
|
748
|
-
SOURCEMAP_MAX_FILES_PER_UPLOAD,
|
|
749
|
-
fingerprintError,
|
|
750
|
-
COMPLAINT_STATUSES,
|
|
751
|
-
COMPLAINT_EVENTS,
|
|
752
|
-
COMPLAINT_FIELD_TYPES,
|
|
753
|
-
MAX_COMPLAINT_FIELDS,
|
|
754
|
-
MAX_COMPLAINT_CHOICES,
|
|
755
|
-
MAX_COMPLAINT_LENGTH,
|
|
756
|
-
MAX_COMPLAINT_ANSWER_LENGTH,
|
|
757
|
-
MAX_COMPLAINT_ATTACHMENT_BYTES,
|
|
758
|
-
complaintReference,
|
|
759
|
-
NETWORK_PLUGIN,
|
|
760
|
-
WS_MAX_MESSAGES_PER_SOCKET,
|
|
761
|
-
WS_MAX_MESSAGE_BYTES,
|
|
762
|
-
SENSITIVE_HEADER_PATTERN,
|
|
763
|
-
SENSITIVE_PARAM_PATTERN,
|
|
764
|
-
MEDIA_IMAGE_TYPES,
|
|
765
|
-
MEDIA_VIDEO_TYPES,
|
|
766
|
-
MEDIA_FILE_TYPES,
|
|
767
|
-
MEDIA_IMAGE_MAX_BYTES,
|
|
768
|
-
MEDIA_VIDEO_MAX_BYTES,
|
|
769
|
-
MEDIA_FILE_MAX_BYTES,
|
|
770
|
-
MEDIA_MAX_BYTES,
|
|
771
|
-
isMediaContentType,
|
|
772
|
-
isVideoContentType,
|
|
773
|
-
mediaKind,
|
|
774
|
-
mediaMaxBytes,
|
|
775
|
-
FILE_LINK_CLASS,
|
|
776
|
-
PDF_BLOCK_CLASS,
|
|
777
|
-
PDF_PAGES_CLASS,
|
|
778
|
-
PDF_MAX_PAGES,
|
|
779
|
-
isFileLink,
|
|
780
|
-
toEmbedUrl,
|
|
781
|
-
isAllowedEmbedSrc,
|
|
782
|
-
EMBED_IFRAME_ATTRS,
|
|
783
|
-
VIDEO_ATTRS,
|
|
784
|
-
isSafeMediaUrl,
|
|
785
|
-
MAX_COLLECTION_DEPTH,
|
|
786
|
-
matchesAudiences,
|
|
787
|
-
resourceCenterSections,
|
|
788
|
-
isArticleListed,
|
|
789
|
-
ARTICLE_VISIBILITIES,
|
|
790
|
-
LOGGED_IN_AUDIENCE,
|
|
791
|
-
servedArticleAudiences,
|
|
792
|
-
visitorAudiences,
|
|
793
|
-
visibleArticleIds,
|
|
794
|
-
SHOW_ME_CLASS,
|
|
795
|
-
SHOW_ME_HREF_PREFIX,
|
|
796
|
-
showMeHref,
|
|
797
|
-
showMeKeyFromHref,
|
|
798
|
-
showMeKeys,
|
|
799
|
-
hasVideoMedia,
|
|
800
|
-
matchesHelpQuery,
|
|
801
|
-
CAPTURE_PARAM,
|
|
802
|
-
CAPTURE_SCREENSHOT_MAX_BYTES,
|
|
803
|
-
PATH_ID_PATTERN,
|
|
804
|
-
foldPathIds,
|
|
805
|
-
pageTerms,
|
|
806
|
-
pageLabel,
|
|
807
|
-
firstNameFromTraits
|
|
808
|
-
};
|
|
809
|
-
//# sourceMappingURL=chunk-UW6NRYRY.js.map
|