@real-router/logger-plugin 0.2.31 → 0.2.32
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/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/metafile-cjs.json +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/metafile-esm.json +1 -1
- package/package.json +1 -1
- package/src/internal/params-diff.ts +2 -6
- package/src/plugin.ts +75 -99
package/dist/cjs/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e={level:"all",usePerformanceMarks:!1,showParamsDiff:!0,showTiming:!0,context:"logger-plugin"},
|
|
1
|
+
var e={level:"all",usePerformanceMarks:!1,showParamsDiff:!0,showTiming:!0,context:"logger-plugin"},o=e=>e?.name??"(none)",r=(e,o)=>{if(null===e)return"";const r=o()-e;return!Number.isFinite(r)||r<0?" (?)":r<.1?` (${(1e3*r).toFixed(2)}μs)`:` (${r.toFixed(2)}ms)`},n=0,t=0,s="undefined"!=typeof performance&&"function"==typeof performance.now?()=>performance.now():()=>{const e=Date.now();return e<n&&(t+=n-e),n=e,e+t},a=()=>s();function i(n){const t={...e,...n},s="all"===t.level,i="none"!==t.level&&"errors"!==t.level,c=i,l="none"!==t.level,u=i&&t.showParamsDiff,f=t.showTiming,m=`[${t.context}]`;return()=>{const e=(e=>{let o=!1;return{open(r){e&&!o&&(console.group(r),o=!0)},close(){e&&o&&(console.groupEnd(),o=!1)},isOpen:()=>o}})("undefined"!=typeof console&&"function"==typeof console.group&&"function"==typeof console.groupEnd),n=((e,o)=>{const r=e&&"undefined"!=typeof performance&&"function"==typeof performance.mark&&"function"==typeof performance.measure;return{mark(e){r&&performance.mark(e)},measure(e,n,t){if(r)try{performance.measure(e,n,t)}catch(r){console.warn(`[${o}] Failed to create performance measure: ${e}`,r)}}}})(t.usePerformanceMarks,t.context);let d=null,p="",$="";const g=()=>{e.close(),p="",$="",d=null};return{onStart(){n.mark("router:start"),s&&console.log(`${m} Router started`)},onStop(){e.close(),n.mark("router:stop"),n.measure("router:lifetime","router:start","router:stop"),s&&console.log(`${m} Router stopped`)},onTransitionStart(r,s){e.open("Router transition"),d=a();const c=o(s),l=o(r);p=((e,o)=>`${e}→${o}`)(c,l),$=`router:transition-start:${p}`,n.mark($),i&&(console.log(`${m} Transition: ${c} → ${l}`,{from:s,to:r}),((e,o)=>{if(!u||!o)return;if(e.name!==o.name)return;const r=((e,o)=>{const r={},n={},t={};let s=!1;for(const n in e)n in o?e[n]!==o[n]&&(r[n]={from:e[n],to:o[n]},s=!0):(t[n]=e[n],s=!0);for(const r in o)r in e||(n[r]=o[r],s=!0);return s?{changed:r,added:n,removed:t}:null})(o.params,e.params);r&&((e,o)=>{const r=[],n=Object.entries(e.changed);if(n.length>0){const e=[];for(const[o,{from:r,to:t}]of n)e.push(`${o}: ${JSON.stringify(r)} → ${JSON.stringify(t)}`);r.push(`Changed: { ${e.join(", ")} }`)}Object.keys(e.added).length>0&&r.push(`Added: ${JSON.stringify(e.added)}`),Object.keys(e.removed).length>0&&r.push(`Removed: ${JSON.stringify(e.removed)}`),console.log(`[${o}] ${r.join(", ")}`)})(r,t.context)})(r,s))},onTransitionSuccess(e,o){const t=p,s=`router:transition-end:${t}`;if(n.mark(s),n.measure(`router:transition:${t}`,$,s),i){const n=f?r(d,a):"";console.log(`${m} Transition success${n}`,{to:e,from:o})}g()},onTransitionCancel(e,o){const t=p,s=`router:transition-cancel:${t}`;if(n.mark(s),n.measure(`router:transition-cancelled:${t}`,$,s),c){const n=f?r(d,a):"";console.warn(`${m} Transition cancelled${n}`,{to:e,from:o})}g()},onTransitionError(e,o,t){const s=p,i=`router:transition-error:${s}`;if(n.mark(i),n.measure(`router:transition-failed:${s}`,$,i),l){const n=f?r(d,a):"";console.error(`${m} Transition error: ${t.code}${n}`,{error:t,stack:t.stack,to:e,from:o})}g()},teardown(){g()}}}}var c=i();exports.loggerPlugin=c,exports.loggerPluginFactory=i;//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/constants.ts","../../src/internal/console-groups.ts","../../src/internal/formatting.ts","../../src/internal/params-diff.ts","../../src/internal/performance-marks.ts","../../src/internal/timing.ts","../../src/plugin.ts"],"names":["now"],"mappings":"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","file":"index.js","sourcesContent":["// packages/logger-plugin/modules/constants.ts\n\nimport type { LoggerPluginConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG: Required<LoggerPluginConfig> = {\n level: \"all\",\n usePerformanceMarks: false,\n showParamsDiff: true,\n showTiming: true,\n context: \"logger-plugin\",\n};\n","// packages/logger-plugin/modules/internal/console-groups.ts\n\n/**\n * Checks if console.group is supported in the current environment.\n */\nexport const supportsConsoleGroups = (): boolean => {\n return (\n typeof console !== \"undefined\" &&\n typeof console.group === \"function\" &&\n typeof console.groupEnd === \"function\"\n );\n};\n\n/**\n * Manager for handling console groups\n */\ninterface GroupManager {\n /**\n * Opens a group if it's not already open\n */\n open: (label: string) => void;\n /**\n * Closes a group if it's open\n */\n close: () => void;\n /**\n * Checks if a group is currently open\n */\n isOpen: () => boolean;\n}\n\n/**\n * Creates a manager for handling console groups.\n * Prevents duplicate group opening.\n *\n * @param enabled - Whether groups are supported in the environment\n * @returns Object with open and close methods\n */\nexport const createGroupManager = (enabled: boolean): GroupManager => {\n let isOpened = false;\n\n return {\n /**\n * Opens a group if it's not already open.\n */\n open(label: string): void {\n if (!enabled || isOpened) {\n return;\n }\n\n console.group(label);\n isOpened = true;\n },\n\n /**\n * Closes a group if it's open.\n */\n close(): void {\n if (!enabled || !isOpened) {\n return;\n }\n\n console.groupEnd();\n isOpened = false;\n },\n\n /**\n * Checks if a group is currently open.\n */\n isOpen(): boolean {\n return isOpened;\n },\n };\n};\n","// packages/logger-plugin/modules/internal/formatting.ts\n\nimport type { State } from \"@real-router/core\";\n\n/**\n * Formats route name for logging output.\n * Handles undefined/null.\n */\nexport const formatRouteName = (state?: State): string => {\n return state?.name ?? \"(none)\";\n};\n\n/**\n * Formats execution time information.\n * Uses adaptive units:\n * - Microseconds (μs) for <0.1ms\n * - Milliseconds (ms) for ≥0.1ms\n *\n * @param startTime - Start time or null\n * @param now - Function to get current time\n * @returns String with time or empty string\n */\nexport const formatTiming = (\n startTime: number | null,\n now: () => number,\n): string => {\n if (startTime === null) {\n return \"\";\n }\n\n const durationMs = now() - startTime;\n\n if (!Number.isFinite(durationMs) || durationMs < 0) {\n return \" (?)\";\n }\n\n if (durationMs < 0.1) {\n const durationMks = (durationMs * 1000).toFixed(2);\n\n return ` (${durationMks}μs)`;\n } else {\n const duration = durationMs.toFixed(2);\n\n return ` (${duration}ms)`;\n }\n};\n\n/**\n * Creates a label for Performance API from route names.\n */\nexport const createTransitionLabel = (\n fromRoute: string,\n toRoute: string,\n): string => {\n return `${fromRoute}→${toRoute}`;\n};\n","// packages/logger-plugin/modules/internal/params-diff.ts\n\nimport type { Params } from \"@real-router/core\";\n\nexport interface ParamsDiff {\n changed: Record<string, { from: unknown; to: unknown }>;\n added: Record<string, unknown>;\n removed: Record<string, unknown>;\n}\n\n/**\n * Calculates differences between two parameter objects.\n * Performs only shallow comparison.\n *\n * @param fromParams - Previous parameters\n * @param toParams - New parameters\n * @returns Object with differences or null if there are no changes\n */\nexport const getParamsDiff = (\n fromParams: Params,\n toParams: Params,\n): ParamsDiff | null => {\n const changed: ParamsDiff[\"changed\"] = {};\n const added: ParamsDiff[\"added\"] = {};\n const removed: ParamsDiff[\"removed\"] = {};\n\n // Track if any changes found to avoid iterating through objects at the end.\n // This is a performance optimization: instead of calling Object.keys().length\n // three times to check if objects are empty, we set this flag when we find\n // any change and check it once at the end.\n let hasChanges = false;\n\n // Find changed and removed\n for (const key in fromParams) {\n if (!(key in toParams)) {\n removed[key] = fromParams[key];\n hasChanges = true;\n } else if (fromParams[key] !== toParams[key]) {\n changed[key] = { from: fromParams[key], to: toParams[key] };\n hasChanges = true;\n }\n }\n\n // Find added\n for (const key in toParams) {\n if (!(key in fromParams)) {\n added[key] = toParams[key];\n hasChanges = true;\n }\n }\n\n // Return null if there are no changes\n if (!hasChanges) {\n return null;\n }\n\n return { changed, added, removed };\n};\n\n/**\n * Formats and logs parameter differences.\n *\n * @param diff - Object with differences\n * @param context - Context for console\n */\nexport const logParamsDiff = (diff: ParamsDiff, context: string): void => {\n const parts: string[] = [];\n\n // Cache entries to avoid double iteration\n const changedEntries = Object.entries(diff.changed);\n\n if (changedEntries.length > 0) {\n const items: string[] = [];\n\n for (const [key, { from, to }] of changedEntries) {\n items.push(`${key}: ${JSON.stringify(from)} → ${JSON.stringify(to)}`);\n }\n\n parts.push(`Changed: { ${items.join(\", \")} }`);\n }\n\n const addedEntries = Object.entries(diff.added);\n\n if (addedEntries.length > 0) {\n parts.push(`Added: ${JSON.stringify(diff.added)}`);\n }\n\n const removedEntries = Object.entries(diff.removed);\n\n if (removedEntries.length > 0) {\n parts.push(`Removed: ${JSON.stringify(diff.removed)}`);\n }\n\n console.log(`[${context}] ${parts.join(\", \")}`);\n};\n","// packages/logger-plugin/modules/internal/performance-marks.ts\n\n/**\n * Checks if Performance API is supported in the current environment.\n */\nexport const supportsPerformanceAPI = (): boolean => {\n return (\n typeof performance !== \"undefined\" &&\n typeof performance.mark === \"function\" &&\n typeof performance.measure === \"function\"\n );\n};\n\n/**\n * Performance tracker interface with mark and measure methods.\n */\ninterface PerformanceTracker {\n mark: (name: string) => void;\n measure: (measureName: string, startMark: string, endMark: string) => void;\n}\n\n/**\n * Creates a tracker for working with the Performance API.\n * Ignores calls if the API is unavailable.\n *\n * @param enabled - Whether the functionality is enabled (from config)\n * @param context - Context for error logging\n * @returns Object with mark and measure methods\n */\nexport const createPerformanceTracker = (\n enabled: boolean,\n context: string,\n): PerformanceTracker => {\n const isSupported = enabled && supportsPerformanceAPI();\n\n return {\n /**\n * Creates a performance mark with the specified name.\n */\n mark(name: string): void {\n if (!isSupported) {\n return;\n }\n\n performance.mark(name);\n },\n\n /**\n * Creates a performance measure between two marks.\n * Logs a warning if the marks don't exist.\n */\n measure(measureName: string, startMark: string, endMark: string): void {\n if (!isSupported) {\n return;\n }\n\n try {\n performance.measure(measureName, startMark, endMark);\n } catch (error) {\n console.warn(\n `[${context}] Failed to create performance measure: ${measureName}`,\n error,\n );\n }\n },\n };\n};\n","// packages/logger-plugin/modules/internal/timing.ts\n\n/**\n * Function that returns high-resolution timestamp in milliseconds.\n */\ntype TimeProvider = () => number;\n\n/**\n * State for Date.now() monotonic emulation\n */\nlet lastTimestamp = 0;\nlet timeOffset = 0;\n\n/**\n * Creates monotonic Date.now() wrapper that ensures time never goes backwards.\n *\n * @returns Time provider function with monotonic guarantee\n */\nfunction createMonotonicDateNow(): TimeProvider {\n // eslint-disable-next-line unicorn/consistent-function-scoping -- closure over module-level lastTimestamp/timeOffset\n return (): number => {\n const current: number = Date.now();\n\n if (current < lastTimestamp) {\n timeOffset += lastTimestamp - current;\n }\n\n lastTimestamp = current;\n\n return current + timeOffset;\n };\n}\n\n/**\n * Initialize time provider based on environment.\n * Uses performance.now() in modern environments (Node.js 16+, all browsers),\n * falls back to monotonic Date.now() wrapper for edge cases.\n */\nconst nowFn: TimeProvider =\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? (): number => performance.now()\n : createMonotonicDateNow();\n\n/**\n * Returns high-resolution monotonic timestamp.\n *\n * Uses performance.now() in modern environments (Node.js 16+, all browsers).\n * Falls back to monotonic Date.now() wrapper (~1ms precision) for edge cases.\n *\n * @returns Timestamp in milliseconds\n */\nexport const now = (): number => nowFn();\n","// packages/logger-plugin/modules/plugin.ts\n\nimport { DEFAULT_CONFIG } from \"./constants\";\nimport {\n createGroupManager,\n supportsConsoleGroups,\n} from \"./internal/console-groups\";\nimport {\n formatRouteName,\n formatTiming,\n createTransitionLabel,\n} from \"./internal/formatting\";\nimport { getParamsDiff, logParamsDiff } from \"./internal/params-diff\";\nimport { createPerformanceTracker } from \"./internal/performance-marks\";\nimport { now } from \"./internal/timing\";\n\nimport type { LoggerPluginConfig, LogLevel } from \"./types\";\nimport type { PluginFactory, RouterError, State } from \"@real-router/core\";\n\n/**\n * Checks if the given log type should be output based on the configured level.\n *\n * Level hierarchy:\n * - 'all': log everything (start, stop, transitions, warnings, errors)\n * - 'transitions': only transition events (start, success, cancel, error)\n * - 'errors': only errors\n * - 'none': nothing\n */\nconst shouldLog = (\n level: LogLevel,\n type: \"lifecycle\" | \"transition\" | \"warning\" | \"error\",\n): boolean => {\n if (level === \"none\") {\n return false;\n }\n\n if (level === \"errors\") {\n return type === \"error\";\n }\n\n if (level === \"transitions\") {\n return type === \"transition\" || type === \"warning\" || type === \"error\";\n }\n\n // level === 'all'\n return true;\n};\n\n/**\n * Creates a logger-plugin for real-router.\n *\n * @param options - Plugin configuration options\n * @returns Plugin factory function for real-router\n *\n * @example\n * ```ts\n * import { loggerPluginFactory } from \"@real-router/logger-plugin\";\n *\n * // Use with default configuration\n * router.usePlugin(loggerPluginFactory());\n *\n * // Use with custom configuration\n * router.usePlugin(loggerPluginFactory({\n * level: 'errors', // only log errors\n * usePerformanceMarks: true, // enable Performance API\n * showTiming: false, // disable timing info\n * showParamsDiff: false, // disable params diff\n * context: 'my-router', // custom context name\n * }));\n * ```\n */\nexport function loggerPluginFactory(\n options?: Partial<LoggerPluginConfig>,\n): PluginFactory {\n // Merge options with defaults\n const config: Required<LoggerPluginConfig> = {\n ...DEFAULT_CONFIG,\n ...options,\n };\n\n return () => {\n // Create helper managers\n const groups = createGroupManager(supportsConsoleGroups());\n const perf = createPerformanceTracker(\n config.usePerformanceMarks,\n config.context,\n );\n\n // Transition state\n let transitionStartTime: number | null = null;\n\n /**\n * Logs parameter differences when navigating within the same route.\n */\n const logParamsIfNeeded = (toState: State, fromState?: State): void => {\n if (!config.showParamsDiff || !fromState) {\n return;\n }\n\n // Show diff only for the same route\n if (toState.name !== fromState.name) {\n return;\n }\n\n const diff = getParamsDiff(fromState.params, toState.params);\n\n if (diff) {\n logParamsDiff(diff, config.context);\n }\n };\n\n /**\n * Formats timing string based on config.\n */\n const getTiming = (): string => {\n if (!config.showTiming) {\n return \"\";\n }\n\n return formatTiming(transitionStartTime, now);\n };\n\n return {\n onStart() {\n perf.mark(\"router:start\");\n\n if (shouldLog(config.level, \"lifecycle\")) {\n console.log(`[${config.context}] Router started`);\n }\n },\n\n onStop() {\n groups.close();\n\n perf.mark(\"router:stop\");\n perf.measure(\"router:lifetime\", \"router:start\", \"router:stop\");\n\n if (shouldLog(config.level, \"lifecycle\")) {\n console.log(`[${config.context}] Router stopped`);\n }\n },\n\n onTransitionStart(toState: State, fromState?: State) {\n groups.open(\"Router transition\");\n transitionStartTime = now();\n\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n const label = createTransitionLabel(fromRoute, toRoute);\n\n perf.mark(`router:transition-start:${label}`);\n\n if (shouldLog(config.level, \"transition\")) {\n console.log(\n `[${config.context}] Transition: ${fromRoute} → ${toRoute}`,\n {\n from: fromState,\n to: toState,\n },\n );\n\n logParamsIfNeeded(toState, fromState);\n }\n },\n\n onTransitionSuccess(toState: State, fromState?: State) {\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n const label = createTransitionLabel(fromRoute, toRoute);\n\n perf.mark(`router:transition-end:${label}`);\n perf.measure(\n `router:transition:${label}`,\n `router:transition-start:${label}`,\n `router:transition-end:${label}`,\n );\n\n if (shouldLog(config.level, \"transition\")) {\n const timing = getTiming();\n\n console.log(`[${config.context}] Transition success${timing}`, {\n to: toState,\n from: fromState,\n });\n }\n\n groups.close();\n transitionStartTime = null;\n },\n\n onTransitionCancel(toState: State, fromState?: State) {\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n const label = createTransitionLabel(fromRoute, toRoute);\n\n perf.mark(`router:transition-cancel:${label}`);\n perf.measure(\n `router:transition-cancelled:${label}`,\n `router:transition-start:${label}`,\n `router:transition-cancel:${label}`,\n );\n\n if (shouldLog(config.level, \"warning\")) {\n const timing = getTiming();\n\n console.warn(`[${config.context}] Transition cancelled${timing}`, {\n to: toState,\n from: fromState,\n });\n }\n\n groups.close();\n transitionStartTime = null;\n },\n\n onTransitionError(\n toState: State | undefined,\n fromState: State | undefined,\n err: RouterError,\n ) {\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n const label = createTransitionLabel(fromRoute, toRoute);\n\n perf.mark(`router:transition-error:${label}`);\n perf.measure(\n `router:transition-failed:${label}`,\n `router:transition-start:${label}`,\n `router:transition-error:${label}`,\n );\n\n if (shouldLog(config.level, \"error\")) {\n const timing = getTiming();\n\n console.error(\n `[${config.context}] Transition error: ${err.code}${timing}`,\n {\n error: err,\n stack: err.stack,\n to: toState,\n from: fromState,\n },\n );\n }\n\n groups.close();\n transitionStartTime = null;\n },\n\n teardown() {\n groups.close();\n transitionStartTime = null;\n },\n };\n };\n}\n\n/**\n * Default logger-plugin instance with standard configuration.\n * Provided for backward compatibility with existing code.\n *\n * @example\n * // Use default configuration\n * router.usePlugin(loggerPlugin);\n */\nexport const loggerPlugin = loggerPluginFactory();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/constants.ts","../../src/internal/console-groups.ts","../../src/internal/formatting.ts","../../src/internal/params-diff.ts","../../src/internal/performance-marks.ts","../../src/internal/timing.ts","../../src/plugin.ts"],"names":["now"],"mappings":"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","file":"index.js","sourcesContent":["// packages/logger-plugin/modules/constants.ts\n\nimport type { LoggerPluginConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG: Required<LoggerPluginConfig> = {\n level: \"all\",\n usePerformanceMarks: false,\n showParamsDiff: true,\n showTiming: true,\n context: \"logger-plugin\",\n};\n","// packages/logger-plugin/modules/internal/console-groups.ts\n\n/**\n * Checks if console.group is supported in the current environment.\n */\nexport const supportsConsoleGroups = (): boolean => {\n return (\n typeof console !== \"undefined\" &&\n typeof console.group === \"function\" &&\n typeof console.groupEnd === \"function\"\n );\n};\n\n/**\n * Manager for handling console groups\n */\ninterface GroupManager {\n /**\n * Opens a group if it's not already open\n */\n open: (label: string) => void;\n /**\n * Closes a group if it's open\n */\n close: () => void;\n /**\n * Checks if a group is currently open\n */\n isOpen: () => boolean;\n}\n\n/**\n * Creates a manager for handling console groups.\n * Prevents duplicate group opening.\n *\n * @param enabled - Whether groups are supported in the environment\n * @returns Object with open and close methods\n */\nexport const createGroupManager = (enabled: boolean): GroupManager => {\n let isOpened = false;\n\n return {\n /**\n * Opens a group if it's not already open.\n */\n open(label: string): void {\n if (!enabled || isOpened) {\n return;\n }\n\n console.group(label);\n isOpened = true;\n },\n\n /**\n * Closes a group if it's open.\n */\n close(): void {\n if (!enabled || !isOpened) {\n return;\n }\n\n console.groupEnd();\n isOpened = false;\n },\n\n /**\n * Checks if a group is currently open.\n */\n isOpen(): boolean {\n return isOpened;\n },\n };\n};\n","// packages/logger-plugin/modules/internal/formatting.ts\n\nimport type { State } from \"@real-router/core\";\n\n/**\n * Formats route name for logging output.\n * Handles undefined/null.\n */\nexport const formatRouteName = (state?: State): string => {\n return state?.name ?? \"(none)\";\n};\n\n/**\n * Formats execution time information.\n * Uses adaptive units:\n * - Microseconds (μs) for <0.1ms\n * - Milliseconds (ms) for ≥0.1ms\n *\n * @param startTime - Start time or null\n * @param now - Function to get current time\n * @returns String with time or empty string\n */\nexport const formatTiming = (\n startTime: number | null,\n now: () => number,\n): string => {\n if (startTime === null) {\n return \"\";\n }\n\n const durationMs = now() - startTime;\n\n if (!Number.isFinite(durationMs) || durationMs < 0) {\n return \" (?)\";\n }\n\n if (durationMs < 0.1) {\n const durationMks = (durationMs * 1000).toFixed(2);\n\n return ` (${durationMks}μs)`;\n } else {\n const duration = durationMs.toFixed(2);\n\n return ` (${duration}ms)`;\n }\n};\n\n/**\n * Creates a label for Performance API from route names.\n */\nexport const createTransitionLabel = (\n fromRoute: string,\n toRoute: string,\n): string => {\n return `${fromRoute}→${toRoute}`;\n};\n","// packages/logger-plugin/modules/internal/params-diff.ts\n\nimport type { Params } from \"@real-router/core\";\n\nexport interface ParamsDiff {\n changed: Record<string, { from: unknown; to: unknown }>;\n added: Record<string, unknown>;\n removed: Record<string, unknown>;\n}\n\n/**\n * Calculates differences between two parameter objects.\n * Performs only shallow comparison.\n *\n * @param fromParams - Previous parameters\n * @param toParams - New parameters\n * @returns Object with differences or null if there are no changes\n */\nexport const getParamsDiff = (\n fromParams: Params,\n toParams: Params,\n): ParamsDiff | null => {\n const changed: ParamsDiff[\"changed\"] = {};\n const added: ParamsDiff[\"added\"] = {};\n const removed: ParamsDiff[\"removed\"] = {};\n\n // Track if any changes found to avoid iterating through objects at the end.\n // This is a performance optimization: instead of calling Object.keys().length\n // three times to check if objects are empty, we set this flag when we find\n // any change and check it once at the end.\n let hasChanges = false;\n\n // Find changed and removed\n for (const key in fromParams) {\n if (!(key in toParams)) {\n removed[key] = fromParams[key];\n hasChanges = true;\n } else if (fromParams[key] !== toParams[key]) {\n changed[key] = { from: fromParams[key], to: toParams[key] };\n hasChanges = true;\n }\n }\n\n // Find added\n for (const key in toParams) {\n if (!(key in fromParams)) {\n added[key] = toParams[key];\n hasChanges = true;\n }\n }\n\n // Return null if there are no changes\n if (!hasChanges) {\n return null;\n }\n\n return { changed, added, removed };\n};\n\n/**\n * Formats and logs parameter differences.\n *\n * @param diff - Object with differences\n * @param context - Context for console\n */\nexport const logParamsDiff = (diff: ParamsDiff, context: string): void => {\n const parts: string[] = [];\n\n // Cache entries to avoid double iteration\n const changedEntries = Object.entries(diff.changed);\n\n if (changedEntries.length > 0) {\n const items: string[] = [];\n\n for (const [key, { from, to }] of changedEntries) {\n items.push(`${key}: ${JSON.stringify(from)} → ${JSON.stringify(to)}`);\n }\n\n parts.push(`Changed: { ${items.join(\", \")} }`);\n }\n\n if (Object.keys(diff.added).length > 0) {\n parts.push(`Added: ${JSON.stringify(diff.added)}`);\n }\n\n if (Object.keys(diff.removed).length > 0) {\n parts.push(`Removed: ${JSON.stringify(diff.removed)}`);\n }\n\n console.log(`[${context}] ${parts.join(\", \")}`);\n};\n","// packages/logger-plugin/modules/internal/performance-marks.ts\n\n/**\n * Checks if Performance API is supported in the current environment.\n */\nexport const supportsPerformanceAPI = (): boolean => {\n return (\n typeof performance !== \"undefined\" &&\n typeof performance.mark === \"function\" &&\n typeof performance.measure === \"function\"\n );\n};\n\n/**\n * Performance tracker interface with mark and measure methods.\n */\ninterface PerformanceTracker {\n mark: (name: string) => void;\n measure: (measureName: string, startMark: string, endMark: string) => void;\n}\n\n/**\n * Creates a tracker for working with the Performance API.\n * Ignores calls if the API is unavailable.\n *\n * @param enabled - Whether the functionality is enabled (from config)\n * @param context - Context for error logging\n * @returns Object with mark and measure methods\n */\nexport const createPerformanceTracker = (\n enabled: boolean,\n context: string,\n): PerformanceTracker => {\n const isSupported = enabled && supportsPerformanceAPI();\n\n return {\n /**\n * Creates a performance mark with the specified name.\n */\n mark(name: string): void {\n if (!isSupported) {\n return;\n }\n\n performance.mark(name);\n },\n\n /**\n * Creates a performance measure between two marks.\n * Logs a warning if the marks don't exist.\n */\n measure(measureName: string, startMark: string, endMark: string): void {\n if (!isSupported) {\n return;\n }\n\n try {\n performance.measure(measureName, startMark, endMark);\n } catch (error) {\n console.warn(\n `[${context}] Failed to create performance measure: ${measureName}`,\n error,\n );\n }\n },\n };\n};\n","// packages/logger-plugin/modules/internal/timing.ts\n\n/**\n * Function that returns high-resolution timestamp in milliseconds.\n */\ntype TimeProvider = () => number;\n\n/**\n * State for Date.now() monotonic emulation\n */\nlet lastTimestamp = 0;\nlet timeOffset = 0;\n\n/**\n * Creates monotonic Date.now() wrapper that ensures time never goes backwards.\n *\n * @returns Time provider function with monotonic guarantee\n */\nfunction createMonotonicDateNow(): TimeProvider {\n // eslint-disable-next-line unicorn/consistent-function-scoping -- closure over module-level lastTimestamp/timeOffset\n return (): number => {\n const current: number = Date.now();\n\n if (current < lastTimestamp) {\n timeOffset += lastTimestamp - current;\n }\n\n lastTimestamp = current;\n\n return current + timeOffset;\n };\n}\n\n/**\n * Initialize time provider based on environment.\n * Uses performance.now() in modern environments (Node.js 16+, all browsers),\n * falls back to monotonic Date.now() wrapper for edge cases.\n */\nconst nowFn: TimeProvider =\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? (): number => performance.now()\n : createMonotonicDateNow();\n\n/**\n * Returns high-resolution monotonic timestamp.\n *\n * Uses performance.now() in modern environments (Node.js 16+, all browsers).\n * Falls back to monotonic Date.now() wrapper (~1ms precision) for edge cases.\n *\n * @returns Timestamp in milliseconds\n */\nexport const now = (): number => nowFn();\n","// packages/logger-plugin/modules/plugin.ts\n\nimport { DEFAULT_CONFIG } from \"./constants\";\nimport {\n createGroupManager,\n supportsConsoleGroups,\n} from \"./internal/console-groups\";\nimport {\n formatRouteName,\n formatTiming,\n createTransitionLabel,\n} from \"./internal/formatting\";\nimport { getParamsDiff, logParamsDiff } from \"./internal/params-diff\";\nimport { createPerformanceTracker } from \"./internal/performance-marks\";\nimport { now } from \"./internal/timing\";\n\nimport type { LoggerPluginConfig } from \"./types\";\nimport type { PluginFactory, RouterError, State } from \"@real-router/core\";\n\n/**\n * Creates a logger-plugin for real-router.\n *\n * @param options - Plugin configuration options\n * @returns Plugin factory function for real-router\n *\n * @example\n * ```ts\n * import { loggerPluginFactory } from \"@real-router/logger-plugin\";\n *\n * // Use with default configuration\n * router.usePlugin(loggerPluginFactory());\n *\n * // Use with custom configuration\n * router.usePlugin(loggerPluginFactory({\n * level: 'errors', // only log errors\n * usePerformanceMarks: true, // enable Performance API\n * showTiming: false, // disable timing info\n * showParamsDiff: false, // disable params diff\n * context: 'my-router', // custom context name\n * }));\n * ```\n */\nexport function loggerPluginFactory(\n options?: Partial<LoggerPluginConfig>,\n): PluginFactory {\n // Merge options with defaults\n const config: Required<LoggerPluginConfig> = {\n ...DEFAULT_CONFIG,\n ...options,\n };\n\n // Pre-compute log level flags\n const logLifecycle = config.level === \"all\";\n const logTransition = config.level !== \"none\" && config.level !== \"errors\";\n const logWarning = logTransition;\n const logError = config.level !== \"none\";\n\n // Pre-compute feature flags\n const shouldLogParams = logTransition && config.showParamsDiff;\n const shouldShowTiming = config.showTiming;\n\n // Cached prefix\n const prefix = `[${config.context}]`;\n\n return () => {\n // Create helper managers\n const groups = createGroupManager(supportsConsoleGroups());\n const perf = createPerformanceTracker(\n config.usePerformanceMarks,\n config.context,\n );\n\n // Transition state\n let transitionStartTime: number | null = null;\n let transitionLabel = \"\";\n let startMarkName = \"\";\n\n /**\n * Logs parameter differences when navigating within the same route.\n */\n const logParamsIfNeeded = (toState: State, fromState?: State): void => {\n if (!shouldLogParams || !fromState) {\n return;\n }\n\n // Show diff only for the same route\n if (toState.name !== fromState.name) {\n return;\n }\n\n const diff = getParamsDiff(fromState.params, toState.params);\n\n if (diff) {\n logParamsDiff(diff, config.context);\n }\n };\n\n /**\n * Resets transition state. Must be called AFTER timing is read.\n */\n const resetTransitionState = (): void => {\n groups.close();\n transitionLabel = \"\";\n startMarkName = \"\";\n transitionStartTime = null;\n };\n\n return {\n onStart() {\n perf.mark(\"router:start\");\n\n if (logLifecycle) {\n console.log(`${prefix} Router started`);\n }\n },\n\n onStop() {\n groups.close();\n\n perf.mark(\"router:stop\");\n perf.measure(\"router:lifetime\", \"router:start\", \"router:stop\");\n\n if (logLifecycle) {\n console.log(`${prefix} Router stopped`);\n }\n },\n\n onTransitionStart(toState: State, fromState?: State) {\n groups.open(\"Router transition\");\n transitionStartTime = now();\n\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n\n transitionLabel = createTransitionLabel(fromRoute, toRoute);\n startMarkName = `router:transition-start:${transitionLabel}`;\n\n perf.mark(startMarkName);\n\n if (logTransition) {\n console.log(`${prefix} Transition: ${fromRoute} → ${toRoute}`, {\n from: fromState,\n to: toState,\n });\n\n logParamsIfNeeded(toState, fromState);\n }\n },\n\n onTransitionSuccess(toState: State, fromState?: State) {\n const label = transitionLabel;\n const endMark = `router:transition-end:${label}`;\n\n perf.mark(endMark);\n perf.measure(`router:transition:${label}`, startMarkName, endMark);\n\n if (logTransition) {\n const timing = shouldShowTiming\n ? formatTiming(transitionStartTime, now)\n : \"\";\n\n console.log(`${prefix} Transition success${timing}`, {\n to: toState,\n from: fromState,\n });\n }\n\n resetTransitionState();\n },\n\n onTransitionCancel(toState: State, fromState?: State) {\n const label = transitionLabel;\n const cancelMark = `router:transition-cancel:${label}`;\n\n perf.mark(cancelMark);\n perf.measure(\n `router:transition-cancelled:${label}`,\n startMarkName,\n cancelMark,\n );\n\n if (logWarning) {\n const timing = shouldShowTiming\n ? formatTiming(transitionStartTime, now)\n : \"\";\n\n console.warn(`${prefix} Transition cancelled${timing}`, {\n to: toState,\n from: fromState,\n });\n }\n\n resetTransitionState();\n },\n\n onTransitionError(\n toState: State | undefined,\n fromState: State | undefined,\n err: RouterError,\n ) {\n const label = transitionLabel;\n const errorMark = `router:transition-error:${label}`;\n\n perf.mark(errorMark);\n perf.measure(\n `router:transition-failed:${label}`,\n startMarkName,\n errorMark,\n );\n\n if (logError) {\n const timing = shouldShowTiming\n ? formatTiming(transitionStartTime, now)\n : \"\";\n\n console.error(`${prefix} Transition error: ${err.code}${timing}`, {\n error: err,\n stack: err.stack,\n to: toState,\n from: fromState,\n });\n }\n\n resetTransitionState();\n },\n\n teardown() {\n resetTransitionState();\n },\n };\n };\n}\n\n/**\n * Default logger-plugin instance with standard configuration.\n * Provided for backward compatibility with existing code.\n *\n * @example\n * // Use default configuration\n * router.usePlugin(loggerPlugin);\n */\nexport const loggerPlugin = loggerPluginFactory();\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js":{"bytes":569,"imports":[],"format":"esm"},"src/constants.ts":{"bytes":283,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/internal/console-groups.ts":{"bytes":1490,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/internal/formatting.ts":{"bytes":1234,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/internal/params-diff.ts":{"bytes":
|
|
1
|
+
{"inputs":{"../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js":{"bytes":569,"imports":[],"format":"esm"},"src/constants.ts":{"bytes":283,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/internal/console-groups.ts":{"bytes":1490,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/internal/formatting.ts":{"bytes":1234,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/internal/params-diff.ts":{"bytes":2534,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/internal/performance-marks.ts":{"bytes":1720,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/internal/timing.ts":{"bytes":1480,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/plugin.ts":{"bytes":6520,"imports":[{"path":"src/constants.ts","kind":"import-statement","original":"./constants"},{"path":"src/internal/console-groups.ts","kind":"import-statement","original":"./internal/console-groups"},{"path":"src/internal/formatting.ts","kind":"import-statement","original":"./internal/formatting"},{"path":"src/internal/params-diff.ts","kind":"import-statement","original":"./internal/params-diff"},{"path":"src/internal/performance-marks.ts","kind":"import-statement","original":"./internal/performance-marks"},{"path":"src/internal/timing.ts","kind":"import-statement","original":"./internal/timing"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":266,"imports":[{"path":"src/plugin.ts","kind":"import-statement","original":"./plugin"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/cjs/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":21834},"dist/cjs/index.js":{"imports":[],"exports":["loggerPlugin","loggerPluginFactory"],"entryPoint":"src/index.ts","inputs":{"src/constants.ts":{"bytesInOutput":143},"src/internal/console-groups.ts":{"bytesInOutput":727},"src/internal/formatting.ts":{"bytesInOutput":592},"src/internal/params-diff.ts":{"bytesInOutput":1277},"src/internal/performance-marks.ts":{"bytesInOutput":941},"src/internal/timing.ts":{"bytesInOutput":450},"src/plugin.ts":{"bytesInOutput":4237},"src/index.ts":{"bytesInOutput":0}},"bytes":8618}}}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e={level:"all",usePerformanceMarks:!1,showParamsDiff:!0,showTiming:!0,context:"logger-plugin"},
|
|
1
|
+
var e={level:"all",usePerformanceMarks:!1,showParamsDiff:!0,showTiming:!0,context:"logger-plugin"},o=e=>e?.name??"(none)",n=(e,o)=>{if(null===e)return"";const n=o()-e;return!Number.isFinite(n)||n<0?" (?)":n<.1?` (${(1e3*n).toFixed(2)}μs)`:` (${n.toFixed(2)}ms)`},r=0,t=0,s="undefined"!=typeof performance&&"function"==typeof performance.now?()=>performance.now():()=>{const e=Date.now();return e<r&&(t+=r-e),r=e,e+t},a=()=>s();function i(r){const t={...e,...r},s="all"===t.level,i="none"!==t.level&&"errors"!==t.level,c=i,l="none"!==t.level,u=i&&t.showParamsDiff,f=t.showTiming,m=`[${t.context}]`;return()=>{const e=(e=>{let o=!1;return{open(n){e&&!o&&(console.group(n),o=!0)},close(){e&&o&&(console.groupEnd(),o=!1)},isOpen:()=>o}})("undefined"!=typeof console&&"function"==typeof console.group&&"function"==typeof console.groupEnd),r=((e,o)=>{const n=e&&"undefined"!=typeof performance&&"function"==typeof performance.mark&&"function"==typeof performance.measure;return{mark(e){n&&performance.mark(e)},measure(e,r,t){if(n)try{performance.measure(e,r,t)}catch(n){console.warn(`[${o}] Failed to create performance measure: ${e}`,n)}}}})(t.usePerformanceMarks,t.context);let d=null,p="",$="";const g=()=>{e.close(),p="",$="",d=null};return{onStart(){r.mark("router:start"),s&&console.log(`${m} Router started`)},onStop(){e.close(),r.mark("router:stop"),r.measure("router:lifetime","router:start","router:stop"),s&&console.log(`${m} Router stopped`)},onTransitionStart(n,s){e.open("Router transition"),d=a();const c=o(s),l=o(n);p=((e,o)=>`${e}→${o}`)(c,l),$=`router:transition-start:${p}`,r.mark($),i&&(console.log(`${m} Transition: ${c} → ${l}`,{from:s,to:n}),((e,o)=>{if(!u||!o)return;if(e.name!==o.name)return;const n=((e,o)=>{const n={},r={},t={};let s=!1;for(const r in e)r in o?e[r]!==o[r]&&(n[r]={from:e[r],to:o[r]},s=!0):(t[r]=e[r],s=!0);for(const n in o)n in e||(r[n]=o[n],s=!0);return s?{changed:n,added:r,removed:t}:null})(o.params,e.params);n&&((e,o)=>{const n=[],r=Object.entries(e.changed);if(r.length>0){const e=[];for(const[o,{from:n,to:t}]of r)e.push(`${o}: ${JSON.stringify(n)} → ${JSON.stringify(t)}`);n.push(`Changed: { ${e.join(", ")} }`)}Object.keys(e.added).length>0&&n.push(`Added: ${JSON.stringify(e.added)}`),Object.keys(e.removed).length>0&&n.push(`Removed: ${JSON.stringify(e.removed)}`),console.log(`[${o}] ${n.join(", ")}`)})(n,t.context)})(n,s))},onTransitionSuccess(e,o){const t=p,s=`router:transition-end:${t}`;if(r.mark(s),r.measure(`router:transition:${t}`,$,s),i){const r=f?n(d,a):"";console.log(`${m} Transition success${r}`,{to:e,from:o})}g()},onTransitionCancel(e,o){const t=p,s=`router:transition-cancel:${t}`;if(r.mark(s),r.measure(`router:transition-cancelled:${t}`,$,s),c){const r=f?n(d,a):"";console.warn(`${m} Transition cancelled${r}`,{to:e,from:o})}g()},onTransitionError(e,o,t){const s=p,i=`router:transition-error:${s}`;if(r.mark(i),r.measure(`router:transition-failed:${s}`,$,i),l){const r=f?n(d,a):"";console.error(`${m} Transition error: ${t.code}${r}`,{error:t,stack:t.stack,to:e,from:o})}g()},teardown(){g()}}}}var c=i();export{c as loggerPlugin,i as loggerPluginFactory};//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/constants.ts","../../src/internal/console-groups.ts","../../src/internal/formatting.ts","../../src/internal/params-diff.ts","../../src/internal/performance-marks.ts","../../src/internal/timing.ts","../../src/plugin.ts"],"names":["now"],"mappings":"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","file":"index.mjs","sourcesContent":["// packages/logger-plugin/modules/constants.ts\n\nimport type { LoggerPluginConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG: Required<LoggerPluginConfig> = {\n level: \"all\",\n usePerformanceMarks: false,\n showParamsDiff: true,\n showTiming: true,\n context: \"logger-plugin\",\n};\n","// packages/logger-plugin/modules/internal/console-groups.ts\n\n/**\n * Checks if console.group is supported in the current environment.\n */\nexport const supportsConsoleGroups = (): boolean => {\n return (\n typeof console !== \"undefined\" &&\n typeof console.group === \"function\" &&\n typeof console.groupEnd === \"function\"\n );\n};\n\n/**\n * Manager for handling console groups\n */\ninterface GroupManager {\n /**\n * Opens a group if it's not already open\n */\n open: (label: string) => void;\n /**\n * Closes a group if it's open\n */\n close: () => void;\n /**\n * Checks if a group is currently open\n */\n isOpen: () => boolean;\n}\n\n/**\n * Creates a manager for handling console groups.\n * Prevents duplicate group opening.\n *\n * @param enabled - Whether groups are supported in the environment\n * @returns Object with open and close methods\n */\nexport const createGroupManager = (enabled: boolean): GroupManager => {\n let isOpened = false;\n\n return {\n /**\n * Opens a group if it's not already open.\n */\n open(label: string): void {\n if (!enabled || isOpened) {\n return;\n }\n\n console.group(label);\n isOpened = true;\n },\n\n /**\n * Closes a group if it's open.\n */\n close(): void {\n if (!enabled || !isOpened) {\n return;\n }\n\n console.groupEnd();\n isOpened = false;\n },\n\n /**\n * Checks if a group is currently open.\n */\n isOpen(): boolean {\n return isOpened;\n },\n };\n};\n","// packages/logger-plugin/modules/internal/formatting.ts\n\nimport type { State } from \"@real-router/core\";\n\n/**\n * Formats route name for logging output.\n * Handles undefined/null.\n */\nexport const formatRouteName = (state?: State): string => {\n return state?.name ?? \"(none)\";\n};\n\n/**\n * Formats execution time information.\n * Uses adaptive units:\n * - Microseconds (μs) for <0.1ms\n * - Milliseconds (ms) for ≥0.1ms\n *\n * @param startTime - Start time or null\n * @param now - Function to get current time\n * @returns String with time or empty string\n */\nexport const formatTiming = (\n startTime: number | null,\n now: () => number,\n): string => {\n if (startTime === null) {\n return \"\";\n }\n\n const durationMs = now() - startTime;\n\n if (!Number.isFinite(durationMs) || durationMs < 0) {\n return \" (?)\";\n }\n\n if (durationMs < 0.1) {\n const durationMks = (durationMs * 1000).toFixed(2);\n\n return ` (${durationMks}μs)`;\n } else {\n const duration = durationMs.toFixed(2);\n\n return ` (${duration}ms)`;\n }\n};\n\n/**\n * Creates a label for Performance API from route names.\n */\nexport const createTransitionLabel = (\n fromRoute: string,\n toRoute: string,\n): string => {\n return `${fromRoute}→${toRoute}`;\n};\n","// packages/logger-plugin/modules/internal/params-diff.ts\n\nimport type { Params } from \"@real-router/core\";\n\nexport interface ParamsDiff {\n changed: Record<string, { from: unknown; to: unknown }>;\n added: Record<string, unknown>;\n removed: Record<string, unknown>;\n}\n\n/**\n * Calculates differences between two parameter objects.\n * Performs only shallow comparison.\n *\n * @param fromParams - Previous parameters\n * @param toParams - New parameters\n * @returns Object with differences or null if there are no changes\n */\nexport const getParamsDiff = (\n fromParams: Params,\n toParams: Params,\n): ParamsDiff | null => {\n const changed: ParamsDiff[\"changed\"] = {};\n const added: ParamsDiff[\"added\"] = {};\n const removed: ParamsDiff[\"removed\"] = {};\n\n // Track if any changes found to avoid iterating through objects at the end.\n // This is a performance optimization: instead of calling Object.keys().length\n // three times to check if objects are empty, we set this flag when we find\n // any change and check it once at the end.\n let hasChanges = false;\n\n // Find changed and removed\n for (const key in fromParams) {\n if (!(key in toParams)) {\n removed[key] = fromParams[key];\n hasChanges = true;\n } else if (fromParams[key] !== toParams[key]) {\n changed[key] = { from: fromParams[key], to: toParams[key] };\n hasChanges = true;\n }\n }\n\n // Find added\n for (const key in toParams) {\n if (!(key in fromParams)) {\n added[key] = toParams[key];\n hasChanges = true;\n }\n }\n\n // Return null if there are no changes\n if (!hasChanges) {\n return null;\n }\n\n return { changed, added, removed };\n};\n\n/**\n * Formats and logs parameter differences.\n *\n * @param diff - Object with differences\n * @param context - Context for console\n */\nexport const logParamsDiff = (diff: ParamsDiff, context: string): void => {\n const parts: string[] = [];\n\n // Cache entries to avoid double iteration\n const changedEntries = Object.entries(diff.changed);\n\n if (changedEntries.length > 0) {\n const items: string[] = [];\n\n for (const [key, { from, to }] of changedEntries) {\n items.push(`${key}: ${JSON.stringify(from)} → ${JSON.stringify(to)}`);\n }\n\n parts.push(`Changed: { ${items.join(\", \")} }`);\n }\n\n const addedEntries = Object.entries(diff.added);\n\n if (addedEntries.length > 0) {\n parts.push(`Added: ${JSON.stringify(diff.added)}`);\n }\n\n const removedEntries = Object.entries(diff.removed);\n\n if (removedEntries.length > 0) {\n parts.push(`Removed: ${JSON.stringify(diff.removed)}`);\n }\n\n console.log(`[${context}] ${parts.join(\", \")}`);\n};\n","// packages/logger-plugin/modules/internal/performance-marks.ts\n\n/**\n * Checks if Performance API is supported in the current environment.\n */\nexport const supportsPerformanceAPI = (): boolean => {\n return (\n typeof performance !== \"undefined\" &&\n typeof performance.mark === \"function\" &&\n typeof performance.measure === \"function\"\n );\n};\n\n/**\n * Performance tracker interface with mark and measure methods.\n */\ninterface PerformanceTracker {\n mark: (name: string) => void;\n measure: (measureName: string, startMark: string, endMark: string) => void;\n}\n\n/**\n * Creates a tracker for working with the Performance API.\n * Ignores calls if the API is unavailable.\n *\n * @param enabled - Whether the functionality is enabled (from config)\n * @param context - Context for error logging\n * @returns Object with mark and measure methods\n */\nexport const createPerformanceTracker = (\n enabled: boolean,\n context: string,\n): PerformanceTracker => {\n const isSupported = enabled && supportsPerformanceAPI();\n\n return {\n /**\n * Creates a performance mark with the specified name.\n */\n mark(name: string): void {\n if (!isSupported) {\n return;\n }\n\n performance.mark(name);\n },\n\n /**\n * Creates a performance measure between two marks.\n * Logs a warning if the marks don't exist.\n */\n measure(measureName: string, startMark: string, endMark: string): void {\n if (!isSupported) {\n return;\n }\n\n try {\n performance.measure(measureName, startMark, endMark);\n } catch (error) {\n console.warn(\n `[${context}] Failed to create performance measure: ${measureName}`,\n error,\n );\n }\n },\n };\n};\n","// packages/logger-plugin/modules/internal/timing.ts\n\n/**\n * Function that returns high-resolution timestamp in milliseconds.\n */\ntype TimeProvider = () => number;\n\n/**\n * State for Date.now() monotonic emulation\n */\nlet lastTimestamp = 0;\nlet timeOffset = 0;\n\n/**\n * Creates monotonic Date.now() wrapper that ensures time never goes backwards.\n *\n * @returns Time provider function with monotonic guarantee\n */\nfunction createMonotonicDateNow(): TimeProvider {\n // eslint-disable-next-line unicorn/consistent-function-scoping -- closure over module-level lastTimestamp/timeOffset\n return (): number => {\n const current: number = Date.now();\n\n if (current < lastTimestamp) {\n timeOffset += lastTimestamp - current;\n }\n\n lastTimestamp = current;\n\n return current + timeOffset;\n };\n}\n\n/**\n * Initialize time provider based on environment.\n * Uses performance.now() in modern environments (Node.js 16+, all browsers),\n * falls back to monotonic Date.now() wrapper for edge cases.\n */\nconst nowFn: TimeProvider =\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? (): number => performance.now()\n : createMonotonicDateNow();\n\n/**\n * Returns high-resolution monotonic timestamp.\n *\n * Uses performance.now() in modern environments (Node.js 16+, all browsers).\n * Falls back to monotonic Date.now() wrapper (~1ms precision) for edge cases.\n *\n * @returns Timestamp in milliseconds\n */\nexport const now = (): number => nowFn();\n","// packages/logger-plugin/modules/plugin.ts\n\nimport { DEFAULT_CONFIG } from \"./constants\";\nimport {\n createGroupManager,\n supportsConsoleGroups,\n} from \"./internal/console-groups\";\nimport {\n formatRouteName,\n formatTiming,\n createTransitionLabel,\n} from \"./internal/formatting\";\nimport { getParamsDiff, logParamsDiff } from \"./internal/params-diff\";\nimport { createPerformanceTracker } from \"./internal/performance-marks\";\nimport { now } from \"./internal/timing\";\n\nimport type { LoggerPluginConfig, LogLevel } from \"./types\";\nimport type { PluginFactory, RouterError, State } from \"@real-router/core\";\n\n/**\n * Checks if the given log type should be output based on the configured level.\n *\n * Level hierarchy:\n * - 'all': log everything (start, stop, transitions, warnings, errors)\n * - 'transitions': only transition events (start, success, cancel, error)\n * - 'errors': only errors\n * - 'none': nothing\n */\nconst shouldLog = (\n level: LogLevel,\n type: \"lifecycle\" | \"transition\" | \"warning\" | \"error\",\n): boolean => {\n if (level === \"none\") {\n return false;\n }\n\n if (level === \"errors\") {\n return type === \"error\";\n }\n\n if (level === \"transitions\") {\n return type === \"transition\" || type === \"warning\" || type === \"error\";\n }\n\n // level === 'all'\n return true;\n};\n\n/**\n * Creates a logger-plugin for real-router.\n *\n * @param options - Plugin configuration options\n * @returns Plugin factory function for real-router\n *\n * @example\n * ```ts\n * import { loggerPluginFactory } from \"@real-router/logger-plugin\";\n *\n * // Use with default configuration\n * router.usePlugin(loggerPluginFactory());\n *\n * // Use with custom configuration\n * router.usePlugin(loggerPluginFactory({\n * level: 'errors', // only log errors\n * usePerformanceMarks: true, // enable Performance API\n * showTiming: false, // disable timing info\n * showParamsDiff: false, // disable params diff\n * context: 'my-router', // custom context name\n * }));\n * ```\n */\nexport function loggerPluginFactory(\n options?: Partial<LoggerPluginConfig>,\n): PluginFactory {\n // Merge options with defaults\n const config: Required<LoggerPluginConfig> = {\n ...DEFAULT_CONFIG,\n ...options,\n };\n\n return () => {\n // Create helper managers\n const groups = createGroupManager(supportsConsoleGroups());\n const perf = createPerformanceTracker(\n config.usePerformanceMarks,\n config.context,\n );\n\n // Transition state\n let transitionStartTime: number | null = null;\n\n /**\n * Logs parameter differences when navigating within the same route.\n */\n const logParamsIfNeeded = (toState: State, fromState?: State): void => {\n if (!config.showParamsDiff || !fromState) {\n return;\n }\n\n // Show diff only for the same route\n if (toState.name !== fromState.name) {\n return;\n }\n\n const diff = getParamsDiff(fromState.params, toState.params);\n\n if (diff) {\n logParamsDiff(diff, config.context);\n }\n };\n\n /**\n * Formats timing string based on config.\n */\n const getTiming = (): string => {\n if (!config.showTiming) {\n return \"\";\n }\n\n return formatTiming(transitionStartTime, now);\n };\n\n return {\n onStart() {\n perf.mark(\"router:start\");\n\n if (shouldLog(config.level, \"lifecycle\")) {\n console.log(`[${config.context}] Router started`);\n }\n },\n\n onStop() {\n groups.close();\n\n perf.mark(\"router:stop\");\n perf.measure(\"router:lifetime\", \"router:start\", \"router:stop\");\n\n if (shouldLog(config.level, \"lifecycle\")) {\n console.log(`[${config.context}] Router stopped`);\n }\n },\n\n onTransitionStart(toState: State, fromState?: State) {\n groups.open(\"Router transition\");\n transitionStartTime = now();\n\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n const label = createTransitionLabel(fromRoute, toRoute);\n\n perf.mark(`router:transition-start:${label}`);\n\n if (shouldLog(config.level, \"transition\")) {\n console.log(\n `[${config.context}] Transition: ${fromRoute} → ${toRoute}`,\n {\n from: fromState,\n to: toState,\n },\n );\n\n logParamsIfNeeded(toState, fromState);\n }\n },\n\n onTransitionSuccess(toState: State, fromState?: State) {\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n const label = createTransitionLabel(fromRoute, toRoute);\n\n perf.mark(`router:transition-end:${label}`);\n perf.measure(\n `router:transition:${label}`,\n `router:transition-start:${label}`,\n `router:transition-end:${label}`,\n );\n\n if (shouldLog(config.level, \"transition\")) {\n const timing = getTiming();\n\n console.log(`[${config.context}] Transition success${timing}`, {\n to: toState,\n from: fromState,\n });\n }\n\n groups.close();\n transitionStartTime = null;\n },\n\n onTransitionCancel(toState: State, fromState?: State) {\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n const label = createTransitionLabel(fromRoute, toRoute);\n\n perf.mark(`router:transition-cancel:${label}`);\n perf.measure(\n `router:transition-cancelled:${label}`,\n `router:transition-start:${label}`,\n `router:transition-cancel:${label}`,\n );\n\n if (shouldLog(config.level, \"warning\")) {\n const timing = getTiming();\n\n console.warn(`[${config.context}] Transition cancelled${timing}`, {\n to: toState,\n from: fromState,\n });\n }\n\n groups.close();\n transitionStartTime = null;\n },\n\n onTransitionError(\n toState: State | undefined,\n fromState: State | undefined,\n err: RouterError,\n ) {\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n const label = createTransitionLabel(fromRoute, toRoute);\n\n perf.mark(`router:transition-error:${label}`);\n perf.measure(\n `router:transition-failed:${label}`,\n `router:transition-start:${label}`,\n `router:transition-error:${label}`,\n );\n\n if (shouldLog(config.level, \"error\")) {\n const timing = getTiming();\n\n console.error(\n `[${config.context}] Transition error: ${err.code}${timing}`,\n {\n error: err,\n stack: err.stack,\n to: toState,\n from: fromState,\n },\n );\n }\n\n groups.close();\n transitionStartTime = null;\n },\n\n teardown() {\n groups.close();\n transitionStartTime = null;\n },\n };\n };\n}\n\n/**\n * Default logger-plugin instance with standard configuration.\n * Provided for backward compatibility with existing code.\n *\n * @example\n * // Use default configuration\n * router.usePlugin(loggerPlugin);\n */\nexport const loggerPlugin = loggerPluginFactory();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/constants.ts","../../src/internal/console-groups.ts","../../src/internal/formatting.ts","../../src/internal/params-diff.ts","../../src/internal/performance-marks.ts","../../src/internal/timing.ts","../../src/plugin.ts"],"names":["now"],"mappings":"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","file":"index.mjs","sourcesContent":["// packages/logger-plugin/modules/constants.ts\n\nimport type { LoggerPluginConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG: Required<LoggerPluginConfig> = {\n level: \"all\",\n usePerformanceMarks: false,\n showParamsDiff: true,\n showTiming: true,\n context: \"logger-plugin\",\n};\n","// packages/logger-plugin/modules/internal/console-groups.ts\n\n/**\n * Checks if console.group is supported in the current environment.\n */\nexport const supportsConsoleGroups = (): boolean => {\n return (\n typeof console !== \"undefined\" &&\n typeof console.group === \"function\" &&\n typeof console.groupEnd === \"function\"\n );\n};\n\n/**\n * Manager for handling console groups\n */\ninterface GroupManager {\n /**\n * Opens a group if it's not already open\n */\n open: (label: string) => void;\n /**\n * Closes a group if it's open\n */\n close: () => void;\n /**\n * Checks if a group is currently open\n */\n isOpen: () => boolean;\n}\n\n/**\n * Creates a manager for handling console groups.\n * Prevents duplicate group opening.\n *\n * @param enabled - Whether groups are supported in the environment\n * @returns Object with open and close methods\n */\nexport const createGroupManager = (enabled: boolean): GroupManager => {\n let isOpened = false;\n\n return {\n /**\n * Opens a group if it's not already open.\n */\n open(label: string): void {\n if (!enabled || isOpened) {\n return;\n }\n\n console.group(label);\n isOpened = true;\n },\n\n /**\n * Closes a group if it's open.\n */\n close(): void {\n if (!enabled || !isOpened) {\n return;\n }\n\n console.groupEnd();\n isOpened = false;\n },\n\n /**\n * Checks if a group is currently open.\n */\n isOpen(): boolean {\n return isOpened;\n },\n };\n};\n","// packages/logger-plugin/modules/internal/formatting.ts\n\nimport type { State } from \"@real-router/core\";\n\n/**\n * Formats route name for logging output.\n * Handles undefined/null.\n */\nexport const formatRouteName = (state?: State): string => {\n return state?.name ?? \"(none)\";\n};\n\n/**\n * Formats execution time information.\n * Uses adaptive units:\n * - Microseconds (μs) for <0.1ms\n * - Milliseconds (ms) for ≥0.1ms\n *\n * @param startTime - Start time or null\n * @param now - Function to get current time\n * @returns String with time or empty string\n */\nexport const formatTiming = (\n startTime: number | null,\n now: () => number,\n): string => {\n if (startTime === null) {\n return \"\";\n }\n\n const durationMs = now() - startTime;\n\n if (!Number.isFinite(durationMs) || durationMs < 0) {\n return \" (?)\";\n }\n\n if (durationMs < 0.1) {\n const durationMks = (durationMs * 1000).toFixed(2);\n\n return ` (${durationMks}μs)`;\n } else {\n const duration = durationMs.toFixed(2);\n\n return ` (${duration}ms)`;\n }\n};\n\n/**\n * Creates a label for Performance API from route names.\n */\nexport const createTransitionLabel = (\n fromRoute: string,\n toRoute: string,\n): string => {\n return `${fromRoute}→${toRoute}`;\n};\n","// packages/logger-plugin/modules/internal/params-diff.ts\n\nimport type { Params } from \"@real-router/core\";\n\nexport interface ParamsDiff {\n changed: Record<string, { from: unknown; to: unknown }>;\n added: Record<string, unknown>;\n removed: Record<string, unknown>;\n}\n\n/**\n * Calculates differences between two parameter objects.\n * Performs only shallow comparison.\n *\n * @param fromParams - Previous parameters\n * @param toParams - New parameters\n * @returns Object with differences or null if there are no changes\n */\nexport const getParamsDiff = (\n fromParams: Params,\n toParams: Params,\n): ParamsDiff | null => {\n const changed: ParamsDiff[\"changed\"] = {};\n const added: ParamsDiff[\"added\"] = {};\n const removed: ParamsDiff[\"removed\"] = {};\n\n // Track if any changes found to avoid iterating through objects at the end.\n // This is a performance optimization: instead of calling Object.keys().length\n // three times to check if objects are empty, we set this flag when we find\n // any change and check it once at the end.\n let hasChanges = false;\n\n // Find changed and removed\n for (const key in fromParams) {\n if (!(key in toParams)) {\n removed[key] = fromParams[key];\n hasChanges = true;\n } else if (fromParams[key] !== toParams[key]) {\n changed[key] = { from: fromParams[key], to: toParams[key] };\n hasChanges = true;\n }\n }\n\n // Find added\n for (const key in toParams) {\n if (!(key in fromParams)) {\n added[key] = toParams[key];\n hasChanges = true;\n }\n }\n\n // Return null if there are no changes\n if (!hasChanges) {\n return null;\n }\n\n return { changed, added, removed };\n};\n\n/**\n * Formats and logs parameter differences.\n *\n * @param diff - Object with differences\n * @param context - Context for console\n */\nexport const logParamsDiff = (diff: ParamsDiff, context: string): void => {\n const parts: string[] = [];\n\n // Cache entries to avoid double iteration\n const changedEntries = Object.entries(diff.changed);\n\n if (changedEntries.length > 0) {\n const items: string[] = [];\n\n for (const [key, { from, to }] of changedEntries) {\n items.push(`${key}: ${JSON.stringify(from)} → ${JSON.stringify(to)}`);\n }\n\n parts.push(`Changed: { ${items.join(\", \")} }`);\n }\n\n if (Object.keys(diff.added).length > 0) {\n parts.push(`Added: ${JSON.stringify(diff.added)}`);\n }\n\n if (Object.keys(diff.removed).length > 0) {\n parts.push(`Removed: ${JSON.stringify(diff.removed)}`);\n }\n\n console.log(`[${context}] ${parts.join(\", \")}`);\n};\n","// packages/logger-plugin/modules/internal/performance-marks.ts\n\n/**\n * Checks if Performance API is supported in the current environment.\n */\nexport const supportsPerformanceAPI = (): boolean => {\n return (\n typeof performance !== \"undefined\" &&\n typeof performance.mark === \"function\" &&\n typeof performance.measure === \"function\"\n );\n};\n\n/**\n * Performance tracker interface with mark and measure methods.\n */\ninterface PerformanceTracker {\n mark: (name: string) => void;\n measure: (measureName: string, startMark: string, endMark: string) => void;\n}\n\n/**\n * Creates a tracker for working with the Performance API.\n * Ignores calls if the API is unavailable.\n *\n * @param enabled - Whether the functionality is enabled (from config)\n * @param context - Context for error logging\n * @returns Object with mark and measure methods\n */\nexport const createPerformanceTracker = (\n enabled: boolean,\n context: string,\n): PerformanceTracker => {\n const isSupported = enabled && supportsPerformanceAPI();\n\n return {\n /**\n * Creates a performance mark with the specified name.\n */\n mark(name: string): void {\n if (!isSupported) {\n return;\n }\n\n performance.mark(name);\n },\n\n /**\n * Creates a performance measure between two marks.\n * Logs a warning if the marks don't exist.\n */\n measure(measureName: string, startMark: string, endMark: string): void {\n if (!isSupported) {\n return;\n }\n\n try {\n performance.measure(measureName, startMark, endMark);\n } catch (error) {\n console.warn(\n `[${context}] Failed to create performance measure: ${measureName}`,\n error,\n );\n }\n },\n };\n};\n","// packages/logger-plugin/modules/internal/timing.ts\n\n/**\n * Function that returns high-resolution timestamp in milliseconds.\n */\ntype TimeProvider = () => number;\n\n/**\n * State for Date.now() monotonic emulation\n */\nlet lastTimestamp = 0;\nlet timeOffset = 0;\n\n/**\n * Creates monotonic Date.now() wrapper that ensures time never goes backwards.\n *\n * @returns Time provider function with monotonic guarantee\n */\nfunction createMonotonicDateNow(): TimeProvider {\n // eslint-disable-next-line unicorn/consistent-function-scoping -- closure over module-level lastTimestamp/timeOffset\n return (): number => {\n const current: number = Date.now();\n\n if (current < lastTimestamp) {\n timeOffset += lastTimestamp - current;\n }\n\n lastTimestamp = current;\n\n return current + timeOffset;\n };\n}\n\n/**\n * Initialize time provider based on environment.\n * Uses performance.now() in modern environments (Node.js 16+, all browsers),\n * falls back to monotonic Date.now() wrapper for edge cases.\n */\nconst nowFn: TimeProvider =\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? (): number => performance.now()\n : createMonotonicDateNow();\n\n/**\n * Returns high-resolution monotonic timestamp.\n *\n * Uses performance.now() in modern environments (Node.js 16+, all browsers).\n * Falls back to monotonic Date.now() wrapper (~1ms precision) for edge cases.\n *\n * @returns Timestamp in milliseconds\n */\nexport const now = (): number => nowFn();\n","// packages/logger-plugin/modules/plugin.ts\n\nimport { DEFAULT_CONFIG } from \"./constants\";\nimport {\n createGroupManager,\n supportsConsoleGroups,\n} from \"./internal/console-groups\";\nimport {\n formatRouteName,\n formatTiming,\n createTransitionLabel,\n} from \"./internal/formatting\";\nimport { getParamsDiff, logParamsDiff } from \"./internal/params-diff\";\nimport { createPerformanceTracker } from \"./internal/performance-marks\";\nimport { now } from \"./internal/timing\";\n\nimport type { LoggerPluginConfig } from \"./types\";\nimport type { PluginFactory, RouterError, State } from \"@real-router/core\";\n\n/**\n * Creates a logger-plugin for real-router.\n *\n * @param options - Plugin configuration options\n * @returns Plugin factory function for real-router\n *\n * @example\n * ```ts\n * import { loggerPluginFactory } from \"@real-router/logger-plugin\";\n *\n * // Use with default configuration\n * router.usePlugin(loggerPluginFactory());\n *\n * // Use with custom configuration\n * router.usePlugin(loggerPluginFactory({\n * level: 'errors', // only log errors\n * usePerformanceMarks: true, // enable Performance API\n * showTiming: false, // disable timing info\n * showParamsDiff: false, // disable params diff\n * context: 'my-router', // custom context name\n * }));\n * ```\n */\nexport function loggerPluginFactory(\n options?: Partial<LoggerPluginConfig>,\n): PluginFactory {\n // Merge options with defaults\n const config: Required<LoggerPluginConfig> = {\n ...DEFAULT_CONFIG,\n ...options,\n };\n\n // Pre-compute log level flags\n const logLifecycle = config.level === \"all\";\n const logTransition = config.level !== \"none\" && config.level !== \"errors\";\n const logWarning = logTransition;\n const logError = config.level !== \"none\";\n\n // Pre-compute feature flags\n const shouldLogParams = logTransition && config.showParamsDiff;\n const shouldShowTiming = config.showTiming;\n\n // Cached prefix\n const prefix = `[${config.context}]`;\n\n return () => {\n // Create helper managers\n const groups = createGroupManager(supportsConsoleGroups());\n const perf = createPerformanceTracker(\n config.usePerformanceMarks,\n config.context,\n );\n\n // Transition state\n let transitionStartTime: number | null = null;\n let transitionLabel = \"\";\n let startMarkName = \"\";\n\n /**\n * Logs parameter differences when navigating within the same route.\n */\n const logParamsIfNeeded = (toState: State, fromState?: State): void => {\n if (!shouldLogParams || !fromState) {\n return;\n }\n\n // Show diff only for the same route\n if (toState.name !== fromState.name) {\n return;\n }\n\n const diff = getParamsDiff(fromState.params, toState.params);\n\n if (diff) {\n logParamsDiff(diff, config.context);\n }\n };\n\n /**\n * Resets transition state. Must be called AFTER timing is read.\n */\n const resetTransitionState = (): void => {\n groups.close();\n transitionLabel = \"\";\n startMarkName = \"\";\n transitionStartTime = null;\n };\n\n return {\n onStart() {\n perf.mark(\"router:start\");\n\n if (logLifecycle) {\n console.log(`${prefix} Router started`);\n }\n },\n\n onStop() {\n groups.close();\n\n perf.mark(\"router:stop\");\n perf.measure(\"router:lifetime\", \"router:start\", \"router:stop\");\n\n if (logLifecycle) {\n console.log(`${prefix} Router stopped`);\n }\n },\n\n onTransitionStart(toState: State, fromState?: State) {\n groups.open(\"Router transition\");\n transitionStartTime = now();\n\n const fromRoute = formatRouteName(fromState);\n const toRoute = formatRouteName(toState);\n\n transitionLabel = createTransitionLabel(fromRoute, toRoute);\n startMarkName = `router:transition-start:${transitionLabel}`;\n\n perf.mark(startMarkName);\n\n if (logTransition) {\n console.log(`${prefix} Transition: ${fromRoute} → ${toRoute}`, {\n from: fromState,\n to: toState,\n });\n\n logParamsIfNeeded(toState, fromState);\n }\n },\n\n onTransitionSuccess(toState: State, fromState?: State) {\n const label = transitionLabel;\n const endMark = `router:transition-end:${label}`;\n\n perf.mark(endMark);\n perf.measure(`router:transition:${label}`, startMarkName, endMark);\n\n if (logTransition) {\n const timing = shouldShowTiming\n ? formatTiming(transitionStartTime, now)\n : \"\";\n\n console.log(`${prefix} Transition success${timing}`, {\n to: toState,\n from: fromState,\n });\n }\n\n resetTransitionState();\n },\n\n onTransitionCancel(toState: State, fromState?: State) {\n const label = transitionLabel;\n const cancelMark = `router:transition-cancel:${label}`;\n\n perf.mark(cancelMark);\n perf.measure(\n `router:transition-cancelled:${label}`,\n startMarkName,\n cancelMark,\n );\n\n if (logWarning) {\n const timing = shouldShowTiming\n ? formatTiming(transitionStartTime, now)\n : \"\";\n\n console.warn(`${prefix} Transition cancelled${timing}`, {\n to: toState,\n from: fromState,\n });\n }\n\n resetTransitionState();\n },\n\n onTransitionError(\n toState: State | undefined,\n fromState: State | undefined,\n err: RouterError,\n ) {\n const label = transitionLabel;\n const errorMark = `router:transition-error:${label}`;\n\n perf.mark(errorMark);\n perf.measure(\n `router:transition-failed:${label}`,\n startMarkName,\n errorMark,\n );\n\n if (logError) {\n const timing = shouldShowTiming\n ? formatTiming(transitionStartTime, now)\n : \"\";\n\n console.error(`${prefix} Transition error: ${err.code}${timing}`, {\n error: err,\n stack: err.stack,\n to: toState,\n from: fromState,\n });\n }\n\n resetTransitionState();\n },\n\n teardown() {\n resetTransitionState();\n },\n };\n };\n}\n\n/**\n * Default logger-plugin instance with standard configuration.\n * Provided for backward compatibility with existing code.\n *\n * @example\n * // Use default configuration\n * router.usePlugin(loggerPlugin);\n */\nexport const loggerPlugin = loggerPluginFactory();\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/constants.ts":{"bytes":283,"imports":[],"format":"esm"},"src/internal/console-groups.ts":{"bytes":1490,"imports":[],"format":"esm"},"src/internal/formatting.ts":{"bytes":1234,"imports":[],"format":"esm"},"src/internal/params-diff.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/constants.ts":{"bytes":283,"imports":[],"format":"esm"},"src/internal/console-groups.ts":{"bytes":1490,"imports":[],"format":"esm"},"src/internal/formatting.ts":{"bytes":1234,"imports":[],"format":"esm"},"src/internal/params-diff.ts":{"bytes":2534,"imports":[],"format":"esm"},"src/internal/performance-marks.ts":{"bytes":1720,"imports":[],"format":"esm"},"src/internal/timing.ts":{"bytes":1480,"imports":[],"format":"esm"},"src/plugin.ts":{"bytes":6520,"imports":[{"path":"src/constants.ts","kind":"import-statement","original":"./constants"},{"path":"src/internal/console-groups.ts","kind":"import-statement","original":"./internal/console-groups"},{"path":"src/internal/formatting.ts","kind":"import-statement","original":"./internal/formatting"},{"path":"src/internal/params-diff.ts","kind":"import-statement","original":"./internal/params-diff"},{"path":"src/internal/performance-marks.ts","kind":"import-statement","original":"./internal/performance-marks"},{"path":"src/internal/timing.ts","kind":"import-statement","original":"./internal/timing"}],"format":"esm"},"src/index.ts":{"bytes":266,"imports":[{"path":"src/plugin.ts","kind":"import-statement","original":"./plugin"}],"format":"esm"}},"outputs":{"dist/esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":21834},"dist/esm/index.mjs":{"imports":[],"exports":["loggerPlugin","loggerPluginFactory"],"entryPoint":"src/index.ts","inputs":{"src/constants.ts":{"bytesInOutput":143},"src/internal/console-groups.ts":{"bytesInOutput":727},"src/internal/formatting.ts":{"bytesInOutput":592},"src/internal/params-diff.ts":{"bytesInOutput":1277},"src/internal/performance-marks.ts":{"bytesInOutput":941},"src/internal/timing.ts":{"bytesInOutput":450},"src/plugin.ts":{"bytesInOutput":4237},"src/index.ts":{"bytesInOutput":0}},"bytes":8618}}}
|
package/package.json
CHANGED
|
@@ -79,15 +79,11 @@ export const logParamsDiff = (diff: ParamsDiff, context: string): void => {
|
|
|
79
79
|
parts.push(`Changed: { ${items.join(", ")} }`);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (addedEntries.length > 0) {
|
|
82
|
+
if (Object.keys(diff.added).length > 0) {
|
|
85
83
|
parts.push(`Added: ${JSON.stringify(diff.added)}`);
|
|
86
84
|
}
|
|
87
85
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (removedEntries.length > 0) {
|
|
86
|
+
if (Object.keys(diff.removed).length > 0) {
|
|
91
87
|
parts.push(`Removed: ${JSON.stringify(diff.removed)}`);
|
|
92
88
|
}
|
|
93
89
|
|
package/src/plugin.ts
CHANGED
|
@@ -14,38 +14,9 @@ import { getParamsDiff, logParamsDiff } from "./internal/params-diff";
|
|
|
14
14
|
import { createPerformanceTracker } from "./internal/performance-marks";
|
|
15
15
|
import { now } from "./internal/timing";
|
|
16
16
|
|
|
17
|
-
import type { LoggerPluginConfig
|
|
17
|
+
import type { LoggerPluginConfig } from "./types";
|
|
18
18
|
import type { PluginFactory, RouterError, State } from "@real-router/core";
|
|
19
19
|
|
|
20
|
-
/**
|
|
21
|
-
* Checks if the given log type should be output based on the configured level.
|
|
22
|
-
*
|
|
23
|
-
* Level hierarchy:
|
|
24
|
-
* - 'all': log everything (start, stop, transitions, warnings, errors)
|
|
25
|
-
* - 'transitions': only transition events (start, success, cancel, error)
|
|
26
|
-
* - 'errors': only errors
|
|
27
|
-
* - 'none': nothing
|
|
28
|
-
*/
|
|
29
|
-
const shouldLog = (
|
|
30
|
-
level: LogLevel,
|
|
31
|
-
type: "lifecycle" | "transition" | "warning" | "error",
|
|
32
|
-
): boolean => {
|
|
33
|
-
if (level === "none") {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (level === "errors") {
|
|
38
|
-
return type === "error";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if (level === "transitions") {
|
|
42
|
-
return type === "transition" || type === "warning" || type === "error";
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// level === 'all'
|
|
46
|
-
return true;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
20
|
/**
|
|
50
21
|
* Creates a logger-plugin for real-router.
|
|
51
22
|
*
|
|
@@ -78,6 +49,19 @@ export function loggerPluginFactory(
|
|
|
78
49
|
...options,
|
|
79
50
|
};
|
|
80
51
|
|
|
52
|
+
// Pre-compute log level flags
|
|
53
|
+
const logLifecycle = config.level === "all";
|
|
54
|
+
const logTransition = config.level !== "none" && config.level !== "errors";
|
|
55
|
+
const logWarning = logTransition;
|
|
56
|
+
const logError = config.level !== "none";
|
|
57
|
+
|
|
58
|
+
// Pre-compute feature flags
|
|
59
|
+
const shouldLogParams = logTransition && config.showParamsDiff;
|
|
60
|
+
const shouldShowTiming = config.showTiming;
|
|
61
|
+
|
|
62
|
+
// Cached prefix
|
|
63
|
+
const prefix = `[${config.context}]`;
|
|
64
|
+
|
|
81
65
|
return () => {
|
|
82
66
|
// Create helper managers
|
|
83
67
|
const groups = createGroupManager(supportsConsoleGroups());
|
|
@@ -88,12 +72,14 @@ export function loggerPluginFactory(
|
|
|
88
72
|
|
|
89
73
|
// Transition state
|
|
90
74
|
let transitionStartTime: number | null = null;
|
|
75
|
+
let transitionLabel = "";
|
|
76
|
+
let startMarkName = "";
|
|
91
77
|
|
|
92
78
|
/**
|
|
93
79
|
* Logs parameter differences when navigating within the same route.
|
|
94
80
|
*/
|
|
95
81
|
const logParamsIfNeeded = (toState: State, fromState?: State): void => {
|
|
96
|
-
if (!
|
|
82
|
+
if (!shouldLogParams || !fromState) {
|
|
97
83
|
return;
|
|
98
84
|
}
|
|
99
85
|
|
|
@@ -110,22 +96,21 @@ export function loggerPluginFactory(
|
|
|
110
96
|
};
|
|
111
97
|
|
|
112
98
|
/**
|
|
113
|
-
*
|
|
99
|
+
* Resets transition state. Must be called AFTER timing is read.
|
|
114
100
|
*/
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return formatTiming(transitionStartTime, now);
|
|
101
|
+
const resetTransitionState = (): void => {
|
|
102
|
+
groups.close();
|
|
103
|
+
transitionLabel = "";
|
|
104
|
+
startMarkName = "";
|
|
105
|
+
transitionStartTime = null;
|
|
121
106
|
};
|
|
122
107
|
|
|
123
108
|
return {
|
|
124
109
|
onStart() {
|
|
125
110
|
perf.mark("router:start");
|
|
126
111
|
|
|
127
|
-
if (
|
|
128
|
-
console.log(
|
|
112
|
+
if (logLifecycle) {
|
|
113
|
+
console.log(`${prefix} Router started`);
|
|
129
114
|
}
|
|
130
115
|
},
|
|
131
116
|
|
|
@@ -135,8 +120,8 @@ export function loggerPluginFactory(
|
|
|
135
120
|
perf.mark("router:stop");
|
|
136
121
|
perf.measure("router:lifetime", "router:start", "router:stop");
|
|
137
122
|
|
|
138
|
-
if (
|
|
139
|
-
console.log(
|
|
123
|
+
if (logLifecycle) {
|
|
124
|
+
console.log(`${prefix} Router stopped`);
|
|
140
125
|
}
|
|
141
126
|
},
|
|
142
127
|
|
|
@@ -146,71 +131,66 @@ export function loggerPluginFactory(
|
|
|
146
131
|
|
|
147
132
|
const fromRoute = formatRouteName(fromState);
|
|
148
133
|
const toRoute = formatRouteName(toState);
|
|
149
|
-
const label = createTransitionLabel(fromRoute, toRoute);
|
|
150
134
|
|
|
151
|
-
|
|
135
|
+
transitionLabel = createTransitionLabel(fromRoute, toRoute);
|
|
136
|
+
startMarkName = `router:transition-start:${transitionLabel}`;
|
|
152
137
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
);
|
|
138
|
+
perf.mark(startMarkName);
|
|
139
|
+
|
|
140
|
+
if (logTransition) {
|
|
141
|
+
console.log(`${prefix} Transition: ${fromRoute} → ${toRoute}`, {
|
|
142
|
+
from: fromState,
|
|
143
|
+
to: toState,
|
|
144
|
+
});
|
|
161
145
|
|
|
162
146
|
logParamsIfNeeded(toState, fromState);
|
|
163
147
|
}
|
|
164
148
|
},
|
|
165
149
|
|
|
166
150
|
onTransitionSuccess(toState: State, fromState?: State) {
|
|
167
|
-
const
|
|
168
|
-
const
|
|
169
|
-
const label = createTransitionLabel(fromRoute, toRoute);
|
|
151
|
+
const label = transitionLabel;
|
|
152
|
+
const endMark = `router:transition-end:${label}`;
|
|
170
153
|
|
|
171
|
-
perf.mark(
|
|
172
|
-
perf.measure(
|
|
173
|
-
`router:transition:${label}`,
|
|
174
|
-
`router:transition-start:${label}`,
|
|
175
|
-
`router:transition-end:${label}`,
|
|
176
|
-
);
|
|
154
|
+
perf.mark(endMark);
|
|
155
|
+
perf.measure(`router:transition:${label}`, startMarkName, endMark);
|
|
177
156
|
|
|
178
|
-
if (
|
|
179
|
-
const timing =
|
|
157
|
+
if (logTransition) {
|
|
158
|
+
const timing = shouldShowTiming
|
|
159
|
+
? formatTiming(transitionStartTime, now)
|
|
160
|
+
: "";
|
|
180
161
|
|
|
181
|
-
console.log(
|
|
162
|
+
console.log(`${prefix} Transition success${timing}`, {
|
|
182
163
|
to: toState,
|
|
183
164
|
from: fromState,
|
|
184
165
|
});
|
|
185
166
|
}
|
|
186
167
|
|
|
187
|
-
|
|
188
|
-
transitionStartTime = null;
|
|
168
|
+
resetTransitionState();
|
|
189
169
|
},
|
|
190
170
|
|
|
191
171
|
onTransitionCancel(toState: State, fromState?: State) {
|
|
192
|
-
const
|
|
193
|
-
const
|
|
194
|
-
const label = createTransitionLabel(fromRoute, toRoute);
|
|
172
|
+
const label = transitionLabel;
|
|
173
|
+
const cancelMark = `router:transition-cancel:${label}`;
|
|
195
174
|
|
|
196
|
-
perf.mark(
|
|
175
|
+
perf.mark(cancelMark);
|
|
197
176
|
perf.measure(
|
|
198
177
|
`router:transition-cancelled:${label}`,
|
|
199
|
-
|
|
200
|
-
|
|
178
|
+
startMarkName,
|
|
179
|
+
cancelMark,
|
|
201
180
|
);
|
|
202
181
|
|
|
203
|
-
if (
|
|
204
|
-
const timing =
|
|
182
|
+
if (logWarning) {
|
|
183
|
+
const timing = shouldShowTiming
|
|
184
|
+
? formatTiming(transitionStartTime, now)
|
|
185
|
+
: "";
|
|
205
186
|
|
|
206
|
-
console.warn(
|
|
187
|
+
console.warn(`${prefix} Transition cancelled${timing}`, {
|
|
207
188
|
to: toState,
|
|
208
189
|
from: fromState,
|
|
209
190
|
});
|
|
210
191
|
}
|
|
211
192
|
|
|
212
|
-
|
|
213
|
-
transitionStartTime = null;
|
|
193
|
+
resetTransitionState();
|
|
214
194
|
},
|
|
215
195
|
|
|
216
196
|
onTransitionError(
|
|
@@ -218,38 +198,34 @@ export function loggerPluginFactory(
|
|
|
218
198
|
fromState: State | undefined,
|
|
219
199
|
err: RouterError,
|
|
220
200
|
) {
|
|
221
|
-
const
|
|
222
|
-
const
|
|
223
|
-
const label = createTransitionLabel(fromRoute, toRoute);
|
|
201
|
+
const label = transitionLabel;
|
|
202
|
+
const errorMark = `router:transition-error:${label}`;
|
|
224
203
|
|
|
225
|
-
perf.mark(
|
|
204
|
+
perf.mark(errorMark);
|
|
226
205
|
perf.measure(
|
|
227
206
|
`router:transition-failed:${label}`,
|
|
228
|
-
|
|
229
|
-
|
|
207
|
+
startMarkName,
|
|
208
|
+
errorMark,
|
|
230
209
|
);
|
|
231
210
|
|
|
232
|
-
if (
|
|
233
|
-
const timing =
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
);
|
|
211
|
+
if (logError) {
|
|
212
|
+
const timing = shouldShowTiming
|
|
213
|
+
? formatTiming(transitionStartTime, now)
|
|
214
|
+
: "";
|
|
215
|
+
|
|
216
|
+
console.error(`${prefix} Transition error: ${err.code}${timing}`, {
|
|
217
|
+
error: err,
|
|
218
|
+
stack: err.stack,
|
|
219
|
+
to: toState,
|
|
220
|
+
from: fromState,
|
|
221
|
+
});
|
|
244
222
|
}
|
|
245
223
|
|
|
246
|
-
|
|
247
|
-
transitionStartTime = null;
|
|
224
|
+
resetTransitionState();
|
|
248
225
|
},
|
|
249
226
|
|
|
250
227
|
teardown() {
|
|
251
|
-
|
|
252
|
-
transitionStartTime = null;
|
|
228
|
+
resetTransitionState();
|
|
253
229
|
},
|
|
254
230
|
};
|
|
255
231
|
};
|