@openreplay/tracker 4.1.8 → 4.1.9-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +22 -18
  3. package/cjs/app/guards.d.ts +10 -11
  4. package/cjs/app/guards.js +2 -1
  5. package/cjs/app/index.d.ts +5 -3
  6. package/cjs/app/index.js +53 -36
  7. package/cjs/app/messages.gen.d.ts +3 -2
  8. package/cjs/app/messages.gen.js +19 -5
  9. package/cjs/app/observer/observer.js +4 -4
  10. package/cjs/app/observer/top_observer.js +1 -1
  11. package/cjs/app/session.d.ts +1 -1
  12. package/cjs/app/session.js +1 -1
  13. package/cjs/common/messages.gen.d.ts +16 -4
  14. package/cjs/index.d.ts +5 -1
  15. package/cjs/index.js +6 -4
  16. package/cjs/modules/cssrules.js +1 -1
  17. package/cjs/modules/focus.js +2 -2
  18. package/cjs/modules/img.js +1 -1
  19. package/cjs/modules/input.js +9 -17
  20. package/cjs/modules/mouse.js +1 -1
  21. package/cjs/modules/network.d.ts +28 -0
  22. package/cjs/modules/network.js +203 -0
  23. package/cjs/modules/timing.js +9 -6
  24. package/cjs/modules/viewport.js +3 -1
  25. package/cjs/utils.d.ts +1 -0
  26. package/cjs/utils.js +7 -4
  27. package/jest.config.js +11 -0
  28. package/lib/app/guards.d.ts +10 -11
  29. package/lib/app/guards.js +2 -1
  30. package/lib/app/index.d.ts +5 -3
  31. package/lib/app/index.js +54 -37
  32. package/lib/app/messages.gen.d.ts +3 -2
  33. package/lib/app/messages.gen.js +15 -2
  34. package/lib/app/observer/observer.js +4 -4
  35. package/lib/app/observer/top_observer.js +1 -1
  36. package/lib/app/session.d.ts +1 -1
  37. package/lib/app/session.js +1 -1
  38. package/lib/common/messages.gen.d.ts +16 -4
  39. package/lib/common/tsconfig.tsbuildinfo +1 -1
  40. package/lib/index.d.ts +5 -1
  41. package/lib/index.js +7 -5
  42. package/lib/modules/cssrules.js +1 -1
  43. package/lib/modules/focus.js +2 -2
  44. package/lib/modules/img.js +1 -1
  45. package/lib/modules/input.js +9 -17
  46. package/lib/modules/mouse.js +1 -1
  47. package/lib/modules/network.d.ts +28 -0
  48. package/lib/modules/network.js +200 -0
  49. package/lib/modules/timing.js +10 -7
  50. package/lib/modules/viewport.js +3 -1
  51. package/lib/utils.d.ts +1 -0
  52. package/lib/utils.js +5 -3
  53. package/package.json +8 -3
  54. package/cjs/app/messages.d.ts +0 -52
  55. package/cjs/app/messages.js +0 -234
  56. package/lib/app/messages.d.ts +0 -52
  57. package/lib/app/messages.js +0 -181
@@ -95,7 +95,7 @@ export default function (app) {
95
95
  observer.disconnect();
96
96
  });
