posthog-node 5.8.8 → 5.9.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 (129) hide show
  1. package/dist/{index.d.ts → client.d.ts} +7 -378
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +481 -0
  4. package/dist/client.mjs +437 -0
  5. package/dist/entrypoints/index.edge.d.ts +6 -0
  6. package/dist/entrypoints/index.edge.d.ts.map +1 -0
  7. package/dist/entrypoints/index.edge.js +89 -0
  8. package/dist/entrypoints/index.edge.mjs +12 -0
  9. package/dist/entrypoints/index.node.d.ts +6 -0
  10. package/dist/entrypoints/index.node.d.ts.map +1 -0
  11. package/dist/entrypoints/index.node.js +99 -0
  12. package/dist/entrypoints/index.node.mjs +16 -0
  13. package/dist/exports.d.ts +4 -0
  14. package/dist/exports.d.ts.map +1 -0
  15. package/dist/exports.js +78 -0
  16. package/dist/exports.mjs +3 -0
  17. package/dist/extensions/error-tracking/autocapture.d.ts +4 -0
  18. package/dist/extensions/error-tracking/autocapture.d.ts.map +1 -0
  19. package/dist/extensions/error-tracking/autocapture.js +68 -0
  20. package/dist/extensions/error-tracking/autocapture.mjs +31 -0
  21. package/dist/extensions/error-tracking/chunk-ids.d.ts +5 -0
  22. package/dist/extensions/error-tracking/chunk-ids.d.ts.map +1 -0
  23. package/dist/extensions/error-tracking/chunk-ids.js +68 -0
  24. package/dist/extensions/error-tracking/chunk-ids.mjs +34 -0
  25. package/dist/extensions/error-tracking/context-lines.node.d.ts +5 -0
  26. package/dist/extensions/error-tracking/context-lines.node.d.ts.map +1 -0
  27. package/dist/extensions/error-tracking/context-lines.node.js +227 -0
  28. package/dist/extensions/error-tracking/context-lines.node.mjs +187 -0
  29. package/dist/extensions/error-tracking/error-conversion.d.ts +4 -0
  30. package/dist/extensions/error-tracking/error-conversion.d.ts.map +1 -0
  31. package/dist/extensions/error-tracking/error-conversion.js +183 -0
  32. package/dist/extensions/error-tracking/error-conversion.mjs +146 -0
  33. package/dist/extensions/error-tracking/get-module.node.d.ts +3 -0
  34. package/dist/extensions/error-tracking/get-module.node.d.ts.map +1 -0
  35. package/dist/extensions/error-tracking/get-module.node.js +57 -0
  36. package/dist/extensions/error-tracking/get-module.node.mjs +23 -0
  37. package/dist/extensions/error-tracking/index.d.ts +20 -0
  38. package/dist/extensions/error-tracking/index.d.ts.map +1 -0
  39. package/dist/extensions/error-tracking/index.js +97 -0
  40. package/dist/extensions/error-tracking/index.mjs +63 -0
  41. package/dist/extensions/error-tracking/reduceable-cache.d.ts +13 -0
  42. package/dist/extensions/error-tracking/reduceable-cache.d.ts.map +1 -0
  43. package/dist/extensions/error-tracking/reduceable-cache.js +57 -0
  44. package/dist/extensions/error-tracking/reduceable-cache.mjs +23 -0
  45. package/dist/extensions/error-tracking/stack-parser.d.ts +3 -0
  46. package/dist/extensions/error-tracking/stack-parser.d.ts.map +1 -0
  47. package/dist/extensions/error-tracking/stack-parser.js +148 -0
  48. package/dist/extensions/error-tracking/stack-parser.mjs +114 -0
  49. package/dist/extensions/error-tracking/type-checking.d.ts +8 -0
  50. package/dist/extensions/error-tracking/type-checking.d.ts.map +1 -0
  51. package/dist/extensions/error-tracking/type-checking.js +80 -0
  52. package/dist/extensions/error-tracking/type-checking.mjs +31 -0
  53. package/dist/extensions/error-tracking/types.d.ts +61 -0
  54. package/dist/extensions/error-tracking/types.d.ts.map +1 -0
  55. package/dist/extensions/error-tracking/types.js +43 -0
  56. package/dist/extensions/error-tracking/types.mjs +9 -0
  57. package/dist/extensions/express.d.ts +17 -0
  58. package/dist/extensions/express.d.ts.map +1 -0
  59. package/dist/extensions/express.js +61 -0
  60. package/dist/extensions/express.mjs +17 -0
  61. package/dist/extensions/feature-flags/crypto-helpers.d.ts +3 -0
  62. package/dist/extensions/feature-flags/crypto-helpers.d.ts.map +1 -0
  63. package/dist/extensions/feature-flags/crypto-helpers.js +77 -0
  64. package/dist/extensions/feature-flags/crypto-helpers.mjs +22 -0
  65. package/dist/extensions/feature-flags/crypto.d.ts +2 -0
  66. package/dist/extensions/feature-flags/crypto.d.ts.map +1 -0
  67. package/dist/extensions/feature-flags/crypto.js +47 -0
  68. package/dist/extensions/feature-flags/crypto.mjs +13 -0
  69. package/dist/extensions/feature-flags/feature-flags.d.ts +89 -0
  70. package/dist/extensions/feature-flags/feature-flags.d.ts.map +1 -0
  71. package/dist/extensions/feature-flags/feature-flags.js +529 -0
  72. package/dist/extensions/feature-flags/feature-flags.mjs +483 -0
  73. package/dist/extensions/feature-flags/lazy.d.ts +24 -0
  74. package/dist/extensions/feature-flags/lazy.d.ts.map +1 -0
  75. package/dist/extensions/feature-flags/lazy.js +60 -0
  76. package/dist/extensions/feature-flags/lazy.mjs +26 -0
  77. package/dist/extensions/sentry-integration.d.ts +54 -0
  78. package/dist/extensions/sentry-integration.d.ts.map +1 -0
  79. package/dist/extensions/sentry-integration.js +113 -0
  80. package/dist/extensions/sentry-integration.mjs +73 -0
  81. package/dist/storage-memory.d.ts +7 -0
  82. package/dist/storage-memory.d.ts.map +1 -0
  83. package/dist/storage-memory.js +46 -0
  84. package/dist/storage-memory.mjs +12 -0
  85. package/dist/types.d.ts +253 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +18 -0
  88. package/dist/types.mjs +0 -0
  89. package/dist/utils/logger.d.ts +3 -0
  90. package/dist/utils/logger.d.ts.map +1 -0
  91. package/dist/utils/logger.js +63 -0
  92. package/dist/utils/logger.mjs +29 -0
  93. package/dist/version.d.ts +2 -0
  94. package/dist/version.d.ts.map +1 -0
  95. package/dist/version.js +36 -0
  96. package/dist/version.mjs +2 -0
  97. package/package.json +32 -31
  98. package/src/client.ts +1532 -0
  99. package/src/entrypoints/index.edge.ts +15 -0
  100. package/src/entrypoints/index.node.ts +17 -0
  101. package/src/exports.ts +3 -0
  102. package/src/extensions/error-tracking/autocapture.ts +65 -0
  103. package/src/extensions/error-tracking/chunk-ids.ts +58 -0
  104. package/src/extensions/error-tracking/context-lines.node.ts +392 -0
  105. package/src/extensions/error-tracking/error-conversion.ts +291 -0
  106. package/src/extensions/error-tracking/get-module.node.ts +57 -0
  107. package/src/extensions/error-tracking/index.ts +103 -0
  108. package/src/extensions/error-tracking/reduceable-cache.ts +39 -0
  109. package/src/extensions/error-tracking/stack-parser.ts +212 -0
  110. package/src/extensions/error-tracking/type-checking.ts +40 -0
  111. package/src/extensions/error-tracking/types.ts +71 -0
  112. package/src/extensions/express.ts +39 -0
  113. package/src/extensions/feature-flags/crypto-helpers.ts +36 -0
  114. package/src/extensions/feature-flags/crypto.ts +22 -0
  115. package/src/extensions/feature-flags/feature-flags.ts +1003 -0
  116. package/src/extensions/feature-flags/lazy.ts +55 -0
  117. package/src/extensions/sentry-integration.ts +216 -0
  118. package/src/storage-memory.ts +13 -0
  119. package/src/types.ts +294 -0
  120. package/src/utils/logger.ts +39 -0
  121. package/src/version.ts +1 -0
  122. package/dist/edge/index.cjs +0 -3150
  123. package/dist/edge/index.cjs.map +0 -1
  124. package/dist/edge/index.mjs +0 -3144
  125. package/dist/edge/index.mjs.map +0 -1
  126. package/dist/node/index.cjs +0 -3556
  127. package/dist/node/index.cjs.map +0 -1
  128. package/dist/node/index.mjs +0 -3550
  129. package/dist/node/index.mjs.map +0 -1
