@replay-kit/core 0.0.1

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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/app_event.cjs +4 -0
  4. package/dist/app_event.d.cts +7 -0
  5. package/dist/app_event.d.ts +7 -0
  6. package/dist/app_event.js +4 -0
  7. package/dist/cli.cjs +46 -0
  8. package/dist/cli.d.cts +1 -0
  9. package/dist/cli.d.ts +1 -0
  10. package/dist/cli.js +46 -0
  11. package/dist/enum/index.cjs +1 -0
  12. package/dist/enum/index.d.cts +1 -0
  13. package/dist/enum/index.d.ts +1 -0
  14. package/dist/enum/index.js +1 -0
  15. package/dist/enum/log_level.enum.cjs +1 -0
  16. package/dist/enum/log_level.enum.d.cts +7 -0
  17. package/dist/enum/log_level.enum.d.ts +7 -0
  18. package/dist/enum/log_level.enum.js +1 -0
  19. package/dist/error_handle.helper-CQsPSbuz.d.cts +75 -0
  20. package/dist/error_handle.helper-CQsPSbuz.d.ts +75 -0
  21. package/dist/helper/crypto.helper.cjs +1 -0
  22. package/dist/helper/crypto.helper.d.cts +3 -0
  23. package/dist/helper/crypto.helper.d.ts +3 -0
  24. package/dist/helper/crypto.helper.js +1 -0
  25. package/dist/helper/error_handle.helper.cjs +3 -0
  26. package/dist/helper/error_handle.helper.d.cts +2 -0
  27. package/dist/helper/error_handle.helper.d.ts +2 -0
  28. package/dist/helper/error_handle.helper.js +3 -0
  29. package/dist/helper/index.cjs +4 -0
  30. package/dist/helper/index.d.cts +4 -0
  31. package/dist/helper/index.d.ts +4 -0
  32. package/dist/helper/index.js +4 -0
  33. package/dist/helper/stack.helper.cjs +2 -0
  34. package/dist/helper/stack.helper.d.cts +9 -0
  35. package/dist/helper/stack.helper.d.ts +9 -0
  36. package/dist/helper/stack.helper.js +2 -0
  37. package/dist/index-8u1_ya-u.d.ts +36 -0
  38. package/dist/index-MBKv_hsI.d.cts +36 -0
  39. package/dist/index.cjs +4 -0
  40. package/dist/index.d.cts +7 -0
  41. package/dist/index.d.ts +7 -0
  42. package/dist/index.js +4 -0
  43. package/dist/logger/actions/index.cjs +3 -0
  44. package/dist/logger/actions/index.d.cts +4 -0
  45. package/dist/logger/actions/index.d.ts +4 -0
  46. package/dist/logger/actions/index.js +3 -0
  47. package/dist/logger/actions/record.action.cjs +2 -0
  48. package/dist/logger/actions/record.action.d.cts +4 -0
  49. package/dist/logger/actions/record.action.d.ts +4 -0
  50. package/dist/logger/actions/record.action.js +2 -0
  51. package/dist/logger/actions/view_many.action.cjs +2 -0
  52. package/dist/logger/actions/view_many.action.d.cts +4 -0
  53. package/dist/logger/actions/view_many.action.d.ts +4 -0
  54. package/dist/logger/actions/view_many.action.js +2 -0
  55. package/dist/logger/handler.cjs +3 -0
  56. package/dist/logger/handler.d.cts +4 -0
  57. package/dist/logger/handler.d.ts +4 -0
  58. package/dist/logger/handler.js +3 -0
  59. package/dist/logger/index.cjs +3 -0
  60. package/dist/logger/index.d.cts +4 -0
  61. package/dist/logger/index.d.ts +4 -0
  62. package/dist/logger/index.js +3 -0
  63. package/dist/replay/base.cjs +1 -0
  64. package/dist/replay/base.d.cts +18 -0
  65. package/dist/replay/base.d.ts +18 -0
  66. package/dist/replay/base.js +1 -0
  67. package/dist/replay/handler.cjs +25 -0
  68. package/dist/replay/handler.d.cts +24 -0
  69. package/dist/replay/handler.d.ts +24 -0
  70. package/dist/replay/handler.js +25 -0
  71. package/dist/replay/helper.cjs +1 -0
  72. package/dist/replay/helper.d.cts +34 -0
  73. package/dist/replay/helper.d.ts +34 -0
  74. package/dist/replay/helper.js +1 -0
  75. package/dist/replay/index.cjs +25 -0
  76. package/dist/replay/index.d.cts +6 -0
  77. package/dist/replay/index.d.ts +6 -0
  78. package/dist/replay/index.js +25 -0
  79. package/dist/replay/mode/advance/index.cjs +22 -0
  80. package/dist/replay/mode/advance/index.d.cts +11 -0
  81. package/dist/replay/mode/advance/index.d.ts +11 -0
  82. package/dist/replay/mode/advance/index.js +22 -0
  83. package/dist/replay/mode/advance/reasons/assigner_cases/base.cjs +14 -0
  84. package/dist/replay/mode/advance/reasons/assigner_cases/base.d.cts +137 -0
  85. package/dist/replay/mode/advance/reasons/assigner_cases/base.d.ts +137 -0
  86. package/dist/replay/mode/advance/reasons/assigner_cases/base.js +14 -0
  87. package/dist/replay/mode/advance/reasons/assigner_cases/business_logic_rejection_case/index.cjs +14 -0
  88. package/dist/replay/mode/advance/reasons/assigner_cases/business_logic_rejection_case/index.d.cts +19 -0
  89. package/dist/replay/mode/advance/reasons/assigner_cases/business_logic_rejection_case/index.d.ts +19 -0
  90. package/dist/replay/mode/advance/reasons/assigner_cases/business_logic_rejection_case/index.js +14 -0
  91. package/dist/replay/mode/advance/reasons/assigner_cases/index.cjs +14 -0
  92. package/dist/replay/mode/advance/reasons/assigner_cases/index.d.cts +15 -0
  93. package/dist/replay/mode/advance/reasons/assigner_cases/index.d.ts +15 -0
  94. package/dist/replay/mode/advance/reasons/assigner_cases/index.js +14 -0
  95. package/dist/replay/mode/advance/reasons/assigner_cases/post_trace_response_mutation_case/index.cjs +14 -0
  96. package/dist/replay/mode/advance/reasons/assigner_cases/post_trace_response_mutation_case/index.d.cts +18 -0
  97. package/dist/replay/mode/advance/reasons/assigner_cases/post_trace_response_mutation_case/index.d.ts +18 -0
  98. package/dist/replay/mode/advance/reasons/assigner_cases/post_trace_response_mutation_case/index.js +14 -0
  99. package/dist/replay/mode/advance/reasons/assigner_cases/trace_divergence_case/index.cjs +14 -0
  100. package/dist/replay/mode/advance/reasons/assigner_cases/trace_divergence_case/index.d.cts +18 -0
  101. package/dist/replay/mode/advance/reasons/assigner_cases/trace_divergence_case/index.d.ts +18 -0
  102. package/dist/replay/mode/advance/reasons/assigner_cases/trace_divergence_case/index.js +14 -0
  103. package/dist/replay/mode/advance/reasons/index.cjs +21 -0
  104. package/dist/replay/mode/advance/reasons/index.d.cts +17 -0
  105. package/dist/replay/mode/advance/reasons/index.d.ts +17 -0
  106. package/dist/replay/mode/advance/reasons/index.js +21 -0
  107. package/dist/replay/mode/advance/reasons/reason_assigner.cjs +14 -0
  108. package/dist/replay/mode/advance/reasons/reason_assigner.d.cts +25 -0
  109. package/dist/replay/mode/advance/reasons/reason_assigner.d.ts +25 -0
  110. package/dist/replay/mode/advance/reasons/reason_assigner.js +14 -0
  111. package/dist/replay/mode/advance/reasons/reason_printer.cjs +8 -0
  112. package/dist/replay/mode/advance/reasons/reason_printer.d.cts +25 -0
  113. package/dist/replay/mode/advance/reasons/reason_printer.d.ts +25 -0
  114. package/dist/replay/mode/advance/reasons/reason_printer.js +8 -0
  115. package/dist/replay/mode/advance/reasons/reason_signal.cjs +1 -0
  116. package/dist/replay/mode/advance/reasons/reason_signal.d.cts +87 -0
  117. package/dist/replay/mode/advance/reasons/reason_signal.d.ts +87 -0
  118. package/dist/replay/mode/advance/reasons/reason_signal.js +1 -0
  119. package/dist/replay/mode/advance/replay.cjs +22 -0
  120. package/dist/replay/mode/advance/replay.d.cts +57 -0
  121. package/dist/replay/mode/advance/replay.d.ts +57 -0
  122. package/dist/replay/mode/advance/replay.js +22 -0
  123. package/dist/replay/mode/index.cjs +25 -0
  124. package/dist/replay/mode/index.d.cts +12 -0
  125. package/dist/replay/mode/index.d.ts +12 -0
  126. package/dist/replay/mode/index.js +25 -0
  127. package/dist/replay/mode/smart.replay.cjs +4 -0
  128. package/dist/replay/mode/smart.replay.d.cts +18 -0
  129. package/dist/replay/mode/smart.replay.d.ts +18 -0
  130. package/dist/replay/mode/smart.replay.js +4 -0
  131. package/dist/setup.cjs +7 -0
  132. package/dist/setup.d.cts +27 -0
  133. package/dist/setup.d.ts +27 -0
  134. package/dist/setup.js +7 -0
  135. package/dist/trace/builder.cjs +1 -0
  136. package/dist/trace/builder.d.cts +6 -0
  137. package/dist/trace/builder.d.ts +6 -0
  138. package/dist/trace/builder.js +1 -0
  139. package/dist/trace/context.cjs +2 -0
  140. package/dist/trace/context.d.cts +2 -0
  141. package/dist/trace/context.d.ts +2 -0
  142. package/dist/trace/context.js +2 -0
  143. package/dist/trace/filter.cjs +1 -0
  144. package/dist/trace/filter.d.cts +21 -0
  145. package/dist/trace/filter.d.ts +21 -0
  146. package/dist/trace/filter.js +1 -0
  147. package/dist/trace/index.cjs +2 -0
  148. package/dist/trace/index.d.cts +7 -0
  149. package/dist/trace/index.d.ts +7 -0
  150. package/dist/trace/index.js +2 -0
  151. package/package.json +81 -0
