trickle-observe 0.2.74 → 0.2.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/vite-plugin.js +14 -1
- package/dist-esm/vite-plugin.js +14 -1
- package/package.json +1 -1
- package/src/vite-plugin.ts +17 -5
package/dist/vite-plugin.js
CHANGED
|
@@ -261,6 +261,14 @@ function findVarDeclarations(source) {
|
|
|
261
261
|
// Skip TS compiled vars
|
|
262
262
|
if (varName === '_a' || varName === '_b' || varName === '_c')
|
|
263
263
|
continue;
|
|
264
|
+
// Skip React Refresh / HMR internals (Vite, webpack, Next.js inject these)
|
|
265
|
+
if (varName === 'prevRefreshReg' || varName === 'prevRefreshSig' || varName === 'inWebWorker' || varName === 'invalidateMessage')
|
|
266
|
+
continue;
|
|
267
|
+
if (varName === '_s' || varName === '_c2' || varName === '_s2')
|
|
268
|
+
continue;
|
|
269
|
+
// Skip single-underscore discard variables
|
|
270
|
+
if (varName === '_')
|
|
271
|
+
continue;
|
|
264
272
|
// Check if this is a require() call or import — skip those
|
|
265
273
|
const restOfLine = source.slice(vmatch.index + vmatch[0].length - 1, vmatch.index + vmatch[0].length + 200);
|
|
266
274
|
if (/^\s*require\s*\(/.test(restOfLine))
|
|
@@ -505,6 +513,11 @@ function findReassignments(source) {
|
|
|
505
513
|
// Skip 'this', 'self', 'super' (not reassignable in practice)
|
|
506
514
|
if (varName === 'this' || varName === 'super')
|
|
507
515
|
continue;
|
|
516
|
+
// Skip React Refresh / HMR internals and discard variables
|
|
517
|
+
if (varName === 'prevRefreshReg' || varName === 'prevRefreshSig' || varName === 'inWebWorker')
|
|
518
|
+
continue;
|
|
519
|
+
if (varName === '_s' || varName === '_c2' || varName === '_s2' || varName === '_')
|
|
520
|
+
continue;
|
|
508
521
|
// Skip keywords that could look like identifiers
|
|
509
522
|
if (['if', 'else', 'while', 'for', 'do', 'switch', 'case', 'default', 'return', 'throw',
|
|
510
523
|
'break', 'continue', 'try', 'catch', 'finally', 'new', 'delete', 'typeof', 'void',
|
|
@@ -1352,7 +1365,7 @@ ingestUrl) {
|
|
|
1352
1365
|
}
|
|
1353
1366
|
// Add variable tracing if needed — inlined to avoid import resolution issues in Vite SSR.
|
|
1354
1367
|
if (varInsertions.length > 0 || destructInsertions.length > 0 || reassignInsertions.length > 0 || forLoopInsertions.length > 0 || catchInsertions.length > 0 || funcParamInsertions.length > 0) {
|
|
1355
|
-
prefixLines.push(`if (!globalThis.__trickle_var_tracer) {`, ` const _cache = new
|
|
1368
|
+
prefixLines.push(`if (!globalThis.__trickle_var_tracer) {`, ` const _cache = new Map();`, ` function _inferType(v, d) {`, ` if (d <= 0) return { kind: 'primitive', name: 'unknown' };`, ` if (v === null) return { kind: 'primitive', name: 'null' };`, ` if (v === undefined) return { kind: 'primitive', name: 'undefined' };`, ` const t = typeof v;`, ` if (t === 'string' || t === 'number' || t === 'boolean' || t === 'bigint' || t === 'symbol') return { kind: 'primitive', name: t };`, ` if (t === 'function') return { kind: 'function' };`, ` if (Array.isArray(v)) { return v.length === 0 ? { kind: 'array', element: { kind: 'primitive', name: 'unknown' } } : { kind: 'array', element: _inferType(v[0], d-1) }; }`, ` if (t === 'object') {`, ` if (v instanceof Date) return { kind: 'object', properties: { __date: { kind: 'primitive', name: 'string' } } };`, ` if (v instanceof RegExp) return { kind: 'object', properties: { __regexp: { kind: 'primitive', name: 'string' } } };`, ` if (v instanceof Error) return { kind: 'object', properties: { __error: { kind: 'primitive', name: 'string' } } };`, ` if (v instanceof Promise) return { kind: 'promise', resolved: { kind: 'primitive', name: 'unknown' } };`, ` const props = {}; const keys = Object.keys(v).slice(0, 20);`, ` for (const k of keys) { try { props[k] = _inferType(v[k], d-1); } catch(e) { props[k] = { kind: 'primitive', name: 'unknown' }; } }`, ` return { kind: 'object', properties: props };`, ` }`, ` return { kind: 'primitive', name: 'unknown' };`, ` }`, ` function _sanitize(v, d) {`, ` if (d <= 0) return '[truncated]'; if (v === null || v === undefined) return v; const t = typeof v;`, ` if (t === 'string') return v.length > 100 ? v.substring(0, 100) + '...' : v;`, ` if (t === 'number' || t === 'boolean') return v; if (t === 'bigint') return String(v);`, ` if (t === 'function') return '[Function: ' + (v.name || 'anonymous') + ']';`, ` if (Array.isArray(v)) return v.slice(0, 3).map(i => _sanitize(i, d-1));`, ` if (t === 'object') { if (v instanceof Date) return v.toISOString(); if (v instanceof RegExp) return String(v); if (v instanceof Error) return { error: v.message }; if (v instanceof Promise) return '[Promise]';`, ` const r = {}; const keys = Object.keys(v).slice(0, 10); for (const k of keys) { try { r[k] = _sanitize(v[k], d-1); } catch(e) { r[k] = '[unreadable]'; } } return r; }`, ` return String(v);`, ` }`, ` globalThis.__trickle_var_tracer = function(v, n, l, mod, file) {`, ` try {`, ` const type = _inferType(v, 3);`, ` const th = JSON.stringify(type).substring(0, 32);`, ` const sample = _sanitize(v, 2);`, ` const sv = typeof v === 'object' && v !== null ? JSON.stringify(sample).substring(0, 60) : String(v).substring(0, 60);`, ` const ck = file + ':' + l + ':' + n;`, ` const prev = _cache.get(ck);`, ` const now = Date.now();`, ` if (prev && prev.sv === sv && now - prev.ts < 5000) return;`, ` _cache.set(ck, { sv: sv, ts: now });`, ` __trickle_send(JSON.stringify({ kind: 'variable', varName: n, line: l, module: mod, file: file, type: type, typeHash: th, sample: sample }));`, ` } catch(e) {}`, ` };`, `}`, `function __trickle_tv(v, n, l) { try { globalThis.__trickle_var_tracer(v, n, l, ${JSON.stringify(moduleName)}, ${JSON.stringify(filename)}); } catch(e) {} }`);
|
|
1356
1369
|
}
|
|
1357
1370
|
// Add React component render tracker if needed
|
|
1358
1371
|
if (bodyInsertions.length > 0 || conciseBodyInsertions.length > 0) {
|
package/dist-esm/vite-plugin.js
CHANGED
|
@@ -254,6 +254,14 @@ function findVarDeclarations(source) {
|
|
|
254
254
|
// Skip TS compiled vars
|
|
255
255
|
if (varName === '_a' || varName === '_b' || varName === '_c')
|
|
256
256
|
continue;
|
|
257
|
+
// Skip React Refresh / HMR internals (Vite, webpack, Next.js inject these)
|
|
258
|
+
if (varName === 'prevRefreshReg' || varName === 'prevRefreshSig' || varName === 'inWebWorker' || varName === 'invalidateMessage')
|
|
259
|
+
continue;
|
|
260
|
+
if (varName === '_s' || varName === '_c2' || varName === '_s2')
|
|
261
|
+
continue;
|
|
262
|
+
// Skip single-underscore discard variables
|
|
263
|
+
if (varName === '_')
|
|
264
|
+
continue;
|
|
257
265
|
// Check if this is a require() call or import — skip those
|
|
258
266
|
const restOfLine = source.slice(vmatch.index + vmatch[0].length - 1, vmatch.index + vmatch[0].length + 200);
|
|
259
267
|
if (/^\s*require\s*\(/.test(restOfLine))
|
|
@@ -498,6 +506,11 @@ function findReassignments(source) {
|
|
|
498
506
|
// Skip 'this', 'self', 'super' (not reassignable in practice)
|
|
499
507
|
if (varName === 'this' || varName === 'super')
|
|
500
508
|
continue;
|
|
509
|
+
// Skip React Refresh / HMR internals and discard variables
|
|
510
|
+
if (varName === 'prevRefreshReg' || varName === 'prevRefreshSig' || varName === 'inWebWorker')
|
|
511
|
+
continue;
|
|
512
|
+
if (varName === '_s' || varName === '_c2' || varName === '_s2' || varName === '_')
|
|
513
|
+
continue;
|
|
501
514
|
// Skip keywords that could look like identifiers
|
|
502
515
|
if (['if', 'else', 'while', 'for', 'do', 'switch', 'case', 'default', 'return', 'throw',
|
|
503
516
|
'break', 'continue', 'try', 'catch', 'finally', 'new', 'delete', 'typeof', 'void',
|
|
@@ -1345,7 +1358,7 @@ ingestUrl) {
|
|
|
1345
1358
|
}
|
|
1346
1359
|
// Add variable tracing if needed — inlined to avoid import resolution issues in Vite SSR.
|
|
1347
1360
|
if (varInsertions.length > 0 || destructInsertions.length > 0 || reassignInsertions.length > 0 || forLoopInsertions.length > 0 || catchInsertions.length > 0 || funcParamInsertions.length > 0) {
|
|
1348
|
-
prefixLines.push(`if (!globalThis.__trickle_var_tracer) {`, ` const _cache = new
|
|
1361
|
+
prefixLines.push(`if (!globalThis.__trickle_var_tracer) {`, ` const _cache = new Map();`, ` function _inferType(v, d) {`, ` if (d <= 0) return { kind: 'primitive', name: 'unknown' };`, ` if (v === null) return { kind: 'primitive', name: 'null' };`, ` if (v === undefined) return { kind: 'primitive', name: 'undefined' };`, ` const t = typeof v;`, ` if (t === 'string' || t === 'number' || t === 'boolean' || t === 'bigint' || t === 'symbol') return { kind: 'primitive', name: t };`, ` if (t === 'function') return { kind: 'function' };`, ` if (Array.isArray(v)) { return v.length === 0 ? { kind: 'array', element: { kind: 'primitive', name: 'unknown' } } : { kind: 'array', element: _inferType(v[0], d-1) }; }`, ` if (t === 'object') {`, ` if (v instanceof Date) return { kind: 'object', properties: { __date: { kind: 'primitive', name: 'string' } } };`, ` if (v instanceof RegExp) return { kind: 'object', properties: { __regexp: { kind: 'primitive', name: 'string' } } };`, ` if (v instanceof Error) return { kind: 'object', properties: { __error: { kind: 'primitive', name: 'string' } } };`, ` if (v instanceof Promise) return { kind: 'promise', resolved: { kind: 'primitive', name: 'unknown' } };`, ` const props = {}; const keys = Object.keys(v).slice(0, 20);`, ` for (const k of keys) { try { props[k] = _inferType(v[k], d-1); } catch(e) { props[k] = { kind: 'primitive', name: 'unknown' }; } }`, ` return { kind: 'object', properties: props };`, ` }`, ` return { kind: 'primitive', name: 'unknown' };`, ` }`, ` function _sanitize(v, d) {`, ` if (d <= 0) return '[truncated]'; if (v === null || v === undefined) return v; const t = typeof v;`, ` if (t === 'string') return v.length > 100 ? v.substring(0, 100) + '...' : v;`, ` if (t === 'number' || t === 'boolean') return v; if (t === 'bigint') return String(v);`, ` if (t === 'function') return '[Function: ' + (v.name || 'anonymous') + ']';`, ` if (Array.isArray(v)) return v.slice(0, 3).map(i => _sanitize(i, d-1));`, ` if (t === 'object') { if (v instanceof Date) return v.toISOString(); if (v instanceof RegExp) return String(v); if (v instanceof Error) return { error: v.message }; if (v instanceof Promise) return '[Promise]';`, ` const r = {}; const keys = Object.keys(v).slice(0, 10); for (const k of keys) { try { r[k] = _sanitize(v[k], d-1); } catch(e) { r[k] = '[unreadable]'; } } return r; }`, ` return String(v);`, ` }`, ` globalThis.__trickle_var_tracer = function(v, n, l, mod, file) {`, ` try {`, ` const type = _inferType(v, 3);`, ` const th = JSON.stringify(type).substring(0, 32);`, ` const sample = _sanitize(v, 2);`, ` const sv = typeof v === 'object' && v !== null ? JSON.stringify(sample).substring(0, 60) : String(v).substring(0, 60);`, ` const ck = file + ':' + l + ':' + n;`, ` const prev = _cache.get(ck);`, ` const now = Date.now();`, ` if (prev && prev.sv === sv && now - prev.ts < 5000) return;`, ` _cache.set(ck, { sv: sv, ts: now });`, ` __trickle_send(JSON.stringify({ kind: 'variable', varName: n, line: l, module: mod, file: file, type: type, typeHash: th, sample: sample }));`, ` } catch(e) {}`, ` };`, `}`, `function __trickle_tv(v, n, l) { try { globalThis.__trickle_var_tracer(v, n, l, ${JSON.stringify(moduleName)}, ${JSON.stringify(filename)}); } catch(e) {} }`);
|
|
1349
1362
|
}
|
|
1350
1363
|
// Add React component render tracker if needed
|
|
1351
1364
|
if (bodyInsertions.length > 0 || conciseBodyInsertions.length > 0) {
|
package/package.json
CHANGED
package/src/vite-plugin.ts
CHANGED
|
@@ -257,6 +257,11 @@ function findVarDeclarations(source: string): Array<{ lineEnd: number; varName:
|
|
|
257
257
|
if (varName.startsWith('__trickle')) continue;
|
|
258
258
|
// Skip TS compiled vars
|
|
259
259
|
if (varName === '_a' || varName === '_b' || varName === '_c') continue;
|
|
260
|
+
// Skip React Refresh / HMR internals (Vite, webpack, Next.js inject these)
|
|
261
|
+
if (varName === 'prevRefreshReg' || varName === 'prevRefreshSig' || varName === 'inWebWorker' || varName === 'invalidateMessage') continue;
|
|
262
|
+
if (varName === '_s' || varName === '_c2' || varName === '_s2') continue;
|
|
263
|
+
// Skip single-underscore discard variables
|
|
264
|
+
if (varName === '_') continue;
|
|
260
265
|
|
|
261
266
|
// Check if this is a require() call or import — skip those
|
|
262
267
|
const restOfLine = source.slice(vmatch.index + vmatch[0].length - 1, vmatch.index + vmatch[0].length + 200);
|
|
@@ -486,6 +491,9 @@ function findReassignments(source: string): Array<{ lineEnd: number; varName: st
|
|
|
486
491
|
if (varName === '_a' || varName === '_b' || varName === '_c') continue;
|
|
487
492
|
// Skip 'this', 'self', 'super' (not reassignable in practice)
|
|
488
493
|
if (varName === 'this' || varName === 'super') continue;
|
|
494
|
+
// Skip React Refresh / HMR internals and discard variables
|
|
495
|
+
if (varName === 'prevRefreshReg' || varName === 'prevRefreshSig' || varName === 'inWebWorker') continue;
|
|
496
|
+
if (varName === '_s' || varName === '_c2' || varName === '_s2' || varName === '_') continue;
|
|
489
497
|
// Skip keywords that could look like identifiers
|
|
490
498
|
if (['if', 'else', 'while', 'for', 'do', 'switch', 'case', 'default', 'return', 'throw',
|
|
491
499
|
'break', 'continue', 'try', 'catch', 'finally', 'new', 'delete', 'typeof', 'void',
|
|
@@ -1415,7 +1423,7 @@ export function transformEsmSource(
|
|
|
1415
1423
|
if (varInsertions.length > 0 || destructInsertions.length > 0 || reassignInsertions.length > 0 || forLoopInsertions.length > 0 || catchInsertions.length > 0 || funcParamInsertions.length > 0) {
|
|
1416
1424
|
prefixLines.push(
|
|
1417
1425
|
`if (!globalThis.__trickle_var_tracer) {`,
|
|
1418
|
-
` const _cache = new
|
|
1426
|
+
` const _cache = new Map();`,
|
|
1419
1427
|
` function _inferType(v, d) {`,
|
|
1420
1428
|
` if (d <= 0) return { kind: 'primitive', name: 'unknown' };`,
|
|
1421
1429
|
` if (v === null) return { kind: 'primitive', name: 'null' };`,
|
|
@@ -1449,10 +1457,14 @@ export function transformEsmSource(
|
|
|
1449
1457
|
` try {`,
|
|
1450
1458
|
` const type = _inferType(v, 3);`,
|
|
1451
1459
|
` const th = JSON.stringify(type).substring(0, 32);`,
|
|
1452
|
-
` const
|
|
1453
|
-
`
|
|
1454
|
-
`
|
|
1455
|
-
`
|
|
1460
|
+
` const sample = _sanitize(v, 2);`,
|
|
1461
|
+
` const sv = typeof v === 'object' && v !== null ? JSON.stringify(sample).substring(0, 60) : String(v).substring(0, 60);`,
|
|
1462
|
+
` const ck = file + ':' + l + ':' + n;`,
|
|
1463
|
+
` const prev = _cache.get(ck);`,
|
|
1464
|
+
` const now = Date.now();`,
|
|
1465
|
+
` if (prev && prev.sv === sv && now - prev.ts < 5000) return;`,
|
|
1466
|
+
` _cache.set(ck, { sv: sv, ts: now });`,
|
|
1467
|
+
` __trickle_send(JSON.stringify({ kind: 'variable', varName: n, line: l, module: mod, file: file, type: type, typeHash: th, sample: sample }));`,
|
|
1456
1468
|
` } catch(e) {}`,
|
|
1457
1469
|
` };`,
|
|
1458
1470
|
`}`,
|