11'use strict' ;
22
33const {
4+ ArrayIsArray,
45 ArrayPrototypePush,
56 JSONParse,
67 RegExpPrototypeExec,
@@ -15,7 +16,7 @@ let debug = require('internal/util/debuglog').debuglog('source_map', (fn) => {
1516 debug = fn ;
1617} ) ;
1718
18- const { validateBoolean } = require ( 'internal/validators' ) ;
19+ const { validateBoolean, validateObject , validateString , validateNumber } = require ( 'internal/validators' ) ;
1920const {
2021 setSourceMapsEnabled : setSourceMapsNative ,
2122} = internalBinding ( 'errors' ) ;
@@ -351,11 +352,54 @@ function findSourceMap(sourceURL) {
351352 return sourceMap ;
352353}
353354
355+ function reconstructCallSite ( callSite ) {
356+ const { scriptName, lineNumber, column } = callSite ;
357+ const sourceMap = findSourceMap ( scriptName ) ;
358+ if ( ! sourceMap ) return ;
359+ const entry = sourceMap . findEntry ( lineNumber - 1 , column - 1 ) ;
360+ if ( ! entry ?. originalSource ) return ;
361+ return {
362+ __proto__ : null ,
363+ functionName : callSite . name ,
364+ lineNumber : entry . originalLine + 1 ,
365+ column : entry . originalColumn + 1 ,
366+ scriptName : entry . originalSource ,
367+ } ;
368+ }
369+
370+ function validateCallSite ( callSite ) {
371+ validateObject ( callSite , 'callSites' ) ;
372+ validateString ( callSite . scriptName , 'callSites.scriptName' ) ;
373+ validateString ( callSite . functionName , 'callSites.functionName' ) ;
374+ validateNumber ( callSite . lineNumber , 'callSites.lineNumber' ) ;
375+ validateNumber ( callSite . column , 'callSites.column' ) ;
376+ }
377+
378+ /**
379+ *
380+ * @param {object } callSites The call site object to map (ex `util.getCallSite()`)
381+ * @returns {object | object[] } An object or array of objects with the reconstructed call site
382+ */
383+ function mapCallSite ( callSites ) {
384+ if ( ArrayIsArray ( callSites ) ) {
385+ const result = [ ] ;
386+ for ( const callSite of callSites ) {
387+ validateCallSite ( callSite ) ;
388+ const found = reconstructCallSite ( callSite ) ;
389+ ArrayPrototypePush ( result , found ?? callSite ) ;
390+ }
391+ return result ;
392+ }
393+ validateCallSite ( callSites ) ;
394+ return reconstructCallSite ( callSites ) ?? callSites ;
395+ }
396+
354397module . exports = {
355398 findSourceMap,
356399 getSourceMapsEnabled,
357400 setSourceMapsEnabled,
358401 maybeCacheSourceMap,
359402 maybeCacheGeneratedSourceMap,
403+ mapCallSite,
360404 sourceMapCacheToObject,
361405} ;
0 commit comments