@@ -0,0 +1,187 @@
1
+ import { ReduceableCache } from "./reduceable-cache.mjs";
2
+ import { createReadStream } from "node:fs";
3
+ import { createInterface } from "node:readline";
4
+ const LRU_FILE_CONTENTS_CACHE = new ReduceableCache(25);
5
+ const LRU_FILE_CONTENTS_FS_READ_FAILED = new ReduceableCache(20);
6
+ const DEFAULT_LINES_OF_CONTEXT = 7;
7
+ const MAX_CONTEXTLINES_COLNO = 1000;
8
+ const MAX_CONTEXTLINES_LINENO = 10000;
9
+ async function addSourceContext(frames) {
10
+ const filesToLines = {};
11
+ for(let i = frames.length - 1; i >= 0; i--){
12
+ const frame = frames[i];
13
+ const filename = frame?.filename;
14
+ if (!frame || 'string' != typeof filename || 'number' != typeof frame.lineno || shouldSkipContextLinesForFile(filename) || shouldSkipContextLinesForFrame(frame)) continue;
15
+ const filesToLinesOutput = filesToLines[filename];
16
+ if (!filesToLinesOutput) filesToLines[filename] = [];
17
+ filesToLines[filename].push(frame.lineno);
18
+ }
19
+ const files = Object.keys(filesToLines);
20
+ if (0 == files.length) return frames;
21
+ const readlinePromises = [];
22
+ for (const file of files){
23
+ if (LRU_FILE_CONTENTS_FS_READ_FAILED.get(file)) continue;
24
+ const filesToLineRanges = filesToLines[file];
25
+ if (!filesToLineRanges) continue;
26
+ filesToLineRanges.sort((a, b)=>a - b);
27
+ const ranges = makeLineReaderRanges(filesToLineRanges);
28
+ if (ranges.every((r)=>rangeExistsInContentCache(file, r))) continue;
29
+ const cache = emplace(LRU_FILE_CONTENTS_CACHE, file, {});
30
+ readlinePromises.push(getContextLinesFromFile(file, ranges, cache));
31
+ }
32
+ await Promise.all(readlinePromises).catch(()=>{});
33
+ if (frames && frames.length > 0) addSourceContextToFrames(frames, LRU_FILE_CONTENTS_CACHE);
34
+ LRU_FILE_CONTENTS_CACHE.reduce();
35
+ return frames;
36
+ }
37
+ function getContextLinesFromFile(path, ranges, output) {
38
+ return new Promise((resolve)=>{
39
+ const stream = createReadStream(path);
40
+ const lineReaded = createInterface({
41
+ input: stream
42
+ });
43
+ function destroyStreamAndResolve() {
44
+ stream.destroy();
45
+ resolve();
46
+ }
47
+ let lineNumber = 0;
48
+ let currentRangeIndex = 0;
49
+ const range = ranges[currentRangeIndex];
50
+ if (void 0 === range) return void destroyStreamAndResolve();
51
+ let rangeStart = range[0];
52
+ let rangeEnd = range[1];
53
+ function onStreamError() {
54
+ LRU_FILE_CONTENTS_FS_READ_FAILED.set(path, 1);
55
+ lineReaded.close();
56
+ lineReaded.removeAllListeners();
57
+ destroyStreamAndResolve();
58
+ }
59
+ stream.on('error', onStreamError);
60
+ lineReaded.on('error', onStreamError);
61
+ lineReaded.on('close', destroyStreamAndResolve);
62
+ lineReaded.on('line', (line)=>{
63
+ lineNumber++;
64
+ if (lineNumber < rangeStart) return;
65
+ output[lineNumber] = snipLine(line, 0);
66
+ if (lineNumber >= rangeEnd) {
67
+ if (currentRangeIndex === ranges.length - 1) {
68
+ lineReaded.close();
69
+ lineReaded.removeAllListeners();
70
+ return;
71
+ }
72
+ currentRangeIndex++;
73
+ const range = ranges[currentRangeIndex];
74
+ if (void 0 === range) {
75
+ lineReaded.close();
76
+ lineReaded.removeAllListeners();
77
+ return;
78
+ }
79
+ rangeStart = range[0];
80
+ rangeEnd = range[1];
81
+ }
82
+ });
83
+ });
84
+ }
85
+ function addSourceContextToFrames(frames, cache) {
86
+ for (const frame of frames)if (frame.filename && void 0 === frame.context_line && 'number' == typeof frame.lineno) {
87
+ const contents = cache.get(frame.filename);
88
+ if (void 0 === contents) continue;
89
+ addContextToFrame(frame.lineno, frame, contents);
90
+ }
91
+ }
92
+ function addContextToFrame(lineno, frame, contents) {
93
+ if (void 0 === frame.lineno || void 0 === contents) return;
94
+ frame.pre_context = [];
95
+ for(let i = makeRangeStart(lineno); i < lineno; i++){
96
+ const line = contents[i];
97
+ if (void 0 === line) return void clearLineContext(frame);
98
+ frame.pre_context.push(line);
99
+ }
100
+ if (void 0 === contents[lineno]) return void clearLineContext(frame);
101
+ frame.context_line = contents[lineno];
102
+ const end = makeRangeEnd(lineno);
103
+ frame.post_context = [];
104
+ for(let i = lineno + 1; i <= end; i++){
105
+ const line = contents[i];
106
+ if (void 0 === line) break;
107
+ frame.post_context.push(line);
108
+ }
109
+ }
110
+ function clearLineContext(frame) {
111
+ delete frame.pre_context;
112
+ delete frame.context_line;
113
+ delete frame.post_context;
114
+ }
115
+ function shouldSkipContextLinesForFile(path) {
116
+ return path.startsWith('node:') || path.endsWith('.min.js') || path.endsWith('.min.cjs') || path.endsWith('.min.mjs') || path.startsWith('data:');
117
+ }
118
+ function shouldSkipContextLinesForFrame(frame) {
119
+ if (void 0 !== frame.lineno && frame.lineno > MAX_CONTEXTLINES_LINENO) return true;
120
+ if (void 0 !== frame.colno && frame.colno > MAX_CONTEXTLINES_COLNO) return true;
121
+ return false;
122
+ }
123
+ function rangeExistsInContentCache(file, range) {
124
+ const contents = LRU_FILE_CONTENTS_CACHE.get(file);
125
+ if (void 0 === contents) return false;
126
+ for(let i = range[0]; i <= range[1]; i++)if (void 0 === contents[i]) return false;
127
+ return true;
128
+ }
129
+ function makeLineReaderRanges(lines) {
130
+ if (!lines.length) return [];
131
+ let i = 0;
132
+ const line = lines[0];
133
+ if ('number' != typeof line) return [];
134
+ let current = makeContextRange(line);
135
+ const out = [];
136
+ while(true){
137
+ if (i === lines.length - 1) {
138
+ out.push(current);
139
+ break;
140
+ }
141
+ const next = lines[i + 1];
142
+ if ('number' != typeof next) break;
143
+ if (next <= current[1]) current[1] = next + DEFAULT_LINES_OF_CONTEXT;
144
+ else {
145
+ out.push(current);
146
+ current = makeContextRange(next);
147
+ }
148
+ i++;
149
+ }
150
+ return out;
151
+ }
152
+ function makeContextRange(line) {
153
+ return [
154
+ makeRangeStart(line),
155
+ makeRangeEnd(line)
156
+ ];
157
+ }
158
+ function makeRangeStart(line) {
159
+ return Math.max(1, line - DEFAULT_LINES_OF_CONTEXT);
160
+ }
161
+ function makeRangeEnd(line) {
162
+ return line + DEFAULT_LINES_OF_CONTEXT;
163
+ }
164
+ function emplace(map, key, contents) {
165
+ const value = map.get(key);
166
+ if (void 0 === value) {
167
+ map.set(key, contents);
168
+ return contents;
169
+ }
170
+ return value;
171
+ }
172
+ function snipLine(line, colno) {
173
+ let newLine = line;
174
+ const lineLength = newLine.length;
175
+ if (lineLength <= 150) return newLine;
176
+ if (colno > lineLength) colno = lineLength;
177
+ let start = Math.max(colno - 60, 0);
178
+ if (start < 5) start = 0;
179
+ let end = Math.min(start + 140, lineLength);
180
+ if (end > lineLength - 5) end = lineLength;
181
+ if (end === lineLength) start = Math.max(end - 140, 0);
182
+ newLine = newLine.slice(start, end);
183
+ if (start > 0) newLine = `...${newLine}`;
184
+ if (end < lineLength) newLine += '...';
185
+ return newLine;
186
+ }
187
+ export { MAX_CONTEXTLINES_COLNO, MAX_CONTEXTLINES_LINENO, addSourceContext };
@@ -0,0 +1,4 @@
1
+ import { ErrorProperties, EventHint, StackFrame, StackFrameModifierFn, StackParser } from './types';
2
+ export declare function propertiesFromUnknownInput(stackParser: StackParser, frameModifiers: StackFrameModifierFn[], input: unknown, hint?: EventHint): Promise<ErrorProperties>;
3
+ export declare function applyChunkIds(frames: StackFrame[], parser: StackParser): StackFrame[];
4
+ //# sourceMappingURL=error-conversion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-conversion.d.ts","sourceRoot":"","sources":["../../../src/extensions/error-tracking/error-conversion.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,eAAe,EACf,SAAS,EAGT,UAAU,EACV,oBAAoB,EACpB,WAAW,EACZ,MAAM,SAAS,CAAA;AAEhB,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,oBAAoB,EAAE,EACtC,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,SAAS,GACf,OAAO,CAAC,eAAe,CAAC,CAoB1B;AAiPD,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,UAAU,EAAE,CASrF"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ propertiesFromUnknownInput: ()=>propertiesFromUnknownInput,
28
+ applyChunkIds: ()=>applyChunkIds
29
+ });
30
+ const external_chunk_ids_js_namespaceObject = require("./chunk-ids.js");
31
+ const external_type_checking_js_namespaceObject = require("./type-checking.js");
32
+ async function propertiesFromUnknownInput(stackParser, frameModifiers, input, hint) {
33
+ const providedMechanism = hint && hint.mechanism;
34
+ const mechanism = providedMechanism || {
35
+ handled: true,
36
+ type: 'generic'
37
+ };
38
+ const errorList = getErrorList(mechanism, input, hint);
39
+ const exceptionList = await Promise.all(errorList.map(async (error)=>{
40
+ const exception = await exceptionFromError(stackParser, frameModifiers, error);
41
+ exception.value = exception.value || '';
42
+ exception.type = exception.type || 'Error';
43
+ exception.mechanism = mechanism;
44
+ return exception;
45
+ }));
46
+ const properties = {
47
+ $exception_list: exceptionList
48
+ };
49
+ return properties;
50
+ }
51
+ function getErrorList(mechanism, input, hint) {
52
+ const error = getError(mechanism, input, hint);
53
+ if (error.cause) return [
54
+ error,
55
+ ...getErrorList(mechanism, error.cause, hint)
56
+ ];
57
+ return [
58
+ error
59
+ ];
60
+ }
61
+ function getError(mechanism, exception, hint) {
62
+ if ((0, external_type_checking_js_namespaceObject.isError)(exception)) return exception;
63
+ mechanism.synthetic = true;
64
+ if ((0, external_type_checking_js_namespaceObject.isPlainObject)(exception)) {
65
+ const errorFromProp = getErrorPropertyFromObject(exception);
66
+ if (errorFromProp) return errorFromProp;
67
+ const message = getMessageForObject(exception);
68
+ const ex = hint?.syntheticException || new Error(message);
69
+ ex.message = message;
70
+ return ex;
71
+ }
72
+ const ex = hint?.syntheticException || new Error(exception);
73
+ ex.message = `${exception}`;
74
+ return ex;
75
+ }
76
+ function getErrorPropertyFromObject(obj) {
77
+ for(const prop in obj)if (Object.prototype.hasOwnProperty.call(obj, prop)) {
78
+ const value = obj[prop];
79
+ if ((0, external_type_checking_js_namespaceObject.isError)(value)) return value;
80
+ }
81
+ }
82
+ function getMessageForObject(exception) {
83
+ if ('name' in exception && 'string' == typeof exception.name) {
84
+ let message = `'${exception.name}' captured as exception`;
85
+ if ('message' in exception && 'string' == typeof exception.message) message += ` with message '${exception.message}'`;
86
+ return message;
87
+ }
88
+ if ('message' in exception && 'string' == typeof exception.message) return exception.message;
89
+ const keys = extractExceptionKeysForMessage(exception);
90
+ if ((0, external_type_checking_js_namespaceObject.isErrorEvent)(exception)) return `Event \`ErrorEvent\` captured as exception with message \`${exception.message}\``;
91
+ const className = getObjectClassName(exception);
92
+ return `${className && 'Object' !== className ? `'${className}'` : 'Object'} captured as exception with keys: ${keys}`;
93
+ }
94
+ function getObjectClassName(obj) {
95
+ try {
96
+ const prototype = Object.getPrototypeOf(obj);
97
+ return prototype ? prototype.constructor.name : void 0;
98
+ } catch (e) {}
99
+ }
100
+ function extractExceptionKeysForMessage(exception, maxLength = 40) {
101
+ const keys = Object.keys(convertToPlainObject(exception));
102
+ keys.sort();
103
+ const firstKey = keys[0];
104
+ if (!firstKey) return '[object has no keys]';
105
+ if (firstKey.length >= maxLength) return truncate(firstKey, maxLength);
106
+ for(let includedKeys = keys.length; includedKeys > 0; includedKeys--){
107
+ const serialized = keys.slice(0, includedKeys).join(', ');
108
+ if (!(serialized.length > maxLength)) {
109
+ if (includedKeys === keys.length) return serialized;
110
+ return truncate(serialized, maxLength);
111
+ }
112
+ }
113
+ return '';
114
+ }
115
+ function truncate(str, max = 0) {
116
+ if ('string' != typeof str || 0 === max) return str;
117
+ return str.length <= max ? str : `${str.slice(0, max)}...`;
118
+ }
119
+ function convertToPlainObject(value) {
120
+ if ((0, external_type_checking_js_namespaceObject.isError)(value)) return {
121
+ message: value.message,
122
+ name: value.name,
123
+ stack: value.stack,
124
+ ...getOwnProperties(value)
125
+ };
126
+ if (!(0, external_type_checking_js_namespaceObject.isEvent)(value)) return value;
127
+ {
128
+ const newObj = {
129
+ type: value.type,
130
+ target: serializeEventTarget(value.target),
131
+ currentTarget: serializeEventTarget(value.currentTarget),
132
+ ...getOwnProperties(value)
133
+ };
134
+ return newObj;
135
+ }
136
+ }
137
+ function getOwnProperties(obj) {
138
+ if ('object' != typeof obj || null === obj) return {};
139
+ {
140
+ const extractedProps = {};
141
+ for(const property in obj)if (Object.prototype.hasOwnProperty.call(obj, property)) extractedProps[property] = obj[property];
142
+ return extractedProps;
143
+ }
144
+ }
145
+ function serializeEventTarget(target) {
146
+ try {
147
+ return Object.prototype.toString.call(target);
148
+ } catch (_oO) {
149
+ return '<unknown>';
150
+ }
151
+ }
152
+ async function exceptionFromError(stackParser, frameModifiers, error) {
153
+ const exception = {
154
+ type: error.name || error.constructor.name,
155
+ value: error.message
156
+ };
157
+ let frames = parseStackFrames(stackParser, error);
158
+ for (const modifier of frameModifiers)frames = await modifier(frames);
159
+ if (frames.length) exception.stacktrace = {
160
+ frames,
161
+ type: 'raw'
162
+ };
163
+ return exception;
164
+ }
165
+ function parseStackFrames(stackParser, error) {
166
+ return applyChunkIds(stackParser(error.stack || '', 1), stackParser);
167
+ }
168
+ function applyChunkIds(frames, parser) {
169
+ const filenameChunkIdMap = (0, external_chunk_ids_js_namespaceObject.getFilenameToChunkIdMap)(parser);
170
+ frames.forEach((frame)=>{
171
+ if (frame.filename && filenameChunkIdMap) frame.chunk_id = filenameChunkIdMap[frame.filename];
172
+ });
173
+ return frames;
174
+ }
175
+ exports.applyChunkIds = __webpack_exports__.applyChunkIds;
176
+ exports.propertiesFromUnknownInput = __webpack_exports__.propertiesFromUnknownInput;
177
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
178
+ "applyChunkIds",
179
+ "propertiesFromUnknownInput"
180
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
181
+ Object.defineProperty(exports, '__esModule', {
182
+ value: true
183
+ });
@@ -0,0 +1,146 @@
1
+ import { getFilenameToChunkIdMap } from "./chunk-ids.mjs";
2
+ import { isError, isErrorEvent, isEvent, isPlainObject } from "./type-checking.mjs";
3
+ async function propertiesFromUnknownInput(stackParser, frameModifiers, input, hint) {
4
+ const providedMechanism = hint && hint.mechanism;
5
+ const mechanism = providedMechanism || {
6
+ handled: true,
7
+ type: 'generic'
8
+ };
9
+ const errorList = getErrorList(mechanism, input, hint);
10
+ const exceptionList = await Promise.all(errorList.map(async (error)=>{
11
+ const exception = await exceptionFromError(stackParser, frameModifiers, error);
12
+ exception.value = exception.value || '';
13
+ exception.type = exception.type || 'Error';
14
+ exception.mechanism = mechanism;
15
+ return exception;
16
+ }));
17
+ const properties = {
18
+ $exception_list: exceptionList
19
+ };
20
+ return properties;
21
+ }
22
+ function getErrorList(mechanism, input, hint) {
23
+ const error = getError(mechanism, input, hint);
24
+ if (error.cause) return [
25
+ error,
26
+ ...getErrorList(mechanism, error.cause, hint)
27
+ ];
28
+ return [
29
+ error
30
+ ];
31
+ }
32
+ function getError(mechanism, exception, hint) {
33
+ if (isError(exception)) return exception;
34
+ mechanism.synthetic = true;
35
+ if (isPlainObject(exception)) {
36
+ const errorFromProp = getErrorPropertyFromObject(exception);
37
+ if (errorFromProp) return errorFromProp;
38
+ const message = getMessageForObject(exception);
39
+ const ex = hint?.syntheticException || new Error(message);
40
+ ex.message = message;
41
+ return ex;
42
+ }
43
+ const ex = hint?.syntheticException || new Error(exception);
44
+ ex.message = `${exception}`;
45
+ return ex;
46
+ }
47
+ function getErrorPropertyFromObject(obj) {
48
+ for(const prop in obj)if (Object.prototype.hasOwnProperty.call(obj, prop)) {
49
+ const value = obj[prop];
50
+ if (isError(value)) return value;
51
+ }
52
+ }
53
+ function getMessageForObject(exception) {
54
+ if ('name' in exception && 'string' == typeof exception.name) {
55
+ let message = `'${exception.name}' captured as exception`;
56
+ if ('message' in exception && 'string' == typeof exception.message) message += ` with message '${exception.message}'`;
57
+ return message;
58
+ }
59
+ if ('message' in exception && 'string' == typeof exception.message) return exception.message;
60
+ const keys = extractExceptionKeysForMessage(exception);
61
+ if (isErrorEvent(exception)) return `Event \`ErrorEvent\` captured as exception with message \`${exception.message}\``;
62
+ const className = getObjectClassName(exception);
63
+ return `${className && 'Object' !== className ? `'${className}'` : 'Object'} captured as exception with keys: ${keys}`;
64
+ }
65
+ function getObjectClassName(obj) {
66
+ try {
67
+ const prototype = Object.getPrototypeOf(obj);
68
+ return prototype ? prototype.constructor.name : void 0;
69
+ } catch (e) {}
70
+ }
71
+ function extractExceptionKeysForMessage(exception, maxLength = 40) {
72
+ const keys = Object.keys(convertToPlainObject(exception));
73
+ keys.sort();
74
+ const firstKey = keys[0];
75
+ if (!firstKey) return '[object has no keys]';
76
+ if (firstKey.length >= maxLength) return truncate(firstKey, maxLength);
77
+ for(let includedKeys = keys.length; includedKeys > 0; includedKeys--){
78
+ const serialized = keys.slice(0, includedKeys).join(', ');
79
+ if (!(serialized.length > maxLength)) {
80
+ if (includedKeys === keys.length) return serialized;
81
+ return truncate(serialized, maxLength);
82
+ }
83
+ }
84
+ return '';
85
+ }
86
+ function truncate(str, max = 0) {
87
+ if ('string' != typeof str || 0 === max) return str;
88
+ return str.length <= max ? str : `${str.slice(0, max)}...`;
89
+ }
90
+ function convertToPlainObject(value) {
91
+ if (isError(value)) return {
92
+ message: value.message,
93
+ name: value.name,
94
+ stack: value.stack,
95
+ ...getOwnProperties(value)
96
+ };
97
+ if (!isEvent(value)) return value;
98
+ {
99
+ const newObj = {
100
+ type: value.type,
101
+ target: serializeEventTarget(value.target),
102
+ currentTarget: serializeEventTarget(value.currentTarget),
103
+ ...getOwnProperties(value)
104
+ };
105
+ return newObj;
106
+ }
107
+ }
108
+ function getOwnProperties(obj) {
109
+ if ('object' != typeof obj || null === obj) return {};
110
+ {
111
+ const extractedProps = {};
112
+ for(const property in obj)if (Object.prototype.hasOwnProperty.call(obj, property)) extractedProps[property] = obj[property];
113
+ return extractedProps;
114
+ }
115
+ }
116
+ function serializeEventTarget(target) {
117
+ try {
118
+ return Object.prototype.toString.call(target);
119
+ } catch (_oO) {
120
+ return '<unknown>';
121
+ }
122
+ }
123
+ async function exceptionFromError(stackParser, frameModifiers, error) {
124
+ const exception = {
125
+ type: error.name || error.constructor.name,
126
+ value: error.message
127
+ };
128
+ let frames = parseStackFrames(stackParser, error);
129
+ for (const modifier of frameModifiers)frames = await modifier(frames);
130
+ if (frames.length) exception.stacktrace = {
131
+ frames,
132
+ type: 'raw'
133
+ };
134
+ return exception;
135
+ }
136
+ function parseStackFrames(stackParser, error) {
137
+ return applyChunkIds(stackParser(error.stack || '', 1), stackParser);
138
+ }
139
+ function applyChunkIds(frames, parser) {
140
+ const filenameChunkIdMap = getFilenameToChunkIdMap(parser);
141
+ frames.forEach((frame)=>{
142
+ if (frame.filename && filenameChunkIdMap) frame.chunk_id = filenameChunkIdMap[frame.filename];
143
+ });
144
+ return frames;
145
+ }
146
+ export { applyChunkIds, propertiesFromUnknownInput };
@@ -0,0 +1,3 @@
1
+ /** Creates a function that gets the module name from a filename */
2
+ export declare function createGetModuleFromFilename(basePath?: string, isWindows?: boolean): (filename: string | undefined) => string | undefined;
3
+ //# sourceMappingURL=get-module.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-module.node.d.ts","sourceRoot":"","sources":["../../../src/extensions/error-tracking/get-module.node.ts"],"names":[],"mappings":"AAKA,mEAAmE;AACnE,wBAAgB,2BAA2B,CACzC,QAAQ,GAAE,MAAmE,EAC7E,SAAS,GAAE,OAAsB,GAChC,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAwCtD"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ createGetModuleFromFilename: ()=>createGetModuleFromFilename
28
+ });
29
+ const external_path_namespaceObject = require("path");
30
+ function createGetModuleFromFilename(basePath = process.argv[1] ? (0, external_path_namespaceObject.dirname)(process.argv[1]) : process.cwd(), isWindows = '\\' === external_path_namespaceObject.sep) {
31
+ const normalizedBase = isWindows ? normalizeWindowsPath(basePath) : basePath;
32
+ return (filename)=>{
33
+ if (!filename) return;
34
+ const normalizedFilename = isWindows ? normalizeWindowsPath(filename) : filename;
35
+ let { dir, base: file, ext } = external_path_namespaceObject.posix.parse(normalizedFilename);
36
+ if ('.js' === ext || '.mjs' === ext || '.cjs' === ext) file = file.slice(0, -1 * ext.length);
37
+ const decodedFile = decodeURIComponent(file);
38
+ if (!dir) dir = '.';
39
+ const n = dir.lastIndexOf('/node_modules');
40
+ if (n > -1) return `${dir.slice(n + 14).replace(/\//g, '.')}:${decodedFile}`;
41
+ if (dir.startsWith(normalizedBase)) {
42
+ const moduleName = dir.slice(normalizedBase.length + 1).replace(/\//g, '.');
43
+ return moduleName ? `${moduleName}:${decodedFile}` : decodedFile;
44
+ }
45
+ return decodedFile;
46
+ };
47
+ }
48
+ function normalizeWindowsPath(path) {
49
+ return path.replace(/^[A-Z]:/, '').replace(/\\/g, '/');
50
+ }
51
+ exports.createGetModuleFromFilename = __webpack_exports__.createGetModuleFromFilename;
52
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
53
+ "createGetModuleFromFilename"
54
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
55
+ Object.defineProperty(exports, '__esModule', {
56
+ value: true
57
+ });
@@ -0,0 +1,23 @@
1
+ import { dirname, posix, sep } from "path";
2
+ function createGetModuleFromFilename(basePath = process.argv[1] ? dirname(process.argv[1]) : process.cwd(), isWindows = '\\' === sep) {
3
+ const normalizedBase = isWindows ? normalizeWindowsPath(basePath) : basePath;
4
+ return (filename)=>{
5
+ if (!filename) return;
6
+ const normalizedFilename = isWindows ? normalizeWindowsPath(filename) : filename;
7
+ let { dir, base: file, ext } = posix.parse(normalizedFilename);
8
+ if ('.js' === ext || '.mjs' === ext || '.cjs' === ext) file = file.slice(0, -1 * ext.length);
9
+ const decodedFile = decodeURIComponent(file);
10
+ if (!dir) dir = '.';
11
+ const n = dir.lastIndexOf('/node_modules');
12
+ if (n > -1) return `${dir.slice(n + 14).replace(/\//g, '.')}:${decodedFile}`;
13
+ if (dir.startsWith(normalizedBase)) {
14
+ const moduleName = dir.slice(normalizedBase.length + 1).replace(/\//g, '.');
15
+ return moduleName ? `${moduleName}:${decodedFile}` : decodedFile;
16
+ }
17
+ return decodedFile;
18
+ };
19
+ }
20
+ function normalizeWindowsPath(path) {
21
+ return path.replace(/^[A-Z]:/, '').replace(/\\/g, '/');
22
+ }
23
+ export { createGetModuleFromFilename };
@@ -0,0 +1,20 @@
1
+ import { EventHint, StackFrameModifierFn, StackParser } from './types';
2
+ import { PostHogBackendClient } from '../../client';
3
+ import { EventMessage, PostHogOptions } from '../../types';
4
+ import type { Logger } from '@posthog/core';
5
+ export default class ErrorTracking {
6
+ private client;
7
+ private _exceptionAutocaptureEnabled;
8
+ private _rateLimiter;
9
+ private _logger;
10
+ static stackParser: StackParser;
11
+ static frameModifiers: StackFrameModifierFn[];
12
+ constructor(client: PostHogBackendClient, options: PostHogOptions, _logger: Logger);
13
+ static buildEventMessage(error: unknown, hint: EventHint, distinctId?: string, additionalProperties?: Record<string | number, any>): Promise<EventMessage>;
14
+ private startAutocaptureIfEnabled;
15
+ private onException;
16
+ private onFatalError;
17
+ isEnabled(): boolean;
18
+ shutdown(): void;
19
+ }
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/error-tracking/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAEtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGnD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAK3C,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,4BAA4B,CAAS;IAC7C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,OAAO,CAAQ;IAEvB,MAAM,CAAC,WAAW,EAAE,WAAW,CAAA;IAC/B,MAAM,CAAC,cAAc,EAAE,oBAAoB,EAAE,CAAA;gBAEjC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM;WAkBrE,iBAAiB,CAC5B,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,SAAS,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,GAClD,OAAO,CAAC,YAAY,CAAC;IAqBxB,OAAO,CAAC,yBAAyB;YAOnB,WAAW;YAkBX,YAAY;IAM1B,SAAS,IAAI,OAAO;IAIpB,QAAQ,IAAI,IAAI;CAGjB"}