clarity-js 0.6.23

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 (87) hide show
  1. package/README.md +26 -0
  2. package/build/clarity.js +4479 -0
  3. package/build/clarity.min.js +1 -0
  4. package/build/clarity.module.js +4473 -0
  5. package/package.json +66 -0
  6. package/rollup.config.ts +38 -0
  7. package/src/clarity.ts +54 -0
  8. package/src/core/config.ts +21 -0
  9. package/src/core/copy.ts +3 -0
  10. package/src/core/event.ts +25 -0
  11. package/src/core/hash.ts +19 -0
  12. package/src/core/history.ts +69 -0
  13. package/src/core/index.ts +79 -0
  14. package/src/core/measure.ts +17 -0
  15. package/src/core/report.ts +27 -0
  16. package/src/core/scrub.ts +102 -0
  17. package/src/core/task.ts +180 -0
  18. package/src/core/time.ts +14 -0
  19. package/src/core/timeout.ts +10 -0
  20. package/src/core/version.ts +2 -0
  21. package/src/data/baseline.ts +89 -0
  22. package/src/data/compress.ts +31 -0
  23. package/src/data/custom.ts +18 -0
  24. package/src/data/dimension.ts +42 -0
  25. package/src/data/encode.ts +109 -0
  26. package/src/data/envelope.ts +46 -0
  27. package/src/data/index.ts +43 -0
  28. package/src/data/limit.ts +42 -0
  29. package/src/data/metadata.ts +232 -0
  30. package/src/data/metric.ts +51 -0
  31. package/src/data/ping.ts +36 -0
  32. package/src/data/summary.ts +34 -0
  33. package/src/data/token.ts +39 -0
  34. package/src/data/upgrade.ts +36 -0
  35. package/src/data/upload.ts +250 -0
  36. package/src/data/variable.ts +46 -0
  37. package/src/diagnostic/encode.ts +40 -0
  38. package/src/diagnostic/image.ts +23 -0
  39. package/src/diagnostic/index.ts +14 -0
  40. package/src/diagnostic/internal.ts +41 -0
  41. package/src/diagnostic/script.ts +45 -0
  42. package/src/global.ts +22 -0
  43. package/src/index.ts +8 -0
  44. package/src/interaction/click.ts +140 -0
  45. package/src/interaction/encode.ts +140 -0
  46. package/src/interaction/index.ts +45 -0
  47. package/src/interaction/input.ts +64 -0
  48. package/src/interaction/pointer.ts +108 -0
  49. package/src/interaction/resize.ts +30 -0
  50. package/src/interaction/scroll.ts +73 -0
  51. package/src/interaction/selection.ts +66 -0
  52. package/src/interaction/timeline.ts +65 -0
  53. package/src/interaction/unload.ts +25 -0
  54. package/src/interaction/visibility.ts +24 -0
  55. package/src/layout/box.ts +83 -0
  56. package/src/layout/discover.ts +27 -0
  57. package/src/layout/document.ts +46 -0
  58. package/src/layout/dom.ts +442 -0
  59. package/src/layout/encode.ts +111 -0
  60. package/src/layout/extract.ts +75 -0
  61. package/src/layout/index.ts +25 -0
  62. package/src/layout/mutation.ts +232 -0
  63. package/src/layout/node.ts +211 -0
  64. package/src/layout/offset.ts +19 -0
  65. package/src/layout/region.ts +143 -0
  66. package/src/layout/schema.ts +66 -0
  67. package/src/layout/selector.ts +24 -0
  68. package/src/layout/target.ts +44 -0
  69. package/src/layout/traverse.ts +28 -0
  70. package/src/performance/connection.ts +37 -0
  71. package/src/performance/encode.ts +40 -0
  72. package/src/performance/index.ts +15 -0
  73. package/src/performance/navigation.ts +31 -0
  74. package/src/performance/observer.ts +87 -0
  75. package/test/core.test.ts +82 -0
  76. package/test/helper.ts +104 -0
  77. package/test/html/core.html +17 -0
  78. package/test/tsconfig.test.json +6 -0
  79. package/tsconfig.json +21 -0
  80. package/tslint.json +33 -0
  81. package/types/core.d.ts +127 -0
  82. package/types/data.d.ts +344 -0
  83. package/types/diagnostic.d.ts +24 -0
  84. package/types/index.d.ts +30 -0
  85. package/types/interaction.d.ts +110 -0
  86. package/types/layout.d.ts +200 -0
  87. package/types/performance.d.ts +40 -0