@@ -0,0 +1,12 @@
1
+ export { SmartReplay } from './smart.replay.js';
2
+ export { AdvanceReplay, PrintParams, RootCauseParams, RootCauseReason } from './advance/replay.js';
3
+ import '../../error_handle.helper-CQsPSbuz.js';
4
+ import 'async_hooks';
5
+ import '../../setup.js';
6
+ import '../../index-8u1_ya-u.js';
7
+ import '../../enum/log_level.enum.js';
8
+ import '../base.js';
9
+ import '../../trace/filter.js';
10
+ import '../helper.js';
11
+ import '../handler.js';
12
+ import './advance/reasons/reason_signal.js';
@@ -0,0 +1,25 @@
1
+ var J=Object.defineProperty;var a=(s,e)=>J(s,"name",{value:e,configurable:!0});import w from"chalk";import{ulid as fe}from"ulid";import{AsyncLocalStorage as z}from"async_hooks";import X from"fs";import ee from"chalk";import re from"path";import{bundleRequire as ne}from"bundle-require";var he=new z;import U from"crypto";function O(s){try{return U.createHash("md5").update(s).digest("hex")}catch(e){throw e}}a(O,"cryptoHash");var L="__root__";function W(s){let e=new Map;for(let t of s){let r=t.parentId||L;e.has(r)||e.set(r,[]),e.get(r).push(t)}return e}a(W,"buildTraceTree");function G(s,e,t){return`${t}->${s.name}#${e}`}a(G,"buildSignature");function R(s){try{let n=function(o,l){(t.get(o)||[]).sort((c,p)=>c.start-p.start).forEach((c,p)=>{let f=G(c,p,l),h=O(f);r.push({...c,signature:h,rawSignature:f}),n(c.id,h)})};var e=n;a(n,"walk");let t=W(s),r=[];return n(L,L),r}catch(t){throw t}}a(R,"flattenTrace");var S=class{constructor(e){this.config=e}config;static{a(this,"ReplayFilterManager")}matchPattern(e,t){try{return e instanceof RegExp?e.test(t):e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(t):e===t}catch(r){throw r}}async filterTrace(e){try{if(!this.config.filters||!e||e.length===0)return e;let t=this.config.filters;return e.filter(r=>{let n=r.name;return!t.ignoreSteps?.some(l=>this.matchPattern(l,n))})}catch(t){throw t}}async filterNonOptionalTrace(e){try{if(!this.config.filters||!e||e.length===0)return e;let t=this.config.filters;return e.filter(r=>{let n=r.name;return!t.optionalSteps?.some(l=>this.matchPattern(l,n))})}catch(t){throw t}}isOptionalStep(e){try{return this.config.filters?.optionalSteps?.some(t=>this.matchPattern(t,e))}catch(t){throw t}}async filterResponse(e){try{if(!this.config.filters||!e)return e;let t=Object.keys(e.error);if(t.length===0)return e;let r=this.config.filters;for(let n of t)r.ignoreFields?.includes(n)&&delete e.error[n];return{...e,error:e.error}}catch(t){throw t}}};import"dotenv/config.js";var x=class{constructor(e){this.config=e}config;static{a(this,"ReplayHelper")}get filterManager(){return new S(this.config)}setConfig(e){this.config=e}normalize(e){if(!e)return e;if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return e}stableStringify(e){return JSON.stringify(this.sortKeys(e))}sortKeys(e){return Array.isArray(e)?e.map(t=>this.sortKeys(t)):e&&typeof e=="object"?Object.keys(e).sort().reduce((t,r)=>(t[r]=this.sortKeys(e[r]),t),{}):e}compareTrace(e,t){try{let r=[],n=new Map(e.map(i=>[i.signature,i])),o=new Map(t.map(i=>[i.signature,i])),l={};for(let[i,c]of n)l[c.name]={id:c.id,parentId:c.parentId,original:c.returnData,replay:null},o.has(c.signature)||this.filterManager.isOptionalStep(c.name)||r.push({type:"missing_step",name:c.name,message:`Missing step: ${i}`});for(let[i,c]of o)l[c.name].replay=c.returnData,n.has(c.signature)||i&&this.filterManager.isOptionalStep(c.name)||r.push({type:"extra_step",name:c.name,message:`Extra step: ${i}`});for(let i in l){let c=l[i].original,p=l[i].replay;c!==p&&r.push({type:"trace_return_data_mismatch",name:i,message:"Trace return data mismatch",not_matched:{original:c,replay:p}})}return{isDifferent:r.length>0,issues:r}}catch(r){throw r}}compareResponse(e,t){try{let r=[];e.status!==t.status&&r.push({type:"status_mismatch",message:"Status code mismatch",not_matched:{original:e.status,replay:t.status}});let n=this.normalize(e.error),o=this.normalize(t.error),l=this.stableStringify(n),i=this.stableStringify(o);return l!==i&&r.push({type:"body_mismatch",message:"Response mismatch",not_matched:{original:n,replay:o}}),{isDifferent:r.length>0,issues:r}}catch(r){throw r}}fullUrl(e){return`${process.env.SERVER_URL}${e}`}async sendRequest(e){try{return await fetch(this.fullUrl(e.request.url),{method:e.request.method,headers:{"Content-Type":"application/json","x-is-replay":"true"},body:JSON.stringify(e.request.body)})}catch(t){throw t}}};var _=class{constructor(e){this.config=e}config;static{a(this,"BaseReplay")}get filterManager(){return new S(this.config)}get replayHelper(){return new x(this.config)}};var F=class extends _{constructor(t){super(t);this.config=t}config;static{a(this,"SmartReplay")}print(t){try{let{log:r,replay:n,responseDiff:o,traceDiff:l}=t;if(console.log(w.yellow.bold(`\u25B6 ${r.request.method} ${r.request.url}`)),!o.isDifferent&&!l.isDifferent){console.log(w.green(`[OK] Reponse & Trace match
2
+ `));return}if(o.isDifferent&&console.log(w.red(`[!] Response DIFF
3
+ `)),l.isDifferent){console.log(w.red(`[!] Trace DIFF
4
+ `));for(let i of l.issues)console.log(` - [${i.type}] ${i.name}`)}}catch(r){throw r}}async replay(t){try{t.request.headers["x-replay-id"]=t.meta.id;let r=await this.replayHelper.sendRequest(t),n=await r.json(),o=n.__replay;delete n.__replay;let l=this.replayHelper.compareResponse({error:t.response.error,status:t.response.status},{error:n,status:r.status}),i=R(t.trace||[]),c=R(o.trace||[]),p=this.replayHelper.compareTrace(i,c);this.print({log:t,replay:r,responseDiff:l,traceDiff:p})}catch(r){throw r}}};import d from"chalk";import V from"http";var $={trace_step_match:a((s=.1)=>({weight:s,serverity:u(s),message:`trace_match (+${s}) \u2192 trace fully matches replay`}),"trace_step_match"),trace_step_not_match:a((s=.25)=>({weight:s,serverity:u(s),message:`trace_step_not_match (+${s}) \u2192 trace partially matches replay`}),"trace_step_not_match"),trace_return_data_match:a((s=.1)=>({weight:s,serverity:u(s),message:`trace_return_data_match (+${s}) \u2192 trace return data is consistent`}),"trace_return_data_match"),trace_return_data_not_match:a((s=.25)=>({weight:s,serverity:u(s),message:`trace_return_data_not_match (+${s}) \u2192 trace return data is inconsistent`}),"trace_return_data_not_match"),response_match:a((s=.1)=>({weight:s,serverity:u(s),message:`response_match (+${s}) \u2192 response is consistent`}),"response_match"),response_not_match:a((s=.25)=>({weight:s,serverity:u(s),message:`response_not_match (+${s}) \u2192 response is inconsistent`}),"response_not_match"),response_status_match:a((s=.1)=>({weight:s,serverity:u(s),message:`response_status_match (+${s}) \u2192 response status is consistent`}),"response_status_match"),response_status_not_match:a((s=.25)=>({weight:s,serverity:u(s),message:`response_status_not_match (+${s}) \u2192 response status is inconsistent`}),"response_status_not_match"),logic_error_indicator:a((s=.6)=>({weight:s,serverity:u(s),message:`logic_error_indicator (+${s}) \u2192 original response status >= 400 triggered logic flag`}),"logic_error_indicator")},I={trace_match:{value:!0,message:"flow is clean"},trace_not_match:{value:!1,message:"flow is not clean"},trace_step_match:{value:!0,message:"no mismatch"},trace_step_not_match:{value:!1,message:"mismatch"},trace_return_data_match:{value:!0,message:"no mismatch"},trace_return_data_not_match:{value:!1,message:"mismatch"},response_match:{value:!0,message:"no mismatch"},response_not_match:{value:!1,message:"mismatch"}};function u(s){return s>.75?"high":s>.55?"medium":"low"}a(u,"getSignalLevel");var P=class{static{a(this,"ReasonSignalCls")}findSignalByType(e){try{return $[e]}catch(t){throw t}}sumSignalWeights(e){try{return Object.values(e).reduce((t,r)=>t+r.weight,0)}catch(t){throw t}}};import m from"chalk";var y=class{static{a(this,"BaseAssignerCase")}get evidenceSource(){return I}get signalSource(){return $}getTraceDivergenceSection(e){let t=e.traceDiff.issues;if(t.length===0)return"No divergence";let r=`
5
+ `;for(let n of t)n.type==="missing_step"&&(r+=m.yellow(`
6
+ * ${n.name}(missing_step):
7
+ `),r+=m.green(` \u2192 original: exists
8
+ `),r+=m.red(" \u2192 replay: missing"),r+=`
9
+ `),n.type==="extra_step"&&(r+=m.yellow(`
10
+ * ${n.name}(extra_step):
11
+ `),r+=m.green(` \u2192 original: none
12
+ `),r+=m.red(" \u2192 replay: exists"),r+=`
13
+ `);return r.trim()}getMessageEdvidence(e){return`${this.evidenceSource[e].value} (${this.evidenceSource[e].message})`}getStatusEdvidence(e){let t=V.STATUS_CODES[e]||"Unknown";return`${e} (${t})`}isTraceMatch(e){return!e.traceDiff.isDifferent}isTraceStepMatch(e){return e.traceDiff.issues.length>0?!e.traceDiff.issues.some(t=>t.type==="missing_step"||t.type==="extra_step"):!0}isTraceReturnDataMatch(e){return e.traceDiff.issues.length>0?!e.traceDiff.issues.some(t=>t.type==="trace_return_data_mismatch"):!0}isResponseMatch(e){return!e.responseDiff.isDifferent}isResponseStatusMatch(e){let{originalStatus:t,replayStatus:r}=this.resolveStatus(e);return t===r}resolveStatus(e){return{originalStatus:Number(e.log.response.status),replayStatus:e.replayResultStatus}}getResponseDiffSection(e){let t=e.responseDiff.issues;if(t.length===0)return"No diff";let r=t.length>1?1:0,n=e.responseDiff.issues[r].not_matched;if(!n)return"No diff";let o=n.original||{},l=n.replay||{},i=new Set([...Object.keys(o),...Object.keys(l)]),c=`
14
+ `;for(let p of i){let f=o[p],h=l[p];f!==h&&(c+=m.yellow(` * ${p}:
15
+ `),c+=m.green(` \u2192 original: ${JSON.stringify(f)}
16
+ `),c+=m.red(` \u2192 replay: ${JSON.stringify(h)}
17
+ `))}return c}};var T=class extends y{static{a(this,"BusinessLogicRejectionCase")}condition(e,t){return this.isTraceMatch(e)&&this.isResponseMatch(e)&&t.originalStatus>=400&&t.replayStatus>=400}assign(e){try{let t=this.resolveStatus(e);if(this.condition(e,t)){let r=e.log.trace?.find(o=>o.parentId===null);return{type:"Business Logic Rejection Case (logic_suspicious)",message:"Response indicates error, but execution original and replay result match expected behavior",possibleCauses:["Business rule might not align with actual execution flow","Or validation logic is too strict / misaligned"],evidence:{traceMatch:this.getMessageEdvidence("trace_match"),responseMatch:this.getMessageEdvidence("response_match"),originalStatus:this.getStatusEdvidence(t.originalStatus),finalResponse:typeof r?.returnData=="object"?JSON.stringify(r.returnData,null,2):r?.returnData},confidence:{signals:{trace_match:this.signalSource.trace_step_match(.3),response_match:this.signalSource.response_match(.3),logic_error_indicator:this.signalSource.logic_error_indicator(.2)},result:0},finalMessage:["This is NOT a runtime bug","This is likely a business logic issue"],references:e.log.stack}}}catch(t){throw t}}};var b=class extends y{static{a(this,"PostTraceResponseMutationCase")}assign(e){try{let t=this.resolveStatus(e);if(this.isTraceStepMatch(e)&&!this.isResponseMatch(e)&&this.isTraceReturnDataMatch(e))return{type:"Response Mismatch Case (post_processing_suspicious)",message:"Execution flow is identical, but response output differs",possibleCauses:["Post-processing logic may be inconsistent","Response mapping or transformation may be incorrect","Data changes may affect the final result.","Non-deterministic behavior (e.g. random, time-based, shared state)"],evidence:{traceMatch:this.getMessageEdvidence("trace_match"),responseMatch:this.getMessageEdvidence("response_not_match"),originalStatus:this.getStatusEdvidence(t.originalStatus),responseDiff:this.getResponseDiffSection(e)},confidence:{signals:{trace_step_match:this.signalSource.trace_step_match(.3),response_mismatch:this.signalSource.response_not_match(.2),trace_return_data_match:this.signalSource.trace_return_data_match(.3)},result:0},finalMessage:["Execution logic is stable, but output is inconsistent","This may indicate issues in response transformation or side effects","This may occur after the business logic is execute complete."],references:e.log.stack}}catch(t){throw t}}};var C=class extends y{static{a(this,"TraceDivergenceCase")}assign(e){try{let t=this.resolveStatus(e);if(!this.isTraceStepMatch(e)&&!this.isResponseMatch(e)&&!this.isTraceReturnDataMatch(e)&&!this.isResponseStatusMatch(e))return{type:"Trace Divergence Case (execution_path_mismatch)",message:"Execution path diverged between original and replay",possibleCauses:["Conditional branch logic may behave differently","Environment or shared state may affect execution flow","Request context may not be deterministic","Replay execution may enter different logic branches","Hidden dependencies or side effects may exist"],evidence:{traceMatch:this.getMessageEdvidence("trace_not_match"),originalStatus:this.getStatusEdvidence(t.originalStatus),traceDivergence:this.getTraceDivergenceSection(e),responseDiff:this.getResponseDiffSection(e)},confidence:{signals:{trace_step_not_match:this.signalSource.trace_step_not_match(.45),trace_return_data_not_match:this.signalSource.trace_return_data_not_match(.25),response_not_match:this.signalSource.response_not_match(.15),response_status_not_match:this.signalSource.response_status_not_match(.1)},result:0},finalMessage:["Replay execution diverged from the original execution flow","This may indicate unstable conditions or branch inconsistency","Root cause likely exists before response generation"],references:e.log.stack}}catch(t){throw t}}};var k=class{static{a(this,"ReasonAssigner")}get case(){return{business_logic_rejection:new T,post_trace_response_mutation:new b,trace_divergence:new C}}};import g from"chalk";var E=class{static{a(this,"ReasonPrinter")}get reasonSignal(){return new P}title(e){console.log(g.yellowBright("** Reason Title:")),console.log(`[!] ${e}`)}description(e){console.log(g.yellowBright("** Description:")),console.log(e)}possibleCauses(e){console.log(g.yellowBright("** What I think happened:")),e.forEach(t=>{console.log(` \u2192 ${t}`)})}evidence(e){let t=Object.keys(e);console.log(g.yellowBright("** Evidence I saw:")),t.forEach(r=>{console.log(` \u2192 ${r}: ${e[r]}`)})}confidence(e){console.log(g.yellowBright("** Confidence Reason (why I think this): ")),e.signals&&Object.keys(e.signals).forEach(n=>{console.log(` \u2192 ${e.signals[n].message}`)}),e.result=this.reasonSignal.sumSignalWeights(e.signals);let t=Math.round(e.result*100);console.log(`
18
+ `),console.log(g.yellowBright("** Confidence Result: ")),console.log(g.green.italic.bold(` * score: ${e.result.toFixed(2)} / 1 `)),console.log(g.green.italic.bold(` * percent: ${t} / 100 (%) `))}finalMessage(e){e.length!=0&&(console.log(g.yellowBright("** Final Call:")),e.forEach(t=>{console.log(` \u2192 ${t}`)}))}referencePosition(e){if(e&&(console.log(g.yellowBright("* Reference Position: ")),console.log(" \u2192 Suspected position:",g.red.underline(e.primary?.full_path)),e.context&&e.context.length>0)){let t=e.context.length-1;e.context.forEach((r,n)=>{console.log(` \u2192 (Context ${t-n}): ${r.full_path}`)})}}printReason(e){try{if(!e)return;console.log(g.red.italic.bold(`
19
+ Aeeaeae yohh BUT...`)),this.title(e.type),console.log(`
20
+ `),this.description(e.message),console.log(`
21
+ `),this.possibleCauses(e.possibleCauses),console.log(`
22
+ `),this.evidence(e.evidence),console.log(`
23
+ `),this.confidence(e.confidence),console.log(`
24
+ `),this.finalMessage(e.finalMessage||[]),this.referencePosition(e.references)}catch(t){throw t}}};var N=class extends _{constructor(t){super(t);this.config=t}config;static{a(this,"AdvanceReplay")}get reasonPrinter(){return new E}get reasonAssigner(){return new k}printResponseDiff(t){if(t.isDifferent){console.log(d.red("[!] Response DIFF"));for(let r of t.issues)console.log(` - [${r.type}] ${r.message}`)}else console.log(d.green("[OK] Response MATCH"))}printTraceDiff(t){if(t.isDifferent){console.log(d.red("[!] Trace DIFF"));for(let r of t.issues)console.log(` - [${r.type}] ${r.name}`)}else console.log(d.green("[OK] Trace MATCH"))}printRootCauseIssue(t){if(t.length>0){let r=["performance_issue","performance_warning","performance_regression"];if(!t.every(o=>r.includes(o.type))){console.log(d.red("\u26A0 Root Cause Analysis"));for(let o of t)console.log(` - [${o.type}] ${o.message}`)}}else console.log(d.green("[OK] No root cause issues detected"))}printPerformanceIssue(t){let r=t.filter(n=>n.type==="performance_regression");if(r.length>0){console.log(d.yellow(`
25
+ \u26A0 Performance Regression Detected`));for(let n of r)console.log(`- ${n.step}: ${n.message}`)}}print(t){try{let{log:r,responseDiff:n,traceDiff:o,analysis:l}=t;console.log(d.bgYellowBright.bold(` \u25B6 ${r.request.method} ${r.request.url} `)),this.printResponseDiff(n),this.printTraceDiff(o),this.printRootCauseIssue(l),this.printPerformanceIssue(l),this.printReason(t)}catch(r){throw r}}printReason(t){try{let r=this.reasonAssigner.case.business_logic_rejection.assign(t);this.reasonPrinter.printReason(r);let n=this.reasonAssigner.case.post_trace_response_mutation.assign(t);this.reasonPrinter.printReason(n);let o=this.reasonAssigner.case.trace_divergence.assign(t);this.reasonPrinter.printReason(o)}catch(r){throw r}}analyzeRootCause(t){try{let{responseDiff:r,traceDiff:n,logTrace:o,replayData:l}=t,i=[],c=this.config.filters;r.isDifferent&&n.isDifferent&&i.push({type:"flow_break",message:"Response mismatch caused by trace difference"});let p=c?.expectedPerformance;if(!p)return i;for(let f of o){let h=l?.trace?.find(H=>H.name===f.name);if(!h)continue;let v=(h.duration_ms||0)-(f.duration_ms||0),B=Math.max(f.duration_ms||1,20),A=v/B*100,K=f.name.split("."),M=f.name;K.length==2?M=K[1]:M=K[0];let D=p.steps?.[M]??0;if(D===0)continue;let q=D/2;v>D?i.push({type:"performance_regression",step:f.name,severity:"high",message:`Slow step: +${v}ms > ${D}ms (+${A.toFixed(1)}%)`}):v>q&&i.push({type:"performance_warning",step:f.name,severity:"low",message:`Slight delay: +${v}ms`})}return i}catch(r){throw r}}async getTraceResult(t,r){try{let n=R(t.trace||[]),o=R(r.trace||[]),l=await this.filterManager.filterTrace(n),i=await this.filterManager.filterTrace(o),c=this.replayHelper.compareTrace(l,i);return{logTraceFiltered:l,replayTraceFiltered:i,traceDiff:c}}catch(n){throw n}}async getResponseResult(t,r,n){try{let o=await this.filterManager.filterResponse({error:JSON.parse(t.response.error),status:t.response.status}),l=await this.filterManager.filterResponse({error:r,status:n.status});return{responseDiff:this.replayHelper.compareResponse(o,l)}}catch(o){throw o}}async replay(t){try{let r=await this.replayHelper.sendRequest(t),n=await r.json(),o=n.__replay;delete n.__replay;let l=await this.getResponseResult(t,n,r),i=await this.getTraceResult(t,o),c=this.analyzeRootCause({replayData:o,traceDiff:i.traceDiff,logTrace:i.logTraceFiltered,responseDiff:l.responseDiff});r.status<=400&&c.length==0?this.print({log:t,replayResultStatus:r.status,analysis:[],traceDiff:{isDifferent:!1,issues:[]},responseDiff:{isDifferent:!1,issues:[]}}):this.print({log:t,replayResultStatus:r.status,analysis:c,traceDiff:i.traceDiff,responseDiff:l.responseDiff})}catch(r){throw r}}};export{N as AdvanceReplay,F as SmartReplay};
@@ -0,0 +1,4 @@
1
+ "use strict";var k=Object.create;var g=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var s=(n,t)=>g(n,"name",{value:t,configurable:!0});var _=(n,t)=>{for(var e in t)g(n,e,{get:t[e],enumerable:!0})},v=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of P(t))!E.call(n,o)&&o!==e&&g(n,o,{get:()=>t[o],enumerable:!(r=K(t,o))||r.enumerable});return n};var u=(n,t,e)=>(e=n!=null?k(C(n)):{},v(t||!n||!n.__esModule?g(e,"default",{value:n,enumerable:!0}):e,n)),O=n=>v(g({},"__esModule",{value:!0}),n);var H={};_(H,{SmartReplay:()=>S});module.exports=O(H);var m=u(require("chalk"),1);var N=require("ulid"),D=require("async_hooks");var F=u(require("fs"),1),b=u(require("chalk"),1),I=u(require("path"),1),M=require("bundle-require");var X=new D.AsyncLocalStorage;var T=u(require("crypto"),1);function L(n){try{return T.default.createHash("md5").update(n).digest("hex")}catch(t){throw t}}s(L,"cryptoHash");var d="__root__";function q(n){let t=new Map;for(let e of n){let r=e.parentId||d;t.has(r)||t.set(r,[]),t.get(r).push(e)}return t}s(q,"buildTraceTree");function A(n,t,e){return`${e}->${n.name}#${t}`}s(A,"buildSignature");function R(n){try{let o=function(p,c){(e.get(p)||[]).sort((a,f)=>a.start-f.start).forEach((a,f)=>{let x=A(a,f,c),w=L(x);r.push({...a,signature:w,rawSignature:x}),o(a.id,w)})};var t=o;s(o,"walk");let e=q(n),r=[];return o(d,d),r}catch(e){throw e}}s(R,"flattenTrace");var l=class{constructor(t){this.config=t}config;static{s(this,"ReplayFilterManager")}matchPattern(t,e){try{return t instanceof RegExp?t.test(e):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(e):t===e}catch(r){throw r}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(r=>{let o=r.name;return!e.ignoreSteps?.some(c=>this.matchPattern(c,o))})}catch(e){throw e}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(r=>{let o=r.name;return!e.optionalSteps?.some(c=>this.matchPattern(c,o))})}catch(e){throw e}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(e=>this.matchPattern(e,t))}catch(e){throw e}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let e=Object.keys(t.error);if(e.length===0)return t;let r=this.config.filters;for(let o of e)r.ignoreFields?.includes(o)&&delete t.error[o];return{...t,error:t.error}}catch(e){throw e}}};var Mt=require("dotenv/config.js");var y=class{constructor(t){this.config=t}config;static{s(this,"ReplayHelper")}get filterManager(){return new l(this.config)}setConfig(t){this.config=t}normalize(t){if(!t)return t;if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}stableStringify(t){return JSON.stringify(this.sortKeys(t))}sortKeys(t){return Array.isArray(t)?t.map(e=>this.sortKeys(e)):t&&typeof t=="object"?Object.keys(t).sort().reduce((e,r)=>(e[r]=this.sortKeys(t[r]),e),{}):t}compareTrace(t,e){try{let r=[],o=new Map(t.map(i=>[i.signature,i])),p=new Map(e.map(i=>[i.signature,i])),c={};for(let[i,a]of o)c[a.name]={id:a.id,parentId:a.parentId,original:a.returnData,replay:null},p.has(a.signature)||this.filterManager.isOptionalStep(a.name)||r.push({type:"missing_step",name:a.name,message:`Missing step: ${i}`});for(let[i,a]of p)c[a.name].replay=a.returnData,o.has(a.signature)||i&&this.filterManager.isOptionalStep(a.name)||r.push({type:"extra_step",name:a.name,message:`Extra step: ${i}`});for(let i in c){let a=c[i].original,f=c[i].replay;a!==f&&r.push({type:"trace_return_data_mismatch",name:i,message:"Trace return data mismatch",not_matched:{original:a,replay:f}})}return{isDifferent:r.length>0,issues:r}}catch(r){throw r}}compareResponse(t,e){try{let r=[];t.status!==e.status&&r.push({type:"status_mismatch",message:"Status code mismatch",not_matched:{original:t.status,replay:e.status}});let o=this.normalize(t.error),p=this.normalize(e.error),c=this.stableStringify(o),i=this.stableStringify(p);return c!==i&&r.push({type:"body_mismatch",message:"Response mismatch",not_matched:{original:o,replay:p}}),{isDifferent:r.length>0,issues:r}}catch(r){throw r}}fullUrl(t){return`${process.env.SERVER_URL}${t}`}async sendRequest(t){try{return await fetch(this.fullUrl(t.request.url),{method:t.request.method,headers:{"Content-Type":"application/json","x-is-replay":"true"},body:JSON.stringify(t.request.body)})}catch(e){throw e}}};var h=class{constructor(t){this.config=t}config;static{s(this,"BaseReplay")}get filterManager(){return new l(this.config)}get replayHelper(){return new y(this.config)}};var S=class extends h{constructor(e){super(e);this.config=e}config;static{s(this,"SmartReplay")}print(e){try{let{log:r,replay:o,responseDiff:p,traceDiff:c}=e;if(console.log(m.default.yellow.bold(`\u25B6 ${r.request.method} ${r.request.url}`)),!p.isDifferent&&!c.isDifferent){console.log(m.default.green(`[OK] Reponse & Trace match
2
+ `));return}if(p.isDifferent&&console.log(m.default.red(`[!] Response DIFF
3
+ `)),c.isDifferent){console.log(m.default.red(`[!] Trace DIFF
4
+ `));for(let i of c.issues)console.log(` - [${i.type}] ${i.name}`)}}catch(r){throw r}}async replay(e){try{e.request.headers["x-replay-id"]=e.meta.id;let r=await this.replayHelper.sendRequest(e),o=await r.json(),p=o.__replay;delete o.__replay;let c=this.replayHelper.compareResponse({error:e.response.error,status:e.response.status},{error:o,status:r.status}),i=R(e.trace||[]),a=R(p.trace||[]),f=this.replayHelper.compareTrace(i,a);this.print({log:e,replay:r,responseDiff:c,traceDiff:f})}catch(r){throw r}}};0&&(module.exports={SmartReplay});
@@ -0,0 +1,18 @@
1
+ import { R as ReplayKitLogData } from '../../error_handle.helper-CQsPSbuz.cjs';
2
+ import { ConfigSetup } from '../../setup.cjs';
3
+ import { BaseReplay } from '../base.cjs';
4
+ import 'async_hooks';
5
+ import '../../index-MBKv_hsI.cjs';
6
+ import '../../enum/log_level.enum.cjs';
7
+ import '../../trace/filter.cjs';
8
+ import '../helper.cjs';
9
+ import '../handler.cjs';
10
+
11
+ declare class SmartReplay extends BaseReplay {
12
+ protected config: ConfigSetup;
13
+ constructor(config: ConfigSetup);
14
+ private print;
15
+ replay(log: ReplayKitLogData): Promise<void>;
16
+ }
17
+
18
+ export { SmartReplay };
@@ -0,0 +1,18 @@
1
+ import { R as ReplayKitLogData } from '../../error_handle.helper-CQsPSbuz.js';
2
+ import { ConfigSetup } from '../../setup.js';
3
+ import { BaseReplay } from '../base.js';
4
+ import 'async_hooks';
5
+ import '../../index-8u1_ya-u.js';
6
+ import '../../enum/log_level.enum.js';
7
+ import '../../trace/filter.js';
8
+ import '../helper.js';
9
+ import '../handler.js';
10
+
11
+ declare class SmartReplay extends BaseReplay {
12
+ protected config: ConfigSetup;
13
+ constructor(config: ConfigSetup);
14
+ private print;
15
+ replay(log: ReplayKitLogData): Promise<void>;
16
+ }
17
+
18
+ export { SmartReplay };
@@ -0,0 +1,4 @@
1
+ var w=Object.defineProperty;var a=(p,t)=>w(p,"name",{value:t,configurable:!0});import m from"chalk";import{ulid as J}from"ulid";import{AsyncLocalStorage as D}from"async_hooks";import C from"fs";import _ from"chalk";import F from"path";import{bundleRequire as I}from"bundle-require";var G=new D;import T from"crypto";function S(p){try{return T.createHash("md5").update(p).digest("hex")}catch(t){throw t}}a(S,"cryptoHash");var y="__root__";function L(p){let t=new Map;for(let e of p){let r=e.parentId||y;t.has(r)||t.set(r,[]),t.get(r).push(e)}return t}a(L,"buildTraceTree");function k(p,t,e){return`${e}->${p.name}#${t}`}a(k,"buildSignature");function h(p){try{let i=function(c,s){(e.get(c)||[]).sort((n,f)=>n.start-f.start).forEach((n,f)=>{let d=k(n,f,s),R=S(d);r.push({...n,signature:R,rawSignature:d}),i(n.id,R)})};var t=i;a(i,"walk");let e=L(p),r=[];return i(y,y),r}catch(e){throw e}}a(h,"flattenTrace");var l=class{constructor(t){this.config=t}config;static{a(this,"ReplayFilterManager")}matchPattern(t,e){try{return t instanceof RegExp?t.test(e):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(e):t===e}catch(r){throw r}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(r=>{let i=r.name;return!e.ignoreSteps?.some(s=>this.matchPattern(s,i))})}catch(e){throw e}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(r=>{let i=r.name;return!e.optionalSteps?.some(s=>this.matchPattern(s,i))})}catch(e){throw e}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(e=>this.matchPattern(e,t))}catch(e){throw e}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let e=Object.keys(t.error);if(e.length===0)return t;let r=this.config.filters;for(let i of e)r.ignoreFields?.includes(i)&&delete t.error[i];return{...t,error:t.error}}catch(e){throw e}}};import"dotenv/config.js";var g=class{constructor(t){this.config=t}config;static{a(this,"ReplayHelper")}get filterManager(){return new l(this.config)}setConfig(t){this.config=t}normalize(t){if(!t)return t;if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}stableStringify(t){return JSON.stringify(this.sortKeys(t))}sortKeys(t){return Array.isArray(t)?t.map(e=>this.sortKeys(e)):t&&typeof t=="object"?Object.keys(t).sort().reduce((e,r)=>(e[r]=this.sortKeys(t[r]),e),{}):t}compareTrace(t,e){try{let r=[],i=new Map(t.map(o=>[o.signature,o])),c=new Map(e.map(o=>[o.signature,o])),s={};for(let[o,n]of i)s[n.name]={id:n.id,parentId:n.parentId,original:n.returnData,replay:null},c.has(n.signature)||this.filterManager.isOptionalStep(n.name)||r.push({type:"missing_step",name:n.name,message:`Missing step: ${o}`});for(let[o,n]of c)s[n.name].replay=n.returnData,i.has(n.signature)||o&&this.filterManager.isOptionalStep(n.name)||r.push({type:"extra_step",name:n.name,message:`Extra step: ${o}`});for(let o in s){let n=s[o].original,f=s[o].replay;n!==f&&r.push({type:"trace_return_data_mismatch",name:o,message:"Trace return data mismatch",not_matched:{original:n,replay:f}})}return{isDifferent:r.length>0,issues:r}}catch(r){throw r}}compareResponse(t,e){try{let r=[];t.status!==e.status&&r.push({type:"status_mismatch",message:"Status code mismatch",not_matched:{original:t.status,replay:e.status}});let i=this.normalize(t.error),c=this.normalize(e.error),s=this.stableStringify(i),o=this.stableStringify(c);return s!==o&&r.push({type:"body_mismatch",message:"Response mismatch",not_matched:{original:i,replay:c}}),{isDifferent:r.length>0,issues:r}}catch(r){throw r}}fullUrl(t){return`${process.env.SERVER_URL}${t}`}async sendRequest(t){try{return await fetch(this.fullUrl(t.request.url),{method:t.request.method,headers:{"Content-Type":"application/json","x-is-replay":"true"},body:JSON.stringify(t.request.body)})}catch(e){throw e}}};var u=class{constructor(t){this.config=t}config;static{a(this,"BaseReplay")}get filterManager(){return new l(this.config)}get replayHelper(){return new g(this.config)}};var x=class extends u{constructor(e){super(e);this.config=e}config;static{a(this,"SmartReplay")}print(e){try{let{log:r,replay:i,responseDiff:c,traceDiff:s}=e;if(console.log(m.yellow.bold(`\u25B6 ${r.request.method} ${r.request.url}`)),!c.isDifferent&&!s.isDifferent){console.log(m.green(`[OK] Reponse & Trace match
2
+ `));return}if(c.isDifferent&&console.log(m.red(`[!] Response DIFF
3
+ `)),s.isDifferent){console.log(m.red(`[!] Trace DIFF
4
+ `));for(let o of s.issues)console.log(` - [${o.type}] ${o.name}`)}}catch(r){throw r}}async replay(e){try{e.request.headers["x-replay-id"]=e.meta.id;let r=await this.replayHelper.sendRequest(e),i=await r.json(),c=i.__replay;delete i.__replay;let s=this.replayHelper.compareResponse({error:e.response.error,status:e.response.status},{error:i,status:r.status}),o=h(e.trace||[]),n=h(c.trace||[]),f=this.replayHelper.compareTrace(o,n);this.print({log:e,replay:r,responseDiff:s,traceDiff:f})}catch(r){throw r}}};export{x as SmartReplay};
package/dist/setup.cjs ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";var S=Object.create;var f=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var i=(e,t)=>f(e,"name",{value:t,configurable:!0});var E=(e,t)=>{for(var o in t)f(e,o,{get:t[o],enumerable:!0})},u=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of P(t))!w.call(e,n)&&n!==o&&f(e,n,{get:()=>t[n],enumerable:!(r=y(t,n))||r.enumerable});return e};var a=(e,t,o)=>(o=e!=null?S(h(e)):{},u(t||!e||!e.__esModule?f(o,"default",{value:e,enumerable:!0}):o,e)),k=e=>u(f({},"__esModule",{value:!0}),e);var L={};E(L,{configContent:()=>R,defineConfig:()=>F,defineExpectedPerformance:()=>b,getConfig:()=>v,loadConfig:()=>C});module.exports=k(L);var g=a(require("fs"),1),m=a(require("chalk"),1),s=a(require("path"),1),l=require("bundle-require");var x="storage/logs",d={logSetup:{path:x}};function R(){return`import { defineConfig } from 'replay-kit';
2
+
3
+ export default defineConfig({
4
+ logSetup: {
5
+ path: '${x}',
6
+ }
7
+ });`}i(R,"configContent");var p,c,F=i(e=>e,"defineConfig"),b=i(e=>e,"defineExpectedPerformance"),v=i(async()=>{try{return p||await C(),p}catch(e){throw e}},"getConfig"),C=i(async()=>{try{let e=s.default.resolve("replay-kit.config.ts");if(!g.default.existsSync(e)){console.warn(m.default.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),p=d;return}let t=s.default.resolve("replay-kit.performance.config.ts");g.default.existsSync(t)&&(c=await(await(0,l.bundleRequire)({filepath:t})).mod.default);let r=await(await(0,l.bundleRequire)({filepath:e})).mod.default;c&&r.filters&&(r.filters.expectedPerformance=c),p=r}catch(e){throw p=d,e}},"loadConfig");0&&(module.exports={configContent,defineConfig,defineExpectedPerformance,getConfig,loadConfig});
@@ -0,0 +1,27 @@
1
+ import { L as LoggerSetup } from './index-MBKv_hsI.cjs';
2
+ import './enum/log_level.enum.cjs';
3
+ import './error_handle.helper-CQsPSbuz.cjs';
4
+ import 'async_hooks';
5
+
6
+ type ExpectedPerformanceConfig = {
7
+ steps?: Record<string, number>;
8
+ endpoints?: Record<string, number>;
9
+ };
10
+ type FilterConfig = {
11
+ ignoreSteps?: string[];
12
+ ignoreFields?: string[];
13
+ optionalSteps?: string[];
14
+ sensitiveFields?: string[];
15
+ expectedPerformance?: ExpectedPerformanceConfig;
16
+ };
17
+ type ConfigSetup = {
18
+ logSetup: LoggerSetup;
19
+ filters?: FilterConfig;
20
+ };
21
+ declare function configContent(): string;
22
+ declare const defineConfig: (setup: ConfigSetup) => ConfigSetup;
23
+ declare const defineExpectedPerformance: (expected: ExpectedPerformanceConfig) => ExpectedPerformanceConfig;
24
+ declare const getConfig: () => Promise<ConfigSetup>;
25
+ declare const loadConfig: () => Promise<void>;
26
+
27
+ export { type ConfigSetup, type ExpectedPerformanceConfig, type FilterConfig, configContent, defineConfig, defineExpectedPerformance, getConfig, loadConfig };
@@ -0,0 +1,27 @@
1
+ import { L as LoggerSetup } from './index-8u1_ya-u.js';
2
+ import './enum/log_level.enum.js';
3
+ import './error_handle.helper-CQsPSbuz.js';
4
+ import 'async_hooks';
5
+
6
+ type ExpectedPerformanceConfig = {
7
+ steps?: Record<string, number>;
8
+ endpoints?: Record<string, number>;
9
+ };
10
+ type FilterConfig = {
11
+ ignoreSteps?: string[];
12
+ ignoreFields?: string[];
13
+ optionalSteps?: string[];
14
+ sensitiveFields?: string[];
15
+ expectedPerformance?: ExpectedPerformanceConfig;
16
+ };
17
+ type ConfigSetup = {
18
+ logSetup: LoggerSetup;
19
+ filters?: FilterConfig;
20
+ };
21
+ declare function configContent(): string;
22
+ declare const defineConfig: (setup: ConfigSetup) => ConfigSetup;
23
+ declare const defineExpectedPerformance: (expected: ExpectedPerformanceConfig) => ExpectedPerformanceConfig;
24
+ declare const getConfig: () => Promise<ConfigSetup>;
25
+ declare const loadConfig: () => Promise<void>;
26
+
27
+ export { type ConfigSetup, type ExpectedPerformanceConfig, type FilterConfig, configContent, defineConfig, defineExpectedPerformance, getConfig, loadConfig };
package/dist/setup.js ADDED
@@ -0,0 +1,7 @@
1
+ var s=Object.defineProperty;var t=(e,r)=>s(e,"name",{value:r,configurable:!0});import f from"fs";import l from"chalk";import p from"path";import{bundleRequire as a}from"bundle-require";var g="storage/logs",c={logSetup:{path:g}};function w(){return`import { defineConfig } from 'replay-kit';
2
+
3
+ export default defineConfig({
4
+ logSetup: {
5
+ path: '${g}',
6
+ }
7
+ });`}t(w,"configContent");var o,i,E=t(e=>e,"defineConfig"),k=t(e=>e,"defineExpectedPerformance"),R=t(async()=>{try{return o||await u(),o}catch(e){throw e}},"getConfig"),u=t(async()=>{try{let e=p.resolve("replay-kit.config.ts");if(!f.existsSync(e)){console.warn(l.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),o=c;return}let r=p.resolve("replay-kit.performance.config.ts");f.existsSync(r)&&(i=await(await a({filepath:r})).mod.default);let n=await(await a({filepath:e})).mod.default;i&&n.filters&&(n.filters.expectedPerformance=i),o=n}catch(e){throw o=c,e}},"loadConfig");export{w as configContent,E as defineConfig,k as defineExpectedPerformance,R as getConfig,u as loadConfig};
@@ -0,0 +1 @@
1
+ "use strict";var S=Object.create;var s=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var o=(t,e)=>s(t,"name",{value:e,configurable:!0});var v=(t,e)=>{for(var r in e)s(t,r,{get:e[r],enumerable:!0})},u=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of x(e))!w.call(t,i)&&i!==r&&s(t,i,{get:()=>e[i],enumerable:!(n=R(e,i))||n.enumerable});return t};var c=(t,e,r)=>(r=t!=null?S(L(t)):{},u(e||!t||!t.__esModule?s(r,"default",{value:t,enumerable:!0}):r,t)),P=t=>u(s({},"__esModule",{value:!0}),t);var _={};v(_,{flattenTrace:()=>T});module.exports=P(_);var k=c(require("fs"),1),D=c(require("chalk"),1),C=c(require("path"),1),K=require("bundle-require");var m=c(require("crypto"),1);function h(t){try{return m.default.createHash("md5").update(t).digest("hex")}catch(e){throw e}}o(h,"cryptoHash");var f="__root__";function E(t){let e=new Map;for(let r of t){let n=r.parentId||f;e.has(n)||e.set(n,[]),e.get(n).push(r)}return e}o(E,"buildTraceTree");function b(t,e,r){return`${r}->${t.name}#${e}`}o(b,"buildSignature");function T(t){try{let i=function(d,y){(r.get(d)||[]).sort((a,p)=>a.start-p.start).forEach((a,p)=>{let g=b(a,p,y),l=h(g);n.push({...a,signature:l,rawSignature:g}),i(a.id,l)})};var e=i;o(i,"walk");let r=E(t),n=[];return i(f,f),n}catch(r){throw r}}o(T,"flattenTrace");0&&(module.exports={flattenTrace});
@@ -0,0 +1,6 @@
1
+ import { a as ReplayKitTraceEvent } from '../error_handle.helper-CQsPSbuz.cjs';
2
+ import 'async_hooks';
3
+
4
+ declare function flattenTrace(trace: ReplayKitTraceEvent[]): ReplayKitTraceEvent[];
5
+
6
+ export { flattenTrace };
@@ -0,0 +1,6 @@
1
+ import { a as ReplayKitTraceEvent } from '../error_handle.helper-CQsPSbuz.js';
2
+ import 'async_hooks';
3
+
4
+ declare function flattenTrace(trace: ReplayKitTraceEvent[]): ReplayKitTraceEvent[];
5
+
6
+ export { flattenTrace };
@@ -0,0 +1 @@
1
+ var m=Object.defineProperty;var t=(r,e)=>m(r,"name",{value:e,configurable:!0});import I from"fs";import A from"chalk";import J from"path";import{bundleRequire as B}from"bundle-require";import h from"crypto";function g(r){try{return h.createHash("md5").update(r).digest("hex")}catch(e){throw e}}t(g,"cryptoHash");var c="__root__";function d(r){let e=new Map;for(let o of r){let n=o.parentId||c;e.has(n)||e.set(n,[]),e.get(n).push(o)}return e}t(d,"buildTraceTree");function y(r,e,o){return`${o}->${r.name}#${e}`}t(y,"buildSignature");function pt(r){try{let a=function(l,u){(o.get(l)||[]).sort((i,s)=>i.start-s.start).forEach((i,s)=>{let p=y(i,s,u),f=g(p);n.push({...i,signature:f,rawSignature:p}),a(i.id,f)})};var e=a;t(a,"walk");let o=d(r),n=[];return a(c,c),n}catch(o){throw o}}t(pt,"flattenTrace");export{pt as flattenTrace};
@@ -0,0 +1,2 @@
1
+ "use strict";var D=Object.create;var i=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var o=(e,t)=>i(e,"name",{value:t,configurable:!0});var L=(e,t)=>{for(var r in t)i(e,r,{get:t[r],enumerable:!0})},C=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of A(t))!K.call(e,a)&&a!==r&&i(e,a,{get:()=>t[a],enumerable:!(n=F(t,a))||n.enumerable});return e};var g=(e,t,r)=>(r=e!=null?D(_(e)):{},C(t||!e||!e.__esModule?i(r,"default",{value:e,enumerable:!0}):r,e)),O=e=>C(i({},"__esModule",{value:!0}),e);var q={};L(q,{addTrace:()=>S,als:()=>x,traceStep:()=>j});module.exports=O(q);var v=require("ulid"),E=require("async_hooks");var m=g(require("fs"),1),R=g(require("chalk"),1),d=g(require("path"),1),y=require("bundle-require");var $="storage/logs",P={logSetup:{path:$}};var f,u;var T=o(async()=>{try{return f||await G(),f}catch(e){throw e}},"getConfig"),G=o(async()=>{try{let e=d.default.resolve("replay-kit.config.ts");if(!m.default.existsSync(e)){console.warn(R.default.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),f=P;return}let t=d.default.resolve("replay-kit.performance.config.ts");m.default.existsSync(t)&&(u=await(await(0,y.bundleRequire)({filepath:t})).mod.default);let n=await(await(0,y.bundleRequire)({filepath:e})).mod.default;u&&n.filters&&(n.filters.expectedPerformance=u),f=n}catch(e){throw f=P,e}},"loadConfig");var p=class{static{o(this,"StackHelper")}static convertStackToReference(t){try{let r=t.split("/"),n=r[r.length-1],a=n.split(":")[0],s=parseInt(n.split(":")[1]),l=parseInt(n.split(":")[2]);return{file:a,position:[s,l],full_path:t}}catch(r){throw r}}static convertStackToGetOne(t,r){try{return t?`src/${t?.split(`
2
+ `)[r]?.replace(")","").split("src/")[1]}`:"invalid_stack"}catch(n){throw n}}};var x=new E.AsyncLocalStorage;function S(e){try{let t=x.getStore();if(!t)return;t.trace.push(e)}catch(t){throw t}}o(S,"addTrace");async function N(e){try{let r=(await T()).filters?.sensitiveFields;if(!r)return e;for(let n in e)r.includes(n)&&(e[n]="***");return e}catch(t){throw t}}o(N,"deleteSensitiveField");async function j(e){try{let t=x.getStore(),r=e.args??[];if(!t)return await e.fn(...r);let n=Date.now(),a=(0,v.ulid)(),s=t.spanStack[t.spanStack.length-1];t.spanStack.push({id:a,name:e.name});let l=`${e.type}.${e.name}`,h=new Error("err")?.stack,I=p.convertStackToGetOne(h,2),k=p.convertStackToReference(I);k.function=e.fn.name,t.stack.context||(t.stack.context=[]),t.stack.context?.push(k);let w={id:a,traceId:t.traceId,parentId:s?.id??null,type:e.type,name:l,meta:e.meta,payload:e.args,start:n};try{let c=await e.fn(...r),b=typeof c=="object"&&c!==null?await N(c):c;return S({...w,duration_ms:Date.now()-n,returnData:b,status:"success"}),c}catch(c){throw S({...w,duration_ms:Date.now()-n,returnData:c,status:"error"}),c}finally{t.spanStack.pop()}}catch(t){throw t}}o(j,"traceStep");0&&(module.exports={addTrace,als,traceStep});
@@ -0,0 +1,2 @@
1
+ import 'async_hooks';
2
+ export { a as ReplayKitTraceEvent, e as TraceContext, T as TraceOptions, c as addTrace, f as als, t as traceStep } from '../error_handle.helper-CQsPSbuz.cjs';
@@ -0,0 +1,2 @@
1
+ import 'async_hooks';
2
+ export { a as ReplayKitTraceEvent, e as TraceContext, T as TraceOptions, c as addTrace, f as als, t as traceStep } from '../error_handle.helper-CQsPSbuz.js';
@@ -0,0 +1,2 @@
1
+ var R=Object.defineProperty;var a=(t,e)=>R(t,"name",{value:e,configurable:!0});import{ulid as I}from"ulid";import{AsyncLocalStorage as b}from"async_hooks";import d from"fs";import T from"chalk";import y from"path";import{bundleRequire as S}from"bundle-require";var v="storage/logs",x={logSetup:{path:v}};var i,l;var h=a(async()=>{try{return i||await E(),i}catch(t){throw t}},"getConfig"),E=a(async()=>{try{let t=y.resolve("replay-kit.config.ts");if(!d.existsSync(t)){console.warn(T.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),i=x;return}let e=y.resolve("replay-kit.performance.config.ts");d.existsSync(e)&&(l=await(await S({filepath:e})).mod.default);let r=await(await S({filepath:t})).mod.default;l&&r.filters&&(r.filters.expectedPerformance=l),i=r}catch(t){throw i=x,t}},"loadConfig");var f=class{static{a(this,"StackHelper")}static convertStackToReference(e){try{let n=e.split("/"),r=n[n.length-1],c=r.split(":")[0],s=parseInt(r.split(":")[1]),p=parseInt(r.split(":")[2]);return{file:c,position:[s,p],full_path:e}}catch(n){throw n}}static convertStackToGetOne(e,n){try{return e?`src/${e?.split(`
2
+ `)[n]?.replace(")","").split("src/")[1]}`:"invalid_stack"}catch(r){throw r}}};var w=new b;function k(t){try{let e=w.getStore();if(!e)return;e.trace.push(t)}catch(e){throw e}}a(k,"addTrace");async function D(t){try{let n=(await h()).filters?.sensitiveFields;if(!n)return t;for(let r in t)n.includes(r)&&(t[r]="***");return t}catch(e){throw e}}a(D,"deleteSensitiveField");async function H(t){try{let e=w.getStore(),n=t.args??[];if(!e)return await t.fn(...n);let r=Date.now(),c=I(),s=e.spanStack[e.spanStack.length-1];e.spanStack.push({id:c,name:t.name});let p=`${t.type}.${t.name}`,g=new Error("err")?.stack,C=f.convertStackToGetOne(g,2),u=f.convertStackToReference(C);u.function=t.fn.name,e.stack.context||(e.stack.context=[]),e.stack.context?.push(u);let m={id:c,traceId:e.traceId,parentId:s?.id??null,type:t.type,name:p,meta:t.meta,payload:t.args,start:r};try{let o=await t.fn(...n),P=typeof o=="object"&&o!==null?await D(o):o;return k({...m,duration_ms:Date.now()-r,returnData:P,status:"success"}),o}catch(o){throw k({...m,duration_ms:Date.now()-r,returnData:o,status:"error"}),o}finally{e.spanStack.pop()}}catch(e){throw e}}a(H,"traceStep");export{k as addTrace,w as als,H as traceStep};
@@ -0,0 +1 @@
1
+ "use strict";var o=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var f=(n,t)=>o(n,"name",{value:t,configurable:!0});var p=(n,t)=>{for(var r in t)o(n,r,{get:t[r],enumerable:!0})},a=(n,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of g(t))!u.call(n,e)&&e!==r&&o(n,e,{get:()=>t[e],enumerable:!(i=h(t,e))||i.enumerable});return n};var m=n=>a(o({},"__esModule",{value:!0}),n);var y={};p(y,{ReplayFilterManager:()=>c});module.exports=m(y);var c=class{constructor(t){this.config=t}config;static{f(this,"ReplayFilterManager")}matchPattern(t,r){try{return t instanceof RegExp?t.test(r):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(r):t===r}catch(i){throw i}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let r=this.config.filters;return t.filter(i=>{let e=i.name;return!r.ignoreSteps?.some(s=>this.matchPattern(s,e))})}catch(r){throw r}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let r=this.config.filters;return t.filter(i=>{let e=i.name;return!r.optionalSteps?.some(s=>this.matchPattern(s,e))})}catch(r){throw r}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(r=>this.matchPattern(r,t))}catch(r){throw r}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let r=Object.keys(t.error);if(r.length===0)return t;let i=this.config.filters;for(let e of r)i.ignoreFields?.includes(e)&&delete t.error[e];return{...t,error:t.error}}catch(r){throw r}}};0&&(module.exports={ReplayFilterManager});
@@ -0,0 +1,21 @@
1
+ import { ConfigSetup } from '../setup.cjs';
2
+ import { a as ReplayKitTraceEvent } from '../error_handle.helper-CQsPSbuz.cjs';
3
+ import '../index-MBKv_hsI.cjs';
4
+ import '../enum/log_level.enum.cjs';
5
+ import 'async_hooks';
6
+
7
+ type FilterResponseField = {
8
+ error: Record<string, any>;
9
+ status: number | string;
10
+ };
11
+ declare class ReplayFilterManager {
12
+ protected config: ConfigSetup;
13
+ constructor(config: ConfigSetup);
14
+ private matchPattern;
15
+ filterTrace(trace: ReplayKitTraceEvent[]): Promise<ReplayKitTraceEvent[]>;
16
+ filterNonOptionalTrace(trace: ReplayKitTraceEvent[]): Promise<ReplayKitTraceEvent[]>;
17
+ isOptionalStep(name: string): boolean | undefined;
18
+ filterResponse(responseData: FilterResponseField): Promise<FilterResponseField>;
19
+ }
20
+
21
+ export { ReplayFilterManager };
@@ -0,0 +1,21 @@
1
+ import { ConfigSetup } from '../setup.js';
2
+ import { a as ReplayKitTraceEvent } from '../error_handle.helper-CQsPSbuz.js';
3
+ import '../index-8u1_ya-u.js';
4
+ import '../enum/log_level.enum.js';
5
+ import 'async_hooks';
6
+
7
+ type FilterResponseField = {
8
+ error: Record<string, any>;
9
+ status: number | string;
10
+ };
11
+ declare class ReplayFilterManager {
12
+ protected config: ConfigSetup;
13
+ constructor(config: ConfigSetup);
14
+ private matchPattern;
15
+ filterTrace(trace: ReplayKitTraceEvent[]): Promise<ReplayKitTraceEvent[]>;
16
+ filterNonOptionalTrace(trace: ReplayKitTraceEvent[]): Promise<ReplayKitTraceEvent[]>;
17
+ isOptionalStep(name: string): boolean | undefined;
18
+ filterResponse(responseData: FilterResponseField): Promise<FilterResponseField>;
19
+ }
20
+
21
+ export { ReplayFilterManager };
@@ -0,0 +1 @@
1
+ var l=Object.defineProperty;var s=(o,t)=>l(o,"name",{value:t,configurable:!0});var c=class{constructor(t){this.config=t}config;static{s(this,"ReplayFilterManager")}matchPattern(t,r){try{return t instanceof RegExp?t.test(r):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(r):t===r}catch(e){throw e}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let r=this.config.filters;return t.filter(e=>{let i=e.name;return!r.ignoreSteps?.some(n=>this.matchPattern(n,i))})}catch(r){throw r}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let r=this.config.filters;return t.filter(e=>{let i=e.name;return!r.optionalSteps?.some(n=>this.matchPattern(n,i))})}catch(r){throw r}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(r=>this.matchPattern(r,t))}catch(r){throw r}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let r=Object.keys(t.error);if(r.length===0)return t;let e=this.config.filters;for(let i of r)e.ignoreFields?.includes(i)&&delete t.error[i];return{...t,error:t.error}}catch(r){throw r}}};export{c as ReplayFilterManager};
@@ -0,0 +1,2 @@
1
+ "use strict";var _=Object.create;var g=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var $=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty;var a=(r,t)=>g(r,"name",{value:t,configurable:!0});var M=(r,t)=>{for(var e in t)g(r,e,{get:t[e],enumerable:!0})},P=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of N(t))!A.call(r,o)&&o!==e&&g(r,o,{get:()=>t[o],enumerable:!(n=I(t,o))||n.enumerable});return r};var y=(r,t,e)=>(e=r!=null?_($(r)):{},P(t||!r||!r.__esModule?g(e,"default",{value:r,enumerable:!0}):e,r)),J=r=>P(g({},"__esModule",{value:!0}),r);var Q={};M(Q,{ReplayFilterManager:()=>T,addTrace:()=>v,als:()=>k,flattenTrace:()=>W,traceStep:()=>B});module.exports=J(Q);var C=require("ulid"),O=require("async_hooks");var S=y(require("fs"),1),K=y(require("chalk"),1),R=y(require("path"),1),x=require("bundle-require");var j="storage/logs",E={logSetup:{path:j}};var u,d;var w=a(async()=>{try{return u||await q(),u}catch(r){throw r}},"getConfig"),q=a(async()=>{try{let r=R.default.resolve("replay-kit.config.ts");if(!S.default.existsSync(r)){console.warn(K.default.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),u=E;return}let t=R.default.resolve("replay-kit.performance.config.ts");S.default.existsSync(t)&&(d=await(await(0,x.bundleRequire)({filepath:t})).mod.default);let n=await(await(0,x.bundleRequire)({filepath:r})).mod.default;d&&n.filters&&(n.filters.expectedPerformance=d),u=n}catch(r){throw u=E,r}},"loadConfig");var m=class{static{a(this,"StackHelper")}static convertStackToReference(t){try{let e=t.split("/"),n=e[e.length-1],o=n.split(":")[0],s=parseInt(n.split(":")[1]),c=parseInt(n.split(":")[2]);return{file:o,position:[s,c],full_path:t}}catch(e){throw e}}static convertStackToGetOne(t,e){try{return t?`src/${t?.split(`
2
+ `)[e]?.replace(")","").split("src/")[1]}`:"invalid_stack"}catch(n){throw n}}};var k=new O.AsyncLocalStorage;function v(r){try{let t=k.getStore();if(!t)return;t.trace.push(r)}catch(t){throw t}}a(v,"addTrace");async function H(r){try{let e=(await w()).filters?.sensitiveFields;if(!e)return r;for(let n in r)e.includes(n)&&(r[n]="***");return r}catch(t){throw t}}a(H,"deleteSensitiveField");async function B(r){try{let t=k.getStore(),e=r.args??[];if(!t)return await r.fn(...e);let n=Date.now(),o=(0,C.ulid)(),s=t.spanStack[t.spanStack.length-1];t.spanStack.push({id:o,name:r.name});let c=`${r.type}.${r.name}`,h=new Error("err")?.stack,p=m.convertStackToGetOne(h,2),f=m.convertStackToReference(p);f.function=r.fn.name,t.stack.context||(t.stack.context=[]),t.stack.context?.push(f);let l={id:o,traceId:t.traceId,parentId:s?.id??null,type:r.type,name:c,meta:r.meta,payload:r.args,start:n};try{let i=await r.fn(...e),F=typeof i=="object"&&i!==null?await H(i):i;return v({...l,duration_ms:Date.now()-n,returnData:F,status:"success"}),i}catch(i){throw v({...l,duration_ms:Date.now()-n,returnData:i,status:"error"}),i}finally{t.spanStack.pop()}}catch(t){throw t}}a(B,"traceStep");var b=y(require("crypto"),1);function D(r){try{return b.default.createHash("md5").update(r).digest("hex")}catch(t){throw t}}a(D,"cryptoHash");var L="__root__";function G(r){let t=new Map;for(let e of r){let n=e.parentId||L;t.has(n)||t.set(n,[]),t.get(n).push(e)}return t}a(G,"buildTraceTree");function z(r,t,e){return`${e}->${r.name}#${t}`}a(z,"buildSignature");function W(r){try{let o=function(s,c){(e.get(s)||[]).sort((p,f)=>p.start-f.start).forEach((p,f)=>{let l=z(p,f,c),i=D(l);n.push({...p,signature:i,rawSignature:l}),o(p.id,i)})};var t=o;a(o,"walk");let e=G(r),n=[];return o(L,L),n}catch(e){throw e}}a(W,"flattenTrace");var T=class{constructor(t){this.config=t}config;static{a(this,"ReplayFilterManager")}matchPattern(t,e){try{return t instanceof RegExp?t.test(e):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(e):t===e}catch(n){throw n}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(n=>{let o=n.name;return!e.ignoreSteps?.some(c=>this.matchPattern(c,o))})}catch(e){throw e}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(n=>{let o=n.name;return!e.optionalSteps?.some(c=>this.matchPattern(c,o))})}catch(e){throw e}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(e=>this.matchPattern(e,t))}catch(e){throw e}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let e=Object.keys(t.error);if(e.length===0)return t;let n=this.config.filters;for(let o of e)n.ignoreFields?.includes(o)&&delete t.error[o];return{...t,error:t.error}}catch(e){throw e}}};0&&(module.exports={ReplayFilterManager,addTrace,als,flattenTrace,traceStep});
@@ -0,0 +1,7 @@
1
+ export { a as ReplayKitTraceEvent, e as TraceContext, T as TraceOptions, c as addTrace, f as als, t as traceStep } from '../error_handle.helper-CQsPSbuz.cjs';
2
+ export { flattenTrace } from './builder.cjs';
3
+ export { ReplayFilterManager } from './filter.cjs';
4
+ import 'async_hooks';
5
+ import '../setup.cjs';
6
+ import '../index-MBKv_hsI.cjs';
7
+ import '../enum/log_level.enum.cjs';
@@ -0,0 +1,7 @@
1
+ export { a as ReplayKitTraceEvent, e as TraceContext, T as TraceOptions, c as addTrace, f as als, t as traceStep } from '../error_handle.helper-CQsPSbuz.js';
2
+ export { flattenTrace } from './builder.js';
3
+ export { ReplayFilterManager } from './filter.js';
4
+ import 'async_hooks';
5
+ import '../setup.js';
6
+ import '../index-8u1_ya-u.js';
7
+ import '../enum/log_level.enum.js';
@@ -0,0 +1,2 @@
1
+ var E=Object.defineProperty;var o=(r,t)=>E(r,"name",{value:t,configurable:!0});import{ulid as b}from"ulid";import{AsyncLocalStorage as D}from"async_hooks";import S from"fs";import K from"chalk";import R from"path";import{bundleRequire as x}from"bundle-require";var C="storage/logs",w={logSetup:{path:C}};var g,y;var h=o(async()=>{try{return g||await O(),g}catch(r){throw r}},"getConfig"),O=o(async()=>{try{let r=R.resolve("replay-kit.config.ts");if(!S.existsSync(r)){console.warn(K.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),g=w;return}let t=R.resolve("replay-kit.performance.config.ts");S.existsSync(t)&&(y=await(await x({filepath:t})).mod.default);let n=await(await x({filepath:r})).mod.default;y&&n.filters&&(n.filters.expectedPerformance=y),g=n}catch(r){throw g=w,r}},"loadConfig");var u=class{static{o(this,"StackHelper")}static convertStackToReference(t){try{let e=t.split("/"),n=e[e.length-1],a=n.split(":")[0],s=parseInt(n.split(":")[1]),c=parseInt(n.split(":")[2]);return{file:a,position:[s,c],full_path:t}}catch(e){throw e}}static convertStackToGetOne(t,e){try{return t?`src/${t?.split(`
2
+ `)[e]?.replace(")","").split("src/")[1]}`:"invalid_stack"}catch(n){throw n}}};var k=new D;function v(r){try{let t=k.getStore();if(!t)return;t.trace.push(r)}catch(t){throw t}}o(v,"addTrace");async function F(r){try{let e=(await h()).filters?.sensitiveFields;if(!e)return r;for(let n in r)e.includes(n)&&(r[n]="***");return r}catch(t){throw t}}o(F,"deleteSensitiveField");async function V(r){try{let t=k.getStore(),e=r.args??[];if(!t)return await r.fn(...e);let n=Date.now(),a=b(),s=t.spanStack[t.spanStack.length-1];t.spanStack.push({id:a,name:r.name});let c=`${r.type}.${r.name}`,m=new Error("err")?.stack,p=u.convertStackToGetOne(m,2),f=u.convertStackToReference(p);f.function=r.fn.name,t.stack.context||(t.stack.context=[]),t.stack.context?.push(f);let l={id:a,traceId:t.traceId,parentId:s?.id??null,type:r.type,name:c,meta:r.meta,payload:r.args,start:n};try{let i=await r.fn(...e),P=typeof i=="object"&&i!==null?await F(i):i;return v({...l,duration_ms:Date.now()-n,returnData:P,status:"success"}),i}catch(i){throw v({...l,duration_ms:Date.now()-n,returnData:i,status:"error"}),i}finally{t.spanStack.pop()}}catch(t){throw t}}o(V,"traceStep");import _ from"crypto";function L(r){try{return _.createHash("md5").update(r).digest("hex")}catch(t){throw t}}o(L,"cryptoHash");var d="__root__";function I(r){let t=new Map;for(let e of r){let n=e.parentId||d;t.has(n)||t.set(n,[]),t.get(n).push(e)}return t}o(I,"buildTraceTree");function N(r,t,e){return`${e}->${r.name}#${t}`}o(N,"buildSignature");function Ct(r){try{let a=function(s,c){(e.get(s)||[]).sort((p,f)=>p.start-f.start).forEach((p,f)=>{let l=N(p,f,c),i=L(l);n.push({...p,signature:i,rawSignature:l}),a(p.id,i)})};var t=a;o(a,"walk");let e=I(r),n=[];return a(d,d),n}catch(e){throw e}}o(Ct,"flattenTrace");var T=class{constructor(t){this.config=t}config;static{o(this,"ReplayFilterManager")}matchPattern(t,e){try{return t instanceof RegExp?t.test(e):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(e):t===e}catch(n){throw n}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(n=>{let a=n.name;return!e.ignoreSteps?.some(c=>this.matchPattern(c,a))})}catch(e){throw e}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(n=>{let a=n.name;return!e.optionalSteps?.some(c=>this.matchPattern(c,a))})}catch(e){throw e}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(e=>this.matchPattern(e,t))}catch(e){throw e}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let e=Object.keys(t.error);if(e.length===0)return t;let n=this.config.filters;for(let a of e)n.ignoreFields?.includes(a)&&delete t.error[a];return{...t,error:t.error}}catch(e){throw e}}};export{T as ReplayFilterManager,v as addTrace,k as als,Ct as flattenTrace,V as traceStep};
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@replay-kit/core",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "private": false,
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "description": "Replay real production requests with full context to reproduce, trace, and fix bugs instantly.",
10
+ "main": "dist/index.js",
11
+ "module": "dist/index.mjs",
12
+ "types": "dist/index.d.ts",
13
+ "files": [
14
+ "dist",
15
+ "LICENSE",
16
+ "README.md"
17
+ ],
18
+ "exports": {
19
+ ".": {
20
+ "import": "./dist/index.js",
21
+ "require": "./dist/index.js"
22
+ }
23
+ },
24
+ "bin": {
25
+ "replay-kit": "./dist/cli.js"
26
+ },
27
+ "scripts": {
28
+ "build:2": "rimraf dist && tsup && chmod +x dist/cli.js",
29
+ "build": "rimraf dist && tsup",
30
+ "dev": "nodemon --watch src --exec \"tsx\" src/server/index.ts",
31
+ "build:library": "tsc && cpx \"dist/**/*\" \"node_modules/replay-kit\"",
32
+ "test": "vitest",
33
+ "publish-patch": "npm version patch && npm publish --access public",
34
+ "publish-minor": "npm version minor && npm publish --access public",
35
+ "publish-major": "npm version major && npm publish --access public",
36
+ "git-commit-dirty": "git add . && git commit -m 'Update to prepare publish'"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/Poppyyddod/ReplayKit.git"
41
+ },
42
+ "keywords": [
43
+ "typescript",
44
+ "backend",
45
+ "request",
46
+ "log",
47
+ "replay",
48
+ "debug"
49
+ ],
50
+ "license": "MIT",
51
+ "dependencies": {
52
+ "@types/express": "^5.0.6",
53
+ "bundle-require": "^5.1.0",
54
+ "chalk": "^5.6.2",
55
+ "crypto": "^1.0.1",
56
+ "dotenv": "^17.2.3",
57
+ "express": "^5.2.1",
58
+ "qrcode-terminal": "^0.12.0",
59
+ "ulid": "^3.0.2"
60
+ },
61
+ "devDependencies": {
62
+ "@types/dotenv": "^6.1.1",
63
+ "@types/node": "^24.10.1",
64
+ "@types/qrcode-terminal": "^0.12.2",
65
+ "cpx": "^1.5.0",
66
+ "nodemon": "^3.1.11",
67
+ "rimraf": "^6.0.1",
68
+ "tsconfig-paths": "^4.2.0",
69
+ "tsup": "^8.5.1",
70
+ "tsx": "^4.21.0",
71
+ "typescript": "^5.9.3",
72
+ "vitest": "^4.1.2"
73
+ },
74
+ "directories": {
75
+ "test": "test"
76
+ },
77
+ "bugs": {
78
+ "url": "https://github.com/Poppyyddod/ReplayKit/issues"
79
+ },
80
+ "homepage": "https://github.com/Poppyyddod/ReplayKit"
81
+ }