{"version":3,"sources":["caller_metadata.ts"],"sourcesContent":["// @ts-ignore\nconst is_worker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope);\nconst client_type = is_worker ? 'worker' : (\"Deno\" in globalThis && !(globalThis.Deno as any).isPolyfill ? 'deno' : 'browser')\n\nconst caller_file = /((?:https?|file)\\:\\/\\/.*?)(?::\\d+)*(?:$|\\nevaluate@|\\)$)/;\nconst caller_row_col = /(\\d+)\\:(\\d+)(\\))?$/;\nconst caller_name = /([^ ]*)(?:@| \\()(?:https?|file)\\:\\/\\//;\nconst extract_meta = /__meta__([^_]+)__/;\n\n// @ts-ignore check for safari\nconst is_safari = client_type !== \"deno\" && (typeof globalThis.webkitConvertPointFromNodeToPage === 'function')\n\nconst meta = new Map<number, any>();\nlet min_key = 0;\n\nfunction createMetaMapping(object:any){\n\twhile (meta.has(min_key)) {\n\t\tmin_key++;\n\t}\n    meta.set(min_key, object);\n    return min_key;\n}\nfunction removeMeta(key:number){\n    meta.delete(key);\n\tif (key < min_key) min_key = key;\n}\n\nfunction _callWithMetaData<args extends any[], returns>(key:number, fn:(...args:args)=>returns, args?:args, ctx?:any): any {\n    const encoded = '__meta__'+key+'__';\n\tconst _args = <args> args ?? [];\n\treturn is_safari ? \n\t\tnew globalThis.Function('f', 'c', 'a', 'return (function '+encoded+'(){return c ? f.apply(c, a) : f(...a)})()')(fn, ctx, args) : \n\t\t({[encoded]:()=>ctx ? fn.apply(ctx, _args) : fn(..._args)})[encoded]()\n}\n\n\nfunction getPartsFromStack(stack:string|undefined) {\n\tif (!stack) return null;\n\treturn stack\n\t\t.trim()\n\t\t.replace(/^Error\\n/, '') // remove chrome Error line\n\t\t.replace(/(\\n.*@\\[native code\\])+$/, '') // remove safari [native code] lines at the end\n\t\t.replace(/\\n *at ModuleJob\\.run \\(node\\:internal\\/(.|\\n)*$/, '') // remove nodejs internal stack\n\t\t.replace(/\\n(?: |.)* \\(ext:core\\/.*$/, '') // remove deno internal stack\n\t\t.replace(/\\n *at DecorateConstructor \\(.*$/m, '') // replace reflect decorators\n\t\t.replace(/\\n *at Reflect.decorate \\(.*$/m, '') // replace reflect decorators\n\t\t.replace(/\\n *at __decorate \\(.*$/m, '') // replace reflect decorators\n\t\t.split('\\n');\n}\n\nfunction getCallerLineFromParts(parts?:string[]|null) {\n\tconst safari_double_call = is_safari && parts?.[1]?.startsWith(\"@\"); // safari sometimes insert double call to stack, with anonymous name (starts with @)\n\tconst line = parts?.[Math.min(parts.length-1, 2+(safari_double_call?1:0))] // get 2nd item (ignore this function and the function that called it, sometimes +1 for safari) - if stack too small, get last item\n\tif (!line) return null;\n\tif (is_safari && line.endsWith(\"@\")) {\n\t\tconsole.error(\"caller metadata: call order not supported in safari: \" + line)\n\t}\n\treturn line.match(caller_file)?.[1]\n}\n\n\n/**\n * returns the URL location from where the function that called getCallerFile() was called\n */\nexport function getCallerFile(error?: Error) {\n\tconst parts = getPartsFromStack((error??new Error()).stack);\n\treturn getCallerLineFromParts(parts) ?? globalThis.location?.href\n}\n\n/**\n * returns the URL location directory from where the function that called getCallerDir() was called\n */\nexport function getCallerDir(error?: Error) {\n\tconst parts = getPartsFromStack((error??new Error()).stack);\n\treturn getCallerLineFromParts(parts)?.replace(/[^\\/\\\\]*$/, '') ?? globalThis.location?.href\n}\n\n/**\n * returns structured call stack data for the last callers: file, name and position in source code\n * {\n * \t\tfile: string|null,\n * \t\tname: string|null,\n * \t\trow: number|null,\n * \t\tcol: number|null\n * }\n */\nexport function getCallerInfo(error?: Error) {\n\tlet parts = getPartsFromStack((error??new Error()).stack);\n\tif (!parts) return null;\n\t// remove second line '@...' without name in safari\n\tif (is_safari && parts[1].startsWith(\"@\")) parts.splice(1, 1); \n\tparts = parts.slice(Math.min(parts.length-1, 2))\n\n\tconst info = [];\n\n\tfor (const part of parts) {\n\t\tconst pos = part.match(caller_row_col);\n\t\t// get name part, ignore if starts with safari 'module code'\n\t\tlet name:string|null|undefined = part.trim().startsWith('module code') ? null : part.match(caller_name)?.[1];\n\t\t// ignore if just at http://\n\t\tif (name == 'at' && part.trim().startsWith('at ')) name = null;\n\t\t\n\t\tinfo.push({\n\t\t\tfile: part.match(caller_file)?.[1] || null,\n\t\t\tname: name || null,\n\t\t\trow: pos?.[1] ? Number(pos?.[1]) : null,\n\t\t\tcol: pos?.[2] ? Number(pos?.[2]) : null\n\t\t})\n\t}\n\n\treturn info;\n}\n\n\n\n/**\n * Injects meta data to the stack trace, which can be accessed within the function.\n * Calls the function (async) with paramters.\n * @param meta object that can be accessed within the function by calling getMeta()\n * @param ctx value of 'this' inside the function\n * @param func the function to call\n * @param args function arguments array\n * @returns return value of the function call\n */\nexport function callWithMetadata<args extends any[], returns extends Awaited<any>>(meta:any, func:(...args:args)=>returns, args?:args, ctx?:any): returns {\n\tconst key = createMetaMapping(meta);\n\ttry {\n        const res = _callWithMetaData(key, func, args, ctx);\n        removeMeta(key); // clear meta\n        return res;\n    }\n    catch (e) {\n        removeMeta(key); // clear meta\n        throw e;\n    }\n}\n\n/**\n * Injects meta data to the stack trace, which can be accessed within the function.\n * Calls the function (async) with paramters.\n * @param meta object that can be accessed within the function by calling getMeta()\n * @param ctx value of 'this' inside the function\n * @param func the function to call\n * @param args function arguments array\n * @returns return value of the function call\n */\nexport async function callWithMetadataAsync<args extends any[], returns extends Promise<any>>(meta:any, func:(...args:args)=>returns, args?:args, ctx?:any): Promise<returns extends Promise<infer T> ? T : any> {\n\tconst key = createMetaMapping(meta);\n\ttry {\n        const res = await _callWithMetaData(key, func, args, ctx);\n\t\tremoveMeta(key); // clear meta\n        return res;\n    }\n    catch (e) {\n        removeMeta(key); // clear meta\n        throw e;\n    }\n}\n\n\n/**\n * get the current DATEX meta data within a JS function scope\n * @returns meta object\n */\nexport function getMeta(error?: Error){\n    const key = (error??new Error()).stack?.match(extract_meta)?.[1];\n    return meta.get(Number(key));\n}\n\n/**\n * clear metadata for further call stack\n */\nexport function clearMeta(error?: Error){\n    const key = Number((error??new Error()).stack?.match(extract_meta)?.[1]);\n    if (!isNaN(key)) removeMeta(key);\n}"],"names":["client_type","is_worker","WorkerGlobalScope","self","globalThis","Deno","isPolyfill","caller_file","caller_row_col","caller_name","extract_meta","is_safari","webkitConvertPointFromNodeToPage","meta","Map","min_key","createMetaMapping","object","has","set","removeMeta","key","delete","_callWithMetaData","fn","args","ctx","encoded","_args","Function","apply","getPartsFromStack","stack","trim","replace","split","getCallerLineFromParts","parts","safari_double_call","startsWith","line","Math","min","length","endsWith","console","error","match","getCallerFile","Error","location","href","getCallerDir","getCallerInfo","splice","info","part","slice","pos","name","push","file","row","Number","col","callWithMetadata","func","res","e","callWithMetadataAsync","getMeta","get","clearMeta","isNaN"],"mappings":"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","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/utils/","file":"caller_metadata.ts"}