@@ -0,0 +1,127 @@
1
+ import * as Data from "./data";
2
+
3
+ type TaskFunction = () => Promise<void>;
4
+ type TaskResolve = () => void;
5
+ type UploadCallback = (data: string) => void;
6
+ type Region = [number /* RegionId */, keyof HTMLElementTagNameMap /* Query Selector */, RegionFilter? /* Region Filter */, string? /* Filter Text */];
7
+ type Metric = [Data.Metric /* MetricId */, Extract /* Extract Filter */, string /* Match Value */, number? /* Scale Factor */];
8
+
9
+ /* Enum */
10
+
11
+ export const enum Priority {
12
+ Normal = 0,
13
+ High = 1
14
+ }
15
+
16
+ export const enum Time {
17
+ Second = 1000,
18
+ Minute = 60 * 1000,
19
+ Hour = 60 * 60 * 1000,
20
+ Day = 24 * 60 * 60 * 1000
21
+ }
22
+
23
+
24
+ export const enum Task {
25
+ Wait = 0,
26
+ Run = 1,
27
+ Stop = 2
28
+ }
29
+
30
+ export const enum Setting {
31
+ LongTask = 30, // 30ms
32
+ }
33
+
34
+ export const enum RegionFilter {
35
+ Url = 0,
36
+ Javascript = 1
37
+ }
38
+
39
+ export const enum Extract {
40
+ Text = 0,
41
+ Javascript = 1,
42
+ Attribute = 2
43
+ }
44
+
45
+ export const enum Privacy {
46
+ None = 0,
47
+ Sensitive = 1,
48
+ Text = 2,
49
+ TextImage = 3,
50
+ Exclude = 4
51
+ }
52
+
53
+ /* Helper Interfaces */
54
+
55
+ export interface Module {
56
+ start: () => void;
57
+ stop: () => void;
58
+ }
59
+
60
+ export interface Tasks {
61
+ [key: number]: TaskInfo;
62
+ }
63
+
64
+ export interface TaskInfo {
65
+ start: number;
66
+ calls: number;
67
+ yield: number;
68
+ }
69
+
70
+ export interface Timer {
71
+ id: string;
72
+ cost: Data.Metric;
73
+ }
74
+
75
+ export interface RequestIdleCallbackOptions {
76
+ timeout: number;
77
+ }
78
+
79
+ export interface RequestIdleCallbackDeadline {
80
+ didTimeout: boolean;
81
+ timeRemaining: (() => number);
82
+ }
83
+
84
+ export interface AsyncTask {
85
+ task: TaskFunction;
86
+ resolve: TaskResolve;
87
+ id: string;
88
+ }
89
+
90
+ export interface OffsetDistance {
91
+ x: number;
92
+ y: number;
93
+ }
94
+
95
+ export interface BrowserEvent {
96
+ event: string;
97
+ target: EventTarget;
98
+ listener: EventListener;
99
+ capture: boolean;
100
+ }
101
+
102
+ export interface Report {
103
+ c: Data.Check; // Reporting code
104
+ p: string; // Project Id
105
+ u: string; // User Id
106
+ s: string; // Session Id
107
+ n: number; // Page Number
108
+ m?: string; // Message, optional
109
+ }
110
+
111
+ export interface Config {
112
+ projectId?: string;
113
+ delay?: number;
114
+ cssRules?: boolean;
115
+ lean?: boolean;
116
+ track?: boolean;
117
+ content?: boolean;
118
+ mask?: string[];
119
+ unmask?: string[];
120
+ regions?: Region[];
121
+ metrics?: Metric[];
122
+ cookies?: string[];
123
+ report?: string;
124
+ upload?: string | UploadCallback;
125
+ fallback?: string;
126
+ upgrade?: (key: string) => void;
127
+ }
@@ -0,0 +1,344 @@
1
+ import { Time } from "@clarity-types/core";
2
+ export type Target = (number | Node);
3
+ export type Token = (string | number | number[] | string[]);
4
+ export type DecodedToken = (any | any[]);
5
+
6
+ export type MetadataCallback = (data: Metadata, playback: boolean) => void;
7
+
8
+ /* Enum */
9
+
10
+ export const enum Event {
11
+ /* Data */
12
+ Metric = 0,
13
+ Dimension = 1,
14
+ Upload = 2,
15
+ Upgrade = 3,
16
+ Baseline = 4,
17
+ Discover = 5,
18
+ Mutation = 6,
19
+ Region = 7,
20
+ Document = 8,
21
+ Click = 9,
22
+ Scroll = 10,
23
+ Resize = 11,
24
+ MouseMove = 12,
25
+ MouseDown = 13,
26
+ MouseUp = 14,
27
+ MouseWheel = 15,
28
+ DoubleClick = 16,
29
+ TouchStart = 17,
30
+ TouchEnd = 18,
31
+ TouchMove = 19,
32
+ TouchCancel = 20,
33
+ Selection = 21,
34
+ Timeline = 22,
35
+ Page = 23,
36
+ Custom = 24,
37
+ Ping = 25,
38
+ Unload = 26,
39
+ Input = 27,
40
+ Visibility = 28,
41
+ Navigation = 29,
42
+ Connection = 30,
43
+ ScriptError = 31,
44
+ ImageError = 32,
45
+ Log = 33,
46
+ Variable = 34,
47
+ Limit = 35,
48
+ Summary = 36,
49
+ Box = 37,
50
+ }
51
+
52
+ export const enum Metric {
53
+ ClientTimestamp = 0,
54
+ Playback = 1,
55
+ TotalBytes = 2,
56
+ LayoutCost = 3,
57
+ TotalCost = 4,
58
+ InvokeCount = 5,
59
+ ThreadBlockedTime = 6,
60
+ LongTaskCount = 7,
61
+ LargestPaint = 8,
62
+ CumulativeLayoutShift = 9,
63
+ FirstInputDelay = 10,
64
+ RatingValue = 11,
65
+ RatingCount = 12,
66
+ ProductPrice = 13,
67
+ ScreenWidth = 14,
68
+ ScreenHeight = 15,
69
+ ColorDepth = 16,
70
+ ReviewCount = 17,
71
+ BestRating = 18,
72
+ WorstRating = 19,
73
+ CartPrice = 20,
74
+ CartShipping = 21,
75
+ CartDiscount = 22,
76
+ CartTax = 23,
77
+ CartTotal = 24
78
+ }
79
+
80
+ export const enum Dimension {
81
+ UserAgent = 0,
82
+ Url = 1,
83
+ Referrer = 2,
84
+ PageTitle = 3,
85
+ NetworkHosts = 4,
86
+ SchemaType = 5,
87
+ ProductBrand = 6,
88
+ ProductAvailability = 7,
89
+ AuthorName = 8,
90
+ Language = 9,
91
+ ProductName = 10,
92
+ ProductCategory = 11,
93
+ ProductSku = 12,
94
+ ProductCurrency = 13,
95
+ ProductCondition = 14,
96
+ TabId = 15,
97
+ PageLanguage = 16,
98
+ DocumentDirection = 17,
99
+ Headline = 18,
100
+ MetaType = 19,
101
+ MetaTitle = 20,
102
+ Generator = 21
103
+
104
+ }
105
+
106
+ export const enum Check {
107
+ None = 0,
108
+ Payload = 1,
109
+ Shutdown = 2,
110
+ Retry = 3,
111
+ Bytes = 4,
112
+ Collection = 5,
113
+ Server = 6
114
+ }
115
+
116
+ export const enum Code {
117
+ RunTask = 0,
118
+ CssRules = 1,
119
+ MutationObserver = 2,
120
+ PerformanceObserver = 3,
121
+ CallStackDepth = 4,
122
+ Selector = 5,
123
+ Metric = 6,
124
+ ContentSecurityPolicy = 7
125
+ }
126
+
127
+ export const enum Severity {
128
+ Info = 0,
129
+ Warning = 1,
130
+ Error = 2,
131
+ Fatal = 3
132
+ }
133
+
134
+ export const enum Upload {
135
+ Async = 0,
136
+ Beacon = 1
137
+ }
138
+
139
+ export const enum BooleanFlag {
140
+ False = 0,
141
+ True = 1
142
+ }
143
+
144
+ export const enum Setting {
145
+ Expire = 365, // 1 Year
146
+ SessionExpire = 1, // 1 Day
147
+ CookieVersion = 1, // Increment this version every time there's a cookie schema change
148
+ SessionTimeout = 30 * Time.Minute, // 30 minutes
149
+ CookieInterval = 1, // 1 Day
150
+ PingInterval = 1 * Time.Minute, // 1 Minute
151
+ PingTimeout = 5 * Time.Minute, // 5 Minutes
152
+ SummaryInterval = 100, // Same events within 100ms will be collapsed into single summary
153
+ ClickText = 25, // Maximum number of characters to send as part of Click event's text field
154
+ PayloadLimit = 128, // Do not allow more than specified payloads per page
155
+ ShutdownLimit = 2 * Time.Hour, // Shutdown instrumentation after specified time
156
+ RetryLimit = 1, // Maximum number of attempts to upload a payload before giving up
157
+ PlaybackBytesLimit = 10 * 1024 * 1024, // 10MB
158
+ CollectionLimit = 128, // Number of unique entries for dimensions
159
+ ClickPrecision = 32767, // 2^15 - 1
160
+ BoxPrecision = 100, // Up to 2 decimal points (e.g. 34.56)
161
+ ResizeObserverThreshold = 15, // At least 15 characters before we attach a resize observer for the node
162
+ ScriptErrorLimit = 5, // Do not send the same script error more than 5 times per page
163
+ WordLength = 5, // Estimated average size of a word,
164
+ RestartDelay = 250, // Wait for 250ms before starting to wire up again
165
+ CallStackDepth = 20, // Maximum call stack depth before bailing out
166
+ RatingScale = 100, // Scale rating to specified scale
167
+ ViewportIntersectionRatio = 0.25, // Ratio of intersection area in comparison to viewport area before it's marked visible
168
+ IntersectionRatio = 0.8, // Ratio of intersection area in comparison to element's area before it's marked visible
169
+ MaxFirstPayloadBytes = 1 * 1024 * 1024, // 1MB: Cap the very first payload to a maximum of 1MB
170
+ UploadFactor = 3, // Slow down sequence by specified factor
171
+ MinUploadDelay = 100, // Minimum time before we are ready to flush events to the server
172
+ MaxUploadDelay = 30 * Time.Second // Do flush out payload once every 30s
173
+ }
174
+
175
+ export const enum Constant {
176
+ Auto = "Auto",
177
+ Config = "Config",
178
+ Clarity = "clarity",
179
+ Restart = "restart",
180
+ Suspend = "suspend",
181
+ Pause = "pause",
182
+ Resume = "resume",
183
+ Report = "report",
184
+ Empty = "",
185
+ Space = " ",
186
+ Expires = "expires=",
187
+ Domain = "domain=",
188
+ Comma = ",",
189
+ Dot = ".",
190
+ Semicolon = ";",
191
+ Equals = "=",
192
+ Path = ";path=/",
193
+ Target = "target",
194
+ Blank = "_blank",
195
+ Parent = "_parent",
196
+ Top = "_top",
197
+ String = "string",
198
+ Number = "number",
199
+ CookieKey = "_clck", // Clarity Cookie Key
200
+ SessionKey = "_clsk", // Clarity Session Key
201
+ TabKey = "_cltk", // Clarity Tab Key
202
+ Pipe = "|",
203
+ End = "END",
204
+ Upgrade = "UPGRADE",
205
+ UserId = "userId",
206
+ SessionId = "sessionId",
207
+ PageId = "pageId",
208
+ ResizeObserver = "ResizeObserver",
209
+ Mask = "•",
210
+ SessionStorage = "sessionStorage",
211
+ Cookie = "cookie",
212
+ Navigation = "navigation",
213
+ Resource = "resource",
214
+ LongTask = "longtask",
215
+ FID = "first-input",
216
+ CLS = "layout-shift",
217
+ LCP = "largest-contentful-paint",
218
+ HTTPS = "https://",
219
+ CompressionStream = "CompressionStream",
220
+ Accept = "Accept",
221
+ ClarityGzip = "application/x-clarity-gzip"
222
+ }
223
+
224
+ export const enum XMLReadyState {
225
+ Unsent = 0,
226
+ Opened = 1,
227
+ Headers_Recieved = 2,
228
+ Loading = 3,
229
+ Done = 4
230
+ }
231
+
232
+ /* Helper Interfaces */
233
+
234
+ export interface Payload {
235
+ e: Token[]; /* Envelope */
236
+ a: Token[][]; /* Events that are used for data analysis */
237
+ p: Token[][]; /* Events that are primarily used for session playback */
238
+ }
239
+
240
+ export interface EncodedPayload {
241
+ e: string; /* Envelope */
242
+ a: string; /* Analytics Payload */
243
+ p: string; /* Playback Payload */
244
+ }
245
+
246
+ export interface Metadata {
247
+ projectId: string;
248
+ userId: string;
249
+ sessionId: string;
250
+ pageNum: number;
251
+ }
252
+
253
+ export interface Session {
254
+ session: string;
255
+ ts: number;
256
+ count: number;
257
+ upgrade: BooleanFlag;
258
+ upload: string;
259
+ }
260
+
261
+ export interface User {
262
+ id: string;
263
+ expiry: number;
264
+ consent: BooleanFlag;
265
+ }
266
+
267
+ export interface Envelope extends Metadata {
268
+ sequence: number;
269
+ start: number;
270
+ duration: number;
271
+ version: string;
272
+ upload: Upload;
273
+ end: BooleanFlag;
274
+ }
275
+
276
+ export interface Transit {
277
+ [key: number]: {
278
+ data: string;
279
+ attempts: number;
280
+ };
281
+ }
282
+
283
+ export interface BaselineState {
284
+ time: number;
285
+ event: number;
286
+ data: BaselineData;
287
+ }
288
+
289
+ /* Event Data */
290
+ export interface BaselineData {
291
+ visible: BooleanFlag;
292
+ docWidth: number;
293
+ docHeight: number;
294
+ screenWidth: number;
295
+ screenHeight: number;
296
+ scrollX: number;
297
+ scrollY: number;
298
+ pointerX: number;
299
+ pointerY: number;
300
+ activityTime: number;
301
+ }
302
+
303
+ export interface DimensionData {
304
+ [key: number]: string[];
305
+ }
306
+
307
+ export interface VariableData {
308
+ [name: string]: string[];
309
+ }
310
+
311
+ // Eventually custom event can be expanded to contain more properties
312
+ // For now, restricting to key value pair where both key & value are strings
313
+ // The way it's different from variable is that Custom Event has a notion of time
314
+ // Whereas variables have no timing element and eventually will turn into custom dimensions
315
+ export interface CustomData {
316
+ key: string;
317
+ value: string;
318
+ }
319
+
320
+ export interface MetricData {
321
+ [key: number]: number;
322
+ }
323
+
324
+ export interface PingData {
325
+ gap: number;
326
+ }
327
+
328
+ export interface LimitData {
329
+ check: number;
330
+ }
331
+
332
+ export interface SummaryData {
333
+ [event: number]: [number, number][]; // Array of [start, duration] for every event type
334
+ }
335
+
336
+ export interface UpgradeData {
337
+ key: string;
338
+ }
339
+
340
+ export interface UploadData {
341
+ sequence: number;
342
+ attempts: number;
343
+ status: number;
344
+ }
@@ -0,0 +1,24 @@
1
+ import { Code, Severity, Target } from "./data";
2
+
3
+ /* Event Data */
4
+ export interface ScriptErrorData {
5
+ source: string;
6
+ message: string;
7
+ line: number;
8
+ column: number;
9
+ stack: string;
10
+ }
11
+
12
+ export interface ImageErrorData {
13
+ source: string;
14
+ target: Target;
15
+ region?: number;
16
+ }
17
+
18
+ export interface LogData {
19
+ code: Code;
20
+ name: string;
21
+ message: string;
22
+ stack: string;
23
+ severity: Severity;
24
+ }
@@ -0,0 +1,30 @@
1
+ import * as Core from "./core";
2
+ import * as Data from "./data";
3
+ import * as Diagnostic from "./diagnostic";
4
+ import * as Layout from "./layout";
5
+ import * as Interaction from "./interaction";
6
+ import * as Performance from "./performance";
7
+
8
+ interface Clarity {
9
+ start: (config?: Core.Config) => void;
10
+ stop: () => void;
11
+ pause: () => void;
12
+ resume: () => void;
13
+ upgrade: (key: string) => void;
14
+ consent: () => void;
15
+ event: (name: string, value: string) => void;
16
+ set: (variable: string, value: string | string[]) => void;
17
+ identify: (userId: string, sessionId?: string, pageId?: string) => void;
18
+ metadata: (callback: Data.MetadataCallback) => void;
19
+ }
20
+
21
+ interface Helper {
22
+ hash: (input: string) => string;
23
+ selector: (tag: string, prefix: string, attributes: Layout.Attributes, position: number) => string;
24
+ }
25
+
26
+ declare const clarity: Clarity;
27
+ declare const helper: Helper;
28
+ declare const version: string;
29
+
30
+ export { clarity, version, helper, Core, Data, Diagnostic, Layout, Interaction, Performance };
@@ -0,0 +1,110 @@
1
+ import { Time } from "./core";
2
+ import { BooleanFlag, Event, Target } from "./data";
3
+
4
+ /* Enum */
5
+
6
+ export const enum BrowsingContext {
7
+ Self = 0,
8
+ Blank = 1,
9
+ Parent = 2,
10
+ Top = 3
11
+ }
12
+
13
+ export const enum Setting {
14
+ LookAhead = 500, // 500ms
15
+ Distance = 20, // 20 pixels
16
+ Interval = 25, // 25 milliseconds
17
+ TimelineSpan = 2 * Time.Second, // 2 seconds
18
+ }
19
+
20
+ /* Helper Interfaces */
21
+ export interface PointerState {
22
+ time: number;
23
+ event: number;
24
+ data: PointerData;
25
+ }
26
+
27
+ export interface ClickState {
28
+ time: number;
29
+ event: number;
30
+ data: ClickData;
31
+ }
32
+
33
+ export interface ScrollState {
34
+ time: number;
35
+ event: number;
36
+ data: ScrollData;
37
+ }
38
+
39
+ export interface InputState {
40
+ time: number;
41
+ event: number;
42
+ data: InputData;
43
+ }
44
+
45
+ export interface TimelineState {
46
+ time: number;
47
+ event: number;
48
+ data: TimelineData;
49
+ }
50
+
51
+ /* Event Data */
52
+ export interface TimelineData {
53
+ type: Event;
54
+ hash: string;
55
+ x: number;
56
+ y: number;
57
+ reaction: number;
58
+ context: number;
59
+ }
60
+
61
+ export interface InputData {
62
+ target: Target;
63
+ value: string;
64
+ }
65
+
66
+ export interface PointerData {
67
+ target: Target;
68
+ x: number;
69
+ y: number;
70
+ }
71
+
72
+ export interface ClickData {
73
+ target: Target;
74
+ x: number;
75
+ y: number;
76
+ eX: number;
77
+ eY: number;
78
+ button: number;
79
+ reaction: number;
80
+ context: BrowsingContext;
81
+ text: string;
82
+ link: string;
83
+ hash: string;
84
+ }
85
+
86
+ export interface ResizeData {
87
+ width: number;
88
+ height: number;
89
+ }
90
+
91
+ export interface ScrollData {
92
+ target: Target;
93
+ x: number;
94
+ y: number;
95
+ }
96
+
97
+ export interface SelectionData {
98
+ start: Target;
99
+ startOffset: number;
100
+ end: Target;
101
+ endOffset: number;
102
+ }
103
+
104
+ export interface UnloadData {
105
+ name: string;
106
+ }
107
+
108
+ export interface VisibilityData {
109
+ visible: string;
110
+ }