@aiolaapp/logger 0.1.3 → 0.1.5

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/cli.js ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ #!/usr/bin/env node
3
+ "use strict";var x=Object.create;var h=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var v=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var _=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of $(o))!S.call(e,n)&&n!==t&&h(e,n,{get:()=>o[n],enumerable:!(r=I(o,n))||r.enumerable});return e};var A=(e,o,t)=>(t=e!=null?x(v(e)):{},_(o||!e||!e.__esModule?h(t,"default",{value:e,enumerable:!0}):t,e));var f=A(require("fs")),m=A(require("path")),b=require("child_process"),K="https://lhrsgoaselmgophvbqme.supabase.co/functions/v1/sourcemaps-upload";function O(e){let o={};for(let t of e)if(t.startsWith("--")){let[r,...n]=t.slice(2).split("=");o[r]=n.join("=")||"true"}return{dir:o.dir,release:o.release,apiKey:o["api-key"]||o.apiKey,endpoint:o.endpoint}}function E(e){return e||process.env.AIOLA_API_KEY||process.env.AIOLA_KEY||process.env.NEXT_PUBLIC_AIOLA_KEY||process.env.VITE_AIOLA_KEY||null}function P(e){if(e)return e;try{let o=(0,b.execSync)("git rev-parse --short HEAD",{encoding:"utf8",timeout:5e3}).trim();if(o)return o}catch{}try{let o=JSON.parse(f.default.readFileSync("package.json","utf8"));if(o.version)return o.version}catch{}return"unknown"}function w(e){if(e)return f.default.existsSync(e)?e:(console.error(` Directory not found: ${e}`),null);let o=[".next/static","dist","build/static","out",".output"];for(let t of o)if(f.default.existsSync(t))return t;return null}function D(e,o=5){let t=[];function r(n,i){if(!(i>o))try{let c=f.default.readdirSync(n,{withFileTypes:!0});for(let s of c){let a=m.default.join(n,s.name);s.isDirectory()&&!s.name.startsWith(".")&&s.name!=="node_modules"?r(a,i+1):s.isFile()&&s.name.endsWith(".map")&&t.push(a)}}catch{}}return r(e,0),t}async function L(e,o,t,r){let n=0,i=0,c=5;for(let s=0;s<e.length;s+=c){let a=e.slice(s,s+c),p=new FormData;p.append("release",t);for(let l of a){let d=f.default.readFileSync(l),u=m.default.basename(l),g="";try{let y=JSON.parse(d.toString("utf8"));y.file&&(g=y.file)}catch{}g||(g=u.replace(/\.map$/,""));let k=new Blob([d],{type:"application/json"});p.append("file",k,u),g&&p.append(`url:${u}`,g)}try{let l=await fetch(r,{method:"POST",headers:{"x-aiola-key":o},body:p});if(l.ok){let d=await l.json();n+=d.uploaded||a.length;for(let u of a)console.log(` \u2713 ${m.default.relative(".",u)}`)}else{let d=await l.json().catch(()=>({error:l.statusText}));i+=a.length;for(let u of a)console.log(` \u2717 ${m.default.relative(".",u)} \u2014 ${d.error||"upload failed"}`)}}catch(l){i+=a.length,console.error(` \u2717 Network error: ${l}`)}}return{uploaded:n,failed:i}}async function N(){let e=process.argv.slice(2);e[0]!=="upload-sourcemaps"&&(console.log(`
4
+ Aiola Logger CLI
5
+
6
+ Commands:
7
+ upload-sourcemaps Upload source maps for a release
8
+
9
+ Options:
10
+ --dir=<path> Build output directory (auto-detects .next, dist, build)
11
+ --release=<version> Release version (auto-detects from git SHA or package.json)
12
+ --api-key=<key> API key (reads from AIOLA_API_KEY env var)
13
+ --endpoint=<url> Upload endpoint (default: Aiola cloud)
14
+
15
+ Example:
16
+ npx @aiolaapp/logger upload-sourcemaps
17
+ npx @aiolaapp/logger upload-sourcemaps --dir=.next/static --release=1.0.0
18
+ `),process.exit(0));let t=O(e.slice(1));console.log(`
19
+ Aiola Source Map Upload
20
+ `);let r=E(t.apiKey);r||(console.error(" \u2717 No API key found. Set AIOLA_API_KEY environment variable or use --api-key=<key>"),process.exit(1));let n=P(t.release);console.log(` Release: ${n}`);let i=w(t.dir);i||(console.error(" \u2717 No build directory found. Run your build first, or specify --dir=<path>"),process.exit(1)),console.log(` Directory: ${i}`);let c=D(i);c.length===0&&(console.error(` \u2717 No .map files found in ${i}`),process.exit(1)),console.log(` Found: ${c.length} source map${c.length!==1?"s":""}
21
+ `);let s=t.endpoint||K,{uploaded:a,failed:p}=await L(c,r,n,s);console.log(`
22
+ Done: ${a} uploaded${p>0?`, ${p} failed`:""}
23
+ `),process.exit(p>0?1:0)}N();
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use strict";var d=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var v=(o,e)=>{for(var t in e)d(o,t,{get:e[t],enumerable:!0})},E=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of w(e))!y.call(o,r)&&r!==t&&d(o,r,{get:()=>e[r],enumerable:!(n=g(e,r))||n.enumerable});return o};var b=o=>E(d({},"__esModule",{value:!0}),o);var q={};v(q,{Aiola:()=>R});module.exports=b(q);var a=class{constructor(e,t,n){this.endpoint=e;this.apiKey=t;this.flushInterval=n;this.queue=[];this.timer=null}send(e){this.queue.push(e),this.timer||(this.timer=setTimeout(()=>this.flush(),this.flushInterval)),(e.level==="error"||e.level==="fatal")&&this.flush()}flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.queue.length===0)return;let e=this.queue.splice(0);for(let t of e)this._send(t)}_send(e){let t=JSON.stringify(e);this._fetch(t)}_fetch(e){try{fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-aiola-key":this.apiKey},body:e,keepalive:!0}).catch(()=>{})}catch{}}};var p=class{constructor(e){this.crumbs=[];this.max=e}add(e,t,n,r){this.crumbs.push({timestamp:new Date().toISOString(),category:e,message:t,level:r,data:n}),this.crumbs.length>this.max&&this.crumbs.shift()}getAll(){return[...this.crumbs]}clear(){this.crumbs=[]}instrumentFetch(e){if(typeof globalThis.fetch>"u")return;let t=globalThis.fetch,n=this;globalThis.fetch=function(r,s){let i=typeof r=="string"?r:r instanceof URL?r.href:r.url,u=s?.method||"GET";if(e&&i.includes(e))return t.apply(globalThis,[r,s]);let h=Date.now();return t.apply(globalThis,[r,s]).then(c=>(n.add("http",`${u} ${i}`,{status_code:c.status,duration_ms:Date.now()-h}),c),c=>{throw n.add("http",`${u} ${i} (failed)`,{error:String(c),duration_ms:Date.now()-h},"error"),c})}}instrumentXHR(e){if(typeof XMLHttpRequest>"u")return;let t=this,n=XMLHttpRequest.prototype.open,r=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(s,i){return this._clawMethod=s,this._clawUrl=typeof i=="string"?i:i.href,n.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let s=this;if(e&&s._clawUrl.includes(e))return r.apply(this,arguments);let i=Date.now();return s.addEventListener("loadend",function(){let u=Date.now()-i;s.status>0?t.add("http",`${s._clawMethod} ${s._clawUrl}`,{status_code:s.status,duration_ms:u,type:"xhr"}):t.add("http",`${s._clawMethod} ${s._clawUrl} (failed)`,{duration_ms:u,type:"xhr"},"error")}),r.apply(this,arguments)}}instrumentClicks(){typeof document>"u"||document.addEventListener("click",e=>{let t=e.target;if(!t)return;let n=t.tagName?.toLowerCase(),r=t.textContent?.slice(0,50)?.trim(),s=t.id?`#${t.id}`:"",i=t.className&&typeof t.className=="string"?`.${t.className.split(" ")[0]}`:"";this.add("click",`${n}${s}${i}${r?` "${r}"`:""}`)},{capture:!0,passive:!0})}instrumentNavigation(){if(typeof window>"u")return;let e=window.location.href,t=()=>{let s=window.location.href;s!==e&&(this.add("navigation",`${e} \u2192 ${s}`),e=s)};window.addEventListener("popstate",t);let n=history.pushState,r=history.replaceState;history.pushState=function(...s){n.apply(this,s),t()},history.replaceState=function(...s){r.apply(this,s),t()}}};var k=/^\s*at (?:(.+?)\s+\()?(?:(.+?):(\d+):(\d+)|([^)]+))\)?$/,_=/^(.+?)@(.+?):(\d+):(\d+)$/;function m(o){let e=[],t=o.split(`
2
- `);for(let n of t){let r=n.trim();if(!r||r.startsWith("Error"))continue;let s=k.exec(r);if(s){e.push({function:s[1]||"<anonymous>",filename:s[2]||s[5]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:f(s[2]||"")});continue}s=_.exec(r),s&&e.push({function:s[1]||"<anonymous>",filename:s[2]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:f(s[2]||"")})}return e}function f(o){return!(!o||o.includes("node_modules")||o.startsWith("node:")||o.includes("internal/")||o.includes("<anonymous>"))}var x="https://aiola.app/api/app-logs/ingest",L="aiola-js",T="0.1.3",l=class{constructor(){this.initialized=!1;this.seen=new Set;this.options={apiKey:"",environment:"production",endpoint:x,maxBreadcrumbs:30,flushInterval:5e3,captureConsoleErrors:!0},this.transport=new a(this.options.endpoint,"",5e3),this.breadcrumbs=new p(30)}init(e){if(this.initialized){if(this.options.apiKey===e.apiKey)return;this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval);return}this.initialized=!0,this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval),this.breadcrumbs=new p(this.options.maxBreadcrumbs),this._setupGlobalHandlers(),this._instrumentConsole(),this.breadcrumbs.instrumentFetch(this.options.endpoint),this.breadcrumbs.instrumentXHR(this.options.endpoint),typeof window<"u"&&(this.breadcrumbs.instrumentClicks(),this.breadcrumbs.instrumentNavigation(),window.addEventListener("beforeunload",()=>this.transport.flush()),window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.transport.flush()}))}captureException(e,t){if(!this.initialized)return;let n=e instanceof Error?e:new Error(String(e)),r=n.stack?m(n.stack):[],s=`${n.name}:${n.message}`;if(this.seen.has(s))return;this.seen.add(s),setTimeout(()=>this.seen.delete(s),5e3);let i=this._buildEvent({level:t?.level||"error",message:n.message,exception:{type:n.name||"Error",value:n.message,stacktrace:r.length>0?{frames:r}:void 0},tags:t?.tags,request:t?.request});this._send(i)}captureMessage(e,t="info",n){if(!this.initialized)return;let r=this._buildEvent({level:t,message:e,tags:n});this._send(r)}addBreadcrumb(e,t,n){this.breadcrumbs.add(e,t,n)}setUser(e){this.options.user=e||void 0}setTag(e,t){this.options.tags||(this.options.tags={}),this.options.tags[e]=t}flush(){this.transport.flush()}wrap(e){let t=this;return function(...n){try{let r=e.apply(this,n);return r instanceof Promise?r.catch(s=>{throw t.captureException(s),s}):r}catch(r){throw t.captureException(r),r}}}wrapApiHandler(e){let t=this;return async function(n,r){try{return await e(n,r)}catch(s){let i=t._extractRequestContext(n);throw t.captureException(s,{request:i}),t.transport.flush(),s}}}wrapRouteHandler(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){let s=n[0]?t._extractRequestContext(n[0]):void 0;throw t.captureException(r,{request:s}),t.transport.flush(),r}})}wrapServerAction(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){throw t.captureException(r),t.transport.flush(),r}})}_extractRequestContext(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.url=="string"&&typeof t.method=="string")return{url:t.url,method:t.method,query_string:typeof t.url=="string"&&t.url.split("?")[1]||""};if(typeof t.originalUrl=="string"&&typeof t.method=="string")return{url:t.originalUrl,method:t.method,query_string:typeof t.query=="object"?JSON.stringify(t.query):""}}_buildEvent(e){let t={...e,message:e.message||"",environment:this.options.environment,release:this.options.release,timestamp:new Date().toISOString(),user:this.options.user,tags:{sdk_name:L,sdk_version:T,...this.options.tags,...e.tags},breadcrumbs:this.breadcrumbs.getAll()};return e.request?t.request=e.request:typeof window<"u"&&(t.request={url:window.location.href,method:"GET",query_string:window.location.search}),typeof process<"u"&&process.version&&(t.contexts={runtime:{name:"Node.js",version:process.version}}),t}_send(e){if(this.options.beforeSend){let t=this.options.beforeSend(e);if(!t)return;e=t}this.transport.send(e)}_instrumentConsole(){if(typeof console>"u")return;let e={log:console.log,warn:console.warn,error:console.error,info:console.info},t=this;console.log=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.log.apply(console,n)},console.warn=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"warning"),e.warn.apply(console,n)},console.error=function(...n){let r=n.map(String).join(" ");if(t.breadcrumbs.add("console",r,void 0,"error"),t.options.captureConsoleErrors){let s=n[0]instanceof Error?n[0]:null;s?t.captureException(s,{tags:{source:"console.error"}}):t.captureMessage(r,"error",{source:"console.error"})}e.error.apply(console,n)},console.info=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.info.apply(console,n)}}_setupGlobalHandlers(){if(typeof window<"u"&&(window.addEventListener("error",e=>{let t=e.target;if(t&&t!==window&&t.tagName){let n=t,r=n.tagName.toLowerCase(),s=n.src||n.href||"";this.captureMessage(`Failed to load ${r}: ${s}`,"error",{source:"resource",element:r,url:s});return}e.error?this.captureException(e.error):e.message&&this.captureException(new Error(e.message))},!0),window.addEventListener("unhandledrejection",e=>{let t=e.reason instanceof Error?e.reason:new Error(String(e.reason));this.captureException(t)})),typeof process<"u"&&typeof process.on=="function"){let e=process;e.on("uncaughtException",t=>{this.captureException(t,{level:"fatal"}),this.transport.flush()}),e.on("unhandledRejection",t=>{let n=t instanceof Error?t:new Error(String(t));this.captureException(n),this.transport.flush()})}typeof process>"u"&&typeof globalThis<"u"&&"Deno"in globalThis&&(globalThis.addEventListener("error",e=>{let t=e;t.error?this.captureException(t.error):t.message&&this.captureException(new Error(t.message))}),globalThis.addEventListener("unhandledrejection",e=>{let t=e,n=t.reason instanceof Error?t.reason:new Error(String(t.reason));this.captureException(n),this.transport.flush()}))}};var R=new l;0&&(module.exports={Aiola});
2
+ `);for(let n of t){let r=n.trim();if(!r||r.startsWith("Error"))continue;let s=k.exec(r);if(s){e.push({function:s[1]||"<anonymous>",filename:s[2]||s[5]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:f(s[2]||"")});continue}s=_.exec(r),s&&e.push({function:s[1]||"<anonymous>",filename:s[2]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:f(s[2]||"")})}return e}function f(o){return!(!o||o.includes("node_modules")||o.startsWith("node:")||o.includes("internal/")||o.includes("<anonymous>"))}var x="https://lhrsgoaselmgophvbqme.supabase.co/functions/v1/app-logs-ingest",L="aiola-js",T="0.1.5",l=class{constructor(){this.initialized=!1;this.seen=new Set;this.options={apiKey:"",environment:"production",endpoint:x,maxBreadcrumbs:30,flushInterval:5e3,captureConsoleErrors:!0},this.transport=new a(this.options.endpoint,"",5e3),this.breadcrumbs=new p(30)}init(e){if(this.initialized){if(this.options.apiKey===e.apiKey)return;this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval);return}this.initialized=!0,this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval),this.breadcrumbs=new p(this.options.maxBreadcrumbs),this._setupGlobalHandlers(),this._instrumentConsole(),this.breadcrumbs.instrumentFetch(this.options.endpoint),this.breadcrumbs.instrumentXHR(this.options.endpoint),typeof window<"u"&&(this.breadcrumbs.instrumentClicks(),this.breadcrumbs.instrumentNavigation(),window.addEventListener("beforeunload",()=>this.transport.flush()),window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.transport.flush()}))}captureException(e,t){if(!this.initialized)return;let n=e instanceof Error?e:new Error(String(e)),r=n.stack?m(n.stack):[],s=`${n.name}:${n.message}`;if(this.seen.has(s))return;this.seen.add(s),setTimeout(()=>this.seen.delete(s),5e3);let i=this._buildEvent({level:t?.level||"error",message:n.message,exception:{type:n.name||"Error",value:n.message,stacktrace:r.length>0?{frames:r}:void 0},tags:t?.tags,request:t?.request});this._send(i)}captureMessage(e,t="info",n){if(!this.initialized)return;let r=this._buildEvent({level:t,message:e,tags:n});this._send(r)}addBreadcrumb(e,t,n){this.breadcrumbs.add(e,t,n)}setUser(e){this.options.user=e||void 0}setTag(e,t){this.options.tags||(this.options.tags={}),this.options.tags[e]=t}flush(){this.transport.flush()}wrap(e){let t=this;return function(...n){try{let r=e.apply(this,n);return r instanceof Promise?r.catch(s=>{throw t.captureException(s),s}):r}catch(r){throw t.captureException(r),r}}}wrapApiHandler(e){let t=this;return async function(n,r){try{return await e(n,r)}catch(s){let i=t._extractRequestContext(n);throw t.captureException(s,{request:i}),t.transport.flush(),s}}}wrapRouteHandler(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){let s=n[0]?t._extractRequestContext(n[0]):void 0;throw t.captureException(r,{request:s}),t.transport.flush(),r}})}wrapServerAction(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){throw t.captureException(r),t.transport.flush(),r}})}_extractRequestContext(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.url=="string"&&typeof t.method=="string")return{url:t.url,method:t.method,query_string:typeof t.url=="string"&&t.url.split("?")[1]||""};if(typeof t.originalUrl=="string"&&typeof t.method=="string")return{url:t.originalUrl,method:t.method,query_string:typeof t.query=="object"?JSON.stringify(t.query):""}}_buildEvent(e){let t={...e,message:e.message||"",environment:this.options.environment,release:this.options.release,timestamp:new Date().toISOString(),user:this.options.user,tags:{sdk_name:L,sdk_version:T,...this.options.tags,...e.tags},breadcrumbs:this.breadcrumbs.getAll()};return e.request?t.request=e.request:typeof window<"u"&&(t.request={url:window.location.href,method:"GET",query_string:window.location.search}),typeof process<"u"&&process.version&&(t.contexts={runtime:{name:"Node.js",version:process.version}}),t}_send(e){if(this.options.beforeSend){let t=this.options.beforeSend(e);if(!t)return;e=t}this.transport.send(e)}_instrumentConsole(){if(typeof console>"u")return;let e={log:console.log,warn:console.warn,error:console.error,info:console.info},t=this;console.log=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.log.apply(console,n)},console.warn=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"warning"),e.warn.apply(console,n)},console.error=function(...n){let r=n.map(String).join(" ");if(t.breadcrumbs.add("console",r,void 0,"error"),t.options.captureConsoleErrors){let s=n[0]instanceof Error?n[0]:null;s?t.captureException(s,{tags:{source:"console.error"}}):t.captureMessage(r,"error",{source:"console.error"})}e.error.apply(console,n)},console.info=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.info.apply(console,n)}}_setupGlobalHandlers(){if(typeof window<"u"&&(window.addEventListener("error",e=>{let t=e.target;if(t&&t!==window&&t.tagName){let n=t,r=n.tagName.toLowerCase(),s=n.src||n.href||"";this.captureMessage(`Failed to load ${r}: ${s}`,"error",{source:"resource",element:r,url:s});return}e.error?this.captureException(e.error):e.message&&this.captureException(new Error(e.message))},!0),window.addEventListener("unhandledrejection",e=>{let t=e.reason instanceof Error?e.reason:new Error(String(e.reason));this.captureException(t)})),typeof process<"u"&&typeof process.on=="function"){let e=process;e.on("uncaughtException",t=>{this.captureException(t,{level:"fatal"}),this.transport.flush()}),e.on("unhandledRejection",t=>{let n=t instanceof Error?t:new Error(String(t));this.captureException(n),this.transport.flush()})}typeof process>"u"&&typeof globalThis<"u"&&"Deno"in globalThis&&(globalThis.addEventListener("error",e=>{let t=e;t.error?this.captureException(t.error):t.message&&this.captureException(new Error(t.message))}),globalThis.addEventListener("unhandledrejection",e=>{let t=e,n=t.reason instanceof Error?t.reason:new Error(String(t.reason));this.captureException(n),this.transport.flush()}))}};var R=new l;0&&(module.exports={Aiola});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  var a=class{constructor(e,t,n){this.endpoint=e;this.apiKey=t;this.flushInterval=n;this.queue=[];this.timer=null}send(e){this.queue.push(e),this.timer||(this.timer=setTimeout(()=>this.flush(),this.flushInterval)),(e.level==="error"||e.level==="fatal")&&this.flush()}flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.queue.length===0)return;let e=this.queue.splice(0);for(let t of e)this._send(t)}_send(e){let t=JSON.stringify(e);this._fetch(t)}_fetch(e){try{fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-aiola-key":this.apiKey},body:e,keepalive:!0}).catch(()=>{})}catch{}}};var p=class{constructor(e){this.crumbs=[];this.max=e}add(e,t,n,r){this.crumbs.push({timestamp:new Date().toISOString(),category:e,message:t,level:r,data:n}),this.crumbs.length>this.max&&this.crumbs.shift()}getAll(){return[...this.crumbs]}clear(){this.crumbs=[]}instrumentFetch(e){if(typeof globalThis.fetch>"u")return;let t=globalThis.fetch,n=this;globalThis.fetch=function(r,s){let o=typeof r=="string"?r:r instanceof URL?r.href:r.url,u=s?.method||"GET";if(e&&o.includes(e))return t.apply(globalThis,[r,s]);let d=Date.now();return t.apply(globalThis,[r,s]).then(c=>(n.add("http",`${u} ${o}`,{status_code:c.status,duration_ms:Date.now()-d}),c),c=>{throw n.add("http",`${u} ${o} (failed)`,{error:String(c),duration_ms:Date.now()-d},"error"),c})}}instrumentXHR(e){if(typeof XMLHttpRequest>"u")return;let t=this,n=XMLHttpRequest.prototype.open,r=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(s,o){return this._clawMethod=s,this._clawUrl=typeof o=="string"?o:o.href,n.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let s=this;if(e&&s._clawUrl.includes(e))return r.apply(this,arguments);let o=Date.now();return s.addEventListener("loadend",function(){let u=Date.now()-o;s.status>0?t.add("http",`${s._clawMethod} ${s._clawUrl}`,{status_code:s.status,duration_ms:u,type:"xhr"}):t.add("http",`${s._clawMethod} ${s._clawUrl} (failed)`,{duration_ms:u,type:"xhr"},"error")}),r.apply(this,arguments)}}instrumentClicks(){typeof document>"u"||document.addEventListener("click",e=>{let t=e.target;if(!t)return;let n=t.tagName?.toLowerCase(),r=t.textContent?.slice(0,50)?.trim(),s=t.id?`#${t.id}`:"",o=t.className&&typeof t.className=="string"?`.${t.className.split(" ")[0]}`:"";this.add("click",`${n}${s}${o}${r?` "${r}"`:""}`)},{capture:!0,passive:!0})}instrumentNavigation(){if(typeof window>"u")return;let e=window.location.href,t=()=>{let s=window.location.href;s!==e&&(this.add("navigation",`${e} \u2192 ${s}`),e=s)};window.addEventListener("popstate",t);let n=history.pushState,r=history.replaceState;history.pushState=function(...s){n.apply(this,s),t()},history.replaceState=function(...s){r.apply(this,s),t()}}};var m=/^\s*at (?:(.+?)\s+\()?(?:(.+?):(\d+):(\d+)|([^)]+))\)?$/,g=/^(.+?)@(.+?):(\d+):(\d+)$/;function f(i){let e=[],t=i.split(`
2
- `);for(let n of t){let r=n.trim();if(!r||r.startsWith("Error"))continue;let s=m.exec(r);if(s){e.push({function:s[1]||"<anonymous>",filename:s[2]||s[5]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:h(s[2]||"")});continue}s=g.exec(r),s&&e.push({function:s[1]||"<anonymous>",filename:s[2]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:h(s[2]||"")})}return e}function h(i){return!(!i||i.includes("node_modules")||i.startsWith("node:")||i.includes("internal/")||i.includes("<anonymous>"))}var w="https://aiola.app/api/app-logs/ingest",y="aiola-js",v="0.1.3",l=class{constructor(){this.initialized=!1;this.seen=new Set;this.options={apiKey:"",environment:"production",endpoint:w,maxBreadcrumbs:30,flushInterval:5e3,captureConsoleErrors:!0},this.transport=new a(this.options.endpoint,"",5e3),this.breadcrumbs=new p(30)}init(e){if(this.initialized){if(this.options.apiKey===e.apiKey)return;this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval);return}this.initialized=!0,this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval),this.breadcrumbs=new p(this.options.maxBreadcrumbs),this._setupGlobalHandlers(),this._instrumentConsole(),this.breadcrumbs.instrumentFetch(this.options.endpoint),this.breadcrumbs.instrumentXHR(this.options.endpoint),typeof window<"u"&&(this.breadcrumbs.instrumentClicks(),this.breadcrumbs.instrumentNavigation(),window.addEventListener("beforeunload",()=>this.transport.flush()),window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.transport.flush()}))}captureException(e,t){if(!this.initialized)return;let n=e instanceof Error?e:new Error(String(e)),r=n.stack?f(n.stack):[],s=`${n.name}:${n.message}`;if(this.seen.has(s))return;this.seen.add(s),setTimeout(()=>this.seen.delete(s),5e3);let o=this._buildEvent({level:t?.level||"error",message:n.message,exception:{type:n.name||"Error",value:n.message,stacktrace:r.length>0?{frames:r}:void 0},tags:t?.tags,request:t?.request});this._send(o)}captureMessage(e,t="info",n){if(!this.initialized)return;let r=this._buildEvent({level:t,message:e,tags:n});this._send(r)}addBreadcrumb(e,t,n){this.breadcrumbs.add(e,t,n)}setUser(e){this.options.user=e||void 0}setTag(e,t){this.options.tags||(this.options.tags={}),this.options.tags[e]=t}flush(){this.transport.flush()}wrap(e){let t=this;return function(...n){try{let r=e.apply(this,n);return r instanceof Promise?r.catch(s=>{throw t.captureException(s),s}):r}catch(r){throw t.captureException(r),r}}}wrapApiHandler(e){let t=this;return async function(n,r){try{return await e(n,r)}catch(s){let o=t._extractRequestContext(n);throw t.captureException(s,{request:o}),t.transport.flush(),s}}}wrapRouteHandler(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){let s=n[0]?t._extractRequestContext(n[0]):void 0;throw t.captureException(r,{request:s}),t.transport.flush(),r}})}wrapServerAction(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){throw t.captureException(r),t.transport.flush(),r}})}_extractRequestContext(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.url=="string"&&typeof t.method=="string")return{url:t.url,method:t.method,query_string:typeof t.url=="string"&&t.url.split("?")[1]||""};if(typeof t.originalUrl=="string"&&typeof t.method=="string")return{url:t.originalUrl,method:t.method,query_string:typeof t.query=="object"?JSON.stringify(t.query):""}}_buildEvent(e){let t={...e,message:e.message||"",environment:this.options.environment,release:this.options.release,timestamp:new Date().toISOString(),user:this.options.user,tags:{sdk_name:y,sdk_version:v,...this.options.tags,...e.tags},breadcrumbs:this.breadcrumbs.getAll()};return e.request?t.request=e.request:typeof window<"u"&&(t.request={url:window.location.href,method:"GET",query_string:window.location.search}),typeof process<"u"&&process.version&&(t.contexts={runtime:{name:"Node.js",version:process.version}}),t}_send(e){if(this.options.beforeSend){let t=this.options.beforeSend(e);if(!t)return;e=t}this.transport.send(e)}_instrumentConsole(){if(typeof console>"u")return;let e={log:console.log,warn:console.warn,error:console.error,info:console.info},t=this;console.log=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.log.apply(console,n)},console.warn=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"warning"),e.warn.apply(console,n)},console.error=function(...n){let r=n.map(String).join(" ");if(t.breadcrumbs.add("console",r,void 0,"error"),t.options.captureConsoleErrors){let s=n[0]instanceof Error?n[0]:null;s?t.captureException(s,{tags:{source:"console.error"}}):t.captureMessage(r,"error",{source:"console.error"})}e.error.apply(console,n)},console.info=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.info.apply(console,n)}}_setupGlobalHandlers(){if(typeof window<"u"&&(window.addEventListener("error",e=>{let t=e.target;if(t&&t!==window&&t.tagName){let n=t,r=n.tagName.toLowerCase(),s=n.src||n.href||"";this.captureMessage(`Failed to load ${r}: ${s}`,"error",{source:"resource",element:r,url:s});return}e.error?this.captureException(e.error):e.message&&this.captureException(new Error(e.message))},!0),window.addEventListener("unhandledrejection",e=>{let t=e.reason instanceof Error?e.reason:new Error(String(e.reason));this.captureException(t)})),typeof process<"u"&&typeof process.on=="function"){let e=process;e.on("uncaughtException",t=>{this.captureException(t,{level:"fatal"}),this.transport.flush()}),e.on("unhandledRejection",t=>{let n=t instanceof Error?t:new Error(String(t));this.captureException(n),this.transport.flush()})}typeof process>"u"&&typeof globalThis<"u"&&"Deno"in globalThis&&(globalThis.addEventListener("error",e=>{let t=e;t.error?this.captureException(t.error):t.message&&this.captureException(new Error(t.message))}),globalThis.addEventListener("unhandledrejection",e=>{let t=e,n=t.reason instanceof Error?t.reason:new Error(String(t.reason));this.captureException(n),this.transport.flush()}))}};var q=new l;export{q as Aiola};
2
+ `);for(let n of t){let r=n.trim();if(!r||r.startsWith("Error"))continue;let s=m.exec(r);if(s){e.push({function:s[1]||"<anonymous>",filename:s[2]||s[5]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:h(s[2]||"")});continue}s=g.exec(r),s&&e.push({function:s[1]||"<anonymous>",filename:s[2]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:h(s[2]||"")})}return e}function h(i){return!(!i||i.includes("node_modules")||i.startsWith("node:")||i.includes("internal/")||i.includes("<anonymous>"))}var w="https://lhrsgoaselmgophvbqme.supabase.co/functions/v1/app-logs-ingest",y="aiola-js",v="0.1.5",l=class{constructor(){this.initialized=!1;this.seen=new Set;this.options={apiKey:"",environment:"production",endpoint:w,maxBreadcrumbs:30,flushInterval:5e3,captureConsoleErrors:!0},this.transport=new a(this.options.endpoint,"",5e3),this.breadcrumbs=new p(30)}init(e){if(this.initialized){if(this.options.apiKey===e.apiKey)return;this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval);return}this.initialized=!0,this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval),this.breadcrumbs=new p(this.options.maxBreadcrumbs),this._setupGlobalHandlers(),this._instrumentConsole(),this.breadcrumbs.instrumentFetch(this.options.endpoint),this.breadcrumbs.instrumentXHR(this.options.endpoint),typeof window<"u"&&(this.breadcrumbs.instrumentClicks(),this.breadcrumbs.instrumentNavigation(),window.addEventListener("beforeunload",()=>this.transport.flush()),window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.transport.flush()}))}captureException(e,t){if(!this.initialized)return;let n=e instanceof Error?e:new Error(String(e)),r=n.stack?f(n.stack):[],s=`${n.name}:${n.message}`;if(this.seen.has(s))return;this.seen.add(s),setTimeout(()=>this.seen.delete(s),5e3);let o=this._buildEvent({level:t?.level||"error",message:n.message,exception:{type:n.name||"Error",value:n.message,stacktrace:r.length>0?{frames:r}:void 0},tags:t?.tags,request:t?.request});this._send(o)}captureMessage(e,t="info",n){if(!this.initialized)return;let r=this._buildEvent({level:t,message:e,tags:n});this._send(r)}addBreadcrumb(e,t,n){this.breadcrumbs.add(e,t,n)}setUser(e){this.options.user=e||void 0}setTag(e,t){this.options.tags||(this.options.tags={}),this.options.tags[e]=t}flush(){this.transport.flush()}wrap(e){let t=this;return function(...n){try{let r=e.apply(this,n);return r instanceof Promise?r.catch(s=>{throw t.captureException(s),s}):r}catch(r){throw t.captureException(r),r}}}wrapApiHandler(e){let t=this;return async function(n,r){try{return await e(n,r)}catch(s){let o=t._extractRequestContext(n);throw t.captureException(s,{request:o}),t.transport.flush(),s}}}wrapRouteHandler(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){let s=n[0]?t._extractRequestContext(n[0]):void 0;throw t.captureException(r,{request:s}),t.transport.flush(),r}})}wrapServerAction(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){throw t.captureException(r),t.transport.flush(),r}})}_extractRequestContext(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.url=="string"&&typeof t.method=="string")return{url:t.url,method:t.method,query_string:typeof t.url=="string"&&t.url.split("?")[1]||""};if(typeof t.originalUrl=="string"&&typeof t.method=="string")return{url:t.originalUrl,method:t.method,query_string:typeof t.query=="object"?JSON.stringify(t.query):""}}_buildEvent(e){let t={...e,message:e.message||"",environment:this.options.environment,release:this.options.release,timestamp:new Date().toISOString(),user:this.options.user,tags:{sdk_name:y,sdk_version:v,...this.options.tags,...e.tags},breadcrumbs:this.breadcrumbs.getAll()};return e.request?t.request=e.request:typeof window<"u"&&(t.request={url:window.location.href,method:"GET",query_string:window.location.search}),typeof process<"u"&&process.version&&(t.contexts={runtime:{name:"Node.js",version:process.version}}),t}_send(e){if(this.options.beforeSend){let t=this.options.beforeSend(e);if(!t)return;e=t}this.transport.send(e)}_instrumentConsole(){if(typeof console>"u")return;let e={log:console.log,warn:console.warn,error:console.error,info:console.info},t=this;console.log=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.log.apply(console,n)},console.warn=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"warning"),e.warn.apply(console,n)},console.error=function(...n){let r=n.map(String).join(" ");if(t.breadcrumbs.add("console",r,void 0,"error"),t.options.captureConsoleErrors){let s=n[0]instanceof Error?n[0]:null;s?t.captureException(s,{tags:{source:"console.error"}}):t.captureMessage(r,"error",{source:"console.error"})}e.error.apply(console,n)},console.info=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.info.apply(console,n)}}_setupGlobalHandlers(){if(typeof window<"u"&&(window.addEventListener("error",e=>{let t=e.target;if(t&&t!==window&&t.tagName){let n=t,r=n.tagName.toLowerCase(),s=n.src||n.href||"";this.captureMessage(`Failed to load ${r}: ${s}`,"error",{source:"resource",element:r,url:s});return}e.error?this.captureException(e.error):e.message&&this.captureException(new Error(e.message))},!0),window.addEventListener("unhandledrejection",e=>{let t=e.reason instanceof Error?e.reason:new Error(String(e.reason));this.captureException(t)})),typeof process<"u"&&typeof process.on=="function"){let e=process;e.on("uncaughtException",t=>{this.captureException(t,{level:"fatal"}),this.transport.flush()}),e.on("unhandledRejection",t=>{let n=t instanceof Error?t:new Error(String(t));this.captureException(n),this.transport.flush()})}typeof process>"u"&&typeof globalThis<"u"&&"Deno"in globalThis&&(globalThis.addEventListener("error",e=>{let t=e;t.error?this.captureException(t.error):t.message&&this.captureException(new Error(t.message))}),globalThis.addEventListener("unhandledrejection",e=>{let t=e,n=t.reason instanceof Error?t.reason:new Error(String(t.reason));this.captureException(n),this.transport.flush()}))}};var q=new l;export{q as Aiola};
package/dist/node.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var E=(o,e)=>{for(var t in e)d(o,t,{get:e[t],enumerable:!0})},b=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of y(e))!v.call(o,s)&&s!==t&&d(o,s,{get:()=>e[s],enumerable:!(n=w(e,s))||n.enumerable});return o};var k=o=>b(d({},"__esModule",{value:!0}),o);var S={};E(S,{Aiola:()=>g});module.exports=k(S);var a=class{constructor(e,t,n){this.endpoint=e;this.apiKey=t;this.flushInterval=n;this.queue=[];this.timer=null}send(e){this.queue.push(e),this.timer||(this.timer=setTimeout(()=>this.flush(),this.flushInterval)),(e.level==="error"||e.level==="fatal")&&this.flush()}flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.queue.length===0)return;let e=this.queue.splice(0);for(let t of e)this._send(t)}_send(e){let t=JSON.stringify(e);this._fetch(t)}_fetch(e){try{fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-aiola-key":this.apiKey},body:e,keepalive:!0}).catch(()=>{})}catch{}}};var p=class{constructor(e){this.crumbs=[];this.max=e}add(e,t,n,s){this.crumbs.push({timestamp:new Date().toISOString(),category:e,message:t,level:s,data:n}),this.crumbs.length>this.max&&this.crumbs.shift()}getAll(){return[...this.crumbs]}clear(){this.crumbs=[]}instrumentFetch(e){if(typeof globalThis.fetch>"u")return;let t=globalThis.fetch,n=this;globalThis.fetch=function(s,r){let i=typeof s=="string"?s:s instanceof URL?s.href:s.url,u=r?.method||"GET";if(e&&i.includes(e))return t.apply(globalThis,[s,r]);let h=Date.now();return t.apply(globalThis,[s,r]).then(c=>(n.add("http",`${u} ${i}`,{status_code:c.status,duration_ms:Date.now()-h}),c),c=>{throw n.add("http",`${u} ${i} (failed)`,{error:String(c),duration_ms:Date.now()-h},"error"),c})}}instrumentXHR(e){if(typeof XMLHttpRequest>"u")return;let t=this,n=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(r,i){return this._clawMethod=r,this._clawUrl=typeof i=="string"?i:i.href,n.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let r=this;if(e&&r._clawUrl.includes(e))return s.apply(this,arguments);let i=Date.now();return r.addEventListener("loadend",function(){let u=Date.now()-i;r.status>0?t.add("http",`${r._clawMethod} ${r._clawUrl}`,{status_code:r.status,duration_ms:u,type:"xhr"}):t.add("http",`${r._clawMethod} ${r._clawUrl} (failed)`,{duration_ms:u,type:"xhr"},"error")}),s.apply(this,arguments)}}instrumentClicks(){typeof document>"u"||document.addEventListener("click",e=>{let t=e.target;if(!t)return;let n=t.tagName?.toLowerCase(),s=t.textContent?.slice(0,50)?.trim(),r=t.id?`#${t.id}`:"",i=t.className&&typeof t.className=="string"?`.${t.className.split(" ")[0]}`:"";this.add("click",`${n}${r}${i}${s?` "${s}"`:""}`)},{capture:!0,passive:!0})}instrumentNavigation(){if(typeof window>"u")return;let e=window.location.href,t=()=>{let r=window.location.href;r!==e&&(this.add("navigation",`${e} \u2192 ${r}`),e=r)};window.addEventListener("popstate",t);let n=history.pushState,s=history.replaceState;history.pushState=function(...r){n.apply(this,r),t()},history.replaceState=function(...r){s.apply(this,r),t()}}};var x=/^\s*at (?:(.+?)\s+\()?(?:(.+?):(\d+):(\d+)|([^)]+))\)?$/,_=/^(.+?)@(.+?):(\d+):(\d+)$/;function m(o){let e=[],t=o.split(`
2
- `);for(let n of t){let s=n.trim();if(!s||s.startsWith("Error"))continue;let r=x.exec(s);if(r){e.push({function:r[1]||"<anonymous>",filename:r[2]||r[5]||"<unknown>",lineno:parseInt(r[3],10)||0,colno:parseInt(r[4],10)||void 0,in_app:f(r[2]||"")});continue}r=_.exec(s),r&&e.push({function:r[1]||"<anonymous>",filename:r[2]||"<unknown>",lineno:parseInt(r[3],10)||0,colno:parseInt(r[4],10)||void 0,in_app:f(r[2]||"")})}return e}function f(o){return!(!o||o.includes("node_modules")||o.startsWith("node:")||o.includes("internal/")||o.includes("<anonymous>"))}var L="https://aiola.app/api/app-logs/ingest",T="aiola-js",R="0.1.3",l=class{constructor(){this.initialized=!1;this.seen=new Set;this.options={apiKey:"",environment:"production",endpoint:L,maxBreadcrumbs:30,flushInterval:5e3,captureConsoleErrors:!0},this.transport=new a(this.options.endpoint,"",5e3),this.breadcrumbs=new p(30)}init(e){if(this.initialized){if(this.options.apiKey===e.apiKey)return;this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval);return}this.initialized=!0,this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval),this.breadcrumbs=new p(this.options.maxBreadcrumbs),this._setupGlobalHandlers(),this._instrumentConsole(),this.breadcrumbs.instrumentFetch(this.options.endpoint),this.breadcrumbs.instrumentXHR(this.options.endpoint),typeof window<"u"&&(this.breadcrumbs.instrumentClicks(),this.breadcrumbs.instrumentNavigation(),window.addEventListener("beforeunload",()=>this.transport.flush()),window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.transport.flush()}))}captureException(e,t){if(!this.initialized)return;let n=e instanceof Error?e:new Error(String(e)),s=n.stack?m(n.stack):[],r=`${n.name}:${n.message}`;if(this.seen.has(r))return;this.seen.add(r),setTimeout(()=>this.seen.delete(r),5e3);let i=this._buildEvent({level:t?.level||"error",message:n.message,exception:{type:n.name||"Error",value:n.message,stacktrace:s.length>0?{frames:s}:void 0},tags:t?.tags,request:t?.request});this._send(i)}captureMessage(e,t="info",n){if(!this.initialized)return;let s=this._buildEvent({level:t,message:e,tags:n});this._send(s)}addBreadcrumb(e,t,n){this.breadcrumbs.add(e,t,n)}setUser(e){this.options.user=e||void 0}setTag(e,t){this.options.tags||(this.options.tags={}),this.options.tags[e]=t}flush(){this.transport.flush()}wrap(e){let t=this;return function(...n){try{let s=e.apply(this,n);return s instanceof Promise?s.catch(r=>{throw t.captureException(r),r}):s}catch(s){throw t.captureException(s),s}}}wrapApiHandler(e){let t=this;return async function(n,s){try{return await e(n,s)}catch(r){let i=t._extractRequestContext(n);throw t.captureException(r,{request:i}),t.transport.flush(),r}}}wrapRouteHandler(e){let t=this;return(async function(...n){try{return await e(...n)}catch(s){let r=n[0]?t._extractRequestContext(n[0]):void 0;throw t.captureException(s,{request:r}),t.transport.flush(),s}})}wrapServerAction(e){let t=this;return(async function(...n){try{return await e(...n)}catch(s){throw t.captureException(s),t.transport.flush(),s}})}_extractRequestContext(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.url=="string"&&typeof t.method=="string")return{url:t.url,method:t.method,query_string:typeof t.url=="string"&&t.url.split("?")[1]||""};if(typeof t.originalUrl=="string"&&typeof t.method=="string")return{url:t.originalUrl,method:t.method,query_string:typeof t.query=="object"?JSON.stringify(t.query):""}}_buildEvent(e){let t={...e,message:e.message||"",environment:this.options.environment,release:this.options.release,timestamp:new Date().toISOString(),user:this.options.user,tags:{sdk_name:T,sdk_version:R,...this.options.tags,...e.tags},breadcrumbs:this.breadcrumbs.getAll()};return e.request?t.request=e.request:typeof window<"u"&&(t.request={url:window.location.href,method:"GET",query_string:window.location.search}),typeof process<"u"&&process.version&&(t.contexts={runtime:{name:"Node.js",version:process.version}}),t}_send(e){if(this.options.beforeSend){let t=this.options.beforeSend(e);if(!t)return;e=t}this.transport.send(e)}_instrumentConsole(){if(typeof console>"u")return;let e={log:console.log,warn:console.warn,error:console.error,info:console.info},t=this;console.log=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.log.apply(console,n)},console.warn=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"warning"),e.warn.apply(console,n)},console.error=function(...n){let s=n.map(String).join(" ");if(t.breadcrumbs.add("console",s,void 0,"error"),t.options.captureConsoleErrors){let r=n[0]instanceof Error?n[0]:null;r?t.captureException(r,{tags:{source:"console.error"}}):t.captureMessage(s,"error",{source:"console.error"})}e.error.apply(console,n)},console.info=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.info.apply(console,n)}}_setupGlobalHandlers(){if(typeof window<"u"&&(window.addEventListener("error",e=>{let t=e.target;if(t&&t!==window&&t.tagName){let n=t,s=n.tagName.toLowerCase(),r=n.src||n.href||"";this.captureMessage(`Failed to load ${s}: ${r}`,"error",{source:"resource",element:s,url:r});return}e.error?this.captureException(e.error):e.message&&this.captureException(new Error(e.message))},!0),window.addEventListener("unhandledrejection",e=>{let t=e.reason instanceof Error?e.reason:new Error(String(e.reason));this.captureException(t)})),typeof process<"u"&&typeof process.on=="function"){let e=process;e.on("uncaughtException",t=>{this.captureException(t,{level:"fatal"}),this.transport.flush()}),e.on("unhandledRejection",t=>{let n=t instanceof Error?t:new Error(String(t));this.captureException(n),this.transport.flush()})}typeof process>"u"&&typeof globalThis<"u"&&"Deno"in globalThis&&(globalThis.addEventListener("error",e=>{let t=e;t.error?this.captureException(t.error):t.message&&this.captureException(new Error(t.message))}),globalThis.addEventListener("unhandledrejection",e=>{let t=e,n=t.reason instanceof Error?t.reason:new Error(String(t.reason));this.captureException(n),this.transport.flush()}))}};var g=new l;0&&(module.exports={Aiola});
1
+ "use strict";var d=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var E=(o,e)=>{for(var t in e)d(o,t,{get:e[t],enumerable:!0})},b=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of y(e))!v.call(o,r)&&r!==t&&d(o,r,{get:()=>e[r],enumerable:!(n=w(e,r))||n.enumerable});return o};var k=o=>b(d({},"__esModule",{value:!0}),o);var q={};E(q,{Aiola:()=>g});module.exports=k(q);var a=class{constructor(e,t,n){this.endpoint=e;this.apiKey=t;this.flushInterval=n;this.queue=[];this.timer=null}send(e){this.queue.push(e),this.timer||(this.timer=setTimeout(()=>this.flush(),this.flushInterval)),(e.level==="error"||e.level==="fatal")&&this.flush()}flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.queue.length===0)return;let e=this.queue.splice(0);for(let t of e)this._send(t)}_send(e){let t=JSON.stringify(e);this._fetch(t)}_fetch(e){try{fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-aiola-key":this.apiKey},body:e,keepalive:!0}).catch(()=>{})}catch{}}};var p=class{constructor(e){this.crumbs=[];this.max=e}add(e,t,n,r){this.crumbs.push({timestamp:new Date().toISOString(),category:e,message:t,level:r,data:n}),this.crumbs.length>this.max&&this.crumbs.shift()}getAll(){return[...this.crumbs]}clear(){this.crumbs=[]}instrumentFetch(e){if(typeof globalThis.fetch>"u")return;let t=globalThis.fetch,n=this;globalThis.fetch=function(r,s){let i=typeof r=="string"?r:r instanceof URL?r.href:r.url,u=s?.method||"GET";if(e&&i.includes(e))return t.apply(globalThis,[r,s]);let h=Date.now();return t.apply(globalThis,[r,s]).then(c=>(n.add("http",`${u} ${i}`,{status_code:c.status,duration_ms:Date.now()-h}),c),c=>{throw n.add("http",`${u} ${i} (failed)`,{error:String(c),duration_ms:Date.now()-h},"error"),c})}}instrumentXHR(e){if(typeof XMLHttpRequest>"u")return;let t=this,n=XMLHttpRequest.prototype.open,r=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(s,i){return this._clawMethod=s,this._clawUrl=typeof i=="string"?i:i.href,n.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let s=this;if(e&&s._clawUrl.includes(e))return r.apply(this,arguments);let i=Date.now();return s.addEventListener("loadend",function(){let u=Date.now()-i;s.status>0?t.add("http",`${s._clawMethod} ${s._clawUrl}`,{status_code:s.status,duration_ms:u,type:"xhr"}):t.add("http",`${s._clawMethod} ${s._clawUrl} (failed)`,{duration_ms:u,type:"xhr"},"error")}),r.apply(this,arguments)}}instrumentClicks(){typeof document>"u"||document.addEventListener("click",e=>{let t=e.target;if(!t)return;let n=t.tagName?.toLowerCase(),r=t.textContent?.slice(0,50)?.trim(),s=t.id?`#${t.id}`:"",i=t.className&&typeof t.className=="string"?`.${t.className.split(" ")[0]}`:"";this.add("click",`${n}${s}${i}${r?` "${r}"`:""}`)},{capture:!0,passive:!0})}instrumentNavigation(){if(typeof window>"u")return;let e=window.location.href,t=()=>{let s=window.location.href;s!==e&&(this.add("navigation",`${e} \u2192 ${s}`),e=s)};window.addEventListener("popstate",t);let n=history.pushState,r=history.replaceState;history.pushState=function(...s){n.apply(this,s),t()},history.replaceState=function(...s){r.apply(this,s),t()}}};var x=/^\s*at (?:(.+?)\s+\()?(?:(.+?):(\d+):(\d+)|([^)]+))\)?$/,_=/^(.+?)@(.+?):(\d+):(\d+)$/;function m(o){let e=[],t=o.split(`
2
+ `);for(let n of t){let r=n.trim();if(!r||r.startsWith("Error"))continue;let s=x.exec(r);if(s){e.push({function:s[1]||"<anonymous>",filename:s[2]||s[5]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:f(s[2]||"")});continue}s=_.exec(r),s&&e.push({function:s[1]||"<anonymous>",filename:s[2]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:f(s[2]||"")})}return e}function f(o){return!(!o||o.includes("node_modules")||o.startsWith("node:")||o.includes("internal/")||o.includes("<anonymous>"))}var L="https://lhrsgoaselmgophvbqme.supabase.co/functions/v1/app-logs-ingest",T="aiola-js",R="0.1.5",l=class{constructor(){this.initialized=!1;this.seen=new Set;this.options={apiKey:"",environment:"production",endpoint:L,maxBreadcrumbs:30,flushInterval:5e3,captureConsoleErrors:!0},this.transport=new a(this.options.endpoint,"",5e3),this.breadcrumbs=new p(30)}init(e){if(this.initialized){if(this.options.apiKey===e.apiKey)return;this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval);return}this.initialized=!0,this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval),this.breadcrumbs=new p(this.options.maxBreadcrumbs),this._setupGlobalHandlers(),this._instrumentConsole(),this.breadcrumbs.instrumentFetch(this.options.endpoint),this.breadcrumbs.instrumentXHR(this.options.endpoint),typeof window<"u"&&(this.breadcrumbs.instrumentClicks(),this.breadcrumbs.instrumentNavigation(),window.addEventListener("beforeunload",()=>this.transport.flush()),window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.transport.flush()}))}captureException(e,t){if(!this.initialized)return;let n=e instanceof Error?e:new Error(String(e)),r=n.stack?m(n.stack):[],s=`${n.name}:${n.message}`;if(this.seen.has(s))return;this.seen.add(s),setTimeout(()=>this.seen.delete(s),5e3);let i=this._buildEvent({level:t?.level||"error",message:n.message,exception:{type:n.name||"Error",value:n.message,stacktrace:r.length>0?{frames:r}:void 0},tags:t?.tags,request:t?.request});this._send(i)}captureMessage(e,t="info",n){if(!this.initialized)return;let r=this._buildEvent({level:t,message:e,tags:n});this._send(r)}addBreadcrumb(e,t,n){this.breadcrumbs.add(e,t,n)}setUser(e){this.options.user=e||void 0}setTag(e,t){this.options.tags||(this.options.tags={}),this.options.tags[e]=t}flush(){this.transport.flush()}wrap(e){let t=this;return function(...n){try{let r=e.apply(this,n);return r instanceof Promise?r.catch(s=>{throw t.captureException(s),s}):r}catch(r){throw t.captureException(r),r}}}wrapApiHandler(e){let t=this;return async function(n,r){try{return await e(n,r)}catch(s){let i=t._extractRequestContext(n);throw t.captureException(s,{request:i}),t.transport.flush(),s}}}wrapRouteHandler(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){let s=n[0]?t._extractRequestContext(n[0]):void 0;throw t.captureException(r,{request:s}),t.transport.flush(),r}})}wrapServerAction(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){throw t.captureException(r),t.transport.flush(),r}})}_extractRequestContext(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.url=="string"&&typeof t.method=="string")return{url:t.url,method:t.method,query_string:typeof t.url=="string"&&t.url.split("?")[1]||""};if(typeof t.originalUrl=="string"&&typeof t.method=="string")return{url:t.originalUrl,method:t.method,query_string:typeof t.query=="object"?JSON.stringify(t.query):""}}_buildEvent(e){let t={...e,message:e.message||"",environment:this.options.environment,release:this.options.release,timestamp:new Date().toISOString(),user:this.options.user,tags:{sdk_name:T,sdk_version:R,...this.options.tags,...e.tags},breadcrumbs:this.breadcrumbs.getAll()};return e.request?t.request=e.request:typeof window<"u"&&(t.request={url:window.location.href,method:"GET",query_string:window.location.search}),typeof process<"u"&&process.version&&(t.contexts={runtime:{name:"Node.js",version:process.version}}),t}_send(e){if(this.options.beforeSend){let t=this.options.beforeSend(e);if(!t)return;e=t}this.transport.send(e)}_instrumentConsole(){if(typeof console>"u")return;let e={log:console.log,warn:console.warn,error:console.error,info:console.info},t=this;console.log=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.log.apply(console,n)},console.warn=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"warning"),e.warn.apply(console,n)},console.error=function(...n){let r=n.map(String).join(" ");if(t.breadcrumbs.add("console",r,void 0,"error"),t.options.captureConsoleErrors){let s=n[0]instanceof Error?n[0]:null;s?t.captureException(s,{tags:{source:"console.error"}}):t.captureMessage(r,"error",{source:"console.error"})}e.error.apply(console,n)},console.info=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.info.apply(console,n)}}_setupGlobalHandlers(){if(typeof window<"u"&&(window.addEventListener("error",e=>{let t=e.target;if(t&&t!==window&&t.tagName){let n=t,r=n.tagName.toLowerCase(),s=n.src||n.href||"";this.captureMessage(`Failed to load ${r}: ${s}`,"error",{source:"resource",element:r,url:s});return}e.error?this.captureException(e.error):e.message&&this.captureException(new Error(e.message))},!0),window.addEventListener("unhandledrejection",e=>{let t=e.reason instanceof Error?e.reason:new Error(String(e.reason));this.captureException(t)})),typeof process<"u"&&typeof process.on=="function"){let e=process;e.on("uncaughtException",t=>{this.captureException(t,{level:"fatal"}),this.transport.flush()}),e.on("unhandledRejection",t=>{let n=t instanceof Error?t:new Error(String(t));this.captureException(n),this.transport.flush()})}typeof process>"u"&&typeof globalThis<"u"&&"Deno"in globalThis&&(globalThis.addEventListener("error",e=>{let t=e;t.error?this.captureException(t.error):t.message&&this.captureException(new Error(t.message))}),globalThis.addEventListener("unhandledrejection",e=>{let t=e,n=t.reason instanceof Error?t.reason:new Error(String(t.reason));this.captureException(n),this.transport.flush()}))}};var g=new l;0&&(module.exports={Aiola});
package/dist/node.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var a=class{constructor(e,t,n){this.endpoint=e;this.apiKey=t;this.flushInterval=n;this.queue=[];this.timer=null}send(e){this.queue.push(e),this.timer||(this.timer=setTimeout(()=>this.flush(),this.flushInterval)),(e.level==="error"||e.level==="fatal")&&this.flush()}flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.queue.length===0)return;let e=this.queue.splice(0);for(let t of e)this._send(t)}_send(e){let t=JSON.stringify(e);this._fetch(t)}_fetch(e){try{fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-aiola-key":this.apiKey},body:e,keepalive:!0}).catch(()=>{})}catch{}}};var p=class{constructor(e){this.crumbs=[];this.max=e}add(e,t,n,s){this.crumbs.push({timestamp:new Date().toISOString(),category:e,message:t,level:s,data:n}),this.crumbs.length>this.max&&this.crumbs.shift()}getAll(){return[...this.crumbs]}clear(){this.crumbs=[]}instrumentFetch(e){if(typeof globalThis.fetch>"u")return;let t=globalThis.fetch,n=this;globalThis.fetch=function(s,r){let o=typeof s=="string"?s:s instanceof URL?s.href:s.url,u=r?.method||"GET";if(e&&o.includes(e))return t.apply(globalThis,[s,r]);let d=Date.now();return t.apply(globalThis,[s,r]).then(c=>(n.add("http",`${u} ${o}`,{status_code:c.status,duration_ms:Date.now()-d}),c),c=>{throw n.add("http",`${u} ${o} (failed)`,{error:String(c),duration_ms:Date.now()-d},"error"),c})}}instrumentXHR(e){if(typeof XMLHttpRequest>"u")return;let t=this,n=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(r,o){return this._clawMethod=r,this._clawUrl=typeof o=="string"?o:o.href,n.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let r=this;if(e&&r._clawUrl.includes(e))return s.apply(this,arguments);let o=Date.now();return r.addEventListener("loadend",function(){let u=Date.now()-o;r.status>0?t.add("http",`${r._clawMethod} ${r._clawUrl}`,{status_code:r.status,duration_ms:u,type:"xhr"}):t.add("http",`${r._clawMethod} ${r._clawUrl} (failed)`,{duration_ms:u,type:"xhr"},"error")}),s.apply(this,arguments)}}instrumentClicks(){typeof document>"u"||document.addEventListener("click",e=>{let t=e.target;if(!t)return;let n=t.tagName?.toLowerCase(),s=t.textContent?.slice(0,50)?.trim(),r=t.id?`#${t.id}`:"",o=t.className&&typeof t.className=="string"?`.${t.className.split(" ")[0]}`:"";this.add("click",`${n}${r}${o}${s?` "${s}"`:""}`)},{capture:!0,passive:!0})}instrumentNavigation(){if(typeof window>"u")return;let e=window.location.href,t=()=>{let r=window.location.href;r!==e&&(this.add("navigation",`${e} \u2192 ${r}`),e=r)};window.addEventListener("popstate",t);let n=history.pushState,s=history.replaceState;history.pushState=function(...r){n.apply(this,r),t()},history.replaceState=function(...r){s.apply(this,r),t()}}};var m=/^\s*at (?:(.+?)\s+\()?(?:(.+?):(\d+):(\d+)|([^)]+))\)?$/,g=/^(.+?)@(.+?):(\d+):(\d+)$/;function f(i){let e=[],t=i.split(`
2
- `);for(let n of t){let s=n.trim();if(!s||s.startsWith("Error"))continue;let r=m.exec(s);if(r){e.push({function:r[1]||"<anonymous>",filename:r[2]||r[5]||"<unknown>",lineno:parseInt(r[3],10)||0,colno:parseInt(r[4],10)||void 0,in_app:h(r[2]||"")});continue}r=g.exec(s),r&&e.push({function:r[1]||"<anonymous>",filename:r[2]||"<unknown>",lineno:parseInt(r[3],10)||0,colno:parseInt(r[4],10)||void 0,in_app:h(r[2]||"")})}return e}function h(i){return!(!i||i.includes("node_modules")||i.startsWith("node:")||i.includes("internal/")||i.includes("<anonymous>"))}var w="https://aiola.app/api/app-logs/ingest",y="aiola-js",v="0.1.3",l=class{constructor(){this.initialized=!1;this.seen=new Set;this.options={apiKey:"",environment:"production",endpoint:w,maxBreadcrumbs:30,flushInterval:5e3,captureConsoleErrors:!0},this.transport=new a(this.options.endpoint,"",5e3),this.breadcrumbs=new p(30)}init(e){if(this.initialized){if(this.options.apiKey===e.apiKey)return;this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval);return}this.initialized=!0,this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval),this.breadcrumbs=new p(this.options.maxBreadcrumbs),this._setupGlobalHandlers(),this._instrumentConsole(),this.breadcrumbs.instrumentFetch(this.options.endpoint),this.breadcrumbs.instrumentXHR(this.options.endpoint),typeof window<"u"&&(this.breadcrumbs.instrumentClicks(),this.breadcrumbs.instrumentNavigation(),window.addEventListener("beforeunload",()=>this.transport.flush()),window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.transport.flush()}))}captureException(e,t){if(!this.initialized)return;let n=e instanceof Error?e:new Error(String(e)),s=n.stack?f(n.stack):[],r=`${n.name}:${n.message}`;if(this.seen.has(r))return;this.seen.add(r),setTimeout(()=>this.seen.delete(r),5e3);let o=this._buildEvent({level:t?.level||"error",message:n.message,exception:{type:n.name||"Error",value:n.message,stacktrace:s.length>0?{frames:s}:void 0},tags:t?.tags,request:t?.request});this._send(o)}captureMessage(e,t="info",n){if(!this.initialized)return;let s=this._buildEvent({level:t,message:e,tags:n});this._send(s)}addBreadcrumb(e,t,n){this.breadcrumbs.add(e,t,n)}setUser(e){this.options.user=e||void 0}setTag(e,t){this.options.tags||(this.options.tags={}),this.options.tags[e]=t}flush(){this.transport.flush()}wrap(e){let t=this;return function(...n){try{let s=e.apply(this,n);return s instanceof Promise?s.catch(r=>{throw t.captureException(r),r}):s}catch(s){throw t.captureException(s),s}}}wrapApiHandler(e){let t=this;return async function(n,s){try{return await e(n,s)}catch(r){let o=t._extractRequestContext(n);throw t.captureException(r,{request:o}),t.transport.flush(),r}}}wrapRouteHandler(e){let t=this;return(async function(...n){try{return await e(...n)}catch(s){let r=n[0]?t._extractRequestContext(n[0]):void 0;throw t.captureException(s,{request:r}),t.transport.flush(),s}})}wrapServerAction(e){let t=this;return(async function(...n){try{return await e(...n)}catch(s){throw t.captureException(s),t.transport.flush(),s}})}_extractRequestContext(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.url=="string"&&typeof t.method=="string")return{url:t.url,method:t.method,query_string:typeof t.url=="string"&&t.url.split("?")[1]||""};if(typeof t.originalUrl=="string"&&typeof t.method=="string")return{url:t.originalUrl,method:t.method,query_string:typeof t.query=="object"?JSON.stringify(t.query):""}}_buildEvent(e){let t={...e,message:e.message||"",environment:this.options.environment,release:this.options.release,timestamp:new Date().toISOString(),user:this.options.user,tags:{sdk_name:y,sdk_version:v,...this.options.tags,...e.tags},breadcrumbs:this.breadcrumbs.getAll()};return e.request?t.request=e.request:typeof window<"u"&&(t.request={url:window.location.href,method:"GET",query_string:window.location.search}),typeof process<"u"&&process.version&&(t.contexts={runtime:{name:"Node.js",version:process.version}}),t}_send(e){if(this.options.beforeSend){let t=this.options.beforeSend(e);if(!t)return;e=t}this.transport.send(e)}_instrumentConsole(){if(typeof console>"u")return;let e={log:console.log,warn:console.warn,error:console.error,info:console.info},t=this;console.log=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.log.apply(console,n)},console.warn=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"warning"),e.warn.apply(console,n)},console.error=function(...n){let s=n.map(String).join(" ");if(t.breadcrumbs.add("console",s,void 0,"error"),t.options.captureConsoleErrors){let r=n[0]instanceof Error?n[0]:null;r?t.captureException(r,{tags:{source:"console.error"}}):t.captureMessage(s,"error",{source:"console.error"})}e.error.apply(console,n)},console.info=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.info.apply(console,n)}}_setupGlobalHandlers(){if(typeof window<"u"&&(window.addEventListener("error",e=>{let t=e.target;if(t&&t!==window&&t.tagName){let n=t,s=n.tagName.toLowerCase(),r=n.src||n.href||"";this.captureMessage(`Failed to load ${s}: ${r}`,"error",{source:"resource",element:s,url:r});return}e.error?this.captureException(e.error):e.message&&this.captureException(new Error(e.message))},!0),window.addEventListener("unhandledrejection",e=>{let t=e.reason instanceof Error?e.reason:new Error(String(e.reason));this.captureException(t)})),typeof process<"u"&&typeof process.on=="function"){let e=process;e.on("uncaughtException",t=>{this.captureException(t,{level:"fatal"}),this.transport.flush()}),e.on("unhandledRejection",t=>{let n=t instanceof Error?t:new Error(String(t));this.captureException(n),this.transport.flush()})}typeof process>"u"&&typeof globalThis<"u"&&"Deno"in globalThis&&(globalThis.addEventListener("error",e=>{let t=e;t.error?this.captureException(t.error):t.message&&this.captureException(new Error(t.message))}),globalThis.addEventListener("unhandledrejection",e=>{let t=e,n=t.reason instanceof Error?t.reason:new Error(String(t.reason));this.captureException(n),this.transport.flush()}))}};var E=new l;export{E as Aiola};
1
+ var a=class{constructor(e,t,n){this.endpoint=e;this.apiKey=t;this.flushInterval=n;this.queue=[];this.timer=null}send(e){this.queue.push(e),this.timer||(this.timer=setTimeout(()=>this.flush(),this.flushInterval)),(e.level==="error"||e.level==="fatal")&&this.flush()}flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.queue.length===0)return;let e=this.queue.splice(0);for(let t of e)this._send(t)}_send(e){let t=JSON.stringify(e);this._fetch(t)}_fetch(e){try{fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json","x-aiola-key":this.apiKey},body:e,keepalive:!0}).catch(()=>{})}catch{}}};var p=class{constructor(e){this.crumbs=[];this.max=e}add(e,t,n,r){this.crumbs.push({timestamp:new Date().toISOString(),category:e,message:t,level:r,data:n}),this.crumbs.length>this.max&&this.crumbs.shift()}getAll(){return[...this.crumbs]}clear(){this.crumbs=[]}instrumentFetch(e){if(typeof globalThis.fetch>"u")return;let t=globalThis.fetch,n=this;globalThis.fetch=function(r,s){let o=typeof r=="string"?r:r instanceof URL?r.href:r.url,u=s?.method||"GET";if(e&&o.includes(e))return t.apply(globalThis,[r,s]);let d=Date.now();return t.apply(globalThis,[r,s]).then(c=>(n.add("http",`${u} ${o}`,{status_code:c.status,duration_ms:Date.now()-d}),c),c=>{throw n.add("http",`${u} ${o} (failed)`,{error:String(c),duration_ms:Date.now()-d},"error"),c})}}instrumentXHR(e){if(typeof XMLHttpRequest>"u")return;let t=this,n=XMLHttpRequest.prototype.open,r=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(s,o){return this._clawMethod=s,this._clawUrl=typeof o=="string"?o:o.href,n.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let s=this;if(e&&s._clawUrl.includes(e))return r.apply(this,arguments);let o=Date.now();return s.addEventListener("loadend",function(){let u=Date.now()-o;s.status>0?t.add("http",`${s._clawMethod} ${s._clawUrl}`,{status_code:s.status,duration_ms:u,type:"xhr"}):t.add("http",`${s._clawMethod} ${s._clawUrl} (failed)`,{duration_ms:u,type:"xhr"},"error")}),r.apply(this,arguments)}}instrumentClicks(){typeof document>"u"||document.addEventListener("click",e=>{let t=e.target;if(!t)return;let n=t.tagName?.toLowerCase(),r=t.textContent?.slice(0,50)?.trim(),s=t.id?`#${t.id}`:"",o=t.className&&typeof t.className=="string"?`.${t.className.split(" ")[0]}`:"";this.add("click",`${n}${s}${o}${r?` "${r}"`:""}`)},{capture:!0,passive:!0})}instrumentNavigation(){if(typeof window>"u")return;let e=window.location.href,t=()=>{let s=window.location.href;s!==e&&(this.add("navigation",`${e} \u2192 ${s}`),e=s)};window.addEventListener("popstate",t);let n=history.pushState,r=history.replaceState;history.pushState=function(...s){n.apply(this,s),t()},history.replaceState=function(...s){r.apply(this,s),t()}}};var m=/^\s*at (?:(.+?)\s+\()?(?:(.+?):(\d+):(\d+)|([^)]+))\)?$/,g=/^(.+?)@(.+?):(\d+):(\d+)$/;function f(i){let e=[],t=i.split(`
2
+ `);for(let n of t){let r=n.trim();if(!r||r.startsWith("Error"))continue;let s=m.exec(r);if(s){e.push({function:s[1]||"<anonymous>",filename:s[2]||s[5]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:h(s[2]||"")});continue}s=g.exec(r),s&&e.push({function:s[1]||"<anonymous>",filename:s[2]||"<unknown>",lineno:parseInt(s[3],10)||0,colno:parseInt(s[4],10)||void 0,in_app:h(s[2]||"")})}return e}function h(i){return!(!i||i.includes("node_modules")||i.startsWith("node:")||i.includes("internal/")||i.includes("<anonymous>"))}var w="https://lhrsgoaselmgophvbqme.supabase.co/functions/v1/app-logs-ingest",y="aiola-js",v="0.1.5",l=class{constructor(){this.initialized=!1;this.seen=new Set;this.options={apiKey:"",environment:"production",endpoint:w,maxBreadcrumbs:30,flushInterval:5e3,captureConsoleErrors:!0},this.transport=new a(this.options.endpoint,"",5e3),this.breadcrumbs=new p(30)}init(e){if(this.initialized){if(this.options.apiKey===e.apiKey)return;this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval);return}this.initialized=!0,this.options={...this.options,...e},this.transport=new a(this.options.endpoint,this.options.apiKey,this.options.flushInterval),this.breadcrumbs=new p(this.options.maxBreadcrumbs),this._setupGlobalHandlers(),this._instrumentConsole(),this.breadcrumbs.instrumentFetch(this.options.endpoint),this.breadcrumbs.instrumentXHR(this.options.endpoint),typeof window<"u"&&(this.breadcrumbs.instrumentClicks(),this.breadcrumbs.instrumentNavigation(),window.addEventListener("beforeunload",()=>this.transport.flush()),window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.transport.flush()}))}captureException(e,t){if(!this.initialized)return;let n=e instanceof Error?e:new Error(String(e)),r=n.stack?f(n.stack):[],s=`${n.name}:${n.message}`;if(this.seen.has(s))return;this.seen.add(s),setTimeout(()=>this.seen.delete(s),5e3);let o=this._buildEvent({level:t?.level||"error",message:n.message,exception:{type:n.name||"Error",value:n.message,stacktrace:r.length>0?{frames:r}:void 0},tags:t?.tags,request:t?.request});this._send(o)}captureMessage(e,t="info",n){if(!this.initialized)return;let r=this._buildEvent({level:t,message:e,tags:n});this._send(r)}addBreadcrumb(e,t,n){this.breadcrumbs.add(e,t,n)}setUser(e){this.options.user=e||void 0}setTag(e,t){this.options.tags||(this.options.tags={}),this.options.tags[e]=t}flush(){this.transport.flush()}wrap(e){let t=this;return function(...n){try{let r=e.apply(this,n);return r instanceof Promise?r.catch(s=>{throw t.captureException(s),s}):r}catch(r){throw t.captureException(r),r}}}wrapApiHandler(e){let t=this;return async function(n,r){try{return await e(n,r)}catch(s){let o=t._extractRequestContext(n);throw t.captureException(s,{request:o}),t.transport.flush(),s}}}wrapRouteHandler(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){let s=n[0]?t._extractRequestContext(n[0]):void 0;throw t.captureException(r,{request:s}),t.transport.flush(),r}})}wrapServerAction(e){let t=this;return(async function(...n){try{return await e(...n)}catch(r){throw t.captureException(r),t.transport.flush(),r}})}_extractRequestContext(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.url=="string"&&typeof t.method=="string")return{url:t.url,method:t.method,query_string:typeof t.url=="string"&&t.url.split("?")[1]||""};if(typeof t.originalUrl=="string"&&typeof t.method=="string")return{url:t.originalUrl,method:t.method,query_string:typeof t.query=="object"?JSON.stringify(t.query):""}}_buildEvent(e){let t={...e,message:e.message||"",environment:this.options.environment,release:this.options.release,timestamp:new Date().toISOString(),user:this.options.user,tags:{sdk_name:y,sdk_version:v,...this.options.tags,...e.tags},breadcrumbs:this.breadcrumbs.getAll()};return e.request?t.request=e.request:typeof window<"u"&&(t.request={url:window.location.href,method:"GET",query_string:window.location.search}),typeof process<"u"&&process.version&&(t.contexts={runtime:{name:"Node.js",version:process.version}}),t}_send(e){if(this.options.beforeSend){let t=this.options.beforeSend(e);if(!t)return;e=t}this.transport.send(e)}_instrumentConsole(){if(typeof console>"u")return;let e={log:console.log,warn:console.warn,error:console.error,info:console.info},t=this;console.log=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.log.apply(console,n)},console.warn=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"warning"),e.warn.apply(console,n)},console.error=function(...n){let r=n.map(String).join(" ");if(t.breadcrumbs.add("console",r,void 0,"error"),t.options.captureConsoleErrors){let s=n[0]instanceof Error?n[0]:null;s?t.captureException(s,{tags:{source:"console.error"}}):t.captureMessage(r,"error",{source:"console.error"})}e.error.apply(console,n)},console.info=function(...n){t.breadcrumbs.add("console",n.map(String).join(" "),void 0,"info"),e.info.apply(console,n)}}_setupGlobalHandlers(){if(typeof window<"u"&&(window.addEventListener("error",e=>{let t=e.target;if(t&&t!==window&&t.tagName){let n=t,r=n.tagName.toLowerCase(),s=n.src||n.href||"";this.captureMessage(`Failed to load ${r}: ${s}`,"error",{source:"resource",element:r,url:s});return}e.error?this.captureException(e.error):e.message&&this.captureException(new Error(e.message))},!0),window.addEventListener("unhandledrejection",e=>{let t=e.reason instanceof Error?e.reason:new Error(String(e.reason));this.captureException(t)})),typeof process<"u"&&typeof process.on=="function"){let e=process;e.on("uncaughtException",t=>{this.captureException(t,{level:"fatal"}),this.transport.flush()}),e.on("unhandledRejection",t=>{let n=t instanceof Error?t:new Error(String(t));this.captureException(n),this.transport.flush()})}typeof process>"u"&&typeof globalThis<"u"&&"Deno"in globalThis&&(globalThis.addEventListener("error",e=>{let t=e;t.error?this.captureException(t.error):t.message&&this.captureException(new Error(t.message))}),globalThis.addEventListener("unhandledrejection",e=>{let t=e,n=t.reason instanceof Error?t.reason:new Error(String(t.reason));this.captureException(n),this.transport.flush()}))}};var E=new l;export{E as Aiola};
package/package.json CHANGED
@@ -1,10 +1,14 @@
1
1
  {
2
2
  "name": "@aiolaapp/logger",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Lightweight error tracking SDK for Aiola App Logs",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "aiola-logger": "dist/cli.js",
10
+ "@aiolaapp/logger": "dist/cli.js"
11
+ },
8
12
  "exports": {
9
13
  ".": {
10
14
  "types": "./dist/index.d.ts",