{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-eventsourcing/src/client/utils/stack.js"],"names":["sourcemap","Stack","defaultErrorMessage","constructor","omitFn","max","Error","stackTraceLimit","Infinity","captureStackTrace","_error","_frames","_computeFrames","stack","desc","lines","slice","map","line","Frame","frames","getFrame","id","getFrames","from","to","toString","join","_desc","_extractInfos","endsWith","extractSourceInfo","result","exec","info","_getFileLineChar","_applyLocationInfo","isNamedCall","namedCall","funcDesc","location","locations","getLocations","evalInfo","sourceLocation","_extractEvalInfos","info2","_getFunction","_applyFunctionInfo","lively","warn","_applyEvalLocationInfo","_applyEvalFunctionInfo","locationDesc","reverseString","str","split","reverse","reversedDesc","reversedFileLineChar","char","transpiled","file","parseInt","_char","_line","_transpiled","_file","_evalChar","_evalLine","_evalTranspiled","_evalFile","newAsyncFunc","isNew","isAsync","func","_new","_async","_func","_evalNew","_evalAsync","_evalFunc","_determineSourceInfo","sourceMappingURL","sourceMapURL","files","exists","_sourceLoc","column","source","sourceMap","fetchJSON","smc","SourceMapConsumer","originalPositionFor","livelyPath","srcPath","replaceAll","async","new","getSourceLocBabelStyle","undefined","start","end","getSourceLoc","getSourceLine","getSourceChar","character","evalAsync","evalNew","evalFunc","evalFile","evalTranspiled","evalLine","evalChar","openInBrowser","browser","replace"],"mappings":"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","file":"stack.js","sourcesContent":["\nimport sourcemap from 'src/external/source-map.min.js';\n\n/*MD # Stack MD*/\nexport default class Stack {\n  static get defaultErrorMessage() {\n    return 'Error for stack';\n  }\n  constructor({ omitFn = Stack, max }) {\n    Error.stackTraceLimit = Infinity;\n    Error.captureStackTrace(this._error = {}, omitFn);\n    this._frames = this._computeFrames(this._error.stack, max);\n  }\n  _computeFrames(desc, max) {\n    return desc.lines().slice(1, max).map(line => new Frame(line));\n  }\n  get frames() {\n    return this._frames;\n  }\n  getFrame(id = 1) {\n    return this.frames[id];\n  }\n  getFrames(from, to) {\n    return this.frames.slice(from, to);\n  }\n  toString() {\n    return this.frames.join('\\n');\n  }\n}\n\n/*MD # Frame\nView some examples at [regex101](https://regex101.com/r/pSppPm/3)\nMD*/\nexport class Frame {\n  constructor(desc) {\n    this._desc = desc;\n    this._extractInfos(this._desc);\n  }\n\n  _extractInfos(desc) {\n    // just file, transpiled, line, char given -> no parens around\n    // \" at https://lively-kernel.org/lively4/aexpr/src/external/mocha.js?1583757762700:4694:7\"\n    if (!this._desc.endsWith(')')) {\n      const extractSourceInfo = /^\\s+at\\s(.*)$/;\n      const result = extractSourceInfo.exec(desc);\n      // lively.openInspector(result)\n      const info = this._getFileLineChar(result[1]);\n      this._applyLocationInfo(info);\n\n      return;\n    }\n\n    // e.g. \" at Function.stack (https://lively-kernel.org/lively4/aexpr/src/client/lively.js!transpiled:2548:19)\"\n    const isNamedCall = /^\\s+at\\s([^\\(]*)\\s\\((.*)\\)$/;\n    let namedCall;\n    if ((namedCall = isNamedCall.exec(desc)) !== null) {\n      const [, funcDesc, location] = namedCall;\n\n      let locations;\n      // \" at doEvaluate (eval at loadJavaScript (https://lively-kernel.org/lively4/aexpr/src/client/boot.js:25:3), &lt;anonymous>:1554:13)\"\n      // can also have no infos on function name of eval call:\n      // \"    at eval (eval at <anonymous> (https://lively-kernel.org/lively4/aexpr/test/stack-test.js!transpiled), <anonymous>:8:19)\"\n      const getLocations = /^(?:eval\\sat\\s(.*\\)),\\s)?(.*)$/;\n      if ((locations = getLocations.exec(location)) !== null) {\n        const [, evalInfo, sourceLocation] = locations;\n\n        if (evalInfo) {\n          this._extractEvalInfos(evalInfo);\n        }\n\n        const info = this._getFileLineChar(sourceLocation);\n        this._applyLocationInfo(info);\n      }\n\n      const info2 = this._getFunction(funcDesc);\n      this._applyFunctionInfo(info2);\n\n      return;\n    }\n\n    lively.warn('could not analyse frame', desc);\n  }\n\n  _extractEvalInfos(desc) {\n    const isNamedCall = /^([^\\(]*)\\s\\((.*)\\)$/;\n    let namedCall;\n    if ((namedCall = isNamedCall.exec(desc)) !== null) {\n      const [, funcDesc, location] = namedCall;\n\n      const info = this._getFileLineChar(location);\n      this._applyEvalLocationInfo(info);\n\n      const info2 = this._getFunction(funcDesc);\n      this._applyEvalFunctionInfo(info2);\n    }\n  }\n\n  /*MD ## location utils MD*/\n  _getFileLineChar(locationDesc) {\n    function reverseString(str) {\n      return str.split('').reverse().join('');\n    }\n\n    const reversedDesc = reverseString(locationDesc);\n    const reversedFileLineChar = /^(?:(\\d+):)?(?:(\\d+):)?(?:(delipsnart)!)?(.*)$/;\n\n    const [, char, line, transpiled, file] = reversedFileLineChar.exec(reversedDesc);\n\n    return {\n      char: char && parseInt(reverseString(char)),\n      line: line && parseInt(reverseString(line)),\n      transpiled: !!transpiled,\n      file: reverseString(file)\n    };\n  }\n\n  _applyLocationInfo({ char, line, transpiled, file }) {\n    this._char = char;\n    this._line = line;\n    this._transpiled = transpiled;\n    this._file = file;\n  }\n\n  _applyEvalLocationInfo({ char, line, transpiled, file }) {\n    this._evalChar = char;\n    this._evalLine = line;\n    this._evalTranspiled = transpiled;\n    this._evalFile = file;\n  }\n\n  /*MD ## func utils MD*/\n  _getFunction(desc) {\n    const newAsyncFunc = /^(?:(new)\\s)?(?:(async)\\s)?(.+)$/;\n\n    const [, isNew, isAsync, func] = newAsyncFunc.exec(desc);\n\n    return {\n      isNew: !!isNew,\n      isAsync: !!isAsync,\n      func\n    };\n  }\n\n  _applyFunctionInfo({ isNew, isAsync, func }) {\n    this._new = isNew;\n    this._async = isAsync;\n    this._func = func;\n  }\n\n  _applyEvalFunctionInfo({ isNew, isAsync, func }) {\n    this._evalNew = isNew;\n    this._evalAsync = isAsync;\n    this._evalFunc = func;\n  }\n  \n  async _determineSourceInfo() {\n    const sourceMappingURL = this.sourceMapURL();\n    if(!sourceMappingURL || !(await lively.files.exists(sourceMappingURL))) {\n      if(this._file !== \"<anonymous>\") {\n        this._sourceLoc = { line: this._line, column: this._char, source: this._file };\n      }\n      return;\n    } \n\n    var sourceMap = await sourceMappingURL.fetchJSON();\n    var smc = sourcemap.SourceMapConsumer(sourceMap);\n    this._sourceLoc = smc.originalPositionFor({\n      line: parseInt(this._line),\n      column: parseInt(this._char)\n    });\n  }\n\n  sourceMapURL() {\n    if (this._file === \"<anonymous>\") return;\n\n    const [livelyPath, srcPath] = this._file.split(\"/src/\");\n\n    if (!srcPath) {\n      return;\n    }\n\n    const sourceMappingURL = livelyPath + \"/.transpiled/\" + (\"src/\" + srcPath).replaceAll(\"/\", \"_\") + \".map.json\";\n    return sourceMappingURL;\n  }\n\n  /*MD ## func MD*/\n  /**\n   * returns Bool\n   */\n\n  get async() {\n    return this._async || false;\n  }\n\n  get new() {\n    return this._new || false;\n  }\n\n  get func() {\n    return this._func;\n  }\n\n  /*MD ## location MD*/\n  get file() {\n    return this._file;\n  }\n\n  get transpiled() {\n    return this._transpiled || false;\n  }\n\n  get line() {\n    return this._line;\n  }\n\n  get char() {\n    return this._char;\n  }\n\n  async getSourceLocBabelStyle() {\n    if (!this._sourceLoc) {\n      await this._determineSourceInfo();\n      if (!this._sourceLoc) return undefined;\n    }\n    const location = { line: this._sourceLoc.line, column: this._sourceLoc.column };\n    return { start: location, end: location, file: this._sourceLoc.source };\n  }\n\n  async getSourceLoc() {\n    if (!this._sourceLoc) {\n      await this._determineSourceInfo();\n    }\n    return this._sourceLoc;\n  }\n\n  async getSourceLine() {\n    if (!this._sourceLoc.line) {\n      await this._determineSourceInfo();\n    }\n    return this._sourceLoc.line;\n  }\n\n  async getSourceChar() {\n    if (!this._sourceLoc.character) {\n      await this._determineSourceInfo();\n    }\n    return this._sourceLoc.column;\n  }\n\n  /*MD ## eval func MD*/\n  /**\n   * returns Bool\n   */\n  get evalAsync() {\n    return this._evalAsync || false;\n  }\n\n  get evalNew() {\n    return this._evalNew || false;\n  }\n\n  get evalFunc() {\n    return this._evalFunc;\n  }\n\n  /*MD ## eval location MD*/\n  get evalFile() {\n    return this._evalFile;\n  }\n\n  get evalTranspiled() {\n    return this._evalTranspiled;\n  }\n\n  get evalLine() {\n    return this._evalLine;\n  }\n\n  get evalChar() {\n    return this._evalChar;\n  }\n\n  /*MD ## utils MD*/\n  // #TODO: implement\n  openInBrowser(browser) {\n    // #TODO: requires back mapping of source code information #SourceMaps\n  }\n\n  toString() {\n    return this._desc.replace(/\\s+at\\s/, '');\n  }\n\n}"]}