@php-wasm/logger 2.0.12 → 2.0.13

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/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("@php-wasm/node-polyfills");const p="playground-log",l=(e,...r)=>{E.dispatchEvent(new CustomEvent(p,{detail:{log:e,args:r}}))},h=(e,...r)=>{switch(typeof e.message=="string"?Reflect.set(e,"message",n(e.message)):e.message.message&&typeof e.message.message=="string"&&Reflect.set(e.message,"message",n(e.message.message)),e.severity){case"Debug":console.debug(e.message,...r);break;case"Info":console.info(e.message,...r);break;case"Warn":console.warn(e.message,...r);break;case"Error":console.error(e.message,...r);break;case"Fatal":console.error(e.message,...r);break;default:console.log(e.message,...r)}},v=e=>e instanceof Error?[e.message,e.stack].join(`
2
- `):JSON.stringify(e,null,2),i=[],f=e=>{i.push(e)},a=e=>{if(e.raw===!0)f(e.message);else{const r=w(typeof e.message=="object"?v(e.message):e.message,e.severity??"Info",e.prefix??"JavaScript");f(r)}},T=()=>{i.length=0};let c=0;const d="/wordpress/wp-content/debug.log",M=async e=>await e.fileExists(d)?await e.readFileAsText(d):"",P=(e,r)=>{r.addEventListener("request.end",async()=>{const s=await M(r);if(s.length>c){const t=s.substring(c);e.logMessage({message:t,raw:!0}),c=s.length}}),r.addEventListener("request.error",s=>{s=s,s.error&&(e.logMessage({message:`${s.error.message} ${s.error.stack}`,severity:"Fatal",prefix:s.source==="request"?"PHP":"WASM Crash"}),e.dispatchEvent(new CustomEvent(e.fatalErrorEvent,{detail:{logs:e.getLogs(),source:s.source}})))})};class y extends EventTarget{constructor(r=[]){super(),this.fatalErrorEvent="playground-fatal-error",this.handlers=r}getLogs(){return this.handlers.includes(a)?[...i]:(this.error(`Logs aren't stored because the logToMemory handler isn't registered.
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("@php-wasm/node-polyfills");const p="playground-log",f=(e,...r)=>{E.dispatchEvent(new CustomEvent(p,{detail:{log:e,args:r}}))},v=(e,...r)=>{switch(typeof e.message=="string"?Reflect.set(e,"message",l(e.message)):e.message.message&&typeof e.message.message=="string"&&Reflect.set(e.message,"message",l(e.message.message)),e.severity){case t.Debug:console.debug(e.message,...r);break;case t.Info:console.info(e.message,...r);break;case t.Warn:console.warn(e.message,...r);break;case t.Error:console.error(e.message,...r);break;case t.Fatal:console.error(e.message,...r);break;default:console.log(e.message,...r)}},P=e=>e instanceof Error?[e.message,e.stack].join(`
2
+ `):JSON.stringify(e,null,2),g=[],u=e=>{g.push(e)},i=e=>{if(e.raw===!0)u(e.message);else{const r=w(typeof e.message=="object"?P(e.message):e.message,e.severity,e.prefix??a.JS);u(r)}},T=()=>{g.length=0};let c=0;const m="/wordpress/wp-content/debug.log",S=async e=>await e.fileExists(m)?await e.readFileAsText(m):"",W=(e,r)=>{r.addEventListener("request.end",async()=>{const s=await S(r);if(s.length>c){const o=s.substring(c);e.logMessage({message:o,severity:t.Log,raw:!0}),c=s.length}}),r.addEventListener("request.error",s=>{s=s,s.error&&(e.logMessage({message:`${s.error.message} ${s.error.stack}`,severity:t.Fatal,prefix:s.source==="request"?a.PHP:a.WASM}),e.dispatchEvent(new CustomEvent(e.fatalErrorEvent,{detail:{logs:e.getLogs(),source:s.source}})))})},t={Fatal:{name:"fatal",level:0},Error:{name:"error",level:1},Warn:{name:"warn",level:2},Log:{name:"log",level:3},Info:{name:"info",level:4},Debug:{name:"debug",level:5}},a={WASM:"Wasm Crash",PHP:"PHP",JS:"JavaScript"};class L extends EventTarget{constructor(r=[]){super(),this.fatalErrorEvent="playground-fatal-error",this.severity=t.Info,this.handlers=r}getLogs(){return this.handlers.includes(i)?[...g]:(this.error(`Logs aren't stored because the logToMemory handler isn't registered.
3
3
  If you're using a custom logger instance, make sure to register logToMemory handler.
4
- `),[])}logMessage(r,...s){for(const t of this.handlers)t(r,...s)}log(r,...s){this.logMessage({message:r,severity:void 0,prefix:"JavaScript",raw:!1},...s)}debug(r,...s){this.logMessage({message:r,severity:"Debug",prefix:"JavaScript",raw:!1},...s)}info(r,...s){this.logMessage({message:r,severity:"Info",prefix:"JavaScript",raw:!1},...s)}warn(r,...s){this.logMessage({message:r,severity:"Warn",prefix:"JavaScript",raw:!1},...s)}error(r,...s){this.logMessage({message:r,severity:"Error",prefix:"JavaScript",raw:!1},...s)}}const O=()=>{try{if(process.env.NODE_ENV==="test")return[a,l]}catch{}return[a,h,l]},E=new y(O()),n=e=>e.replace(/\t/g,""),w=(e,r,s)=>{const t=new Date,o=new Intl.DateTimeFormat("en-GB",{year:"numeric",month:"short",day:"2-digit",timeZone:"UTC"}).format(t).replace(/ /g,"-"),L=new Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZone:"UTC",timeZoneName:"short"}).format(t),b=o+" "+L;return e=n(e),`[${b}] ${s} ${r}: ${e}`},S=(e,r)=>{e.addEventListener(e.fatalErrorEvent,r)},k=(e,r)=>{e.logMessage({message:`${r.message} in ${r.filename} on line ${r.lineno}:${r.colno}`,severity:"Error"})},m=(e,r)=>{if(!(r!=null&&r.reason))return;const s=(r==null?void 0:r.reason.stack)??r.reason;e.logMessage({message:s,severity:"Error"})};let g=0;const $=e=>{navigator.serviceWorker.addEventListener("message",r=>{var s,t,o;((s=r.data)==null?void 0:s.numberOfOpenPlaygroundTabs)!==void 0&&g!==((t=r.data)==null?void 0:t.numberOfOpenPlaygroundTabs)&&(g=(o=r.data)==null?void 0:o.numberOfOpenPlaygroundTabs,e.debug(`Number of open Playground tabs is: ${g}`))})};let u=!1;const x=e=>{u||($(e),!(typeof window>"u")&&(window.addEventListener("error",r=>k(e,r)),window.addEventListener("unhandledrejection",r=>m(e,r)),window.addEventListener("rejectionhandled",r=>m(e,r)),u=!0))},C=e=>{e.addEventListener("activate",()=>{e.clients.matchAll().then(r=>{const s={numberOfOpenPlaygroundTabs:r.filter(t=>t.frameType==="top-level").length};for(const t of r)t.postMessage(s)})})};exports.Logger=y;exports.addCrashListener=S;exports.clearMemoryLogs=T;exports.collectPhpLogs=P;exports.collectWindowErrors=x;exports.errorLogPath=d;exports.formatLogEntry=w;exports.logEvent=l;exports.logEventType=p;exports.logToConsole=h;exports.logToMemory=a;exports.logger=E;exports.logs=i;exports.prepareLogMessage=n;exports.reportServiceWorkerMetrics=C;
4
+ `),[])}logMessage(r,...s){const o={...r,severity:r.severity??t.Log};for(const n of this.handlers)o.severity.level<=this.severity.level&&n(o,...s)}setSeverityFilterLevel(r){this.severity=r}log(r,...s){this.logMessage({message:r,severity:t.Log,prefix:a.JS,raw:!1},...s)}debug(r,...s){this.logMessage({message:r,severity:t.Debug,prefix:a.JS,raw:!1},...s)}info(r,...s){this.logMessage({message:r,severity:t.Info,prefix:a.JS,raw:!1},...s)}warn(r,...s){this.logMessage({message:r,severity:t.Warn,prefix:a.JS,raw:!1},...s)}error(r,...s){this.logMessage({message:r,severity:t.Error,prefix:a.JS,raw:!1},...s)}}const O=()=>{try{if(process.env.NODE_ENV==="test")return[i,f]}catch{}return[i,v,f]},E=new L(O()),l=e=>e.replace(/\t/g,""),w=(e,r,s)=>{const o=new Date,n=new Intl.DateTimeFormat("en-GB",{year:"numeric",month:"short",day:"2-digit",timeZone:"UTC"}).format(o).replace(/ /g,"-"),b=new Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZone:"UTC",timeZoneName:"short"}).format(o),M=n+" "+b;return e=l(e),`[${M}] ${s} ${r.name}: ${e}`},k=(e,r)=>{e.addEventListener(e.fatalErrorEvent,r)},x=(e,r)=>{e.logMessage({message:`${r.message} in ${r.filename} on line ${r.lineno}:${r.colno}`,severity:t.Error})},y=(e,r)=>{if(!(r!=null&&r.reason))return;const s=(r==null?void 0:r.reason.stack)??r.reason;e.logMessage({message:s,severity:t.Error})};let d=0;const $=e=>{navigator.serviceWorker.addEventListener("message",r=>{var s,o,n;((s=r.data)==null?void 0:s.numberOfOpenPlaygroundTabs)!==void 0&&d!==((o=r.data)==null?void 0:o.numberOfOpenPlaygroundTabs)&&(d=(n=r.data)==null?void 0:n.numberOfOpenPlaygroundTabs,e.debug(`Number of open Playground tabs is: ${d}`))})};let h=!1;const C=e=>{h||($(e),!(typeof window>"u")&&(window.addEventListener("error",r=>x(e,r)),window.addEventListener("unhandledrejection",r=>y(e,r)),window.addEventListener("rejectionhandled",r=>y(e,r)),h=!0))},D=e=>{e.addEventListener("activate",()=>{e.clients.matchAll().then(r=>{const s={numberOfOpenPlaygroundTabs:r.filter(o=>o.frameType==="top-level").length};for(const o of r)o.postMessage(s)})})};exports.LogPrefix=a;exports.LogSeverity=t;exports.Logger=L;exports.addCrashListener=k;exports.clearMemoryLogs=T;exports.collectPhpLogs=W;exports.collectWindowErrors=C;exports.errorLogPath=m;exports.formatLogEntry=w;exports.logEvent=f;exports.logEventType=p;exports.logToConsole=v;exports.logToMemory=i;exports.logger=E;exports.logs=g;exports.prepareLogMessage=l;exports.reportServiceWorkerMetrics=D;
5
5
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../packages/php-wasm/logger/src/lib/handlers/log-event.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-console.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-memory.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-php-logs.ts","../../../../packages/php-wasm/logger/src/lib/logger.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-window-errors.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-service-worker-metrics.ts"],"sourcesContent":["import type { LogHandler } from '../log-handlers';\nimport type { Log } from '../logger';\nimport { logger } from '../logger';\n\nexport const logEventType = 'playground-log';\n\nexport const logEvent: LogHandler = (log: Log, ...args: any[]): void => {\n\tlogger.dispatchEvent(\n\t\tnew CustomEvent(logEventType, {\n\t\t\tdetail: {\n\t\t\t\tlog,\n\t\t\t\targs,\n\t\t\t},\n\t\t})\n\t);\n};\n","import type { LogHandler } from '../log-handlers';\nimport type { Log } from '../logger';\nimport { prepareLogMessage } from '../logger';\n\n/**\n * Log message to the console.\n */\nexport const logToConsole: LogHandler = (log: Log, ...args: any[]): void => {\n\tif (typeof log.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(log, 'message', prepareLogMessage(log.message));\n\t} else if (log.message.message && typeof log.message.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(\n\t\t\tlog.message,\n\t\t\t'message',\n\t\t\tprepareLogMessage(log.message.message)\n\t\t);\n\t}\n\t/* eslint-disable no-console */\n\tswitch (log.severity) {\n\t\tcase 'Debug':\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Info':\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Warn':\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Error':\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Fatal':\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.log(log.message, ...args);\n\t}\n\t/* eslint-enable no-console */\n};\n","import type { LogHandler } from '../log-handlers';\nimport type { Log } from '../logger';\nimport { formatLogEntry } from '../logger';\n\nconst prepareLogMessage = (logMessage: object): string => {\n\tif (logMessage instanceof Error) {\n\t\treturn [logMessage.message, logMessage.stack].join('\\n');\n\t}\n\treturn JSON.stringify(logMessage, null, 2);\n};\n\nexport const logs: string[] = [];\n\nconst addToLogArray = (message: string): void => {\n\tlogs.push(message);\n};\n\n/**\n * Log to memory\n */\nexport const logToMemory: LogHandler = (log: Log): void => {\n\tif (log.raw === true) {\n\t\taddToLogArray(log.message);\n\t} else {\n\t\tconst message = formatLogEntry(\n\t\t\ttypeof log.message === 'object'\n\t\t\t\t? prepareLogMessage(log.message)\n\t\t\t\t: log.message,\n\t\t\tlog.severity ?? 'Info',\n\t\t\tlog.prefix ?? 'JavaScript'\n\t\t);\n\t\taddToLogArray(message);\n\t}\n};\n\nexport const clearMemoryLogs = (): void => {\n\tlogs.length = 0;\n};\n","import type { UniversalPHP, PHPRequestErrorEvent } from '../types';\nimport type { Logger } from '../logger';\n\nlet lastPHPLogLength = 0;\nexport const errorLogPath = '/wordpress/wp-content/debug.log';\n\n/**\n * Read the WordPress debug.log file and return its content.\n *\n * @param UniversalPHP playground instance\n * @returns string The content of the debug.log file\n */\nconst getRequestPhpErrorLog = async (playground: UniversalPHP) => {\n\tif (!(await playground.fileExists(errorLogPath))) {\n\t\treturn '';\n\t}\n\treturn await playground.readFileAsText(errorLogPath);\n};\n\n/**\n * Collect PHP logs from the error_log file and log them.\n * @param UniversalPHP playground instance\n * @param loggerInstance The logger instance\n */\nexport const collectPhpLogs = (\n\tloggerInstance: Logger,\n\tplayground: UniversalPHP\n) => {\n\tplayground.addEventListener('request.end', async () => {\n\t\tconst log = await getRequestPhpErrorLog(playground);\n\t\tif (log.length > lastPHPLogLength) {\n\t\t\tconst currentLog = log.substring(lastPHPLogLength);\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: currentLog,\n\t\t\t\traw: true,\n\t\t\t});\n\t\t\tlastPHPLogLength = log.length;\n\t\t}\n\t});\n\tplayground.addEventListener('request.error', (event) => {\n\t\tevent = event as PHPRequestErrorEvent;\n\t\tif (event.error) {\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: `${event.error.message} ${event.error.stack}`,\n\t\t\t\tseverity: 'Fatal',\n\t\t\t\tprefix: event.source === 'request' ? 'PHP' : 'WASM Crash',\n\t\t\t});\n\t\t\tloggerInstance.dispatchEvent(\n\t\t\t\tnew CustomEvent(loggerInstance.fatalErrorEvent, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tlogs: loggerInstance.getLogs(),\n\t\t\t\t\t\tsource: event.source,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t});\n};\n","import { logEvent } from './handlers/log-event';\nimport {\n\tlogToMemory,\n\tlogToConsole,\n\tlogs,\n\ttype LogHandler,\n} from './log-handlers';\n\nexport { logEventType } from './handlers/log-event';\n\nexport { errorLogPath } from './collectors/collect-php-logs';\n\nexport type Log = {\n\tmessage: any;\n\tseverity?: LogSeverity;\n\tprefix?: LogPrefix;\n\traw?: boolean;\n};\n\n/**\n * Log severity levels.\n */\nexport type LogSeverity = 'Debug' | 'Info' | 'Warn' | 'Error' | 'Fatal';\n\n/**\n * Log prefix.\n */\nexport type LogPrefix = 'WASM Crash' | 'PHP' | 'JavaScript';\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\tprivate readonly handlers: LogHandler[];\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\t\thandlers: LogHandler[] = []\n\t) {\n\t\tsuper();\n\t\tthis.handlers = handlers;\n\t}\n\n\t/**\n\t * Get all logs.\n\t * @returns string[]\n\t */\n\tpublic getLogs(): string[] {\n\t\tif (!this.handlers.includes(logToMemory)) {\n\t\t\tthis\n\t\t\t\t.error(`Logs aren't stored because the logToMemory handler isn't registered.\n\t\t\t\tIf you're using a custom logger instance, make sure to register logToMemory handler.\n\t\t\t`);\n\t\t\treturn [];\n\t\t}\n\t\treturn [...logs];\n\t}\n\n\t/**\n\t * Log message with severity.\n\t *\n\t * @param message any\n\t * @param severity LogSeverity\n\t * @param raw boolean\n\t * @param args any\n\t */\n\tpublic logMessage(log: Log, ...args: any[]): void {\n\t\tfor (const handler of this.handlers) {\n\t\t\thandler(log, ...args);\n\t\t}\n\t}\n\n\t/**\n\t * Log message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic log(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: undefined,\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log debug message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic debug(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: 'Debug',\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log info message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic info(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: 'Info',\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log warning message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic warn(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: 'Warn',\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log error message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic error(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: 'Error',\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n}\n\nconst getDefaultHandlers = () => {\n\ttry {\n\t\tif (process.env['NODE_ENV'] === 'test') {\n\t\t\treturn [logToMemory, logEvent];\n\t\t}\n\t} catch {\n\t\t// Process.env is not available in the browser\n\t}\n\treturn [logToMemory, logToConsole, logEvent];\n};\n\n/**\n * The logger instance.\n */\nexport const logger: Logger = new Logger(getDefaultHandlers());\n\nexport const prepareLogMessage = (message: string) => {\n\treturn message.replace(/\\t/g, '');\n};\n\nexport const formatLogEntry = (\n\tmessage: string,\n\tseverity: LogSeverity,\n\tprefix: string\n): string => {\n\tconst date = new Date();\n\tconst formattedDate = new Intl.DateTimeFormat('en-GB', {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: '2-digit',\n\t\ttimeZone: 'UTC',\n\t})\n\t\t.format(date)\n\t\t.replace(/ /g, '-');\n\n\tconst formattedTime = new Intl.DateTimeFormat('en-GB', {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\thour12: false,\n\t\ttimeZone: 'UTC',\n\t\ttimeZoneName: 'short',\n\t}).format(date);\n\tconst now = formattedDate + ' ' + formattedTime;\n\tmessage = prepareLogMessage(message);\n\treturn `[${now}] ${prefix} ${severity}: ${message}`;\n};\n\n/**\n * Add a listener for the Playground crashes.\n * These crashes include Playground errors like Asyncify errors.\n * The callback function will receive an Event object with logs in the detail\n * property.\n *\n * @param loggerInstance The logger instance\n * @param callback The callback function\n */\nexport const addCrashListener = (\n\tloggerInstance: Logger,\n\tcallback: EventListenerOrEventListenerObject\n) => {\n\tloggerInstance.addEventListener(loggerInstance.fatalErrorEvent, callback);\n};\n","import type { Logger } from '../logger';\n\n/**\n * Log Windows errors.\n *\n * @param loggerInstance The logger instance\n * @param ErrorEvent event\n */\nconst logWindowErrorEvent = (loggerInstance: Logger, event: ErrorEvent) => {\n\tloggerInstance.logMessage({\n\t\tmessage: `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`,\n\t\tseverity: 'Error',\n\t});\n};\n\n/**\n * Log promise rejections.\n *\n * @param loggerInstance The logger instance\n * @param PromiseRejectionEvent event\n */\nconst logPromiseRejection = (\n\tloggerInstance: Logger,\n\tevent: PromiseRejectionEvent\n) => {\n\t// No reason was provided, so we can't log anything.\n\tif (!event?.reason) {\n\t\treturn;\n\t}\n\tconst message = event?.reason.stack ?? event.reason;\n\tloggerInstance.logMessage({\n\t\tmessage,\n\t\tseverity: 'Error',\n\t});\n};\n\n/**\n * The number of open Playground tabs.\n */\nlet numberOfOpenPlaygroundTabs = 0;\n\n/**\n * Register a listener for service worker messages and log the data.\n * The service worker will send the number of open Playground tabs.\n *\n * @param loggerInstance The logger instance\n */\nconst addServiceWorkerMessageListener = (loggerInstance: Logger) => {\n\tnavigator.serviceWorker.addEventListener('message', (event) => {\n\t\tif (event.data?.numberOfOpenPlaygroundTabs === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Each tab sends an activate event on load. Prevent sending the same\n\t\t// metrics multiple times if a tab is reloaded.\n\t\tif (\n\t\t\tnumberOfOpenPlaygroundTabs ===\n\t\t\tevent.data?.numberOfOpenPlaygroundTabs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tnumberOfOpenPlaygroundTabs = event.data?.numberOfOpenPlaygroundTabs;\n\t\tloggerInstance.debug(\n\t\t\t`Number of open Playground tabs is: ${numberOfOpenPlaygroundTabs}`\n\t\t);\n\t});\n};\n\n// If the window events are already connected.\nlet windowConnected = false;\n\n/**\n * Collect errors from JavaScript window events like error and log them.\n * @param loggerInstance The logger instance\n */\nexport const collectWindowErrors = (loggerInstance: Logger) => {\n\t// Ensure that the window events are connected only once.\n\tif (windowConnected) {\n\t\treturn;\n\t}\n\taddServiceWorkerMessageListener(loggerInstance);\n\tif (typeof window === 'undefined') {\n\t\treturn;\n\t}\n\n\twindow.addEventListener('error', (event) =>\n\t\tlogWindowErrorEvent(loggerInstance, event as ErrorEvent)\n\t);\n\twindow.addEventListener('unhandledrejection', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindow.addEventListener('rejectionhandled', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindowConnected = true;\n};\n","/// <reference lib=\"WebWorker\" />\n\n/**\n * **Call this inside a service worker.**\n * These errors include Playground errors like Asyncify errors. PHP errors\n * won't trigger this event.\n *\n * Reports service worker metrics.\n * Allows the logger to request metrics from the service worker by sending a\n * message. The service worker will respond with the number of open Playground\n * tabs.\n *\n * @param worker The service worker\n */\nexport const reportServiceWorkerMetrics = (\n\tworker: ServiceWorkerGlobalScope\n) => {\n\tworker.addEventListener('activate', () => {\n\t\tworker.clients.matchAll().then((clients) => {\n\t\t\tconst metrics = {\n\t\t\t\tnumberOfOpenPlaygroundTabs: clients.filter(\n\t\t\t\t\t// Only count top-level frames to get the number of tabs.\n\t\t\t\t\t(c) => c.frameType === 'top-level'\n\t\t\t\t).length,\n\t\t\t};\n\t\t\tfor (const client of clients) {\n\t\t\t\tclient.postMessage(metrics);\n\t\t\t}\n\t\t});\n\t});\n};\n"],"names":["logEventType","logEvent","log","args","logger","logToConsole","prepareLogMessage","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","clearMemoryLogs","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","handler","getDefaultHandlers","severity","prefix","date","formattedDate","formattedTime","now","addCrashListener","callback","logWindowErrorEvent","logPromiseRejection","numberOfOpenPlaygroundTabs","addServiceWorkerMessageListener","_a","_b","_c","windowConnected","collectWindowErrors","reportServiceWorkerMetrics","worker","clients","metrics","c","client"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../packages/php-wasm/logger/src/lib/handlers/log-event.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-console.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-memory.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-php-logs.ts","../../../../packages/php-wasm/logger/src/lib/logger.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-window-errors.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-service-worker-metrics.ts"],"sourcesContent":["import type { LogHandler } from '../log-handlers';\nimport { type Log, logger } from '../logger';\n\nexport const logEventType = 'playground-log';\n\nexport const logEvent: LogHandler = (log: Log, ...args: any[]): void => {\n\tlogger.dispatchEvent(\n\t\tnew CustomEvent(logEventType, {\n\t\t\tdetail: {\n\t\t\t\tlog,\n\t\t\t\targs,\n\t\t\t},\n\t\t})\n\t);\n};\n","import type { LogHandler } from '../log-handlers';\nimport { type Log, LogSeverity, prepareLogMessage } from '../logger';\n\n/**\n * Log message to the console.\n */\nexport const logToConsole: LogHandler = (log: Log, ...args: any[]): void => {\n\tif (typeof log.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(log, 'message', prepareLogMessage(log.message));\n\t} else if (log.message.message && typeof log.message.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(\n\t\t\tlog.message,\n\t\t\t'message',\n\t\t\tprepareLogMessage(log.message.message)\n\t\t);\n\t}\n\t/* eslint-disable no-console */\n\tswitch (log.severity) {\n\t\tcase LogSeverity.Debug:\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Info:\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Warn:\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Error:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Fatal:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.log(log.message, ...args);\n\t}\n\t/* eslint-enable no-console */\n};\n","import type { LogHandler } from '../log-handlers';\nimport { formatLogEntry, type Log, LogPrefix } from '../logger';\n\nconst prepareLogMessage = (logMessage: object): string => {\n\tif (logMessage instanceof Error) {\n\t\treturn [logMessage.message, logMessage.stack].join('\\n');\n\t}\n\treturn JSON.stringify(logMessage, null, 2);\n};\n\nexport const logs: string[] = [];\n\nconst addToLogArray = (message: string): void => {\n\tlogs.push(message);\n};\n\n/**\n * Log to memory\n */\nexport const logToMemory: LogHandler = (log: Log): void => {\n\tif (log.raw === true) {\n\t\taddToLogArray(log.message);\n\t} else {\n\t\tconst message = formatLogEntry(\n\t\t\ttypeof log.message === 'object'\n\t\t\t\t? prepareLogMessage(log.message)\n\t\t\t\t: log.message,\n\t\t\tlog.severity,\n\t\t\tlog.prefix ?? LogPrefix.JS\n\t\t);\n\t\taddToLogArray(message);\n\t}\n};\n\nexport const clearMemoryLogs = (): void => {\n\tlogs.length = 0;\n};\n","import type { UniversalPHP, PHPRequestErrorEvent } from '../types';\nimport { type Logger, LogPrefix, LogSeverity } from '../logger';\n\nlet lastPHPLogLength = 0;\nexport const errorLogPath = '/wordpress/wp-content/debug.log';\n\n/**\n * Read the WordPress debug.log file and return its content.\n *\n * @param UniversalPHP playground instance\n * @returns string The content of the debug.log file\n */\nconst getRequestPhpErrorLog = async (playground: UniversalPHP) => {\n\tif (!(await playground.fileExists(errorLogPath))) {\n\t\treturn '';\n\t}\n\treturn await playground.readFileAsText(errorLogPath);\n};\n\n/**\n * Collect PHP logs from the error_log file and log them.\n * @param UniversalPHP playground instance\n * @param loggerInstance The logger instance\n */\nexport const collectPhpLogs = (\n\tloggerInstance: Logger,\n\tplayground: UniversalPHP\n) => {\n\tplayground.addEventListener('request.end', async () => {\n\t\tconst log = await getRequestPhpErrorLog(playground);\n\t\tif (log.length > lastPHPLogLength) {\n\t\t\tconst currentLog = log.substring(lastPHPLogLength);\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: currentLog,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\traw: true,\n\t\t\t});\n\t\t\tlastPHPLogLength = log.length;\n\t\t}\n\t});\n\tplayground.addEventListener('request.error', (event) => {\n\t\tevent = event as PHPRequestErrorEvent;\n\t\tif (event.error) {\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: `${event.error.message} ${event.error.stack}`,\n\t\t\t\tseverity: LogSeverity.Fatal,\n\t\t\t\tprefix:\n\t\t\t\t\tevent.source === 'request' ? LogPrefix.PHP : LogPrefix.WASM,\n\t\t\t});\n\t\t\tloggerInstance.dispatchEvent(\n\t\t\t\tnew CustomEvent(loggerInstance.fatalErrorEvent, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tlogs: loggerInstance.getLogs(),\n\t\t\t\t\t\tsource: event.source,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t});\n};\n","import { logEvent } from './handlers/log-event';\nimport {\n\tlogToMemory,\n\tlogToConsole,\n\tlogs,\n\ttype LogHandler,\n} from './log-handlers';\n\nexport { logEventType } from './handlers/log-event';\n\nexport { errorLogPath } from './collectors/collect-php-logs';\n\nexport type Log = {\n\tmessage: any;\n\tseverity: LogSeverity;\n\tprefix?: LogPrefix;\n\traw?: boolean;\n};\n\n/**\n * Log severity levels.\n */\nexport const LogSeverity = {\n\tFatal: { name: 'fatal', level: 0 },\n\tError: { name: 'error', level: 1 },\n\tWarn: { name: 'warn', level: 2 },\n\tLog: { name: 'log', level: 3 },\n\tInfo: { name: 'info', level: 4 },\n\tDebug: { name: 'debug', level: 5 },\n} as const;\n\nexport type LogSeverity = (typeof LogSeverity)[keyof typeof LogSeverity];\n\n/**\n * Log prefix.\n */\nexport const LogPrefix = {\n\tWASM: 'Wasm Crash',\n\tPHP: 'PHP',\n\tJS: 'JavaScript',\n} as const;\n\nexport type LogPrefix = (typeof LogPrefix)[keyof typeof LogPrefix];\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\tprivate readonly handlers: LogHandler[];\n\tprivate severity: LogSeverity = LogSeverity.Info;\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\t\thandlers: LogHandler[] = []\n\t) {\n\t\tsuper();\n\t\tthis.handlers = handlers;\n\t}\n\n\t/**\n\t * Get all logs.\n\t * @returns string[]\n\t */\n\tpublic getLogs(): string[] {\n\t\tif (!this.handlers.includes(logToMemory)) {\n\t\t\tthis\n\t\t\t\t.error(`Logs aren't stored because the logToMemory handler isn't registered.\n\t\t\t\tIf you're using a custom logger instance, make sure to register logToMemory handler.\n\t\t\t`);\n\t\t\treturn [];\n\t\t}\n\t\treturn [...logs];\n\t}\n\n\t/**\n\t * Log message with severity.\n\t *\n\t * @param log Log\n\t * @param args any\n\t */\n\tpublic logMessage(\n\t\tlog: Omit<Log, 'severity'> & { severity?: LogSeverity },\n\t\t...args: any[]\n\t): void {\n\t\tconst logWithSeverity: Log = {\n\t\t\t...log,\n\t\t\tseverity: log.severity ?? LogSeverity.Log,\n\t\t};\n\t\tfor (const handler of this.handlers) {\n\t\t\tif (logWithSeverity.severity.level <= this.severity.level) {\n\t\t\t\thandler(logWithSeverity, ...args);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter message based on severity\n\t * @param severity LogSeverity\n\t */\n\tpublic setSeverityFilterLevel(severity: LogSeverity): void {\n\t\tthis.severity = severity;\n\t}\n\n\t/**\n\t * Log message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic log(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log debug message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic debug(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Debug,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log info message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic info(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Info,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log warning message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic warn(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Warn,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log error message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic error(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Error,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n}\n\nconst getDefaultHandlers = () => {\n\ttry {\n\t\tif (process.env['NODE_ENV'] === 'test') {\n\t\t\treturn [logToMemory, logEvent];\n\t\t}\n\t} catch {\n\t\t// Process.env is not available in the browser\n\t}\n\treturn [logToMemory, logToConsole, logEvent];\n};\n\n/**\n * The logger instance.\n */\nexport const logger: Logger = new Logger(getDefaultHandlers());\n\nexport const prepareLogMessage = (message: string) => {\n\treturn message.replace(/\\t/g, '');\n};\n\nexport const formatLogEntry = (\n\tmessage: string,\n\tseverity: LogSeverity,\n\tprefix: string\n): string => {\n\tconst date = new Date();\n\tconst formattedDate = new Intl.DateTimeFormat('en-GB', {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: '2-digit',\n\t\ttimeZone: 'UTC',\n\t})\n\t\t.format(date)\n\t\t.replace(/ /g, '-');\n\n\tconst formattedTime = new Intl.DateTimeFormat('en-GB', {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\thour12: false,\n\t\ttimeZone: 'UTC',\n\t\ttimeZoneName: 'short',\n\t}).format(date);\n\tconst now = formattedDate + ' ' + formattedTime;\n\tmessage = prepareLogMessage(message);\n\treturn `[${now}] ${prefix} ${severity.name}: ${message}`;\n};\n\n/**\n * Add a listener for the Playground crashes.\n * These crashes include Playground errors like Asyncify errors.\n * The callback function will receive an Event object with logs in the detail\n * property.\n *\n * @param loggerInstance The logger instance\n * @param callback The callback function\n */\nexport const addCrashListener = (\n\tloggerInstance: Logger,\n\tcallback: EventListenerOrEventListenerObject\n) => {\n\tloggerInstance.addEventListener(loggerInstance.fatalErrorEvent, callback);\n};\n","import { type Logger, LogSeverity } from '../logger';\n\n/**\n * Log Windows errors.\n *\n * @param loggerInstance The logger instance\n * @param ErrorEvent event\n */\nconst logWindowErrorEvent = (loggerInstance: Logger, event: ErrorEvent) => {\n\tloggerInstance.logMessage({\n\t\tmessage: `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * Log promise rejections.\n *\n * @param loggerInstance The logger instance\n * @param PromiseRejectionEvent event\n */\nconst logPromiseRejection = (\n\tloggerInstance: Logger,\n\tevent: PromiseRejectionEvent\n) => {\n\t// No reason was provided, so we can't log anything.\n\tif (!event?.reason) {\n\t\treturn;\n\t}\n\tconst message = event?.reason.stack ?? event.reason;\n\tloggerInstance.logMessage({\n\t\tmessage,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * The number of open Playground tabs.\n */\nlet numberOfOpenPlaygroundTabs = 0;\n\n/**\n * Register a listener for service worker messages and log the data.\n * The service worker will send the number of open Playground tabs.\n *\n * @param loggerInstance The logger instance\n */\nconst addServiceWorkerMessageListener = (loggerInstance: Logger) => {\n\tnavigator.serviceWorker.addEventListener('message', (event) => {\n\t\tif (event.data?.numberOfOpenPlaygroundTabs === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Each tab sends an activate event on load. Prevent sending the same\n\t\t// metrics multiple times if a tab is reloaded.\n\t\tif (\n\t\t\tnumberOfOpenPlaygroundTabs ===\n\t\t\tevent.data?.numberOfOpenPlaygroundTabs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tnumberOfOpenPlaygroundTabs = event.data?.numberOfOpenPlaygroundTabs;\n\t\tloggerInstance.debug(\n\t\t\t`Number of open Playground tabs is: ${numberOfOpenPlaygroundTabs}`\n\t\t);\n\t});\n};\n\n// If the window events are already connected.\nlet windowConnected = false;\n\n/**\n * Collect errors from JavaScript window events like error and log them.\n * @param loggerInstance The logger instance\n */\nexport const collectWindowErrors = (loggerInstance: Logger) => {\n\t// Ensure that the window events are connected only once.\n\tif (windowConnected) {\n\t\treturn;\n\t}\n\taddServiceWorkerMessageListener(loggerInstance);\n\tif (typeof window === 'undefined') {\n\t\treturn;\n\t}\n\n\twindow.addEventListener('error', (event) =>\n\t\tlogWindowErrorEvent(loggerInstance, event as ErrorEvent)\n\t);\n\twindow.addEventListener('unhandledrejection', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindow.addEventListener('rejectionhandled', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindowConnected = true;\n};\n","/// <reference lib=\"WebWorker\" />\n\n/**\n * **Call this inside a service worker.**\n * These errors include Playground errors like Asyncify errors. PHP errors\n * won't trigger this event.\n *\n * Reports service worker metrics.\n * Allows the logger to request metrics from the service worker by sending a\n * message. The service worker will respond with the number of open Playground\n * tabs.\n *\n * @param worker The service worker\n */\nexport const reportServiceWorkerMetrics = (\n\tworker: ServiceWorkerGlobalScope\n) => {\n\tworker.addEventListener('activate', () => {\n\t\tworker.clients.matchAll().then((clients) => {\n\t\t\tconst metrics = {\n\t\t\t\tnumberOfOpenPlaygroundTabs: clients.filter(\n\t\t\t\t\t// Only count top-level frames to get the number of tabs.\n\t\t\t\t\t(c) => c.frameType === 'top-level'\n\t\t\t\t).length,\n\t\t\t};\n\t\t\tfor (const client of clients) {\n\t\t\t\tclient.postMessage(metrics);\n\t\t\t}\n\t\t});\n\t});\n};\n"],"names":["logEventType","logEvent","log","args","logger","logToConsole","prepareLogMessage","LogSeverity","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","LogPrefix","clearMemoryLogs","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","logWithSeverity","handler","severity","getDefaultHandlers","prefix","date","formattedDate","formattedTime","now","addCrashListener","callback","logWindowErrorEvent","logPromiseRejection","numberOfOpenPlaygroundTabs","addServiceWorkerMessageListener","_a","_b","_c","windowConnected","collectWindowErrors","reportServiceWorkerMetrics","worker","clients","metrics","c","client"],"mappings":"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"}
package/index.js CHANGED
@@ -1,70 +1,71 @@
1
1
  import "@php-wasm/node-polyfills";
2
- const y = "playground-log", g = (e, ...r) => {
3
- T.dispatchEvent(
4
- new CustomEvent(y, {
2
+ const E = "playground-log", f = (e, ...r) => {
3
+ M.dispatchEvent(
4
+ new CustomEvent(E, {
5
5
  detail: {
6
6
  log: e,
7
7
  args: r
8
8
  }
9
9
  })
10
10
  );
11
- }, E = (e, ...r) => {
12
- switch (typeof e.message == "string" ? Reflect.set(e, "message", c(e.message)) : e.message.message && typeof e.message.message == "string" && Reflect.set(
11
+ }, w = (e, ...r) => {
12
+ switch (typeof e.message == "string" ? Reflect.set(e, "message", g(e.message)) : e.message.message && typeof e.message.message == "string" && Reflect.set(
13
13
  e.message,
14
14
  "message",
15
- c(e.message.message)
15
+ g(e.message.message)
16
16
  ), e.severity) {
17
- case "Debug":
17
+ case t.Debug:
18
18
  console.debug(e.message, ...r);
19
19
  break;
20
- case "Info":
20
+ case t.Info:
21
21
  console.info(e.message, ...r);
22
22
  break;
23
- case "Warn":
23
+ case t.Warn:
24
24
  console.warn(e.message, ...r);
25
25
  break;
26
- case "Error":
26
+ case t.Error:
27
27
  console.error(e.message, ...r);
28
28
  break;
29
- case "Fatal":
29
+ case t.Fatal:
30
30
  console.error(e.message, ...r);
31
31
  break;
32
32
  default:
33
33
  console.log(e.message, ...r);
34
34
  }
35
- }, w = (e) => e instanceof Error ? [e.message, e.stack].join(`
36
- `) : JSON.stringify(e, null, 2), d = [], l = (e) => {
35
+ }, L = (e) => e instanceof Error ? [e.message, e.stack].join(`
36
+ `) : JSON.stringify(e, null, 2), d = [], m = (e) => {
37
37
  d.push(e);
38
- }, i = (e) => {
38
+ }, c = (e) => {
39
39
  if (e.raw === !0)
40
- l(e.message);
40
+ m(e.message);
41
41
  else {
42
- const r = M(
43
- typeof e.message == "object" ? w(e.message) : e.message,
44
- e.severity ?? "Info",
45
- e.prefix ?? "JavaScript"
42
+ const r = S(
43
+ typeof e.message == "object" ? L(e.message) : e.message,
44
+ e.severity,
45
+ e.prefix ?? a.JS
46
46
  );
47
- l(r);
47
+ m(r);
48
48
  }
49
- }, k = () => {
49
+ }, $ = () => {
50
50
  d.length = 0;
51
51
  };
52
- let o = 0;
53
- const f = "/wordpress/wp-content/debug.log", b = async (e) => await e.fileExists(f) ? await e.readFileAsText(f) : "", x = (e, r) => {
52
+ let i = 0;
53
+ const u = "/wordpress/wp-content/debug.log", b = async (e) => await e.fileExists(u) ? await e.readFileAsText(u) : "", k = (e, r) => {
54
54
  r.addEventListener("request.end", async () => {
55
55
  const s = await b(r);
56
- if (s.length > o) {
57
- const t = s.substring(o);
56
+ if (s.length > i) {
57
+ const o = s.substring(i);
58
58
  e.logMessage({
59
- message: t,
59
+ message: o,
60
+ severity: t.Log,
60
61
  raw: !0
61
- }), o = s.length;
62
+ }), i = s.length;
62
63
  }
63
64
  }), r.addEventListener("request.error", (s) => {
64
65
  s = s, s.error && (e.logMessage({
65
66
  message: `${s.error.message} ${s.error.stack}`,
66
- severity: "Fatal",
67
- prefix: s.source === "request" ? "PHP" : "WASM Crash"
67
+ severity: t.Fatal,
68
+ prefix: s.source === "request" ? a.PHP : a.WASM
68
69
  }), e.dispatchEvent(
69
70
  new CustomEvent(e.fatalErrorEvent, {
70
71
  detail: {
@@ -74,32 +75,52 @@ const f = "/wordpress/wp-content/debug.log", b = async (e) => await e.fileExists
74
75
  })
75
76
  ));
76
77
  });
78
+ }, t = {
79
+ Fatal: { name: "fatal", level: 0 },
80
+ Error: { name: "error", level: 1 },
81
+ Warn: { name: "warn", level: 2 },
82
+ Log: { name: "log", level: 3 },
83
+ Info: { name: "info", level: 4 },
84
+ Debug: { name: "debug", level: 5 }
85
+ }, a = {
86
+ WASM: "Wasm Crash",
87
+ PHP: "PHP",
88
+ JS: "JavaScript"
77
89
  };
78
- class L extends EventTarget {
90
+ class P extends EventTarget {
79
91
  // constructor
80
92
  constructor(r = []) {
81
- super(), this.fatalErrorEvent = "playground-fatal-error", this.handlers = r;
93
+ super(), this.fatalErrorEvent = "playground-fatal-error", this.severity = t.Info, this.handlers = r;
82
94
  }
83
95
  /**
84
96
  * Get all logs.
85
97
  * @returns string[]
86
98
  */
87
99
  getLogs() {
88
- return this.handlers.includes(i) ? [...d] : (this.error(`Logs aren't stored because the logToMemory handler isn't registered.
100
+ return this.handlers.includes(c) ? [...d] : (this.error(`Logs aren't stored because the logToMemory handler isn't registered.
89
101
  If you're using a custom logger instance, make sure to register logToMemory handler.
90
102
  `), []);
91
103
  }
92
104
  /**
93
105
  * Log message with severity.
94
106
  *
95
- * @param message any
96
- * @param severity LogSeverity
97
- * @param raw boolean
107
+ * @param log Log
98
108
  * @param args any
99
109
  */
100
110
  logMessage(r, ...s) {
101
- for (const t of this.handlers)
102
- t(r, ...s);
111
+ const o = {
112
+ ...r,
113
+ severity: r.severity ?? t.Log
114
+ };
115
+ for (const n of this.handlers)
116
+ o.severity.level <= this.severity.level && n(o, ...s);
117
+ }
118
+ /**
119
+ * Filter message based on severity
120
+ * @param severity LogSeverity
121
+ */
122
+ setSeverityFilterLevel(r) {
123
+ this.severity = r;
103
124
  }
104
125
  /**
105
126
  * Log message
@@ -111,8 +132,8 @@ class L extends EventTarget {
111
132
  this.logMessage(
112
133
  {
113
134
  message: r,
114
- severity: void 0,
115
- prefix: "JavaScript",
135
+ severity: t.Log,
136
+ prefix: a.JS,
116
137
  raw: !1
117
138
  },
118
139
  ...s
@@ -128,8 +149,8 @@ class L extends EventTarget {
128
149
  this.logMessage(
129
150
  {
130
151
  message: r,
131
- severity: "Debug",
132
- prefix: "JavaScript",
152
+ severity: t.Debug,
153
+ prefix: a.JS,
133
154
  raw: !1
134
155
  },
135
156
  ...s
@@ -145,8 +166,8 @@ class L extends EventTarget {
145
166
  this.logMessage(
146
167
  {
147
168
  message: r,
148
- severity: "Info",
149
- prefix: "JavaScript",
169
+ severity: t.Info,
170
+ prefix: a.JS,
150
171
  raw: !1
151
172
  },
152
173
  ...s
@@ -162,8 +183,8 @@ class L extends EventTarget {
162
183
  this.logMessage(
163
184
  {
164
185
  message: r,
165
- severity: "Warn",
166
- prefix: "JavaScript",
186
+ severity: t.Warn,
187
+ prefix: a.JS,
167
188
  raw: !1
168
189
  },
169
190
  ...s
@@ -179,102 +200,104 @@ class L extends EventTarget {
179
200
  this.logMessage(
180
201
  {
181
202
  message: r,
182
- severity: "Error",
183
- prefix: "JavaScript",
203
+ severity: t.Error,
204
+ prefix: a.JS,
184
205
  raw: !1
185
206
  },
186
207
  ...s
187
208
  );
188
209
  }
189
210
  }
190
- const v = () => {
211
+ const T = () => {
191
212
  try {
192
213
  if (process.env.NODE_ENV === "test")
193
- return [i, g];
214
+ return [c, f];
194
215
  } catch {
195
216
  }
196
- return [i, E, g];
197
- }, T = new L(v()), c = (e) => e.replace(/\t/g, ""), M = (e, r, s) => {
198
- const t = /* @__PURE__ */ new Date(), a = new Intl.DateTimeFormat("en-GB", {
217
+ return [c, w, f];
218
+ }, M = new P(T()), g = (e) => e.replace(/\t/g, ""), S = (e, r, s) => {
219
+ const o = /* @__PURE__ */ new Date(), n = new Intl.DateTimeFormat("en-GB", {
199
220
  year: "numeric",
200
221
  month: "short",
201
222
  day: "2-digit",
202
223
  timeZone: "UTC"
203
- }).format(t).replace(/ /g, "-"), p = new Intl.DateTimeFormat("en-GB", {
224
+ }).format(o).replace(/ /g, "-"), p = new Intl.DateTimeFormat("en-GB", {
204
225
  hour: "2-digit",
205
226
  minute: "2-digit",
206
227
  second: "2-digit",
207
228
  hour12: !1,
208
229
  timeZone: "UTC",
209
230
  timeZoneName: "short"
210
- }).format(t), h = a + " " + p;
211
- return e = c(e), `[${h}] ${s} ${r}: ${e}`;
212
- }, S = (e, r) => {
231
+ }).format(o), v = n + " " + p;
232
+ return e = g(e), `[${v}] ${s} ${r.name}: ${e}`;
233
+ }, D = (e, r) => {
213
234
  e.addEventListener(e.fatalErrorEvent, r);
214
- }, P = (e, r) => {
235
+ }, x = (e, r) => {
215
236
  e.logMessage({
216
237
  message: `${r.message} in ${r.filename} on line ${r.lineno}:${r.colno}`,
217
- severity: "Error"
238
+ severity: t.Error
218
239
  });
219
- }, m = (e, r) => {
240
+ }, h = (e, r) => {
220
241
  if (!(r != null && r.reason))
221
242
  return;
222
243
  const s = (r == null ? void 0 : r.reason.stack) ?? r.reason;
223
244
  e.logMessage({
224
245
  message: s,
225
- severity: "Error"
246
+ severity: t.Error
226
247
  });
227
248
  };
228
- let n = 0;
249
+ let l = 0;
229
250
  const O = (e) => {
230
251
  navigator.serviceWorker.addEventListener("message", (r) => {
231
- var s, t, a;
232
- ((s = r.data) == null ? void 0 : s.numberOfOpenPlaygroundTabs) !== void 0 && n !== ((t = r.data) == null ? void 0 : t.numberOfOpenPlaygroundTabs) && (n = (a = r.data) == null ? void 0 : a.numberOfOpenPlaygroundTabs, e.debug(
233
- `Number of open Playground tabs is: ${n}`
252
+ var s, o, n;
253
+ ((s = r.data) == null ? void 0 : s.numberOfOpenPlaygroundTabs) !== void 0 && l !== ((o = r.data) == null ? void 0 : o.numberOfOpenPlaygroundTabs) && (l = (n = r.data) == null ? void 0 : n.numberOfOpenPlaygroundTabs, e.debug(
254
+ `Number of open Playground tabs is: ${l}`
234
255
  ));
235
256
  });
236
257
  };
237
- let u = !1;
238
- const C = (e) => {
239
- u || (O(e), !(typeof window > "u") && (window.addEventListener(
258
+ let y = !1;
259
+ const J = (e) => {
260
+ y || (O(e), !(typeof window > "u") && (window.addEventListener(
240
261
  "error",
241
- (r) => P(e, r)
262
+ (r) => x(e, r)
242
263
  ), window.addEventListener(
243
264
  "unhandledrejection",
244
- (r) => m(e, r)
265
+ (r) => h(e, r)
245
266
  ), window.addEventListener(
246
267
  "rejectionhandled",
247
- (r) => m(e, r)
248
- ), u = !0));
249
- }, D = (e) => {
268
+ (r) => h(e, r)
269
+ ), y = !0));
270
+ }, C = (e) => {
250
271
  e.addEventListener("activate", () => {
251
272
  e.clients.matchAll().then((r) => {
252
273
  const s = {
253
274
  numberOfOpenPlaygroundTabs: r.filter(
254
275
  // Only count top-level frames to get the number of tabs.
255
- (t) => t.frameType === "top-level"
276
+ (o) => o.frameType === "top-level"
256
277
  ).length
257
278
  };
258
- for (const t of r)
259
- t.postMessage(s);
279
+ for (const o of r)
280
+ o.postMessage(s);
260
281
  });
261
282
  });
262
283
  };
263
284
  export {
264
- L as Logger,
265
- S as addCrashListener,
266
- k as clearMemoryLogs,
267
- x as collectPhpLogs,
268
- C as collectWindowErrors,
269
- f as errorLogPath,
270
- M as formatLogEntry,
271
- g as logEvent,
272
- y as logEventType,
273
- E as logToConsole,
274
- i as logToMemory,
275
- T as logger,
285
+ a as LogPrefix,
286
+ t as LogSeverity,
287
+ P as Logger,
288
+ D as addCrashListener,
289
+ $ as clearMemoryLogs,
290
+ k as collectPhpLogs,
291
+ J as collectWindowErrors,
292
+ u as errorLogPath,
293
+ S as formatLogEntry,
294
+ f as logEvent,
295
+ E as logEventType,
296
+ w as logToConsole,
297
+ c as logToMemory,
298
+ M as logger,
276
299
  d as logs,
277
- c as prepareLogMessage,
278
- D as reportServiceWorkerMetrics
300
+ g as prepareLogMessage,
301
+ C as reportServiceWorkerMetrics
279
302
  };
280
303
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../packages/php-wasm/logger/src/lib/handlers/log-event.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-console.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-memory.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-php-logs.ts","../../../../packages/php-wasm/logger/src/lib/logger.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-window-errors.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-service-worker-metrics.ts"],"sourcesContent":["import type { LogHandler } from '../log-handlers';\nimport type { Log } from '../logger';\nimport { logger } from '../logger';\n\nexport const logEventType = 'playground-log';\n\nexport const logEvent: LogHandler = (log: Log, ...args: any[]): void => {\n\tlogger.dispatchEvent(\n\t\tnew CustomEvent(logEventType, {\n\t\t\tdetail: {\n\t\t\t\tlog,\n\t\t\t\targs,\n\t\t\t},\n\t\t})\n\t);\n};\n","import type { LogHandler } from '../log-handlers';\nimport type { Log } from '../logger';\nimport { prepareLogMessage } from '../logger';\n\n/**\n * Log message to the console.\n */\nexport const logToConsole: LogHandler = (log: Log, ...args: any[]): void => {\n\tif (typeof log.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(log, 'message', prepareLogMessage(log.message));\n\t} else if (log.message.message && typeof log.message.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(\n\t\t\tlog.message,\n\t\t\t'message',\n\t\t\tprepareLogMessage(log.message.message)\n\t\t);\n\t}\n\t/* eslint-disable no-console */\n\tswitch (log.severity) {\n\t\tcase 'Debug':\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Info':\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Warn':\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Error':\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase 'Fatal':\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.log(log.message, ...args);\n\t}\n\t/* eslint-enable no-console */\n};\n","import type { LogHandler } from '../log-handlers';\nimport type { Log } from '../logger';\nimport { formatLogEntry } from '../logger';\n\nconst prepareLogMessage = (logMessage: object): string => {\n\tif (logMessage instanceof Error) {\n\t\treturn [logMessage.message, logMessage.stack].join('\\n');\n\t}\n\treturn JSON.stringify(logMessage, null, 2);\n};\n\nexport const logs: string[] = [];\n\nconst addToLogArray = (message: string): void => {\n\tlogs.push(message);\n};\n\n/**\n * Log to memory\n */\nexport const logToMemory: LogHandler = (log: Log): void => {\n\tif (log.raw === true) {\n\t\taddToLogArray(log.message);\n\t} else {\n\t\tconst message = formatLogEntry(\n\t\t\ttypeof log.message === 'object'\n\t\t\t\t? prepareLogMessage(log.message)\n\t\t\t\t: log.message,\n\t\t\tlog.severity ?? 'Info',\n\t\t\tlog.prefix ?? 'JavaScript'\n\t\t);\n\t\taddToLogArray(message);\n\t}\n};\n\nexport const clearMemoryLogs = (): void => {\n\tlogs.length = 0;\n};\n","import type { UniversalPHP, PHPRequestErrorEvent } from '../types';\nimport type { Logger } from '../logger';\n\nlet lastPHPLogLength = 0;\nexport const errorLogPath = '/wordpress/wp-content/debug.log';\n\n/**\n * Read the WordPress debug.log file and return its content.\n *\n * @param UniversalPHP playground instance\n * @returns string The content of the debug.log file\n */\nconst getRequestPhpErrorLog = async (playground: UniversalPHP) => {\n\tif (!(await playground.fileExists(errorLogPath))) {\n\t\treturn '';\n\t}\n\treturn await playground.readFileAsText(errorLogPath);\n};\n\n/**\n * Collect PHP logs from the error_log file and log them.\n * @param UniversalPHP playground instance\n * @param loggerInstance The logger instance\n */\nexport const collectPhpLogs = (\n\tloggerInstance: Logger,\n\tplayground: UniversalPHP\n) => {\n\tplayground.addEventListener('request.end', async () => {\n\t\tconst log = await getRequestPhpErrorLog(playground);\n\t\tif (log.length > lastPHPLogLength) {\n\t\t\tconst currentLog = log.substring(lastPHPLogLength);\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: currentLog,\n\t\t\t\traw: true,\n\t\t\t});\n\t\t\tlastPHPLogLength = log.length;\n\t\t}\n\t});\n\tplayground.addEventListener('request.error', (event) => {\n\t\tevent = event as PHPRequestErrorEvent;\n\t\tif (event.error) {\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: `${event.error.message} ${event.error.stack}`,\n\t\t\t\tseverity: 'Fatal',\n\t\t\t\tprefix: event.source === 'request' ? 'PHP' : 'WASM Crash',\n\t\t\t});\n\t\t\tloggerInstance.dispatchEvent(\n\t\t\t\tnew CustomEvent(loggerInstance.fatalErrorEvent, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tlogs: loggerInstance.getLogs(),\n\t\t\t\t\t\tsource: event.source,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t});\n};\n","import { logEvent } from './handlers/log-event';\nimport {\n\tlogToMemory,\n\tlogToConsole,\n\tlogs,\n\ttype LogHandler,\n} from './log-handlers';\n\nexport { logEventType } from './handlers/log-event';\n\nexport { errorLogPath } from './collectors/collect-php-logs';\n\nexport type Log = {\n\tmessage: any;\n\tseverity?: LogSeverity;\n\tprefix?: LogPrefix;\n\traw?: boolean;\n};\n\n/**\n * Log severity levels.\n */\nexport type LogSeverity = 'Debug' | 'Info' | 'Warn' | 'Error' | 'Fatal';\n\n/**\n * Log prefix.\n */\nexport type LogPrefix = 'WASM Crash' | 'PHP' | 'JavaScript';\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\tprivate readonly handlers: LogHandler[];\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\t\thandlers: LogHandler[] = []\n\t) {\n\t\tsuper();\n\t\tthis.handlers = handlers;\n\t}\n\n\t/**\n\t * Get all logs.\n\t * @returns string[]\n\t */\n\tpublic getLogs(): string[] {\n\t\tif (!this.handlers.includes(logToMemory)) {\n\t\t\tthis\n\t\t\t\t.error(`Logs aren't stored because the logToMemory handler isn't registered.\n\t\t\t\tIf you're using a custom logger instance, make sure to register logToMemory handler.\n\t\t\t`);\n\t\t\treturn [];\n\t\t}\n\t\treturn [...logs];\n\t}\n\n\t/**\n\t * Log message with severity.\n\t *\n\t * @param message any\n\t * @param severity LogSeverity\n\t * @param raw boolean\n\t * @param args any\n\t */\n\tpublic logMessage(log: Log, ...args: any[]): void {\n\t\tfor (const handler of this.handlers) {\n\t\t\thandler(log, ...args);\n\t\t}\n\t}\n\n\t/**\n\t * Log message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic log(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: undefined,\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log debug message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic debug(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: 'Debug',\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log info message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic info(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: 'Info',\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log warning message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic warn(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: 'Warn',\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log error message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic error(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: 'Error',\n\t\t\t\tprefix: 'JavaScript',\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n}\n\nconst getDefaultHandlers = () => {\n\ttry {\n\t\tif (process.env['NODE_ENV'] === 'test') {\n\t\t\treturn [logToMemory, logEvent];\n\t\t}\n\t} catch {\n\t\t// Process.env is not available in the browser\n\t}\n\treturn [logToMemory, logToConsole, logEvent];\n};\n\n/**\n * The logger instance.\n */\nexport const logger: Logger = new Logger(getDefaultHandlers());\n\nexport const prepareLogMessage = (message: string) => {\n\treturn message.replace(/\\t/g, '');\n};\n\nexport const formatLogEntry = (\n\tmessage: string,\n\tseverity: LogSeverity,\n\tprefix: string\n): string => {\n\tconst date = new Date();\n\tconst formattedDate = new Intl.DateTimeFormat('en-GB', {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: '2-digit',\n\t\ttimeZone: 'UTC',\n\t})\n\t\t.format(date)\n\t\t.replace(/ /g, '-');\n\n\tconst formattedTime = new Intl.DateTimeFormat('en-GB', {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\thour12: false,\n\t\ttimeZone: 'UTC',\n\t\ttimeZoneName: 'short',\n\t}).format(date);\n\tconst now = formattedDate + ' ' + formattedTime;\n\tmessage = prepareLogMessage(message);\n\treturn `[${now}] ${prefix} ${severity}: ${message}`;\n};\n\n/**\n * Add a listener for the Playground crashes.\n * These crashes include Playground errors like Asyncify errors.\n * The callback function will receive an Event object with logs in the detail\n * property.\n *\n * @param loggerInstance The logger instance\n * @param callback The callback function\n */\nexport const addCrashListener = (\n\tloggerInstance: Logger,\n\tcallback: EventListenerOrEventListenerObject\n) => {\n\tloggerInstance.addEventListener(loggerInstance.fatalErrorEvent, callback);\n};\n","import type { Logger } from '../logger';\n\n/**\n * Log Windows errors.\n *\n * @param loggerInstance The logger instance\n * @param ErrorEvent event\n */\nconst logWindowErrorEvent = (loggerInstance: Logger, event: ErrorEvent) => {\n\tloggerInstance.logMessage({\n\t\tmessage: `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`,\n\t\tseverity: 'Error',\n\t});\n};\n\n/**\n * Log promise rejections.\n *\n * @param loggerInstance The logger instance\n * @param PromiseRejectionEvent event\n */\nconst logPromiseRejection = (\n\tloggerInstance: Logger,\n\tevent: PromiseRejectionEvent\n) => {\n\t// No reason was provided, so we can't log anything.\n\tif (!event?.reason) {\n\t\treturn;\n\t}\n\tconst message = event?.reason.stack ?? event.reason;\n\tloggerInstance.logMessage({\n\t\tmessage,\n\t\tseverity: 'Error',\n\t});\n};\n\n/**\n * The number of open Playground tabs.\n */\nlet numberOfOpenPlaygroundTabs = 0;\n\n/**\n * Register a listener for service worker messages and log the data.\n * The service worker will send the number of open Playground tabs.\n *\n * @param loggerInstance The logger instance\n */\nconst addServiceWorkerMessageListener = (loggerInstance: Logger) => {\n\tnavigator.serviceWorker.addEventListener('message', (event) => {\n\t\tif (event.data?.numberOfOpenPlaygroundTabs === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Each tab sends an activate event on load. Prevent sending the same\n\t\t// metrics multiple times if a tab is reloaded.\n\t\tif (\n\t\t\tnumberOfOpenPlaygroundTabs ===\n\t\t\tevent.data?.numberOfOpenPlaygroundTabs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tnumberOfOpenPlaygroundTabs = event.data?.numberOfOpenPlaygroundTabs;\n\t\tloggerInstance.debug(\n\t\t\t`Number of open Playground tabs is: ${numberOfOpenPlaygroundTabs}`\n\t\t);\n\t});\n};\n\n// If the window events are already connected.\nlet windowConnected = false;\n\n/**\n * Collect errors from JavaScript window events like error and log them.\n * @param loggerInstance The logger instance\n */\nexport const collectWindowErrors = (loggerInstance: Logger) => {\n\t// Ensure that the window events are connected only once.\n\tif (windowConnected) {\n\t\treturn;\n\t}\n\taddServiceWorkerMessageListener(loggerInstance);\n\tif (typeof window === 'undefined') {\n\t\treturn;\n\t}\n\n\twindow.addEventListener('error', (event) =>\n\t\tlogWindowErrorEvent(loggerInstance, event as ErrorEvent)\n\t);\n\twindow.addEventListener('unhandledrejection', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindow.addEventListener('rejectionhandled', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindowConnected = true;\n};\n","/// <reference lib=\"WebWorker\" />\n\n/**\n * **Call this inside a service worker.**\n * These errors include Playground errors like Asyncify errors. PHP errors\n * won't trigger this event.\n *\n * Reports service worker metrics.\n * Allows the logger to request metrics from the service worker by sending a\n * message. The service worker will respond with the number of open Playground\n * tabs.\n *\n * @param worker The service worker\n */\nexport const reportServiceWorkerMetrics = (\n\tworker: ServiceWorkerGlobalScope\n) => {\n\tworker.addEventListener('activate', () => {\n\t\tworker.clients.matchAll().then((clients) => {\n\t\t\tconst metrics = {\n\t\t\t\tnumberOfOpenPlaygroundTabs: clients.filter(\n\t\t\t\t\t// Only count top-level frames to get the number of tabs.\n\t\t\t\t\t(c) => c.frameType === 'top-level'\n\t\t\t\t).length,\n\t\t\t};\n\t\t\tfor (const client of clients) {\n\t\t\t\tclient.postMessage(metrics);\n\t\t\t}\n\t\t});\n\t});\n};\n"],"names":["logEventType","logEvent","log","args","logger","logToConsole","prepareLogMessage","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","clearMemoryLogs","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","handler","getDefaultHandlers","severity","prefix","date","formattedDate","formattedTime","now","addCrashListener","callback","logWindowErrorEvent","logPromiseRejection","numberOfOpenPlaygroundTabs","addServiceWorkerMessageListener","_a","_b","_c","windowConnected","collectWindowErrors","reportServiceWorkerMetrics","worker","clients","metrics","c","client"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../packages/php-wasm/logger/src/lib/handlers/log-event.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-console.ts","../../../../packages/php-wasm/logger/src/lib/handlers/log-to-memory.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-php-logs.ts","../../../../packages/php-wasm/logger/src/lib/logger.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-window-errors.ts","../../../../packages/php-wasm/logger/src/lib/collectors/collect-service-worker-metrics.ts"],"sourcesContent":["import type { LogHandler } from '../log-handlers';\nimport { type Log, logger } from '../logger';\n\nexport const logEventType = 'playground-log';\n\nexport const logEvent: LogHandler = (log: Log, ...args: any[]): void => {\n\tlogger.dispatchEvent(\n\t\tnew CustomEvent(logEventType, {\n\t\t\tdetail: {\n\t\t\t\tlog,\n\t\t\t\targs,\n\t\t\t},\n\t\t})\n\t);\n};\n","import type { LogHandler } from '../log-handlers';\nimport { type Log, LogSeverity, prepareLogMessage } from '../logger';\n\n/**\n * Log message to the console.\n */\nexport const logToConsole: LogHandler = (log: Log, ...args: any[]): void => {\n\tif (typeof log.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(log, 'message', prepareLogMessage(log.message));\n\t} else if (log.message.message && typeof log.message.message === 'string') {\n\t\t// Some errors have a read-only message property where direct\n\t\t// assignment will throw an error. The assignment is merely for\n\t\t// formatting, so let's assign with Reflect.set and avoid the error.\n\t\tReflect.set(\n\t\t\tlog.message,\n\t\t\t'message',\n\t\t\tprepareLogMessage(log.message.message)\n\t\t);\n\t}\n\t/* eslint-disable no-console */\n\tswitch (log.severity) {\n\t\tcase LogSeverity.Debug:\n\t\t\tconsole.debug(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Info:\n\t\t\tconsole.info(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Warn:\n\t\t\tconsole.warn(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Error:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tcase LogSeverity.Fatal:\n\t\t\tconsole.error(log.message, ...args);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tconsole.log(log.message, ...args);\n\t}\n\t/* eslint-enable no-console */\n};\n","import type { LogHandler } from '../log-handlers';\nimport { formatLogEntry, type Log, LogPrefix } from '../logger';\n\nconst prepareLogMessage = (logMessage: object): string => {\n\tif (logMessage instanceof Error) {\n\t\treturn [logMessage.message, logMessage.stack].join('\\n');\n\t}\n\treturn JSON.stringify(logMessage, null, 2);\n};\n\nexport const logs: string[] = [];\n\nconst addToLogArray = (message: string): void => {\n\tlogs.push(message);\n};\n\n/**\n * Log to memory\n */\nexport const logToMemory: LogHandler = (log: Log): void => {\n\tif (log.raw === true) {\n\t\taddToLogArray(log.message);\n\t} else {\n\t\tconst message = formatLogEntry(\n\t\t\ttypeof log.message === 'object'\n\t\t\t\t? prepareLogMessage(log.message)\n\t\t\t\t: log.message,\n\t\t\tlog.severity,\n\t\t\tlog.prefix ?? LogPrefix.JS\n\t\t);\n\t\taddToLogArray(message);\n\t}\n};\n\nexport const clearMemoryLogs = (): void => {\n\tlogs.length = 0;\n};\n","import type { UniversalPHP, PHPRequestErrorEvent } from '../types';\nimport { type Logger, LogPrefix, LogSeverity } from '../logger';\n\nlet lastPHPLogLength = 0;\nexport const errorLogPath = '/wordpress/wp-content/debug.log';\n\n/**\n * Read the WordPress debug.log file and return its content.\n *\n * @param UniversalPHP playground instance\n * @returns string The content of the debug.log file\n */\nconst getRequestPhpErrorLog = async (playground: UniversalPHP) => {\n\tif (!(await playground.fileExists(errorLogPath))) {\n\t\treturn '';\n\t}\n\treturn await playground.readFileAsText(errorLogPath);\n};\n\n/**\n * Collect PHP logs from the error_log file and log them.\n * @param UniversalPHP playground instance\n * @param loggerInstance The logger instance\n */\nexport const collectPhpLogs = (\n\tloggerInstance: Logger,\n\tplayground: UniversalPHP\n) => {\n\tplayground.addEventListener('request.end', async () => {\n\t\tconst log = await getRequestPhpErrorLog(playground);\n\t\tif (log.length > lastPHPLogLength) {\n\t\t\tconst currentLog = log.substring(lastPHPLogLength);\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: currentLog,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\traw: true,\n\t\t\t});\n\t\t\tlastPHPLogLength = log.length;\n\t\t}\n\t});\n\tplayground.addEventListener('request.error', (event) => {\n\t\tevent = event as PHPRequestErrorEvent;\n\t\tif (event.error) {\n\t\t\tloggerInstance.logMessage({\n\t\t\t\tmessage: `${event.error.message} ${event.error.stack}`,\n\t\t\t\tseverity: LogSeverity.Fatal,\n\t\t\t\tprefix:\n\t\t\t\t\tevent.source === 'request' ? LogPrefix.PHP : LogPrefix.WASM,\n\t\t\t});\n\t\t\tloggerInstance.dispatchEvent(\n\t\t\t\tnew CustomEvent(loggerInstance.fatalErrorEvent, {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tlogs: loggerInstance.getLogs(),\n\t\t\t\t\t\tsource: event.source,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\t\t}\n\t});\n};\n","import { logEvent } from './handlers/log-event';\nimport {\n\tlogToMemory,\n\tlogToConsole,\n\tlogs,\n\ttype LogHandler,\n} from './log-handlers';\n\nexport { logEventType } from './handlers/log-event';\n\nexport { errorLogPath } from './collectors/collect-php-logs';\n\nexport type Log = {\n\tmessage: any;\n\tseverity: LogSeverity;\n\tprefix?: LogPrefix;\n\traw?: boolean;\n};\n\n/**\n * Log severity levels.\n */\nexport const LogSeverity = {\n\tFatal: { name: 'fatal', level: 0 },\n\tError: { name: 'error', level: 1 },\n\tWarn: { name: 'warn', level: 2 },\n\tLog: { name: 'log', level: 3 },\n\tInfo: { name: 'info', level: 4 },\n\tDebug: { name: 'debug', level: 5 },\n} as const;\n\nexport type LogSeverity = (typeof LogSeverity)[keyof typeof LogSeverity];\n\n/**\n * Log prefix.\n */\nexport const LogPrefix = {\n\tWASM: 'Wasm Crash',\n\tPHP: 'PHP',\n\tJS: 'JavaScript',\n} as const;\n\nexport type LogPrefix = (typeof LogPrefix)[keyof typeof LogPrefix];\n\n/**\n * A logger for Playground.\n */\nexport class Logger extends EventTarget {\n\tpublic readonly fatalErrorEvent = 'playground-fatal-error';\n\tprivate readonly handlers: LogHandler[];\n\tprivate severity: LogSeverity = LogSeverity.Info;\n\n\t// constructor\n\tconstructor(\n\t\t// Log handlers\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\t\thandlers: LogHandler[] = []\n\t) {\n\t\tsuper();\n\t\tthis.handlers = handlers;\n\t}\n\n\t/**\n\t * Get all logs.\n\t * @returns string[]\n\t */\n\tpublic getLogs(): string[] {\n\t\tif (!this.handlers.includes(logToMemory)) {\n\t\t\tthis\n\t\t\t\t.error(`Logs aren't stored because the logToMemory handler isn't registered.\n\t\t\t\tIf you're using a custom logger instance, make sure to register logToMemory handler.\n\t\t\t`);\n\t\t\treturn [];\n\t\t}\n\t\treturn [...logs];\n\t}\n\n\t/**\n\t * Log message with severity.\n\t *\n\t * @param log Log\n\t * @param args any\n\t */\n\tpublic logMessage(\n\t\tlog: Omit<Log, 'severity'> & { severity?: LogSeverity },\n\t\t...args: any[]\n\t): void {\n\t\tconst logWithSeverity: Log = {\n\t\t\t...log,\n\t\t\tseverity: log.severity ?? LogSeverity.Log,\n\t\t};\n\t\tfor (const handler of this.handlers) {\n\t\t\tif (logWithSeverity.severity.level <= this.severity.level) {\n\t\t\t\thandler(logWithSeverity, ...args);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter message based on severity\n\t * @param severity LogSeverity\n\t */\n\tpublic setSeverityFilterLevel(severity: LogSeverity): void {\n\t\tthis.severity = severity;\n\t}\n\n\t/**\n\t * Log message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic log(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Log,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log debug message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic debug(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Debug,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log info message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic info(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Info,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log warning message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic warn(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Warn,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * Log error message\n\t *\n\t * @param message any\n\t * @param args any\n\t */\n\tpublic error(message: any, ...args: any[]): void {\n\t\tthis.logMessage(\n\t\t\t{\n\t\t\t\tmessage,\n\t\t\t\tseverity: LogSeverity.Error,\n\t\t\t\tprefix: LogPrefix.JS,\n\t\t\t\traw: false,\n\t\t\t},\n\t\t\t...args\n\t\t);\n\t}\n}\n\nconst getDefaultHandlers = () => {\n\ttry {\n\t\tif (process.env['NODE_ENV'] === 'test') {\n\t\t\treturn [logToMemory, logEvent];\n\t\t}\n\t} catch {\n\t\t// Process.env is not available in the browser\n\t}\n\treturn [logToMemory, logToConsole, logEvent];\n};\n\n/**\n * The logger instance.\n */\nexport const logger: Logger = new Logger(getDefaultHandlers());\n\nexport const prepareLogMessage = (message: string) => {\n\treturn message.replace(/\\t/g, '');\n};\n\nexport const formatLogEntry = (\n\tmessage: string,\n\tseverity: LogSeverity,\n\tprefix: string\n): string => {\n\tconst date = new Date();\n\tconst formattedDate = new Intl.DateTimeFormat('en-GB', {\n\t\tyear: 'numeric',\n\t\tmonth: 'short',\n\t\tday: '2-digit',\n\t\ttimeZone: 'UTC',\n\t})\n\t\t.format(date)\n\t\t.replace(/ /g, '-');\n\n\tconst formattedTime = new Intl.DateTimeFormat('en-GB', {\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t\tsecond: '2-digit',\n\t\thour12: false,\n\t\ttimeZone: 'UTC',\n\t\ttimeZoneName: 'short',\n\t}).format(date);\n\tconst now = formattedDate + ' ' + formattedTime;\n\tmessage = prepareLogMessage(message);\n\treturn `[${now}] ${prefix} ${severity.name}: ${message}`;\n};\n\n/**\n * Add a listener for the Playground crashes.\n * These crashes include Playground errors like Asyncify errors.\n * The callback function will receive an Event object with logs in the detail\n * property.\n *\n * @param loggerInstance The logger instance\n * @param callback The callback function\n */\nexport const addCrashListener = (\n\tloggerInstance: Logger,\n\tcallback: EventListenerOrEventListenerObject\n) => {\n\tloggerInstance.addEventListener(loggerInstance.fatalErrorEvent, callback);\n};\n","import { type Logger, LogSeverity } from '../logger';\n\n/**\n * Log Windows errors.\n *\n * @param loggerInstance The logger instance\n * @param ErrorEvent event\n */\nconst logWindowErrorEvent = (loggerInstance: Logger, event: ErrorEvent) => {\n\tloggerInstance.logMessage({\n\t\tmessage: `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * Log promise rejections.\n *\n * @param loggerInstance The logger instance\n * @param PromiseRejectionEvent event\n */\nconst logPromiseRejection = (\n\tloggerInstance: Logger,\n\tevent: PromiseRejectionEvent\n) => {\n\t// No reason was provided, so we can't log anything.\n\tif (!event?.reason) {\n\t\treturn;\n\t}\n\tconst message = event?.reason.stack ?? event.reason;\n\tloggerInstance.logMessage({\n\t\tmessage,\n\t\tseverity: LogSeverity.Error,\n\t});\n};\n\n/**\n * The number of open Playground tabs.\n */\nlet numberOfOpenPlaygroundTabs = 0;\n\n/**\n * Register a listener for service worker messages and log the data.\n * The service worker will send the number of open Playground tabs.\n *\n * @param loggerInstance The logger instance\n */\nconst addServiceWorkerMessageListener = (loggerInstance: Logger) => {\n\tnavigator.serviceWorker.addEventListener('message', (event) => {\n\t\tif (event.data?.numberOfOpenPlaygroundTabs === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Each tab sends an activate event on load. Prevent sending the same\n\t\t// metrics multiple times if a tab is reloaded.\n\t\tif (\n\t\t\tnumberOfOpenPlaygroundTabs ===\n\t\t\tevent.data?.numberOfOpenPlaygroundTabs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tnumberOfOpenPlaygroundTabs = event.data?.numberOfOpenPlaygroundTabs;\n\t\tloggerInstance.debug(\n\t\t\t`Number of open Playground tabs is: ${numberOfOpenPlaygroundTabs}`\n\t\t);\n\t});\n};\n\n// If the window events are already connected.\nlet windowConnected = false;\n\n/**\n * Collect errors from JavaScript window events like error and log them.\n * @param loggerInstance The logger instance\n */\nexport const collectWindowErrors = (loggerInstance: Logger) => {\n\t// Ensure that the window events are connected only once.\n\tif (windowConnected) {\n\t\treturn;\n\t}\n\taddServiceWorkerMessageListener(loggerInstance);\n\tif (typeof window === 'undefined') {\n\t\treturn;\n\t}\n\n\twindow.addEventListener('error', (event) =>\n\t\tlogWindowErrorEvent(loggerInstance, event as ErrorEvent)\n\t);\n\twindow.addEventListener('unhandledrejection', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindow.addEventListener('rejectionhandled', (event) =>\n\t\tlogPromiseRejection(loggerInstance, event as PromiseRejectionEvent)\n\t);\n\twindowConnected = true;\n};\n","/// <reference lib=\"WebWorker\" />\n\n/**\n * **Call this inside a service worker.**\n * These errors include Playground errors like Asyncify errors. PHP errors\n * won't trigger this event.\n *\n * Reports service worker metrics.\n * Allows the logger to request metrics from the service worker by sending a\n * message. The service worker will respond with the number of open Playground\n * tabs.\n *\n * @param worker The service worker\n */\nexport const reportServiceWorkerMetrics = (\n\tworker: ServiceWorkerGlobalScope\n) => {\n\tworker.addEventListener('activate', () => {\n\t\tworker.clients.matchAll().then((clients) => {\n\t\t\tconst metrics = {\n\t\t\t\tnumberOfOpenPlaygroundTabs: clients.filter(\n\t\t\t\t\t// Only count top-level frames to get the number of tabs.\n\t\t\t\t\t(c) => c.frameType === 'top-level'\n\t\t\t\t).length,\n\t\t\t};\n\t\t\tfor (const client of clients) {\n\t\t\t\tclient.postMessage(metrics);\n\t\t\t}\n\t\t});\n\t});\n};\n"],"names":["logEventType","logEvent","log","args","logger","logToConsole","prepareLogMessage","LogSeverity","logMessage","logs","addToLogArray","message","logToMemory","formatLogEntry","LogPrefix","clearMemoryLogs","lastPHPLogLength","errorLogPath","getRequestPhpErrorLog","playground","collectPhpLogs","loggerInstance","currentLog","event","Logger","handlers","logWithSeverity","handler","severity","getDefaultHandlers","prefix","date","formattedDate","formattedTime","now","addCrashListener","callback","logWindowErrorEvent","logPromiseRejection","numberOfOpenPlaygroundTabs","addServiceWorkerMessageListener","_a","_b","_c","windowConnected","collectWindowErrors","reportServiceWorkerMetrics","worker","clients","metrics","c","client"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { UniversalPHP } from '../types';
2
- import type { Logger } from '../logger';
2
+ import { type Logger } from '../logger';
3
3
  export declare const errorLogPath = "/wordpress/wp-content/debug.log";
4
4
  /**
5
5
  * Collect PHP logs from the error_log file and log them.
@@ -1,4 +1,4 @@
1
- import type { Logger } from '../logger';
1
+ import { type Logger } from '../logger';
2
2
  /**
3
3
  * Collect errors from JavaScript window events like error and log them.
4
4
  * @param loggerInstance The logger instance
package/lib/logger.d.ts CHANGED
@@ -3,24 +3,56 @@ export { logEventType } from './handlers/log-event';
3
3
  export { errorLogPath } from './collectors/collect-php-logs';
4
4
  export type Log = {
5
5
  message: any;
6
- severity?: LogSeverity;
6
+ severity: LogSeverity;
7
7
  prefix?: LogPrefix;
8
8
  raw?: boolean;
9
9
  };
10
10
  /**
11
11
  * Log severity levels.
12
12
  */
13
- export type LogSeverity = 'Debug' | 'Info' | 'Warn' | 'Error' | 'Fatal';
13
+ export declare const LogSeverity: {
14
+ readonly Fatal: {
15
+ readonly name: "fatal";
16
+ readonly level: 0;
17
+ };
18
+ readonly Error: {
19
+ readonly name: "error";
20
+ readonly level: 1;
21
+ };
22
+ readonly Warn: {
23
+ readonly name: "warn";
24
+ readonly level: 2;
25
+ };
26
+ readonly Log: {
27
+ readonly name: "log";
28
+ readonly level: 3;
29
+ };
30
+ readonly Info: {
31
+ readonly name: "info";
32
+ readonly level: 4;
33
+ };
34
+ readonly Debug: {
35
+ readonly name: "debug";
36
+ readonly level: 5;
37
+ };
38
+ };
39
+ export type LogSeverity = (typeof LogSeverity)[keyof typeof LogSeverity];
14
40
  /**
15
41
  * Log prefix.
16
42
  */
17
- export type LogPrefix = 'WASM Crash' | 'PHP' | 'JavaScript';
43
+ export declare const LogPrefix: {
44
+ readonly WASM: "Wasm Crash";
45
+ readonly PHP: "PHP";
46
+ readonly JS: "JavaScript";
47
+ };
48
+ export type LogPrefix = (typeof LogPrefix)[keyof typeof LogPrefix];
18
49
  /**
19
50
  * A logger for Playground.
20
51
  */
21
52
  export declare class Logger extends EventTarget {
22
53
  readonly fatalErrorEvent = "playground-fatal-error";
23
54
  private readonly handlers;
55
+ private severity;
24
56
  constructor(handlers?: LogHandler[]);
25
57
  /**
26
58
  * Get all logs.
@@ -30,12 +62,17 @@ export declare class Logger extends EventTarget {
30
62
  /**
31
63
  * Log message with severity.
32
64
  *
33
- * @param message any
34
- * @param severity LogSeverity
35
- * @param raw boolean
65
+ * @param log Log
36
66
  * @param args any
37
67
  */
38
- logMessage(log: Log, ...args: any[]): void;
68
+ logMessage(log: Omit<Log, 'severity'> & {
69
+ severity?: LogSeverity;
70
+ }, ...args: any[]): void;
71
+ /**
72
+ * Filter message based on severity
73
+ * @param severity LogSeverity
74
+ */
75
+ setSeverityFilterLevel(severity: LogSeverity): void;
39
76
  /**
40
77
  * Log message
41
78
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@php-wasm/logger",
3
- "version": "2.0.12",
3
+ "version": "2.0.13",
4
4
  "description": "A logger for PHP-wasm clients like Playground and WP-now.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,7 +27,7 @@
27
27
  "node": ">=20.18.3",
28
28
  "npm": ">=10.1.0"
29
29
  },
30
- "gitHead": "7a2f0f5dc0171895433af3d24d2ade36cd1d5ace",
30
+ "gitHead": "c9d2979597806e5f14985a0607c9c61e48d54c9b",
31
31
  "overrides": {
32
32
  "rollup": "^4.34.6",
33
33
  "react": "18.3.1",
@@ -36,7 +36,7 @@
36
36
  "ws": "^8.18.0"
37
37
  },
38
38
  "dependencies": {
39
- "@php-wasm/node-polyfills": "2.0.12"
39
+ "@php-wasm/node-polyfills": "2.0.13"
40
40
  },
41
41
  "optionalDependencies": {
42
42
  "fs-ext": "2.1.1"