97
97
  app.nodes.attachNodeCallback((node) => {
98
- if (!hasTag(node, 'IMG')) {
98
+ if (!hasTag(node, 'img')) {
99
99
  return;
100
100
  }
101
101
  app.nodes.attachNodeListener(node, 'error', () => sendImgError(node));
@@ -1,18 +1,18 @@
1
1
  import { normSpaces, IN_BROWSER, getLabelAttribute } from '../utils.js';
2
2
  import { hasTag } from '../app/guards.js';
3
3
  import { SetInputTarget, SetInputValue, SetInputChecked } from '../app/messages.gen.js';
4
- const INPUT_TYPES = ['text', 'password', 'email', 'search', 'number', 'range', 'date'];
4
+ const INPUT_TYPES = ['text', 'password', 'email', 'search', 'number', 'range', 'date', 'tel'];
5
5
  function isTextEditable(node) {
6
- if (hasTag(node, 'TEXTAREA')) {
6
+ if (hasTag(node, 'textarea')) {
7
7
  return true;
8
8
  }
9
- if (!hasTag(node, 'INPUT')) {
9
+ if (!hasTag(node, 'input')) {
10
10
  return false;
11
11
  }
12
12
  return INPUT_TYPES.includes(node.type);
13
13
  }
14
14
  function isCheckable(node) {
15
- if (!hasTag(node, 'INPUT')) {
15
+ if (!hasTag(node, 'input')) {
16
16
  return false;
17
17
  }
18
18
  const type = node.type;
@@ -22,7 +22,7 @@ const labelElementFor = IN_BROWSER && 'labels' in HTMLInputElement.prototype
22
22
  ? (node) => {
23
23
  let p = node;
24
24
  while ((p = p.parentNode) !== null) {
25
- if (hasTag(p, 'LABEL')) {
25
+ if (hasTag(p, 'label')) {
26
26
  return p;
27
27
  }
28
28
  }
@@ -34,7 +34,7 @@ const labelElementFor = IN_BROWSER && 'labels' in HTMLInputElement.prototype
34
34
  : (node) => {
35
35
  let p = node;
36
36
  while ((p = p.parentNode) !== null) {
37
- if (hasTag(p, 'LABEL')) {
37
+ if (hasTag(p, 'label')) {
38
38
  return p;
39
39
  }
40
40
  }
@@ -111,11 +111,7 @@ export default function (app, opts) {
111
111
  inputValues.forEach((value, id) => {
112
112
  const node = app.nodes.getNode(id);
113
113
  if (!node)
114
- return;
115
- if (!isTextEditable(node)) {
116
- inputValues.delete(id);
117
- return;
118
- }
114
+ return inputValues.delete(id);
119
115
  if (value !== node.value) {
120
116
  inputValues.set(id, node.value);
121
117
  if (!registeredTargets.has(id)) {
@@ -128,11 +124,7 @@ export default function (app, opts) {
128
124
  checkableValues.forEach((checked, id) => {
129
125
  const node = app.nodes.getNode(id);
130
126
  if (!node)
131
- return;
132
- if (!isCheckable(node)) {
133
- checkableValues.delete(id);
134
- return;
135
- }
127
+ return checkableValues.delete(id);
136
128
  if (checked !== node.checked) {
137
129
  checkableValues.set(id, node.checked);
138
130
  app.send(SetInputChecked(id, node.checked));
@@ -146,7 +138,7 @@ export default function (app, opts) {
146
138
  return;
147
139
  }
148
140
  // TODO: support multiple select (?): use selectedOptions; Need send target?
149
- if (hasTag(node, 'SELECT')) {
141
+ if (hasTag(node, 'select')) {
150
142
  sendInputValue(id, node);
151
143
  app.attachEventListener(node, 'change', () => {
152
144
  sendInputValue(id, node);
@@ -78,7 +78,7 @@ export default function (app) {
78
78
  if (dl !== null) {
79
79
  return dl;
80
80
  }
81
- if (hasTag(target, 'INPUT')) {
81
+ if (hasTag(target, 'input')) {
82
82
  return getInputLabel(target);
83
83
  }
84
84
  if (isClickable(target)) {
@@ -0,0 +1,28 @@
1
+ import type App from '../app/index.js';
2
+ declare type XHRRequestBody = Parameters<XMLHttpRequest['send']>[0];
3
+ declare type FetchRequestBody = RequestInit['body'];
4
+ interface RequestData {
5
+ body: XHRRequestBody | FetchRequestBody;
6
+ headers: Record<string, string>;
7
+ }
8
+ interface ResponseData {
9
+ body: any;
10
+ headers: Record<string, string>;
11
+ }
12
+ interface RequestResponseData {
13
+ readonly status: number;
14
+ readonly method: string;
15
+ url: string;
16
+ request: RequestData;
17
+ response: ResponseData;
18
+ }
19
+ declare type Sanitizer = (data: RequestResponseData) => RequestResponseData | null;
20
+ export interface Options {
21
+ sessionTokenHeader: string | boolean;
22
+ failuresOnly: boolean;
23
+ ignoreHeaders: Array<string> | boolean;
24
+ capturePayload: boolean;
25
+ sanitizer?: Sanitizer;
26
+ }
27
+ export default function (app: App, opts?: Partial<Options>): void;
28
+ export {};
@@ -0,0 +1,200 @@
1
+ import { NetworkRequest } from '../app/messages.gen.js';
2
+ import { getTimeOrigin } from '../utils.js';
3
+ function getXHRRequestDataObject(xhr) {
4
+ // @ts-ignore this is 3x faster than using Map<XHR, XHRRequestData>
5
+ if (!xhr.__or_req_data__) {
6
+ // @ts-ignore
7
+ xhr.__or_req_data__ = { body: undefined, headers: {} };
8
+ }
9
+ // @ts-ignore
10
+ return xhr.__or_req_data__;
11
+ }
12
+ function strMethod(method) {
13
+ return typeof method === 'string' ? method.toUpperCase() : 'GET';
14
+ }
15
+ export default function (app, opts = {}) {
16
+ const options = Object.assign({
17
+ failuresOnly: false,
18
+ ignoreHeaders: ['Cookie', 'Set-Cookie', 'Authorization'],
19
+ capturePayload: false,
20
+ sessionTokenHeader: false,
21
+ }, opts);
22
+ const ignoreHeaders = options.ignoreHeaders;
23
+ const isHIgnored = Array.isArray(ignoreHeaders)
24
+ ? (name) => ignoreHeaders.includes(name)
25
+ : () => ignoreHeaders;
26
+ const stHeader = options.sessionTokenHeader === true ? 'X-OpenReplay-SessionToken' : options.sessionTokenHeader;
27
+ function setSessionTokenHeader(setRequestHeader) {
28
+ if (stHeader) {
29
+ const sessionToken = app.getSessionToken();
30
+ if (sessionToken) {
31
+ app.safe(setRequestHeader)(stHeader, sessionToken);
32
+ }
33
+ }
34
+ }
35
+ function sanitize(reqResInfo) {
36
+ if (!options.capturePayload) {
37
+ delete reqResInfo.request.body;
38
+ delete reqResInfo.response.body;
39
+ }
40
+ if (options.sanitizer) {
41
+ const resBody = reqResInfo.response.body;
42
+ if (typeof resBody === 'string') {
43
+ // Parse response in order to have handy view in sanitisation function
44
+ try {
45
+ reqResInfo.response.body = JSON.parse(resBody);
46
+ }
47
+ catch (_a) { }
48
+ }
49
+ return options.sanitizer(reqResInfo);
50
+ }
51
+ return reqResInfo;
52
+ }
53
+ function stringify(r) {
54
+ if (r && typeof r.body !== 'string') {
55
+ try {
56
+ r.body = JSON.stringify(r.body);
57
+ }
58
+ catch (_a) {
59
+ r.body = '<unable to stringify>';
60
+ app.notify.warn("Openreplay fetch couldn't stringify body:", r.body);
61
+ }
62
+ }
63
+ return JSON.stringify(r);
64
+ }
65
+ /* ====== Fetch ====== */
66
+ const origFetch = window.fetch.bind(window);
67
+ window.fetch = (input, init = {}) => {
68
+ if (!(typeof input === 'string' || input instanceof URL) || app.isServiceURL(String(input))) {
69
+ return origFetch(input, init);
70
+ }
71
+ setSessionTokenHeader(function (name, value) {
72
+ if (init.headers === undefined) {
73
+ init.headers = {};
74
+ }
75
+ if (init.headers instanceof Headers) {
76
+ init.headers.append(name, value);
77
+ }
78
+ else if (Array.isArray(init.headers)) {
79
+ init.headers.push([name, value]);
80
+ }
81
+ else {
82
+ init.headers[name] = value;
83
+ }
84
+ });
85
+ const startTime = performance.now();
86
+ return origFetch(input, init).then((response) => {
87
+ const duration = performance.now() - startTime;
88
+ if (options.failuresOnly && response.status < 400) {
89
+ return response;
90
+ }
91
+ const r = response.clone();
92
+ r.text()
93
+ .then((text) => {
94
+ const reqHs = {};
95
+ const resHs = {};
96
+ if (ignoreHeaders !== true) {
97
+ // request headers
98
+ const writeReqHeader = ([n, v]) => {
99
+ if (!isHIgnored(n)) {
100
+ reqHs[n] = v;
101
+ }
102
+ };
103
+ if (init.headers instanceof Headers) {
104
+ init.headers.forEach((v, n) => writeReqHeader([n, v]));
105
+ }
106
+ else if (Array.isArray(init.headers)) {
107
+ init.headers.forEach(writeReqHeader);
108
+ }
109
+ else if (typeof init.headers === 'object') {
110
+ Object.entries(init.headers).forEach(writeReqHeader);
111
+ }
112
+ // response headers
113
+ r.headers.forEach((v, n) => {
114
+ if (!isHIgnored(n))
115
+ resHs[n] = v;
116
+ });
117
+ }
118
+ const method = strMethod(init.method);
119
+ const reqResInfo = sanitize({
120
+ url: String(input),
121
+ method,
122
+ status: r.status,
123
+ request: {
124
+ headers: reqHs,
125
+ body: init.body,
126
+ },
127
+ response: {
128
+ headers: resHs,
129
+ body: text,
130
+ },
131
+ });
132
+ if (!reqResInfo) {
133
+ return;
134
+ }
135
+ app.send(NetworkRequest('fetch', method, String(reqResInfo.url), stringify(reqResInfo.request), stringify(reqResInfo.response), r.status, startTime + getTimeOrigin(), duration));
136
+ })
137
+ .catch((e) => app.debug.error('Could not process Fetch response:', e));
138
+ return response;
139
+ });
140
+ };
141
+ /* ====== <> ====== */
142
+ /* ====== XHR ====== */
143
+ const nativeOpen = XMLHttpRequest.prototype.open;
144
+ XMLHttpRequest.prototype.open = function (initMethod, url) {
145
+ const xhr = this;
146
+ setSessionTokenHeader((name, value) => xhr.setRequestHeader(name, value));
147
+ let startTime = 0;
148
+ xhr.addEventListener('loadstart', (e) => {
149
+ startTime = e.timeStamp;
150
+ });
151
+ xhr.addEventListener('load', app.safe((e) => {
152
+ const { headers: reqHs, body: reqBody } = getXHRRequestDataObject(xhr);
153
+ const duration = startTime > 0 ? e.timeStamp - startTime : 0;
154
+ const hString = ignoreHeaders ? '' : xhr.getAllResponseHeaders(); // might be null (though only if no response received though)
155
+ const resHs = hString
156
+ ? hString
157
+ .split('\r\n')
158
+ .map((h) => h.split(':'))
159
+ .filter((entry) => !isHIgnored(entry[0]))
160
+ .reduce((hds, [name, value]) => (Object.assign(Object.assign({}, hds), { [name]: value })), {})
161
+ : {};
162
+ const method = strMethod(initMethod);
163
+ const reqResInfo = sanitize({
164
+ url: String(url),
165
+ method,
166
+ status: xhr.status,
167
+ request: {
168
+ headers: reqHs,
169
+ body: reqBody,
170
+ },
171
+ response: {
172
+ headers: resHs,
173
+ body: xhr.response,
174
+ },
175
+ });
176
+ if (!reqResInfo) {
177
+ return;
178
+ }
179
+ app.send(NetworkRequest('xhr', method, String(reqResInfo.url), stringify(reqResInfo.request), stringify(reqResInfo.response), xhr.status, startTime + getTimeOrigin(), duration));
180
+ }));
181
+ //TODO: handle error (though it has no Error API nor any useful information)
182
+ //xhr.addEventListener('error', (e) => {})
183
+ return nativeOpen.apply(this, arguments);
184
+ };
185
+ const nativeSend = XMLHttpRequest.prototype.send;
186
+ XMLHttpRequest.prototype.send = function (body) {
187
+ const rdo = getXHRRequestDataObject(this);
188
+ rdo.body = body;
189
+ return nativeSend.apply(this, arguments);
190
+ };
191
+ const nativeSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
192
+ XMLHttpRequest.prototype.setRequestHeader = function (name, value) {
193
+ if (!isHIgnored(name)) {
194
+ const rdo = getXHRRequestDataObject(this);
195
+ rdo.headers[name] = value;
196
+ }
197
+ return nativeSetRequestHeader.apply(this, arguments);
198
+ };
199
+ /* ====== <> ====== */
200
+ }
@@ -1,5 +1,5 @@
1
1
  import { hasTag } from '../app/guards.js';
2
- import { isURL } from '../utils.js';
2
+ import { isURL, getTimeOrigin } from '../utils.js';
3
3
  import { ResourceTiming, PageLoadTiming, PageRenderTiming } from '../app/messages.gen.js';
4
4
  function getPaintBlocks(resources) {
5
5
  const paintBlocks = [];
@@ -8,7 +8,7 @@ function getPaintBlocks(resources) {
8
8
  for (let i = 0; i < elements.length; i++) {
9
9
  const element = elements[i];
10
10
  let src = '';
11
- if (hasTag(element, 'IMG')) {
11
+ if (hasTag(element, 'img')) {
12
12
  src = element.currentSrc || element.src;
13
13
  }
14
14
  if (!src) {
@@ -68,13 +68,12 @@ export default function (app, opts) {
68
68
  } // Resources are necessary for all timings
69
69
  let resources = {};
70
70
  function resourceTiming(entry) {
71
- var _a;
72
71
  if (entry.duration < 0 || !isURL(entry.name) || app.isServiceURL(entry.name))
73
72
  return;
74
73
  if (resources !== null) {
75
74
  resources[entry.name] = entry.startTime + entry.duration;
76
75
  }
77
- app.send(ResourceTiming(entry.startTime + ((_a = performance === null || performance === void 0 ? void 0 : performance.timing) === null || _a === void 0 ? void 0 : _a.navigationStart), entry.duration, entry.responseStart && entry.startTime ? entry.responseStart - entry.startTime : 0, entry.transferSize > entry.encodedBodySize ? entry.transferSize - entry.encodedBodySize : 0, entry.encodedBodySize || 0, entry.decodedBodySize || 0, entry.name, entry.initiatorType));
76
+ app.send(ResourceTiming(entry.startTime + getTimeOrigin(), entry.duration, entry.responseStart && entry.startTime ? entry.responseStart - entry.startTime : 0, entry.transferSize > entry.encodedBodySize ? entry.transferSize - entry.encodedBodySize : 0, entry.encodedBodySize || 0, entry.decodedBodySize || 0, entry.name, entry.initiatorType));
78
77
  }
79
78
  const observer = new PerformanceObserver((list) => list.getEntries().forEach(resourceTiming));
80
79
  let prevSessionID;
@@ -111,7 +110,11 @@ export default function (app, opts) {
111
110
  }
112
111
  if (performance.timing.loadEventEnd || performance.now() > 30000) {
113
112
  pageLoadTimingSent = true;
114
- const { navigationStart, requestStart, responseStart, responseEnd, domContentLoadedEventStart, domContentLoadedEventEnd, loadEventStart, loadEventEnd, } = performance.timing;
113
+ const {
114
+ // should be ok to use here, (https://github.com/mdn/content/issues/4713)
115
+ // since it is compared with the values obtained on the page load (before any possible sleep state)
116
+ // deprecated though
117
+ navigationStart, requestStart, responseStart, responseEnd, domContentLoadedEventStart, domContentLoadedEventEnd, loadEventStart, loadEventEnd, } = performance.timing;
115
118
  app.send(PageLoadTiming(requestStart - navigationStart || 0, responseStart - navigationStart || 0, responseEnd - navigationStart || 0, domContentLoadedEventStart - navigationStart || 0, domContentLoadedEventEnd - navigationStart || 0, loadEventStart - navigationStart || 0, loadEventEnd - navigationStart || 0, firstPaint, firstContentfulPaint));
116
119
  }
117
120
  }, 30);
@@ -143,9 +146,9 @@ export default function (app, opts) {
143
146
  const speedIndex = paintBlocks === null
144
147
  ? 0
145
148
  : calculateSpeedIndex(firstContentfulPaint || firstPaint, paintBlocks);
149
+ const { domContentLoadedEventEnd, navigationStart } = performance.timing;
146
150
  const timeToInteractive = interactiveWindowTickTime === null
147
- ? Math.max(interactiveWindowStartTime, firstContentfulPaint, performance.timing.domContentLoadedEventEnd - performance.timing.navigationStart ||
148
- 0)
151
+ ? Math.max(interactiveWindowStartTime, firstContentfulPaint, domContentLoadedEventEnd - navigationStart || 0)
149
152
  : 0;
150
153
  app.send(PageRenderTiming(speedIndex, firstContentfulPaint > visuallyComplete ? firstContentfulPaint : visuallyComplete, timeToInteractive));
151
154
  }
@@ -1,7 +1,8 @@
1
+ import { getTimeOrigin } from '../utils.js';
1
2
  import { SetPageLocation, SetViewportSize, SetPageVisibility } from '../app/messages.gen.js';
2
3
  export default function (app) {
3
4
  let url, width, height;
4
- let navigationStart = performance.timing.navigationStart;
5
+ let navigationStart;
5
6
  const sendSetPageLocation = app.safe(() => {
6
7
  const { URL } = document;
7
8
  if (URL !== url) {
@@ -23,6 +24,7 @@ export default function (app) {
23
24
  : app.safe(() => app.send(SetPageVisibility(document.hidden)));
24
25
  app.attachStartCallback(() => {
25
26
  url = '';
27
+ navigationStart = getTimeOrigin();
26
28
  width = height = -1;
27
29
  sendSetPageLocation();
28
30
  sendSetViewportSize();
package/lib/utils.d.ts CHANGED
@@ -2,6 +2,7 @@ export declare const IN_BROWSER: boolean;
2
2
  export declare const IS_FIREFOX: false | RegExpMatchArray | null;
3
3
  export declare const MAX_STR_LEN = 100000;
4
4
  export declare function adjustTimeOrigin(): void;
5
+ export declare function getTimeOrigin(): number;
5
6
  export declare const now: () => number;
6
7
  export declare const stars: (str: string) => string;
7
8
  export declare function normSpaces(str: string): string;
package/lib/utils.js CHANGED
@@ -4,12 +4,14 @@ export const IS_FIREFOX = IN_BROWSER && navigator.userAgent.match(/firefox|fxios
4
4
  export const MAX_STR_LEN = 1e5;
5
5
  // Buggy to use `performance.timeOrigin || performance.timing.navigationStart`
6
6
  // https://github.com/mdn/content/issues/4713
7
- let timeOrigin = IN_BROWSER
8
- ? Date.now() - performance.now()
9
- : 0;
7
+ // Maybe move to timer/ticker
8
+ let timeOrigin = IN_BROWSER ? Date.now() - performance.now() : 0;
10
9
  export function adjustTimeOrigin() {
11
10
  timeOrigin = Date.now() - performance.now();
12
11
  }
12
+ export function getTimeOrigin() {
13
+ return timeOrigin;
14
+ }
13
15
  export const now = IN_BROWSER && !!performance.now
14
16
  ? () => Math.round(performance.now() + timeOrigin)
15
17
  : () => Date.now();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@openreplay/tracker",
3
3
  "description": "The OpenReplay tracker main package",
4
- "version": "4.1.8",
4
+ "version": "4.1.9-beta.2",
5
5
  "keywords": [
6
6
  "logging",
7
7
  "replay"
@@ -21,10 +21,12 @@
21
21
  "compile": "node --experimental-modules --experimental-json-modules scripts/compile.cjs",
22
22
  "build": "npm run clean && npm run tscRun && npm run rollup && npm run compile",
23
23
  "prepare": "cd ../../ && husky install tracker/.husky/",
24
- "lint-front": "lint-staged"
24
+ "lint-front": "lint-staged",
25
+ "test": "jest"
25
26
  },
26
27
  "devDependencies": {
27
28
  "@babel/core": "^7.10.2",
29
+ "@jest/globals": "^29.3.1",
28
30
  "@rollup/plugin-babel": "^5.0.3",
29
31
  "@rollup/plugin-node-resolve": "^10.0.0",
30
32
  "@typescript-eslint/eslint-plugin": "^5.30.0",
@@ -33,13 +35,16 @@
33
35
  "eslint-config-prettier": "^8.5.0",
34
36
  "eslint-plugin-prettier": "^4.2.1",
35
37
  "husky": "^8.0.1",
38
+ "jest": "^29.3.1",
39
+ "jest-environment-jsdom": "^29.3.1",
36
40
  "lint-staged": "^13.0.3",
37
41
  "prettier": "^2.7.1",
38
42
  "replace-in-files": "^2.0.3",
39
43
  "rollup": "^2.17.0",
40
44
  "rollup-plugin-terser": "^6.1.0",
41
45
  "semver": "^6.3.0",
42
- "typescript": "4.6.0-dev.20211126"
46
+ "ts-jest": "^29.0.3",
47
+ "typescript": "^4.9.4"
43
48
  },
44
49
  "dependencies": {
45
50
  "error-stack-parser": "^2.0.6"
@@ -1,52 +0,0 @@
1
- import * as Messages from '../common/messages.gen.js';
2
- export { default } from '../common/messages.gen.js';
3
- export declare function BatchMetadata(version: number, pageNo: number, firstIndex: number, timestamp: number, location: string): Messages.BatchMetadata;
4
- export declare function PartitionedMessage(partNo: number, partTotal: number): Messages.PartitionedMessage;
5
- export declare function Timestamp(timestamp: number): Messages.Timestamp;
6
- export declare function SetPageLocation(url: string, referrer: string, navigationStart: number): Messages.SetPageLocation;
7
- export declare function SetViewportSize(width: number, height: number): Messages.SetViewportSize;
8
- export declare function SetViewportScroll(x: number, y: number): Messages.SetViewportScroll;
9
- export declare function CreateDocument(): Messages.CreateDocument;
10
- export declare function CreateElementNode(id: number, parentID: number, index: number, tag: string, svg: boolean): Messages.CreateElementNode;
11
- export declare function CreateTextNode(id: number, parentID: number, index: number): Messages.CreateTextNode;
12
- export declare function MoveNode(id: number, parentID: number, index: number): Messages.MoveNode;
13
- export declare function RemoveNode(id: number): Messages.RemoveNode;
14
- export declare function SetNodeAttribute(id: number, name: string, value: string): Messages.SetNodeAttribute;
15
- export declare function RemoveNodeAttribute(id: number, name: string): Messages.RemoveNodeAttribute;
16
- export declare function SetNodeData(id: number, data: string): Messages.SetNodeData;
17
- export declare function SetNodeScroll(id: number, x: number, y: number): Messages.SetNodeScroll;
18
- export declare function SetInputTarget(id: number, label: string): Messages.SetInputTarget;
19
- export declare function SetInputValue(id: number, value: string, mask: number): Messages.SetInputValue;
20
- export declare function SetInputChecked(id: number, checked: boolean): Messages.SetInputChecked;
21
- export declare function MouseMove(x: number, y: number): Messages.MouseMove;
22
- export declare function ConsoleLog(level: string, value: string): Messages.ConsoleLog;
23
- export declare function PageLoadTiming(requestStart: number, responseStart: number, responseEnd: number, domContentLoadedEventStart: number, domContentLoadedEventEnd: number, loadEventStart: number, loadEventEnd: number, firstPaint: number, firstContentfulPaint: number): Messages.PageLoadTiming;
24
- export declare function PageRenderTiming(speedIndex: number, visuallyComplete: number, timeToInteractive: number): Messages.PageRenderTiming;
25
- export declare function JSException(name: string, message: string, payload: string, metadata: string): Messages.JSException;
26
- export declare function RawCustomEvent(name: string, payload: string): Messages.RawCustomEvent;
27
- export declare function UserID(id: string): Messages.UserID;
28
- export declare function UserAnonymousID(id: string): Messages.UserAnonymousID;
29
- export declare function Metadata(key: string, value: string): Messages.Metadata;
30
- export declare function CSSInsertRule(id: number, rule: string, index: number): Messages.CSSInsertRule;
31
- export declare function CSSDeleteRule(id: number, index: number): Messages.CSSDeleteRule;
32
- export declare function Fetch(method: string, url: string, request: string, response: string, status: number, timestamp: number, duration: number): Messages.Fetch;
33
- export declare function Profiler(name: string, duration: number, args: string, result: string): Messages.Profiler;
34
- export declare function OTable(key: string, value: string): Messages.OTable;
35
- export declare function StateAction(type: string): Messages.StateAction;
36
- export declare function Redux(action: string, state: string, duration: number): Messages.Redux;
37
- export declare function Vuex(mutation: string, state: string): Messages.Vuex;
38
- export declare function MobX(type: string, payload: string): Messages.MobX;
39
- export declare function NgRx(action: string, state: string, duration: number): Messages.NgRx;
40
- export declare function GraphQL(operationKind: string, operationName: string, variables: string, response: string): Messages.GraphQL;
41
- export declare function PerformanceTrack(frames: number, ticks: number, totalJSHeapSize: number, usedJSHeapSize: number): Messages.PerformanceTrack;
42
- export declare function ResourceTiming(timestamp: number, duration: number, ttfb: number, headerSize: number, encodedBodySize: number, decodedBodySize: number, url: string, initiator: string): Messages.ResourceTiming;
43
- export declare function ConnectionInformation(downlink: number, type: string): Messages.ConnectionInformation;
44
- export declare function SetPageVisibility(hidden: boolean): Messages.SetPageVisibility;
45
- export declare function LongTask(timestamp: number, duration: number, context: number, containerType: number, containerSrc: string, containerId: string, containerName: string): Messages.LongTask;
46
- export declare function SetNodeAttributeURLBased(id: number, name: string, value: string, baseURL: string): Messages.SetNodeAttributeURLBased;
47
- export declare function SetCSSDataURLBased(id: number, data: string, baseURL: string): Messages.SetCSSDataURLBased;
48
- export declare function TechnicalInfo(type: string, value: string): Messages.TechnicalInfo;
49
- export declare function CustomIssue(name: string, payload: string): Messages.CustomIssue;
50
- export declare function CSSInsertRuleURLBased(id: number, rule: string, index: number, baseURL: string): Messages.CSSInsertRuleURLBased;
51
- export declare function MouseClick(id: number, hesitationTime: number, label: string, selector: string): Messages.MouseClick;
52
- export declare function CreateIFrameDocument(frameID: number, id: number): Messages.CreateIFrameDocument;