healcode-client 1.0.5 → 1.0.7

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/bin/healcode.js CHANGED
@@ -33,6 +33,99 @@ program
33
33
  .description('HealCode CLI - Automatic error detection and fix generation')
34
34
  .version('1.0.0');
35
35
 
36
+ // Detect project type and find public folder
37
+ function findPublicFolder() {
38
+ const cwd = process.cwd();
39
+
40
+ // Angular: src/ folder (assets get copied to dist)
41
+ if (fs.existsSync(path.join(cwd, 'angular.json'))) {
42
+ const publicPath = path.join(cwd, 'public');
43
+ if (fs.existsSync(publicPath)) return publicPath;
44
+ // Fallback to src for older Angular
45
+ return path.join(cwd, 'src');
46
+ }
47
+
48
+ // React/Vue: public/ folder
49
+ const publicPath = path.join(cwd, 'public');
50
+ if (fs.existsSync(publicPath)) return publicPath;
51
+
52
+ // Vite: public/ or root
53
+ if (fs.existsSync(path.join(cwd, 'vite.config.js')) || fs.existsSync(path.join(cwd, 'vite.config.ts'))) {
54
+ if (fs.existsSync(publicPath)) return publicPath;
55
+ return cwd;
56
+ }
57
+
58
+ // Generic: try public, then root
59
+ if (fs.existsSync(publicPath)) return publicPath;
60
+
61
+ return cwd;
62
+ }
63
+
64
+ // Find main entry file
65
+ function findMainFile() {
66
+ const cwd = process.cwd();
67
+ const possiblePaths = [
68
+ path.join(cwd, 'src', 'main.ts'), // Angular/Vue
69
+ path.join(cwd, 'src', 'main.js'),
70
+ path.join(cwd, 'src', 'index.tsx'), // React
71
+ path.join(cwd, 'src', 'index.ts'),
72
+ path.join(cwd, 'src', 'index.js'),
73
+ path.join(cwd, 'src', 'App.tsx'),
74
+ path.join(cwd, 'src', 'App.ts'),
75
+ path.join(cwd, 'src', 'App.js'),
76
+ path.join(cwd, 'index.js'),
77
+ path.join(cwd, 'index.ts'),
78
+ ];
79
+
80
+ for (const p of possiblePaths) {
81
+ if (fs.existsSync(p)) return p;
82
+ }
83
+ return null;
84
+ }
85
+
86
+ // Inject import into main file
87
+ function injectImport(mainPath) {
88
+ let content = fs.readFileSync(mainPath, 'utf-8');
89
+
90
+ // Check if already imported
91
+ if (content.includes('healcode-client')) {
92
+ return { success: false, reason: 'already_imported' };
93
+ }
94
+
95
+ const importStatement = "import { initFromConfig } from 'healcode-client';\ninitFromConfig();\n";
96
+
97
+ // Add import at the top (after other imports if possible)
98
+ const lines = content.split('\n');
99
+ let lastImportIndex = -1;
100
+
101
+ for (let i = 0; i < lines.length; i++) {
102
+ if (lines[i].trim().startsWith('import ')) {
103
+ lastImportIndex = i;
104
+ }
105
+ }
106
+
107
+ if (lastImportIndex >= 0) {
108
+ lines.splice(lastImportIndex + 1, 0, '', importStatement);
109
+ } else {
110
+ lines.unshift(importStatement);
111
+ }
112
+
113
+ fs.writeFileSync(mainPath, lines.join('\n'));
114
+ return { success: true };
115
+ }
116
+
117
+ // Remove import from main file
118
+ function removeImport(mainPath) {
119
+ let content = fs.readFileSync(mainPath, 'utf-8');
120
+
121
+ // Remove healcode import and init
122
+ content = content.replace(/import\s*{\s*initFromConfig\s*}\s*from\s*['"]healcode-client['"];\s*/g, '');
123
+ content = content.replace(/initFromConfig\(\);\s*/g, '');
124
+ content = content.replace(/\n\n\n+/g, '\n\n'); // Clean up extra newlines
125
+
126
+ fs.writeFileSync(mainPath, content);
127
+ }
128
+
36
129
  program
37
130
  .command('init')
38
131
  .description('Initialize HealCode in your project')
@@ -59,8 +152,6 @@ program
59
152
  // Validate token with API
60
153
  console.log(chalk.yellow('\n⏳ Validating token...'));
61
154
 
62
- let remoteConfig = null;
63
-
64
155
  try {
65
156
  const response = await fetch(`${BACKEND_URL}/api/tokens/validate`, {
66
157
  method: 'POST',
@@ -79,97 +170,97 @@ program
79
170
  console.log(chalk.green('✅ Token validated successfully!'));
80
171
  console.log(chalk.gray(` Project: ${result.projectId}`));
81
172
 
82
- if (result.configuration) {
83
- remoteConfig = result.configuration;
84
- console.log(chalk.green('✅ Configuration loaded from Dashboard.'));
85
- }
86
-
87
173
  } catch (error) {
88
- console.log(chalk.yellow('\n⚠️ Could not validate token (API unreachable). Proceeding with manual setup...'));
89
- }
90
-
91
- let options = {};
92
-
93
- if (remoteConfig) {
94
- options = remoteConfig;
95
- } else {
96
- options = await inquirer.prompt([
97
- {
98
- type: 'confirm',
99
- name: 'captureConsoleErrors',
100
- message: 'Capture console.error calls?',
101
- default: true,
102
- },
103
- {
104
- type: 'confirm',
105
- name: 'captureUnhandledRejections',
106
- message: 'Capture unhandled promise rejections?',
107
- default: true,
108
- },
109
- ]);
174
+ console.log(chalk.red('\nCould not validate token. Check your internet connection.'));
175
+ process.exit(1);
110
176
  }
111
177
 
112
- // Create config file
178
+ // Create config
113
179
  const config = {
114
180
  token: token,
115
181
  endpoint: AGENT_URL,
116
182
  enabled: true,
117
183
  options: {
118
- captureConsoleErrors: options.captureConsoleErrors !== false,
119
- captureUnhandledRejections: options.captureUnhandledRejections !== false,
184
+ captureConsoleErrors: true,
185
+ captureUnhandledRejections: true,
120
186
  maxBreadcrumbs: 20,
121
187
  },
122
188
  };
123
189
 
124
- const configPath = path.join(process.cwd(), CONFIG_FILE_NAME);
190
+ // Save config to public folder
191
+ const publicFolder = findPublicFolder();
192
+ const configPath = path.join(publicFolder, CONFIG_FILE_NAME);
125
193
  fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
194
+ console.log(chalk.green(`\n✅ Config saved to ${path.relative(process.cwd(), configPath)}`));
195
+
196
+ // Inject import into main file
197
+ const mainPath = findMainFile();
198
+ if (mainPath) {
199
+ const result = injectImport(mainPath);
200
+ if (result.success) {
201
+ console.log(chalk.green(`✅ Import added to ${path.relative(process.cwd(), mainPath)}`));
202
+ } else if (result.reason === 'already_imported') {
203
+ console.log(chalk.gray(` Import already exists in ${path.relative(process.cwd(), mainPath)}`));
204
+ }
205
+ } else {
206
+ console.log(chalk.yellow('\n⚠️ Could not find main entry file.'));
207
+ console.log(chalk.gray(' Add this to your main file manually:'));
208
+ console.log(chalk.cyan(" import { initFromConfig } from 'healcode-client';"));
209
+ console.log(chalk.cyan(' initFromConfig();'));
210
+ }
126
211
 
127
- console.log(chalk.green(`\n✅ Config saved to ${CONFIG_FILE_NAME}`));
128
-
129
- // Show usage instructions
130
- console.log(chalk.cyan('\n📖 Usage:\n'));
131
- console.log(chalk.white(' // In your main entry file (e.g., main.ts, index.js)'));
132
- console.log(chalk.gray(" import { initFromConfig } from 'healcode-client';"));
133
- console.log(chalk.gray(' initFromConfig();\n'));
134
-
135
- console.log(chalk.white(' // Or with manual configuration:'));
136
- console.log(chalk.gray(" import { HealCode } from 'healcode-client';"));
137
- console.log(chalk.gray(` const healcode = new HealCode({ token: '${token.substring(0, 10)}...' });\n`));
138
-
139
- // Add to .gitignore
212
+ // Add config to .gitignore
140
213
  const gitignorePath = path.join(process.cwd(), '.gitignore');
141
214
  if (fs.existsSync(gitignorePath)) {
142
215
  const gitignore = fs.readFileSync(gitignorePath, 'utf-8');
143
216
  if (!gitignore.includes(CONFIG_FILE_NAME)) {
144
217
  fs.appendFileSync(gitignorePath, `\n# HealCode\n${CONFIG_FILE_NAME}\n`);
145
- console.log(chalk.gray(`Added ${CONFIG_FILE_NAME} to .gitignore`));
218
+ console.log(chalk.gray(` Added ${CONFIG_FILE_NAME} to .gitignore`));
146
219
  }
147
220
  }
148
221
 
149
- console.log(chalk.green.bold('\n🎉 HealCode is ready! Errors will be automatically tracked and fixed.\n'));
222
+ console.log(chalk.green.bold('\n🎉 HealCode installed successfully!\n'));
150
223
  });
151
224
 
152
225
  program
153
- .command('status')
154
- .description('Check HealCode configuration status')
226
+ .command('remove')
227
+ .description('Remove HealCode from your project')
155
228
  .action(() => {
156
- const configPath = path.join(process.cwd(), CONFIG_FILE_NAME);
229
+ // Remove config file
230
+ const publicFolder = findPublicFolder();
231
+ const configPath = path.join(publicFolder, CONFIG_FILE_NAME);
232
+
233
+ if (fs.existsSync(configPath)) {
234
+ fs.unlinkSync(configPath);
235
+ console.log(chalk.green(`\n✅ Removed ${path.relative(process.cwd(), configPath)}`));
236
+ }
157
237
 
158
- if (!fs.existsSync(configPath)) {
159
- console.log(chalk.yellow('\n⚠️ No HealCode configuration found.'));
160
- console.log(chalk.gray('Run `npx healcode init` to set up.\n'));
161
- return;
238
+ // Remove import from main file
239
+ const mainPath = findMainFile();
240
+ if (mainPath && fs.readFileSync(mainPath, 'utf-8').includes('healcode-client')) {
241
+ removeImport(mainPath);
242
+ console.log(chalk.green(`✅ Removed import from ${path.relative(process.cwd(), mainPath)}`));
162
243
  }
163
244
 
164
- try {
245
+ console.log(chalk.green('\n✅ HealCode removed successfully.\n'));
246
+ });
247
+
248
+ program
249
+ .command('status')
250
+ .description('Check HealCode installation status')
251
+ .action(() => {
252
+ const publicFolder = findPublicFolder();
253
+ const configPath = path.join(publicFolder, CONFIG_FILE_NAME);
254
+
255
+ if (fs.existsSync(configPath)) {
165
256
  const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
166
- console.log(chalk.green.bold('\n🩺 HealCode Status\n'));
167
- console.log(chalk.white(` Token: ${config.token.substring(0, 15)}...`));
168
- console.log(chalk.white(` Endpoint: ${config.endpoint || AGENT_URL}`));
169
- console.log(chalk.white(` Enabled: ${config.enabled !== false ? '✅' : '❌'}`));
170
- console.log('');
171
- } catch (error) {
172
- console.log(chalk.red('\n❌ Failed to read configuration file.\n'));
257
+ console.log(chalk.green.bold('\n🩺 HealCode Status: Installed ✅\n'));
258
+ console.log(chalk.white(` Token: ${config.token.substring(0, 15)}...`));
259
+ console.log(chalk.white(` Enabled: ${config.enabled !== false ? '✅' : '❌'}`));
260
+ console.log(chalk.gray(` Config: ${path.relative(process.cwd(), configPath)}\n`));
261
+ } else {
262
+ console.log(chalk.yellow('\n⚠️ HealCode is not installed.'));
263
+ console.log(chalk.gray(' Run `npx healcode init` to set up.\n'));
173
264
  }
174
265
  });
175
266
 
@@ -177,10 +268,11 @@ program
177
268
  .command('disable')
178
269
  .description('Disable HealCode error tracking')
179
270
  .action(() => {
180
- const configPath = path.join(process.cwd(), CONFIG_FILE_NAME);
181
-
271
+ const publicFolder = findPublicFolder();
272
+ const configPath = path.join(publicFolder, CONFIG_FILE_NAME);
273
+
182
274
  if (!fs.existsSync(configPath)) {
183
- console.log(chalk.yellow('\n⚠️ No HealCode configuration found.\n'));
275
+ console.log(chalk.yellow('\n⚠️ HealCode is not installed.\n'));
184
276
  return;
185
277
  }
186
278
 
@@ -194,11 +286,12 @@ program
194
286
  .command('enable')
195
287
  .description('Enable HealCode error tracking')
196
288
  .action(() => {
197
- const configPath = path.join(process.cwd(), CONFIG_FILE_NAME);
198
-
289
+ const publicFolder = findPublicFolder();
290
+ const configPath = path.join(publicFolder, CONFIG_FILE_NAME);
291
+
199
292
  if (!fs.existsSync(configPath)) {
200
- console.log(chalk.yellow('\n⚠️ No HealCode configuration found.'));
201
- console.log(chalk.gray('Run `npx healcode init` to set up.\n'));
293
+ console.log(chalk.yellow('\n⚠️ HealCode is not installed.'));
294
+ console.log(chalk.gray(' Run `npx healcode init` to set up.\n'));
202
295
  return;
203
296
  }
204
297
 
package/dist/index.d.mts CHANGED
@@ -55,7 +55,8 @@ declare class HealCode {
55
55
  isEnabled(): boolean;
56
56
  }
57
57
 
58
- declare function loadConfig(configPath?: string): HealCodeFileConfig | null;
59
- declare function initFromConfig(configPath?: string): HealCode | null;
58
+ declare function loadConfigAsync(): Promise<HealCodeFileConfig | null>;
59
+ declare function initFromConfigAsync(): Promise<HealCode | null>;
60
+ declare function initFromConfig(): void;
60
61
 
61
- export { HealCode, type HealCodeConfig, type HealCodeFileConfig, initFromConfig, loadConfig };
62
+ export { HealCode, type HealCodeConfig, type HealCodeFileConfig, initFromConfig, initFromConfigAsync, loadConfigAsync };
package/dist/index.d.ts CHANGED
@@ -55,7 +55,8 @@ declare class HealCode {
55
55
  isEnabled(): boolean;
56
56
  }
57
57
 
58
- declare function loadConfig(configPath?: string): HealCodeFileConfig | null;
59
- declare function initFromConfig(configPath?: string): HealCode | null;
58
+ declare function loadConfigAsync(): Promise<HealCodeFileConfig | null>;
59
+ declare function initFromConfigAsync(): Promise<HealCode | null>;
60
+ declare function initFromConfig(): void;
60
61
 
61
- export { HealCode, type HealCodeConfig, type HealCodeFileConfig, initFromConfig, loadConfig };
62
+ export { HealCode, type HealCodeConfig, type HealCodeFileConfig, initFromConfig, initFromConfigAsync, loadConfigAsync };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';const a0_0x177ba2=a0_0x2c2d;(function(_0x1baf4b,_0xe6882b){const _0xcb8c71=a0_0x2c2d,_0x546d19=_0x1baf4b();while(!![]){try{const _0x4f38d9=parseInt(_0xcb8c71(0x21d))/0x1+parseInt(_0xcb8c71(0x199))/0x2*(parseInt(_0xcb8c71(0x208))/0x3)+parseInt(_0xcb8c71(0x1e6))/0x4*(parseInt(_0xcb8c71(0x21c))/0x5)+-parseInt(_0xcb8c71(0x1ad))/0x6+parseInt(_0xcb8c71(0x1df))/0x7*(-parseInt(_0xcb8c71(0x1b8))/0x8)+-parseInt(_0xcb8c71(0x216))/0x9*(parseInt(_0xcb8c71(0x19e))/0xa)+parseInt(_0xcb8c71(0x1bd))/0xb;if(_0x4f38d9===_0xe6882b)break;else _0x546d19['push'](_0x546d19['shift']());}catch(_0x69989c){_0x546d19['push'](_0x546d19['shift']());}}}(a0_0x12c5,0x37cfc));var C=Object[a0_0x177ba2(0x20b)],l=Object[a0_0x177ba2(0x1f5)],m=Object[a0_0x177ba2(0x20f)],b=Object[a0_0x177ba2(0x1cc)],w=Object[a0_0x177ba2(0x1b3)],H=Object[a0_0x177ba2(0x1ea)][a0_0x177ba2(0x1fb)],v=(_0x5db003,_0x4e2299)=>{const _0x3d0fa0={'RVoAk':function(_0x1b0def,_0x37c99e,_0x56ae87,_0x1d0951){return _0x1b0def(_0x37c99e,_0x56ae87,_0x1d0951);}};for(var _0x55ed3c in _0x4e2299)_0x3d0fa0['RVoAk'](l,_0x5db003,_0x55ed3c,{'get':_0x4e2299[_0x55ed3c],'enumerable':!0x0});},u=(_0x30fc2e,_0x518409,_0x1f87d0,_0x5a3553)=>{const _0x13d66c=a0_0x177ba2,_0x5ed660={'UsJgt':_0x13d66c(0x1b0),'JzXiR':function(_0x185855,_0x37655e){return _0x185855==_0x37655e;},'DGdfX':'function','mTwoG':function(_0x3bb30e,_0x17bd6e){return _0x3bb30e(_0x17bd6e);},'HQnMe':function(_0x26eb9a,_0xf87dbe){return _0x26eb9a!==_0xf87dbe;},'OWHVT':function(_0x5b07dc,_0x8d7301,_0x3e4d80,_0x4e2629){return _0x5b07dc(_0x8d7301,_0x3e4d80,_0x4e2629);},'wSrCH':function(_0x475de5,_0x4237c2,_0x53f611){return _0x475de5(_0x4237c2,_0x53f611);}};if(_0x518409&&typeof _0x518409==_0x5ed660[_0x13d66c(0x1cb)]||_0x5ed660[_0x13d66c(0x1de)](typeof _0x518409,_0x5ed660[_0x13d66c(0x1c5)])){for(let _0x2e4bdd of _0x5ed660['mTwoG'](b,_0x518409))!H[_0x13d66c(0x203)](_0x30fc2e,_0x2e4bdd)&&_0x5ed660['HQnMe'](_0x2e4bdd,_0x1f87d0)&&_0x5ed660[_0x13d66c(0x194)](l,_0x30fc2e,_0x2e4bdd,{'get':()=>_0x518409[_0x2e4bdd],'enumerable':!(_0x5a3553=_0x5ed660[_0x13d66c(0x1ac)](m,_0x518409,_0x2e4bdd))||_0x5a3553[_0x13d66c(0x1c6)]});}return _0x30fc2e;},f=(_0x3fefe2,_0x3f41b9,_0x5c1691)=>(_0x5c1691=_0x3fefe2!=null?C(w(_0x3fefe2)):{},u(_0x3f41b9||!_0x3fefe2||!_0x3fefe2[a0_0x177ba2(0x20a)]?l(_0x5c1691,'default',{'value':_0x3fefe2,'enumerable':!0x0}):_0x5c1691,_0x3fefe2)),y=_0x5c9222=>u(l({},a0_0x177ba2(0x20a),{'value':!0x0}),_0x5c9222),N={};function a0_0x12c5(){const _0x25a6a4=['yw5LtgS','B25LCNjVCG','u3jzwMu','zNLcCKu','Aw1mwu4','Dg9tDhjPBMC','Aw5PDa','CvbZwKq','Aw5PDgLHBgL6zwq','Aw50zxjJzxb0q29UC29Szq','y2fWDhvYzunVBNnVBgvfCNjVCNm','AgfZ','sNPyAvi','mtr3vuTvzxO','w0HLywXdB2rLxsbozxr3B3jRigvYCM9YoG','DxrMltG','DNvRq3e','igf0ia','rNPPyLe','Aw5UzxjuzxH0','ndm2wM5RvNbe','w0HLywXdB2rLxsbgywLSzwqGDg8GBg9HzcbJB25MAwC6','B3b0Aw9UCW','B3vTCMu','ChjVDg90ExbL','yKPdr1e','C2v0rw5HyMXLza','CeHlAMi','zw5HyMXLza','CeLoD3y','w0HLywXdB2rLxsbgywLSzwqGDg8GCMvWB3j0igvYCM9YoG','sfnTs1C','Dg9Rzw4','CgfYC2u','Bwf4qNjLywrJCNvTyNm','zgvMAw5LuhjVCgvYDhK','B25mAw5L','vwzpwLC','ywrKqNjLywrJCNvTyG','z2vUzxjHDgviyxnO','zgvSzxrL','AgfZt3DUuhjVCgvYDhK','zxHPC3rZu3LUyW','q2XPy2TLzcbVBIa','l2fWAs9SB2DZlW','Aw50zxjJzxb0vw5Oyw5KBgvKuMvQzwn0Aw9UCW','y2fWDhvYzvvUAgfUzgXLzfjLAMvJDgLVBNm','sLfxC1q','ChvZAa','y2fSBa','Cgf0Aa','B25SAw5L','CMvyzwy','ywrKrxzLBNrmAxn0zw5LCG','mJDpEhDpCum','B251BMHHBMrSzwrYzwPLy3rPB24','x19LC01VzhvSzq','y3jLyxrL','y2fWDhvYzq','vw5RBM93BIbLCNjVCG','Aw50zxjJzxb0v2LUzg93rxjYB3jZ','z2v0t3DUuhjVCgvYDhLezxnJCMLWDg9Y','w0HLywXdB2rLxsbfCNjVCIbYzxbVCNrLzcbZDwnJzxnZzNvSBhK','yxbWBgLJyxrPB24VANnVBG','y29UzMLN','AxnfBMfIBgvK','BMv0D29YAW','y2XHC3noyw1L','nZiWuLvnv3bg','l2fWAs9SB2DZ','yw5dBe4','C2v0DxbjBNrLCMfJDgLVBKXPC3rLBMvYCW','C2v0Dxbozxr3B3jRtgLZDgvUzxjZ','AgvHBgnVzguUy29UzMLNlMPZB24','nJiYmgjzt2zbua','ntG5ntfgs2zXzhG','yNjLywrJCNvTyNm','w0HLywXdB2rLxsbjBML0AwfSAxPLzcbZDwnJzxnZzNvSBhK','AhjLzG','t1DivLq','C3rYAw5NAwz5','DgfNtMfTzq','zw5KC1DPDgG','C3rHy2S','ndC2mNndrLvNrG','weHwy0y','B2zMBgLUzq','r1DozfC','uNHwDgS','ntmWnJbkD0Lxr1e','C2vUDeHHC2HLCW','v2fOEKi','DwKUy2XPy2S','CMvHC29U','BLndt24','EMnAwe8','BwfW','C3jkwu0','y2HHCKnVzgvbDa','yxbWBhK','DgfYz2v0','BgvUz3rO','zxjYB3i','D1nYq0G','mti2mZeWmNnZB05Qsa','C3rYAw5N','yMX0uxK','B2jQzwn0','DejJwuK','Bg9JyxrPB24','z2v0uhjVDg90ExbLt2y','AM9PBG','qNvJrxa','rfPgzMm','uLL4rvG','mtq1otu0nenbDfnoqW','vxLSCNK','yMvMB3jLu2vUza','yNHsvvi','zxHWB3j0CW','mteXmZC2mJfKC0HxAvu','vw5Oyw5KBgvKifjLAMvJDgLVBJOG','tMndtNC','ywrK','suP4Cgi','zgLYBMfTzq','BLPOquy','zw5KCg9PBNq','reDKzLG','zw51BwvYywjSzq','C3vIC3rYAw5N','Bg9N','y3DK','D2fYBG','vxnkz3q','z2v0t3DUuhjVCgvYDhLoyw1LCW','C2HPzNq','q29UBMvJDgLVBIbSB3n0','CMvWBgfJzq','vvfcCM4','ugjwvM0'];a0_0x12c5=function(){return _0x25a6a4;};return a0_0x12c5();}v(N,{'HealCode':()=>s,'initFromConfig':()=>h,'loadConfig':()=>p}),module[a0_0x177ba2(0x1bc)]=y(N);var g='https://prepaid-tribal-invited-eng.trycloudflare.com',E=g+a0_0x177ba2(0x1fe),x=0x14,s=class{constructor(_0x3d3ae3){const _0x285598=a0_0x177ba2,_0x2a98e5={'vukCq':function(_0x51effd,_0x3b9aba){return _0x51effd!==_0x3b9aba;},'Uylry':function(_0x3833a9,_0x4db9a5){return _0x3833a9<_0x4db9a5;}};this['breadcrumbs']=[],this[_0x285598(0x19f)]=new Set(),this['initialized']=!0x1,(this[_0x285598(0x212)]={'token':_0x3d3ae3[_0x285598(0x1f2)],'endpoint':_0x3d3ae3['endpoint']||E,'enabled':_0x2a98e5[_0x285598(0x1e2)](_0x3d3ae3[_0x285598(0x1ee)],!0x1),'captureConsoleErrors':_0x2a98e5[_0x285598(0x1e2)](_0x3d3ae3['captureConsoleErrors'],!0x1),'captureUnhandledRejections':_0x2a98e5[_0x285598(0x1e2)](_0x3d3ae3[_0x285598(0x200)],!0x1),'maxBreadcrumbs':_0x3d3ae3['maxBreadcrumbs']||x,'beforeSend':_0x3d3ae3[_0x285598(0x1ba)]},this[_0x285598(0x212)][_0x285598(0x1ee)]&&_0x2a98e5[_0x285598(0x1b9)](typeof window,'u')&&this[_0x285598(0x1d8)]());}[a0_0x177ba2(0x1d8)](){const _0x13cc79=a0_0x177ba2;this[_0x13cc79(0x1da)]||(this[_0x13cc79(0x1da)]=!0x0,this[_0x13cc79(0x21a)](),this['setupInteractionListeners'](),this[_0x13cc79(0x212)][_0x13cc79(0x1dc)]&&this[_0x13cc79(0x1db)](),this[_0x13cc79(0x20e)](),this['config'][_0x13cc79(0x200)]&&this[_0x13cc79(0x1ff)](),console['log']('[HealCode]\x20Initialized\x20successfully'));}['setupNetworkListeners'](){const _0x5648df=a0_0x177ba2,_0x3ce60f={'nSCOn':_0x5648df(0x205),'ilqmD':_0x5648df(0x19b)};window['addEventListener'](_0x3ce60f[_0x5648df(0x1a3)],()=>this[_0x5648df(0x1f8)](_0x5648df(0x214),'Connection\x20restored',{'status':_0x5648df(0x205)})),window['addEventListener'](_0x3ce60f['ilqmD'],()=>this[_0x5648df(0x1f8)](_0x5648df(0x214),_0x5648df(0x1ce),{'status':'offline'}));}[a0_0x177ba2(0x219)](){const _0x592e26=a0_0x177ba2,_0x1455b1={'imLYN':_0x592e26(0x1a1),'bxRUR':'click'};document[_0x592e26(0x207)](_0x1455b1[_0x592e26(0x1bb)],_0x6eb9e9=>{const _0x2ab01d=_0x592e26;let _0x54c784=_0x6eb9e9[_0x2ab01d(0x1a9)];this[_0x2ab01d(0x1f8)](_0x1455b1[_0x2ab01d(0x1d6)],_0x2ab01d(0x1fd)+_0x54c784[_0x2ab01d(0x196)],{'id':_0x54c784['id']||void 0x0,'className':_0x54c784[_0x2ab01d(0x215)]||void 0x0,'text':_0x54c784[_0x2ab01d(0x1e5)]?.[_0x2ab01d(0x1c7)](0x0,0x32)||void 0x0});},!0x0);}[a0_0x177ba2(0x1db)](){const _0x4eed37=a0_0x177ba2,_0x27f570={'wVChY':_0x4eed37(0x1ab)};let _0x232325=console[_0x4eed37(0x1ab)];console['error']=(..._0x438e08)=>{const _0x507648=_0x4eed37;let _0x3e2772=_0x438e08[_0x507648(0x1a5)](_0xf058a2=>typeof _0xf058a2==_0x507648(0x1b0)?JSON['stringify'](_0xf058a2):String(_0xf058a2))[_0x507648(0x1b4)]('\x20');this['capture'](_0x27f570['wVChY'],_0x3e2772),_0x232325[_0x507648(0x1a8)](console,_0x438e08);};}[a0_0x177ba2(0x20e)](){const _0xa2a57a=a0_0x177ba2,_0x5123cc={'IJxpb':function(_0x4c7b96,_0x108fac){return _0x4c7b96+_0x108fac;},'gQqdf':function(_0x5e4a15,_0x1fa734){return _0x5e4a15-_0x1fa734;},'sEBNS':function(_0x4a0f86,_0x514f6d){return _0x4a0f86<<_0x514f6d;},'SrYZe':function(_0x49b462,_0xf85f84){return _0x49b462&_0xf85f84;},'BucEp':function(_0x5a95aa,_0xb936be){return _0x5a95aa===_0xb936be;},'RxVtk':'aBkOG','qPsZD':_0xa2a57a(0x1ae),'ACXRC':_0xa2a57a(0x20d),'bJCGQ':'error'};window[_0xa2a57a(0x1d3)]=(_0x4aad33,_0x2c236c,_0x495900,_0x3121fe,_0x4b2922)=>{const _0x52f2d0=_0xa2a57a;if(_0x5123cc[_0x52f2d0(0x1b5)](_0x52f2d0(0x1e4),_0x5123cc[_0x52f2d0(0x19d)])){let _0x3efeff=_0x28135c[_0x52f2d0(0x1a7)](_0x37ace6);_0x2ac226=_0x5123cc[_0x52f2d0(0x1c1)](_0x5123cc['gQqdf'](_0x5123cc['sEBNS'](_0x5368bb,0x5),_0x4776e9),_0x3efeff),_0x12251b=_0x5123cc[_0x52f2d0(0x1d4)](_0x598cdd,_0x2ee32a);}else{let _0x2bd82e=typeof _0x4aad33==_0x5123cc[_0x52f2d0(0x1d9)]?_0x4aad33:_0x5123cc['ACXRC'];this[_0x52f2d0(0x20c)](_0x5123cc[_0x52f2d0(0x1eb)],_0x2bd82e+_0x52f2d0(0x1e3)+_0x2c236c+':'+_0x495900+':'+_0x3121fe,_0x4b2922?.[_0x52f2d0(0x198)]);}};}[a0_0x177ba2(0x1ff)](){const _0x2d6a6a=a0_0x177ba2,_0x65374c={'PbVVm':_0x2d6a6a(0x21f),'UlVmS':function(_0xb96e19,_0x4dea55){return _0xb96e19===_0x4dea55;},'bNZOB':_0x2d6a6a(0x1bf),'reXef':'error'};window['onunhandledrejection']=_0x2d4f1f=>{const _0x361105=_0x2d6a6a,_0x4ac978={'fyBrE':_0x65374c[_0x361105(0x1d1)]};_0x65374c['UlVmS'](_0x361105(0x1bf),_0x65374c['bNZOB'])?this[_0x361105(0x20c)](_0x65374c[_0x361105(0x206)],'Unhandled\x20Rejection:\x20'+_0x2d4f1f[_0x361105(0x1a2)]):this['initialized']||(this['initialized']=!0x0,this[_0x361105(0x21a)](),this[_0x361105(0x219)](),this[_0x361105(0x212)]['captureConsoleErrors']&&this['interceptConsole'](),this[_0x361105(0x20e)](),this[_0x361105(0x212)][_0x361105(0x200)]&&this[_0x361105(0x1ff)](),_0x4f6eb1[_0x361105(0x1c8)](_0x4ac978[_0x361105(0x1d5)]));};}[a0_0x177ba2(0x1f8)](_0x449b77,_0x1db2b0,_0x17d15f){const _0x225611=a0_0x177ba2,_0x1fb1ee={'GWNdW':function(_0x39dbb1,_0x5552a6){return _0x39dbb1>_0x5552a6;}};let _0x46c6a5={'type':_0x449b77,'message':_0x1db2b0,'timestamp':new Date()['toISOString'](),'data':_0x17d15f};this[_0x225611(0x21e)][_0x225611(0x202)](_0x46c6a5),_0x1fb1ee[_0x225611(0x19c)](this['breadcrumbs']['length'],this[_0x225611(0x212)]['maxBreadcrumbs'])&&this[_0x225611(0x21e)][_0x225611(0x1cd)]();}['capture'](_0x4b818f,_0x10ab21,_0x457be3){const _0x2b2b91=a0_0x177ba2,_0x49a728={'JQWsT':_0x2b2b91(0x205),'bLMef':_0x2b2b91(0x19b)};if(!this[_0x2b2b91(0x212)][_0x2b2b91(0x1ee)])return;let _0x1441aa=this[_0x2b2b91(0x1f9)](_0x10ab21,_0x457be3);if(this['sentHashes'][_0x2b2b91(0x1dd)](_0x1441aa))return;this[_0x2b2b91(0x19f)][_0x2b2b91(0x1c0)](_0x1441aa),setTimeout(()=>this[_0x2b2b91(0x19f)][_0x2b2b91(0x1fa)](_0x1441aa),0x12c*0x3e8);let _0x30ea62={'token':this[_0x2b2b91(0x212)][_0x2b2b91(0x1f2)],'message':_0x10ab21,'stacktrace':_0x457be3,'url':window[_0x2b2b91(0x1b2)][_0x2b2b91(0x193)],'level':_0x4b818f,'userAgent':navigator['userAgent'],'networkStatus':navigator[_0x2b2b91(0x1f6)]?_0x49a728[_0x2b2b91(0x201)]:_0x49a728['bLMef'],'breadcrumbs':[...this[_0x2b2b91(0x21e)]],'timestamp':new Date()['toISOString']()};this[_0x2b2b91(0x212)][_0x2b2b91(0x1ba)]&&(_0x30ea62=this[_0x2b2b91(0x212)]['beforeSend'](_0x30ea62),!_0x30ea62)||this['send'](_0x30ea62);}['generateHash'](_0x4e9a4d,_0x231b25){const _0x571ebf=a0_0x177ba2,_0x1eb845={'RYxEX':function(_0x3afdaf,_0x10e207){return _0x3afdaf+_0x10e207;},'srJYM':function(_0x2079fa,_0x2cefb8){return _0x2079fa<_0x2cefb8;},'xzSkv':function(_0x1c61c2,_0x3ef6aa){return _0x1c61c2+_0x3ef6aa;},'oumre':function(_0x3c8729,_0x2d0157){return _0x3c8729<<_0x2d0157;},'pINwv':function(_0x408aad,_0x41ad0b){return _0x408aad&_0x41ad0b;}};let _0x3ac5d5=_0x1eb845[_0x571ebf(0x1b7)](_0x4e9a4d,_0x231b25||''),_0x57c94d=0x0;for(let _0x5a0f08=0x0;_0x1eb845[_0x571ebf(0x1a6)](_0x5a0f08,_0x3ac5d5[_0x571ebf(0x1aa)]);_0x5a0f08++){let _0xd47d80=_0x3ac5d5[_0x571ebf(0x1a7)](_0x5a0f08);_0x57c94d=_0x1eb845['xzSkv'](_0x1eb845[_0x571ebf(0x1e9)](_0x57c94d,0x5)-_0x57c94d,_0xd47d80),_0x57c94d=_0x1eb845[_0x571ebf(0x1ef)](_0x57c94d,_0x57c94d);}return _0x57c94d[_0x571ebf(0x1d7)]();}async['send'](_0x43c177){const _0x32b6be=a0_0x177ba2,_0x25be73={'uruud':_0x32b6be(0x217),'bltQy':function(_0x3c4e49,_0x233dd9){return _0x3c4e49+_0x233dd9;},'XHVcF':_0x32b6be(0x211),'KpCPb':_0x32b6be(0x210),'anClN':_0x32b6be(0x1f0),'zXhFO':_0x32b6be(0x1e0)};try{let _0x427107=this['config'][_0x32b6be(0x1c4)];!_0x427107[_0x32b6be(0x197)]('/api/logs/')&&!_0x427107['endsWith'](_0x25be73['uruud'])&&(_0x427107=_0x25be73[_0x32b6be(0x1af)](_0x427107[_0x32b6be(0x1cf)](/\/$/,''),'/api/logs/'));let _0x17a8f4=await fetch(_0x427107,{'method':'POST','headers':{'Content-Type':_0x25be73[_0x32b6be(0x19a)],'X-HealCode-Token':this[_0x32b6be(0x212)][_0x32b6be(0x1f2)]},'body':JSON[_0x32b6be(0x195)](_0x43c177),'keepalive':!0x0});_0x17a8f4['ok']?console[_0x32b6be(0x1c8)](_0x25be73['KpCPb']):console[_0x32b6be(0x1ca)](_0x25be73[_0x32b6be(0x218)],_0x17a8f4['status']);}catch(_0x59e5c2){console[_0x32b6be(0x1ca)](_0x25be73['zXhFO'],_0x59e5c2);}}[a0_0x177ba2(0x1ec)](_0x18380e){const _0x312e3c=a0_0x177ba2;this[_0x312e3c(0x212)][_0x312e3c(0x1ee)]=_0x18380e;}[a0_0x177ba2(0x213)](){const _0x49683d=a0_0x177ba2;return this[_0x49683d(0x212)][_0x49683d(0x1ee)];}},a=f(require('fs')),d=f(require(a0_0x177ba2(0x204))),k=a0_0x177ba2(0x21b);function S(_0x5a8aa4=process[a0_0x177ba2(0x1c9)]()){const _0x11f606=a0_0x177ba2,_0x2c4b23={'nZhAF':function(_0x2726cf,_0x9d4b63,_0x43ec0d,_0x2770ca){return _0x2726cf(_0x9d4b63,_0x43ec0d,_0x2770ca);},'tBcYI':function(_0x579237,_0x599a35){return _0x579237!==_0x599a35;},'HSmKW':function(_0x53a406,_0x3cc091){return _0x53a406===_0x3cc091;},'pHKjb':_0x11f606(0x1f7),'WahzB':'FdCJf'};let _0x24a45c=_0x5a8aa4;for(;_0x2c4b23[_0x11f606(0x1b1)](_0x24a45c,d[_0x11f606(0x1c2)](_0x24a45c));){if(_0x2c4b23[_0x11f606(0x1f1)](_0x2c4b23[_0x11f606(0x1ed)],_0x2c4b23[_0x11f606(0x1a0)])){for(var _0xbf02f in _0xb94b62)_0x2c4b23[_0x11f606(0x1c3)](_0x2b6edf,_0x3963b6,_0xbf02f,{'get':_0x408926[_0xbf02f],'enumerable':!0x0});}else{let _0x1ea7cb=d[_0x11f606(0x1b4)](_0x24a45c,k);if(a[_0x11f606(0x1fc)](_0x1ea7cb))return _0x1ea7cb;_0x24a45c=d[_0x11f606(0x1c2)](_0x24a45c);}}return null;}function p(_0x22b4a5){const _0x4c06ec=a0_0x177ba2,_0x1fa245={'vIBia':function(_0x1db609,_0x78dd9){return _0x1db609!==_0x78dd9;},'UQBrn':_0x4c06ec(0x1b6),'zcZXO':_0x4c06ec(0x1e7)};let _0x4162e1=_0x22b4a5||S();if(!_0x4162e1||!a[_0x4c06ec(0x1fc)](_0x4162e1))return null;try{let _0x439e32=a['readFileSync'](_0x4162e1,_0x4c06ec(0x1e1));return JSON[_0x4c06ec(0x1f3)](_0x439e32);}catch(_0x335f7b){if(_0x1fa245['vIBia'](_0x1fa245['UQBrn'],_0x1fa245[_0x4c06ec(0x1d0)]))_0x116b82[_0x4c06ec(0x209)]=_0x48f346=>{const _0x40e099=_0x4c06ec;this[_0x40e099(0x20c)](_0x40e099(0x1ab),_0x40e099(0x1be)+_0x48f346[_0x40e099(0x1a2)]);};else return console[_0x4c06ec(0x1ab)](_0x1fa245[_0x4c06ec(0x1a4)],_0x335f7b),null;}}function a0_0x2c2d(_0x5126fc,_0x430c0f){_0x5126fc=_0x5126fc-0x193;const _0x12c516=a0_0x12c5();let _0x2c2d0c=_0x12c516[_0x5126fc];if(a0_0x2c2d['GAFiZZ']===undefined){var _0x1f62c0=function(_0x19eee2){const _0x40833c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x63f6='',_0x5318f1='';for(let _0x5c5d33=0x0,_0x5a299f,_0xb94b62,_0x2b6edf=0x0;_0xb94b62=_0x19eee2['charAt'](_0x2b6edf++);~_0xb94b62&&(_0x5a299f=_0x5c5d33%0x4?_0x5a299f*0x40+_0xb94b62:_0xb94b62,_0x5c5d33++%0x4)?_0x63f6+=String['fromCharCode'](0xff&_0x5a299f>>(-0x2*_0x5c5d33&0x6)):0x0){_0xb94b62=_0x40833c['indexOf'](_0xb94b62);}for(let _0x3963b6=0x0,_0x408926=_0x63f6['length'];_0x3963b6<_0x408926;_0x3963b6++){_0x5318f1+='%'+('00'+_0x63f6['charCodeAt'](_0x3963b6)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5318f1);};a0_0x2c2d['piGWhv']=_0x1f62c0,a0_0x2c2d['qglDHn']={},a0_0x2c2d['GAFiZZ']=!![];}const _0x130a3d=_0x12c516[0x0],_0x2614eb=_0x5126fc+_0x130a3d,_0x4e3ec9=a0_0x2c2d['qglDHn'][_0x2614eb];return!_0x4e3ec9?(_0x2c2d0c=a0_0x2c2d['piGWhv'](_0x2c2d0c),a0_0x2c2d['qglDHn'][_0x2614eb]=_0x2c2d0c):_0x2c2d0c=_0x4e3ec9,_0x2c2d0c;}function h(_0x4a4b6a){const _0x504bc0=a0_0x177ba2,_0x2458d8={'aneLk':'[HealCode]\x20No\x20config\x20file\x20found.\x20Run\x20`npx\x20healcode\x20init`\x20to\x20set\x20up.'};let _0x1f5278=p(_0x4a4b6a);if(!_0x1f5278)return console[_0x504bc0(0x1ca)](_0x2458d8[_0x504bc0(0x1d2)]),null;let _0x835189={'token':_0x1f5278[_0x504bc0(0x1f2)],'endpoint':_0x1f5278[_0x504bc0(0x1c4)],'enabled':_0x1f5278['enabled'],'captureConsoleErrors':_0x1f5278[_0x504bc0(0x1e8)]?.['captureConsoleErrors'],'captureUnhandledRejections':_0x1f5278[_0x504bc0(0x1e8)]?.['captureUnhandledRejections'],'maxBreadcrumbs':_0x1f5278[_0x504bc0(0x1e8)]?.[_0x504bc0(0x1f4)]};return new s(_0x835189);}0x0&&(module[a0_0x177ba2(0x1bc)]={'HealCode':HealCode,'initFromConfig':initFromConfig,'loadConfig':loadConfig});
1
+ 'use strict';const a0_0x32ae5a=a0_0x4509;(function(_0x4ad1dd,_0x3a4c54){const _0x4db6ab=a0_0x4509,_0x5e0e37=_0x4ad1dd();while(!![]){try{const _0xcf97=parseInt(_0x4db6ab(0x17b))/0x1+-parseInt(_0x4db6ab(0x192))/0x2*(-parseInt(_0x4db6ab(0x17c))/0x3)+-parseInt(_0x4db6ab(0x136))/0x4+parseInt(_0x4db6ab(0x172))/0x5*(parseInt(_0x4db6ab(0x17f))/0x6)+parseInt(_0x4db6ab(0x132))/0x7+-parseInt(_0x4db6ab(0x13d))/0x8+parseInt(_0x4db6ab(0x18d))/0x9;if(_0xcf97===_0x3a4c54)break;else _0x5e0e37['push'](_0x5e0e37['shift']());}catch(_0x2e0d09){_0x5e0e37['push'](_0x5e0e37['shift']());}}}(a0_0x2c9e,0x3f015));var l=Object[a0_0x32ae5a(0x162)],h=Object[a0_0x32ae5a(0x193)],g=Object[a0_0x32ae5a(0x14c)],C=Object[a0_0x32ae5a(0x15d)][a0_0x32ae5a(0x146)],m=(_0x84db43,_0x29e9bb)=>{const _0x1ad7c6=a0_0x32ae5a,_0x5b6e54={'bRvGC':function(_0x420250,_0x258503,_0x3a45f0,_0x2678ea){return _0x420250(_0x258503,_0x3a45f0,_0x2678ea);}};for(var _0xc5b999 in _0x29e9bb)_0x5b6e54[_0x1ad7c6(0x153)](l,_0x84db43,_0xc5b999,{'get':_0x29e9bb[_0xc5b999],'enumerable':!0x0});},b=(_0x13e69a,_0x1338d0,_0x5e6d41,_0x2286c7)=>{const _0x1732f2=a0_0x32ae5a,_0x49607d={'QnbRf':function(_0x3bd3c7,_0x8c237a){return _0x3bd3c7==_0x8c237a;},'BKeIB':_0x1732f2(0x14b),'geLBc':'function','QglaK':function(_0x5f58b3,_0x35aa22){return _0x5f58b3(_0x35aa22);},'onXXR':function(_0x4be3fd,_0x591011){return _0x4be3fd!==_0x591011;},'lJpGT':function(_0x12efd9,_0x442361,_0x315047,_0x2cec75){return _0x12efd9(_0x442361,_0x315047,_0x2cec75);}};if(_0x1338d0&&_0x49607d[_0x1732f2(0x19d)](typeof _0x1338d0,_0x49607d[_0x1732f2(0x15c)])||typeof _0x1338d0==_0x49607d[_0x1732f2(0x176)]){for(let _0x1b168b of _0x49607d['QglaK'](g,_0x1338d0))!C[_0x1732f2(0x152)](_0x13e69a,_0x1b168b)&&_0x49607d[_0x1732f2(0x12b)](_0x1b168b,_0x5e6d41)&&_0x49607d[_0x1732f2(0x186)](l,_0x13e69a,_0x1b168b,{'get':()=>_0x1338d0[_0x1b168b],'enumerable':!(_0x2286c7=h(_0x1338d0,_0x1b168b))||_0x2286c7[_0x1732f2(0x147)]});}return _0x13e69a;},w=_0x1d361a=>b(l({},a0_0x32ae5a(0x157),{'value':!0x0}),_0x1d361a),v={};function a0_0x2c9e(){const _0x58d488=['C3rYAw5NAwz5','BePWr1q','Bg9N','zgvSzxrL','tKfuu2i','y2fWDhvYzunVBNnVBgvfCNjVCNm','tu5hA0e','r3LKsM0','mtqXmtq2mxPMzwfzqW','ywrKrxzLBNrmAxn0zw5LCG','B2zMBgLUzq','yMDHuxG','zw5HyMXLza','ntm1mde0yK1hA053','z2v0t3DUuhjVCgvYDhLezxnJCMLWDg9Y','y29UzMLN','C3rHy2S','C2v0rw5HyMXLza','Bwf4qNjLywrJCNvTyNm','C2v0DxbjBNrLCMfJDgLVBKXPC3rLBMvYCW','Aw50zxjJzxb0v2LUzg93rxjYB3jZ','qu50rhq','y2XPy2S','Aw50zxjJzxb0q29UC29Szq','uw5IuMy','Aw5PDgLHBgL6zwq','tMLYyKy','q29UBMvJDgLVBIbYzxn0B3jLza','zxjYB3i','l2fWAs9SB2DZlW','zxHWB3j0CW','DgfYz2v0','y2fWDhvYzvvUAgfUzgXLzfjLAMvJDgLVBNm','B25ywfi','BNjTBKu','q2XPy2TLzcbVBIa','y2fWDhvYzq','vw5RBM93BIbLCNjVCG','B25SAw5L','yNjLywrJCNvTyNm','mJi0mJGWmgj4DKvlza','ywrKqNjLywrJCNvTyG','ChvZAa','w0HLywXdB2rLxsbgywLSzwqGDg8GCMvWB3j0igvYCM9YoG','mtq5mJm5mNjiCvburG','Dg9ju09tDhjPBMC','vw5Oyw5KBgvKifjLAMvJDgLVBJOG','B251BMHHBMrSzwrYzwPLy3rPB24','ywrK','DgHLBG','C3rYAw5N','mJK4nZeZnLj3vw92AG','tKvAC3K','B3b0Aw9UCW','x19OzwfSy29Kzv9F','vKXdCKO','yw9lt3e','AM1iqMy','DwKUy2XPy2S','CMvWBgfJzq','AgfZt3DUuhjVCgvYDhK','zw51BwvYywjSzq','C3H5rhe','igf0ia','sMjuEgu','B2jQzwn0','z2v0t3DUuhjVCgvYDhLoyw1LCW','DgLiAfC','C2v0Dxbozxr3B3jRtgLZDgvUzxjZ','yxbWBhK','BhnNqMq','C2vUza','y2fSBa','yLj2r0m','BwfW','AgfZ','Ahr0Chm6lY9WCMvWywLKlxrYAwjHBc1PBNzPDgvKlwvUzY50CNLJBg91zgzSyxjLlMnVBq','x19LC01VzhvSzq','y2XHC3noyw1L','C2HPzNq','Dg9Rzw4','w0HLywXdB2rLxsbozxr3B3jRigvYCM9YoG','qKTLsui','ChjVDg90ExbL','uLnuBM8','w0HLywXdB2rLxsbgywLSzwqGDg8GAw5PDgLHBgL6zq','l2fWAs9SB2DZ','AhjLzG','zgvMAw5LuhjVCgvYDhK','ue9tva','q29UBMvJDgLVBIbSB3n0','z2vUzxjHDgviyxnO','EufPDfy','vhvrvwi','Aw5PDa','zw5KCg9PBNq','sNPszLi','q1Lbr3y','DxnLCKfNzw50','Dg9tDhjPBMC','Aw50zxjJzxb0vw5Oyw5KBgvKuMvQzwn0Aw9UCW','DffABMG','w0HLywXdB2rLxsbjBML0AwfSAxPLzcbZDwnJzxnZzNvSBhK','EwPVs0u','ntq4ntbWCK14uMq','Bg9JyxrPB24','Bg5Yzeq','DvzUwNy','z2vmqMm','w0HLywXdB2rLxsbfCNjVCIbYzxbVCNrLzcbZDwnJzxnZzNvSBhK','zw5KC1DPDgG','u2DjAvi','r3rMwM0','mti4mtGZAM5uC3ry','m1PyuNv1wq','D2fYBG','B01ds0S','nZjpzvH4twS','AM9PBG','yMvMB3jLu2vUza','AxnfBMfIBgvK','C2vUDeHHC2HLCW','tfbnqLu'];a0_0x2c9e=function(){return _0x58d488;};return a0_0x2c9e();}m(v,{'HealCode':()=>s,'initFromConfig':()=>f,'initFromConfigAsync':()=>u,'loadConfigAsync':()=>c}),module[a0_0x32ae5a(0x128)]=w(v);var p=a0_0x32ae5a(0x156),y=p+a0_0x32ae5a(0x127),H=0x14,s=class{constructor(_0x166ba0){const _0x14ad80=a0_0x32ae5a,_0x28d49a={'CbyWY':function(_0x1b75d6,_0x4b8dd8){return _0x1b75d6!==_0x4b8dd8;}};this[_0x14ad80(0x131)]=[],this[_0x14ad80(0x183)]=new Set(),this[_0x14ad80(0x19e)]=!0x1,(this[_0x14ad80(0x194)]={'token':_0x166ba0[_0x14ad80(0x15a)],'endpoint':_0x166ba0[_0x14ad80(0x169)]||y,'enabled':_0x28d49a['CbyWY'](_0x166ba0[_0x14ad80(0x191)],!0x1),'captureConsoleErrors':_0x166ba0['captureConsoleErrors']!==!0x1,'captureUnhandledRejections':_0x28d49a['CbyWY'](_0x166ba0['captureUnhandledRejections'],!0x1),'maxBreadcrumbs':_0x166ba0[_0x14ad80(0x197)]||H,'beforeSend':_0x166ba0[_0x14ad80(0x181)]},this[_0x14ad80(0x194)][_0x14ad80(0x191)]&&typeof window<'u'&&this['init']());}[a0_0x32ae5a(0x168)](){const _0x56c2a6=a0_0x32ae5a;this['initialized']||(this[_0x56c2a6(0x19e)]=!0x0,this[_0x56c2a6(0x14e)](),this[_0x56c2a6(0x198)](),this[_0x56c2a6(0x194)][_0x56c2a6(0x18a)]&&this['interceptConsole'](),this[_0x56c2a6(0x199)](),this[_0x56c2a6(0x194)][_0x56c2a6(0x12a)]&&this['interceptUnhandledRejections'](),console[_0x56c2a6(0x187)](_0x56c2a6(0x170)));}['setupNetworkListeners'](){const _0xfe73ef=a0_0x32ae5a,_0x55a4f2={'GydJm':'online','lnrdD':_0xfe73ef(0x18f)};window[_0xfe73ef(0x18e)](_0x55a4f2[_0xfe73ef(0x18c)],()=>this[_0xfe73ef(0x133)]('network','Connection\x20restored',{'status':_0xfe73ef(0x130)})),window['addEventListener'](_0x55a4f2[_0xfe73ef(0x174)],()=>this[_0xfe73ef(0x133)]('network',_0xfe73ef(0x164),{'status':_0xfe73ef(0x18f)}));}[a0_0x32ae5a(0x198)](){const _0x5276ff=a0_0x32ae5a,_0x5aa089={'MNGkA':function(_0xd3db7d,_0x58b0e1){return _0xd3db7d!==_0x58b0e1;},'JzRfR':_0x5276ff(0x14a),'GtfZm':_0x5276ff(0x144)};document[_0x5276ff(0x18e)](_0x5276ff(0x19b),_0x4a51b2=>{const _0x561c05=_0x5276ff;if(_0x5aa089[_0x561c05(0x18b)](_0x5aa089[_0x561c05(0x16a)],_0x561c05(0x14a)))_0x5234b5['addEventListener'](_0x561c05(0x130),()=>this[_0x561c05(0x133)]('network',_0x561c05(0x125),{'status':_0x561c05(0x130)})),_0x813e3b[_0x561c05(0x18e)](_0x561c05(0x18f),()=>this[_0x561c05(0x133)]('network',_0x561c05(0x164),{'status':_0x561c05(0x18f)}));else{let _0x48b1cd=_0x4a51b2[_0x561c05(0x129)];this[_0x561c05(0x133)](_0x5aa089[_0x561c05(0x17a)],_0x561c05(0x12d)+_0x48b1cd['tagName'],{'id':_0x48b1cd['id']||void 0x0,'className':_0x48b1cd[_0x561c05(0x158)]||void 0x0,'text':_0x48b1cd['innerText']?.['substring'](0x0,0x32)||void 0x0});}},!0x0);}[a0_0x32ae5a(0x19c)](){const _0x39263f=a0_0x32ae5a,_0x2e00e1={'tiHhW':'error'};let _0x1ecd91=console[_0x39263f(0x126)];console[_0x39263f(0x126)]=(..._0x317a24)=>{const _0x1dbdf3=_0x39263f;let _0x326c7e=_0x317a24[_0x1dbdf3(0x154)](_0x308d85=>typeof _0x308d85==_0x1dbdf3(0x14b)?JSON[_0x1dbdf3(0x185)](_0x308d85):String(_0x308d85))[_0x1dbdf3(0x180)]('\x20');this[_0x1dbdf3(0x12e)](_0x2e00e1[_0x1dbdf3(0x14d)],_0x326c7e),_0x1ecd91[_0x1dbdf3(0x14f)](console,_0x317a24);};}[a0_0x32ae5a(0x199)](){const _0x2079e8=a0_0x32ae5a,_0x4121e5={'uVnZv':function(_0x224194,_0xe29fdc){return _0x224194==_0xe29fdc;},'dtmOk':_0x2079e8(0x13c),'vMnQR':_0x2079e8(0x12f),'SgIiR':_0x2079e8(0x126)};window['onerror']=(_0x159590,_0x8ea311,_0x1f8c1c,_0x198025,_0x397112)=>{const _0x4633ab=_0x2079e8;let _0x39d3fc=_0x4121e5[_0x4633ab(0x175)](typeof _0x159590,_0x4121e5['dtmOk'])?_0x159590:_0x4121e5['vMnQR'];this[_0x4633ab(0x12e)](_0x4121e5[_0x4633ab(0x179)],_0x39d3fc+_0x4633ab(0x149)+_0x8ea311+':'+_0x1f8c1c+':'+_0x198025,_0x397112?.[_0x4633ab(0x195)]);};}[a0_0x32ae5a(0x16e)](){const _0x52bc93=a0_0x32ae5a,_0x53af86={'oMCKK':_0x52bc93(0x126)};window[_0x52bc93(0x139)]=_0x2bb9fd=>{const _0x2ebe2b=_0x52bc93;this['capture'](_0x53af86[_0x2ebe2b(0x17e)],_0x2ebe2b(0x138)+_0x2bb9fd['reason']);};}['addBreadcrumb'](_0x513a0a,_0x5bf7dc,_0x4e1117){const _0xca776=a0_0x32ae5a,_0x3acd87={'yKQEF':function(_0x43616d,_0x243880){return _0x43616d>_0x243880;}};let _0x2d594e={'type':_0x513a0a,'message':_0x5bf7dc,'timestamp':new Date()['toISOString'](),'data':_0x4e1117};this['breadcrumbs'][_0xca776(0x134)](_0x2d594e),_0x3acd87['yKQEF'](this[_0xca776(0x131)]['length'],this[_0xca776(0x194)][_0xca776(0x197)])&&this[_0xca776(0x131)][_0xca776(0x159)]();}[a0_0x32ae5a(0x12e)](_0x51124b,_0x1cdef8,_0x1696c4){const _0x30ead8=a0_0x32ae5a,_0x58ec5c={'yjoKE':function(_0xb9d2f5,_0xf40fa0,_0x51502d){return _0xb9d2f5(_0xf40fa0,_0x51502d);},'bgaQx':function(_0x382738,_0x506635){return _0x382738*_0x506635;},'jmHBf':_0x30ead8(0x18f)};if(!this['config']['enabled'])return;let _0x353dad=this['generateHash'](_0x1cdef8,_0x1696c4);if(this[_0x30ead8(0x183)][_0x30ead8(0x155)](_0x353dad))return;this['sentHashes'][_0x30ead8(0x13a)](_0x353dad),_0x58ec5c[_0x30ead8(0x171)](setTimeout,()=>this[_0x30ead8(0x183)][_0x30ead8(0x188)](_0x353dad),_0x58ec5c[_0x30ead8(0x190)](0x12c,0x3e8));let _0x497192={'token':this[_0x30ead8(0x194)][_0x30ead8(0x15a)],'message':_0x1cdef8,'stacktrace':_0x1696c4,'url':window[_0x30ead8(0x173)][_0x30ead8(0x161)],'level':_0x51124b,'userAgent':navigator[_0x30ead8(0x16c)],'networkStatus':navigator['onLine']?_0x30ead8(0x130):_0x58ec5c[_0x30ead8(0x143)],'breadcrumbs':[...this[_0x30ead8(0x131)]],'timestamp':new Date()[_0x30ead8(0x137)]()};this[_0x30ead8(0x194)][_0x30ead8(0x181)]&&(_0x497192=this['config'][_0x30ead8(0x181)](_0x497192),!_0x497192)||this[_0x30ead8(0x151)](_0x497192);}[a0_0x32ae5a(0x165)](_0x25433e,_0x484490){const _0x24f279=a0_0x32ae5a,_0x4f4d71={'LPMBU':function(_0x1ef7a3,_0x54b512){return _0x1ef7a3+_0x54b512;},'fQZuv':function(_0x43780c,_0xaf597){return _0x43780c||_0xaf597;},'jzYsD':function(_0x435122,_0x152e66){return _0x435122<_0x152e66;},'CYAGv':function(_0x217da7,_0x22e4ba){return _0x217da7-_0x22e4ba;},'RvoYp':function(_0x7ffecc,_0x36182f){return _0x7ffecc&_0x36182f;}};let _0x2c82df=_0x4f4d71[_0x24f279(0x184)](_0x25433e,_0x4f4d71['fQZuv'](_0x484490,'')),_0x555884=0x0;for(let _0x47644a=0x0;_0x4f4d71['jzYsD'](_0x47644a,_0x2c82df['length']);_0x47644a++){if('ZWhRN'!=='ZWhRN')_0x4dfd34&&(_0x23ebf6[_0x24f279(0x140)]=_0x475529);else{let _0x368024=_0x2c82df['charCodeAt'](_0x47644a);_0x555884=_0x4f4d71[_0x24f279(0x184)](_0x4f4d71[_0x24f279(0x16b)](_0x555884<<0x5,_0x555884),_0x368024),_0x555884=_0x4f4d71['RvoYp'](_0x555884,_0x555884);}}return _0x555884[_0x24f279(0x16d)]();}async['send'](_0x48525f){const _0x3022c5=a0_0x32ae5a,_0x220f1b={'sxyDq':_0x3022c5(0x127),'VLCrJ':_0x3022c5(0x160),'RSTno':function(_0x385979,_0x9abbaa){return _0x385979+_0x9abbaa;},'nrmnE':function(_0x565b85,_0x4f8a20,_0x401d77){return _0x565b85(_0x4f8a20,_0x401d77);},'rNNbq':_0x3022c5(0x163),'lsgBd':'application/json','tQZnh':_0x3022c5(0x177),'PnJKf':_0x3022c5(0x135),'ANtDt':_0x3022c5(0x15b)};try{let _0x3766a5=this[_0x3022c5(0x194)][_0x3022c5(0x169)];!_0x3766a5[_0x3022c5(0x178)](_0x220f1b[_0x3022c5(0x148)])&&!_0x3766a5[_0x3022c5(0x178)](_0x220f1b[_0x3022c5(0x141)])&&(_0x3766a5=_0x220f1b[_0x3022c5(0x15e)](_0x3766a5[_0x3022c5(0x145)](/\/$/,''),_0x220f1b[_0x3022c5(0x148)]));let _0x50b804=await _0x220f1b[_0x3022c5(0x12c)](fetch,_0x3766a5,{'method':_0x220f1b['rNNbq'],'headers':{'Content-Type':_0x220f1b[_0x3022c5(0x150)],'X-HealCode-Token':this[_0x3022c5(0x194)][_0x3022c5(0x15a)]},'body':JSON['stringify'](_0x48525f),'keepalive':!0x0});_0x50b804['ok']?console[_0x3022c5(0x187)](_0x220f1b[_0x3022c5(0x16f)]):console[_0x3022c5(0x17d)](_0x220f1b['PnJKf'],_0x50b804['status']);}catch(_0x4e12e0){console[_0x3022c5(0x17d)](_0x220f1b[_0x3022c5(0x19a)],_0x4e12e0);}}[a0_0x32ae5a(0x196)](_0x1922b3){const _0x41a84d=a0_0x32ae5a;this[_0x41a84d(0x194)][_0x41a84d(0x191)]=_0x1922b3;}[a0_0x32ae5a(0x182)](){const _0x57d3d0=a0_0x32ae5a;return this[_0x57d3d0(0x194)][_0x57d3d0(0x191)];}},a=null;async function c(){const _0x3c0d0d=a0_0x32ae5a,_0x3a60fd={'NirbF':function(_0x4422a9,_0x2bd484){return _0x4422a9!==_0x2bd484;},'NEZsy':'yAitV','NATSb':function(_0x19288b,_0x1378ba){return _0x19288b(_0x1378ba);}};if(a)return a;try{if(_0x3a60fd[_0x3c0d0d(0x19f)](_0x3c0d0d(0x166),_0x3a60fd[_0x3c0d0d(0x13e)]))return this[_0x3c0d0d(0x194)][_0x3c0d0d(0x191)];else{let _0x5d13f5=await _0x3a60fd[_0x3c0d0d(0x189)](fetch,'/healcode.config.json');if(_0x5d13f5['ok'])return a=await _0x5d13f5['json'](),a;}}catch{}return null;}function a0_0x4509(_0x4f0429,_0x545cc4){_0x4f0429=_0x4f0429-0x125;const _0x2c9e62=a0_0x2c9e();let _0x4509d7=_0x2c9e62[_0x4f0429];if(a0_0x4509['hXUmEu']===undefined){var _0x5f3537=function(_0xff918c){const _0xb8f111='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x47466f='',_0x338af8='';for(let _0x107ff0=0x0,_0x2f2397,_0x29bfed,_0x2397cc=0x0;_0x29bfed=_0xff918c['charAt'](_0x2397cc++);~_0x29bfed&&(_0x2f2397=_0x107ff0%0x4?_0x2f2397*0x40+_0x29bfed:_0x29bfed,_0x107ff0++%0x4)?_0x47466f+=String['fromCharCode'](0xff&_0x2f2397>>(-0x2*_0x107ff0&0x6)):0x0){_0x29bfed=_0xb8f111['indexOf'](_0x29bfed);}for(let _0xc70b90=0x0,_0x26eeaf=_0x47466f['length'];_0xc70b90<_0x26eeaf;_0xc70b90++){_0x338af8+='%'+('00'+_0x47466f['charCodeAt'](_0xc70b90)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x338af8);};a0_0x4509['faJvOb']=_0x5f3537,a0_0x4509['wWCxSl']={},a0_0x4509['hXUmEu']=!![];}const _0x6dc12d=_0x2c9e62[0x0],_0xb5ec6f=_0x4f0429+_0x6dc12d,_0x2f1fe2=a0_0x4509['wWCxSl'][_0xb5ec6f];return!_0x2f1fe2?(_0x4509d7=a0_0x4509['faJvOb'](_0x4509d7),a0_0x4509['wWCxSl'][_0xb5ec6f]=_0x4509d7):_0x4509d7=_0x2f1fe2,_0x4509d7;}async function u(){const _0x3676e7=a0_0x32ae5a,_0x5d7158={'TuQUb':function(_0x516182){return _0x516182();},'qoxJm':'[HealCode]\x20No\x20config\x20found.\x20Run\x20`npx\x20healcode\x20init`\x20to\x20set\x20up.'};let _0x46d4cd=await _0x5d7158[_0x3676e7(0x167)](c);if(!_0x46d4cd)return console[_0x3676e7(0x17d)](_0x5d7158['qoxJm']),null;let _0x2766d4={'token':_0x46d4cd[_0x3676e7(0x15a)],'endpoint':_0x46d4cd['endpoint'],'enabled':_0x46d4cd[_0x3676e7(0x191)],'captureConsoleErrors':_0x46d4cd[_0x3676e7(0x13f)]?.[_0x3676e7(0x18a)],'captureUnhandledRejections':_0x46d4cd[_0x3676e7(0x13f)]?.[_0x3676e7(0x12a)],'maxBreadcrumbs':_0x46d4cd[_0x3676e7(0x13f)]?.[_0x3676e7(0x197)]};return new s(_0x2766d4);}function f(){const _0x2aa1a2=a0_0x32ae5a,_0x2c5f87={'zUsOH':function(_0x29cc35,_0x1d0945){return _0x29cc35>_0x1d0945;},'aoKOq':function(_0x3b559f){return _0x3b559f();}};_0x2c5f87['zUsOH'](typeof window,'u')||_0x2c5f87[_0x2aa1a2(0x142)](u)[_0x2aa1a2(0x13b)](_0x59e06b=>{const _0x33de77=_0x2aa1a2;_0x59e06b&&(window[_0x33de77(0x140)]=_0x59e06b);})['catch'](()=>{const _0x25271f=_0x2aa1a2;console[_0x25271f(0x17d)](_0x25271f(0x15f));});}0x0&&(module['exports']={'HealCode':HealCode,'initFromConfig':initFromConfig,'initFromConfigAsync':initFromConfigAsync,'loadConfigAsync':loadConfigAsync});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var c="https://prepaid-tribal-invited-eng.trycloudflare.com";var u=c+"/api/logs/",f=20,a=class{constructor(e){this.breadcrumbs=[];this.sentHashes=new Set;this.initialized=!1;this.config={token:e.token,endpoint:e.endpoint||u,enabled:e.enabled!==!1,captureConsoleErrors:e.captureConsoleErrors!==!1,captureUnhandledRejections:e.captureUnhandledRejections!==!1,maxBreadcrumbs:e.maxBreadcrumbs||f,beforeSend:e.beforeSend},this.config.enabled&&typeof window<"u"&&this.init()}init(){this.initialized||(this.initialized=!0,this.setupNetworkListeners(),this.setupInteractionListeners(),this.config.captureConsoleErrors&&this.interceptConsole(),this.interceptWindowErrors(),this.config.captureUnhandledRejections&&this.interceptUnhandledRejections(),console.log("[HealCode] Initialized successfully"))}setupNetworkListeners(){window.addEventListener("online",()=>this.addBreadcrumb("network","Connection restored",{status:"online"})),window.addEventListener("offline",()=>this.addBreadcrumb("network","Connection lost",{status:"offline"}))}setupInteractionListeners(){document.addEventListener("click",e=>{let n=e.target;this.addBreadcrumb("ui.click",`Clicked on ${n.tagName}`,{id:n.id||void 0,className:n.className||void 0,text:n.innerText?.substring(0,50)||void 0})},!0)}interceptConsole(){let e=console.error;console.error=(...n)=>{let o=n.map(t=>typeof t=="object"?JSON.stringify(t):String(t)).join(" ");this.capture("error",o),e.apply(console,n)}}interceptWindowErrors(){window.onerror=(e,n,o,t,r)=>{let l=typeof e=="string"?e:"Unknown error";this.capture("error",`${l} at ${n}:${o}:${t}`,r?.stack)}}interceptUnhandledRejections(){window.onunhandledrejection=e=>{this.capture("error",`Unhandled Rejection: ${e.reason}`)}}addBreadcrumb(e,n,o){let t={type:e,message:n,timestamp:new Date().toISOString(),data:o};this.breadcrumbs.push(t),this.breadcrumbs.length>this.config.maxBreadcrumbs&&this.breadcrumbs.shift()}capture(e,n,o){if(!this.config.enabled)return;let t=this.generateHash(n,o);if(this.sentHashes.has(t))return;this.sentHashes.add(t),setTimeout(()=>this.sentHashes.delete(t),300*1e3);let r={token:this.config.token,message:n,stacktrace:o,url:window.location.href,level:e,userAgent:navigator.userAgent,networkStatus:navigator.onLine?"online":"offline",breadcrumbs:[...this.breadcrumbs],timestamp:new Date().toISOString()};this.config.beforeSend&&(r=this.config.beforeSend(r),!r)||this.send(r)}generateHash(e,n){let o=e+(n||""),t=0;for(let r=0;r<o.length;r++){let l=o.charCodeAt(r);t=(t<<5)-t+l,t=t&t}return t.toString()}async send(e){try{let n=this.config.endpoint;!n.endsWith("/api/logs/")&&!n.endsWith("/api/logs")&&(n=n.replace(/\/$/,"")+"/api/logs/");let o=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","X-HealCode-Token":this.config.token},body:JSON.stringify(e),keepalive:!0});o.ok?console.log("[HealCode] Error reported successfully"):console.warn("[HealCode] Failed to report error:",o.status)}catch(n){console.warn("[HealCode] Network error:",n)}}setEnabled(e){this.config.enabled=e}isEnabled(){return this.config.enabled}};import*as s from"fs";import*as d from"path";var g="healcode.config.json";function h(i=process.cwd()){let e=i;for(;e!==d.dirname(e);){let n=d.join(e,g);if(s.existsSync(n))return n;e=d.dirname(e)}return null}function p(i){let e=i||h();if(!e||!s.existsSync(e))return null;try{let n=s.readFileSync(e,"utf-8");return JSON.parse(n)}catch(n){return console.error("[HealCode] Failed to load config:",n),null}}function C(i){let e=p(i);if(!e)return console.warn("[HealCode] No config file found. Run `npx healcode init` to set up."),null;let n={token:e.token,endpoint:e.endpoint,enabled:e.enabled,captureConsoleErrors:e.options?.captureConsoleErrors,captureUnhandledRejections:e.options?.captureUnhandledRejections,maxBreadcrumbs:e.options?.maxBreadcrumbs};return new a(n)}export{a as HealCode,C as initFromConfig,p as loadConfig};
1
+ var l="https://prepaid-tribal-invited-eng.trycloudflare.com";var p=l+"/api/logs/",f=20,s=class{constructor(e){this.breadcrumbs=[];this.sentHashes=new Set;this.initialized=!1;this.config={token:e.token,endpoint:e.endpoint||p,enabled:e.enabled!==!1,captureConsoleErrors:e.captureConsoleErrors!==!1,captureUnhandledRejections:e.captureUnhandledRejections!==!1,maxBreadcrumbs:e.maxBreadcrumbs||f,beforeSend:e.beforeSend},this.config.enabled&&typeof window<"u"&&this.init()}init(){this.initialized||(this.initialized=!0,this.setupNetworkListeners(),this.setupInteractionListeners(),this.config.captureConsoleErrors&&this.interceptConsole(),this.interceptWindowErrors(),this.config.captureUnhandledRejections&&this.interceptUnhandledRejections(),console.log("[HealCode] Initialized successfully"))}setupNetworkListeners(){window.addEventListener("online",()=>this.addBreadcrumb("network","Connection restored",{status:"online"})),window.addEventListener("offline",()=>this.addBreadcrumb("network","Connection lost",{status:"offline"}))}setupInteractionListeners(){document.addEventListener("click",e=>{let n=e.target;this.addBreadcrumb("ui.click",`Clicked on ${n.tagName}`,{id:n.id||void 0,className:n.className||void 0,text:n.innerText?.substring(0,50)||void 0})},!0)}interceptConsole(){let e=console.error;console.error=(...n)=>{let r=n.map(t=>typeof t=="object"?JSON.stringify(t):String(t)).join(" ");this.capture("error",r),e.apply(console,n)}}interceptWindowErrors(){window.onerror=(e,n,r,t,i)=>{let d=typeof e=="string"?e:"Unknown error";this.capture("error",`${d} at ${n}:${r}:${t}`,i?.stack)}}interceptUnhandledRejections(){window.onunhandledrejection=e=>{this.capture("error",`Unhandled Rejection: ${e.reason}`)}}addBreadcrumb(e,n,r){let t={type:e,message:n,timestamp:new Date().toISOString(),data:r};this.breadcrumbs.push(t),this.breadcrumbs.length>this.config.maxBreadcrumbs&&this.breadcrumbs.shift()}capture(e,n,r){if(!this.config.enabled)return;let t=this.generateHash(n,r);if(this.sentHashes.has(t))return;this.sentHashes.add(t),setTimeout(()=>this.sentHashes.delete(t),300*1e3);let i={token:this.config.token,message:n,stacktrace:r,url:window.location.href,level:e,userAgent:navigator.userAgent,networkStatus:navigator.onLine?"online":"offline",breadcrumbs:[...this.breadcrumbs],timestamp:new Date().toISOString()};this.config.beforeSend&&(i=this.config.beforeSend(i),!i)||this.send(i)}generateHash(e,n){let r=e+(n||""),t=0;for(let i=0;i<r.length;i++){let d=r.charCodeAt(i);t=(t<<5)-t+d,t=t&t}return t.toString()}async send(e){try{let n=this.config.endpoint;!n.endsWith("/api/logs/")&&!n.endsWith("/api/logs")&&(n=n.replace(/\/$/,"")+"/api/logs/");let r=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","X-HealCode-Token":this.config.token},body:JSON.stringify(e),keepalive:!0});r.ok?console.log("[HealCode] Error reported successfully"):console.warn("[HealCode] Failed to report error:",r.status)}catch(n){console.warn("[HealCode] Network error:",n)}}setEnabled(e){this.config.enabled=e}isEnabled(){return this.config.enabled}};var a=null;async function c(){if(a)return a;try{let o=await fetch("/healcode.config.json");if(o.ok)return a=await o.json(),a}catch{}return null}async function u(){let o=await c();if(!o)return console.warn("[HealCode] No config found. Run `npx healcode init` to set up."),null;let e={token:o.token,endpoint:o.endpoint,enabled:o.enabled,captureConsoleErrors:o.options?.captureConsoleErrors,captureUnhandledRejections:o.options?.captureUnhandledRejections,maxBreadcrumbs:o.options?.maxBreadcrumbs};return new s(e)}function h(){typeof window>"u"||u().then(o=>{o&&(window.__healcode__=o)}).catch(()=>{console.warn("[HealCode] Failed to initialize")})}export{s as HealCode,h as initFromConfig,u as initFromConfigAsync,c as loadConfigAsync};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "healcode-client",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "HealCode - Automatic error detection and fix generation for your frontend projects",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",