@geenius/tools 0.1.0 → 0.3.0
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/package.json +62 -3
- package/packages/convex/shared/README.md +1 -1
- package/packages/devtools/dist/index.d.ts +204 -0
- package/packages/devtools/dist/index.js +186 -0
- package/packages/devtools/dist/index.js.map +1 -0
- package/packages/devtools/react/README.md +1 -1
- package/packages/devtools/solidjs/README.md +1 -1
- package/packages/devtools/solidjs/dist/index.js +1830 -0
- package/packages/devtools/solidjs/dist/index.js.map +1 -0
- package/packages/env/dist/index.d.ts +151 -0
- package/packages/env/dist/index.js +93 -0
- package/packages/env/dist/index.js.map +1 -0
- package/packages/errors/dist/index.d.ts +177 -0
- package/packages/errors/dist/index.js +187 -0
- package/packages/errors/dist/index.js.map +1 -0
- package/packages/errors/react/README.md +1 -1
- package/packages/errors/solidjs/README.md +1 -1
- package/packages/logger/dist/index.d.ts +171 -0
- package/packages/logger/dist/index.js +216 -0
- package/packages/logger/dist/index.js.map +1 -0
- package/packages/logger/react/README.md +1 -1
- package/packages/logger/solidjs/README.md +1 -1
- package/packages/perf/dist/index.d.ts +168 -0
- package/packages/perf/dist/index.js +265 -0
- package/packages/perf/dist/index.js.map +1 -0
- package/packages/perf/react/README.md +1 -1
- package/packages/perf/solidjs/README.md +1 -1
- package/packages/shared/dist/index.d.ts +253 -0
- package/packages/shared/dist/index.js +278 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/.changeset/config.json +0 -11
- package/.env.example +0 -2
- package/.github/CODEOWNERS +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -23
- package/.github/workflows/release.yml +0 -29
- package/.node-version +0 -1
- package/.nvmrc +0 -1
- package/.prettierrc +0 -7
- package/.project/ACCOUNT.yaml +0 -4
- package/.project/IDEAS.yaml +0 -7
- package/.project/PROJECT.yaml +0 -11
- package/.project/ROADMAP.yaml +0 -15
- package/CODE_OF_CONDUCT.md +0 -26
- package/CONTRIBUTING.md +0 -69
- package/SECURITY.md +0 -18
- package/SUPPORT.md +0 -14
- package/packages/convex/shared/package.json +0 -42
- package/packages/convex/shared/src/audit/index.ts +0 -5
- package/packages/convex/shared/src/audit/presets.ts +0 -165
- package/packages/convex/shared/src/audit/schema.ts +0 -85
- package/packages/convex/shared/src/audit/write.ts +0 -102
- package/packages/convex/shared/src/extract.ts +0 -75
- package/packages/convex/shared/src/index.ts +0 -41
- package/packages/convex/shared/src/messages.ts +0 -45
- package/packages/convex/shared/src/security.ts +0 -112
- package/packages/convex/shared/src/throw.ts +0 -184
- package/packages/convex/shared/src/types.ts +0 -57
- package/packages/convex/shared/src/utils.ts +0 -58
- package/packages/convex/shared/tsconfig.json +0 -28
- package/packages/convex/shared/tsup.config.ts +0 -12
- package/packages/devtools/package.json +0 -27
- package/packages/devtools/react/package.json +0 -53
- package/packages/devtools/react/src/components/DesignPreview.tsx +0 -59
- package/packages/devtools/react/src/components/DesignSwitcherDropdown.tsx +0 -99
- package/packages/devtools/react/src/components/DevSidebar.tsx +0 -247
- package/packages/devtools/react/src/components/DevToolbar.tsx +0 -242
- package/packages/devtools/react/src/components/GitHubIssueDialog.tsx +0 -402
- package/packages/devtools/react/src/components/InspectorOverlay.tsx +0 -312
- package/packages/devtools/react/src/components/PageLoadWaterfall.tsx +0 -144
- package/packages/devtools/react/src/components/PerformancePanel.tsx +0 -330
- package/packages/devtools/react/src/context/DevModeContext.tsx +0 -226
- package/packages/devtools/react/src/context/PerformanceContext.tsx +0 -143
- package/packages/devtools/react/src/data/designs.ts +0 -13
- package/packages/devtools/react/src/hooks/useGitHubLabels.ts +0 -47
- package/packages/devtools/react/src/hooks/useVirtualList.ts +0 -124
- package/packages/devtools/react/src/index.ts +0 -77
- package/packages/devtools/react/src/panels/ConvexSpy.tsx +0 -130
- package/packages/devtools/react/src/panels/DatabaseSeeder.tsx +0 -116
- package/packages/devtools/react/src/panels/DevModePhase2.tsx +0 -191
- package/packages/devtools/react/src/panels/DevModePhase3.tsx +0 -234
- package/packages/devtools/react/src/panels/FeatureFlagsToggle.tsx +0 -104
- package/packages/devtools/react/src/panels/QuickRouteJump.tsx +0 -152
- package/packages/devtools/react/src/services/github-service.ts +0 -247
- package/packages/devtools/react/tsconfig.json +0 -31
- package/packages/devtools/react/tsup.config.ts +0 -18
- package/packages/devtools/solidjs/package.json +0 -49
- package/packages/devtools/solidjs/src/components/DesignPreview.tsx +0 -51
- package/packages/devtools/solidjs/src/components/DesignSwitcherDropdown.tsx +0 -95
- package/packages/devtools/solidjs/src/components/DevSidebar.tsx +0 -247
- package/packages/devtools/solidjs/src/components/DevToolbar.tsx +0 -242
- package/packages/devtools/solidjs/src/components/GitHubIssueDialog.tsx +0 -400
- package/packages/devtools/solidjs/src/components/InspectorOverlay.tsx +0 -311
- package/packages/devtools/solidjs/src/components/PageLoadWaterfall.tsx +0 -144
- package/packages/devtools/solidjs/src/components/PerformancePanel.tsx +0 -330
- package/packages/devtools/solidjs/src/context/DevModeContext.tsx +0 -216
- package/packages/devtools/solidjs/src/context/PerformanceContext.tsx +0 -135
- package/packages/devtools/solidjs/src/data/designs.ts +0 -13
- package/packages/devtools/solidjs/src/hooks/createGitHubLabels.ts +0 -47
- package/packages/devtools/solidjs/src/index.ts +0 -64
- package/packages/devtools/solidjs/src/services/github-service.ts +0 -247
- package/packages/devtools/solidjs/tsconfig.json +0 -21
- package/packages/devtools/src/index.ts +0 -377
- package/packages/devtools/tsup.config.ts +0 -12
- package/packages/env/package.json +0 -30
- package/packages/env/src/index.ts +0 -264
- package/packages/env/tsup.config.ts +0 -12
- package/packages/errors/package.json +0 -27
- package/packages/errors/react/package.json +0 -72
- package/packages/errors/react/src/analytics.ts +0 -16
- package/packages/errors/react/src/components/ErrorBoundary.tsx +0 -248
- package/packages/errors/react/src/components/ErrorDisplay.tsx +0 -328
- package/packages/errors/react/src/components/ValidationErrors.tsx +0 -102
- package/packages/errors/react/src/config.ts +0 -199
- package/packages/errors/react/src/constants.ts +0 -74
- package/packages/errors/react/src/hooks/useErrorBoundary.ts +0 -92
- package/packages/errors/react/src/hooks/useErrorHandler.ts +0 -87
- package/packages/errors/react/src/index.ts +0 -96
- package/packages/errors/react/src/types.ts +0 -102
- package/packages/errors/react/src/utils/errorMessages.ts +0 -35
- package/packages/errors/react/src/utils/errorPolicy.ts +0 -139
- package/packages/errors/react/src/utils/extractAppError.ts +0 -174
- package/packages/errors/react/src/utils/formatError.ts +0 -112
- package/packages/errors/react/tsconfig.json +0 -25
- package/packages/errors/react/tsup.config.ts +0 -24
- package/packages/errors/solidjs/package.json +0 -46
- package/packages/errors/solidjs/src/components/ErrorDisplay.tsx +0 -179
- package/packages/errors/solidjs/src/config.ts +0 -98
- package/packages/errors/solidjs/src/hooks/createErrorHandler.ts +0 -107
- package/packages/errors/solidjs/src/index.ts +0 -61
- package/packages/errors/solidjs/src/types.ts +0 -34
- package/packages/errors/solidjs/src/utils/errorPolicy.ts +0 -56
- package/packages/errors/solidjs/src/utils/extractAppError.ts +0 -94
- package/packages/errors/solidjs/src/utils/formatError.ts +0 -33
- package/packages/errors/solidjs/tsconfig.json +0 -26
- package/packages/errors/solidjs/tsup.config.ts +0 -21
- package/packages/errors/src/index.ts +0 -320
- package/packages/errors/tsup.config.ts +0 -12
- package/packages/logger/package.json +0 -27
- package/packages/logger/react/package.json +0 -46
- package/packages/logger/react/src/index.ts +0 -4
- package/packages/logger/react/src/useMetrics.ts +0 -42
- package/packages/logger/react/src/usePerformanceLog.ts +0 -61
- package/packages/logger/react/tsconfig.json +0 -31
- package/packages/logger/react/tsup.config.ts +0 -12
- package/packages/logger/solidjs/package.json +0 -45
- package/packages/logger/solidjs/src/createMetrics.ts +0 -37
- package/packages/logger/solidjs/src/createPerformanceLog.ts +0 -58
- package/packages/logger/solidjs/src/index.ts +0 -4
- package/packages/logger/solidjs/tsconfig.json +0 -32
- package/packages/logger/solidjs/tsup.config.ts +0 -12
- package/packages/logger/src/index.ts +0 -363
- package/packages/logger/tsup.config.ts +0 -12
- package/packages/perf/package.json +0 -27
- package/packages/perf/react/package.json +0 -59
- package/packages/perf/react/src/components/PerformanceDashboard.tsx +0 -257
- package/packages/perf/react/src/hooks/useMonitoredQuery.ts +0 -89
- package/packages/perf/react/src/hooks/usePerformanceMetrics.ts +0 -78
- package/packages/perf/react/src/index.ts +0 -33
- package/packages/perf/react/src/services/PerformanceMonitor.ts +0 -313
- package/packages/perf/react/src/types.ts +0 -77
- package/packages/perf/react/tsconfig.json +0 -25
- package/packages/perf/react/tsup.config.ts +0 -19
- package/packages/perf/solidjs/package.json +0 -41
- package/packages/perf/solidjs/src/components/PerformanceDashboard.tsx +0 -207
- package/packages/perf/solidjs/src/hooks/createPerformanceMetrics.ts +0 -73
- package/packages/perf/solidjs/src/index.ts +0 -31
- package/packages/perf/solidjs/src/services/PerformanceMonitor.ts +0 -134
- package/packages/perf/solidjs/src/types.ts +0 -78
- package/packages/perf/solidjs/tsconfig.json +0 -26
- package/packages/perf/solidjs/tsup.config.ts +0 -14
- package/packages/perf/src/index.ts +0 -410
- package/packages/perf/tsup.config.ts +0 -12
- package/pnpm-workspace.yaml +0 -2
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
3
|
+
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
|
|
4
|
+
LogLevel2[LogLevel2["INFO"] = 1] = "INFO";
|
|
5
|
+
LogLevel2[LogLevel2["WARN"] = 2] = "WARN";
|
|
6
|
+
LogLevel2[LogLevel2["ERROR"] = 3] = "ERROR";
|
|
7
|
+
LogLevel2[LogLevel2["FATAL"] = 4] = "FATAL";
|
|
8
|
+
return LogLevel2;
|
|
9
|
+
})(LogLevel || {});
|
|
10
|
+
var Logger = class _Logger {
|
|
11
|
+
level;
|
|
12
|
+
formatter;
|
|
13
|
+
transports;
|
|
14
|
+
timestamps;
|
|
15
|
+
sourceLocation;
|
|
16
|
+
context = /* @__PURE__ */ new Map();
|
|
17
|
+
constructor(config = {}) {
|
|
18
|
+
this.level = config.level ?? 1 /* INFO */;
|
|
19
|
+
this.formatter = config.formatter ?? defaultFormatter;
|
|
20
|
+
this.transports = config.transports ?? [consoleTransport];
|
|
21
|
+
this.timestamps = config.timestamps !== false;
|
|
22
|
+
this.sourceLocation = config.sourceLocation ?? false;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Logs with debug level
|
|
26
|
+
*/
|
|
27
|
+
debug(message, context) {
|
|
28
|
+
this.log(0 /* DEBUG */, message, context);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Logs with info level
|
|
32
|
+
*/
|
|
33
|
+
info(message, context) {
|
|
34
|
+
this.log(1 /* INFO */, message, context);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Logs with warn level
|
|
38
|
+
*/
|
|
39
|
+
warn(message, context) {
|
|
40
|
+
this.log(2 /* WARN */, message, context);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Logs with error level
|
|
44
|
+
*/
|
|
45
|
+
error(message, error, context) {
|
|
46
|
+
this.log(3 /* ERROR */, message, context, error);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Logs with fatal level
|
|
50
|
+
*/
|
|
51
|
+
fatal(message, error, context) {
|
|
52
|
+
this.log(4 /* FATAL */, message, context, error);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Core logging method
|
|
56
|
+
*/
|
|
57
|
+
log(level, message, context, error) {
|
|
58
|
+
if (level < this.level) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const mergedContext = {
|
|
62
|
+
...Object.fromEntries(this.context),
|
|
63
|
+
...context
|
|
64
|
+
};
|
|
65
|
+
const entry = {
|
|
66
|
+
level,
|
|
67
|
+
message,
|
|
68
|
+
context: Object.keys(mergedContext).length > 0 ? mergedContext : void 0,
|
|
69
|
+
error,
|
|
70
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
71
|
+
};
|
|
72
|
+
if (this.sourceLocation) {
|
|
73
|
+
entry.metadata = {
|
|
74
|
+
...entry.metadata,
|
|
75
|
+
location: this.getSourceLocation()
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const formatted = this.formatter(entry);
|
|
79
|
+
for (const transport of this.transports) {
|
|
80
|
+
try {
|
|
81
|
+
void transport.log(entry);
|
|
82
|
+
} catch {
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Sets context for all subsequent logs
|
|
88
|
+
*/
|
|
89
|
+
setContext(key, value) {
|
|
90
|
+
this.context.set(key, value);
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Gets current context
|
|
95
|
+
*/
|
|
96
|
+
getContext() {
|
|
97
|
+
return Object.fromEntries(this.context);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Clears context
|
|
101
|
+
*/
|
|
102
|
+
clearContext() {
|
|
103
|
+
this.context.clear();
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Creates a child logger with inherited context
|
|
108
|
+
*/
|
|
109
|
+
child(context) {
|
|
110
|
+
const child = new _Logger({
|
|
111
|
+
level: this.level,
|
|
112
|
+
formatter: this.formatter,
|
|
113
|
+
transports: this.transports,
|
|
114
|
+
timestamps: this.timestamps,
|
|
115
|
+
sourceLocation: this.sourceLocation
|
|
116
|
+
});
|
|
117
|
+
for (const [key, value] of this.context) {
|
|
118
|
+
child.setContext(key, value);
|
|
119
|
+
}
|
|
120
|
+
for (const [key, value] of Object.entries(context)) {
|
|
121
|
+
child.setContext(key, value);
|
|
122
|
+
}
|
|
123
|
+
return child;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Gets source location from stack trace
|
|
127
|
+
*/
|
|
128
|
+
getSourceLocation() {
|
|
129
|
+
const stack = new Error().stack || "";
|
|
130
|
+
const lines = stack.split("\n");
|
|
131
|
+
for (let i = 2; i < lines.length; i++) {
|
|
132
|
+
const line = lines[i];
|
|
133
|
+
if (line.includes("Logger.") || line.includes("logger.")) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const match = line.match(/at\s+(?:.*?\s+)?\(?([^:\)]+):(\d+)/);
|
|
137
|
+
if (match) {
|
|
138
|
+
return {
|
|
139
|
+
file: match[1],
|
|
140
|
+
line: parseInt(match[2])
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return { file: "unknown", line: 0 };
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
var defaultFormatter = (entry) => {
|
|
148
|
+
const levelName = LogLevel[entry.level];
|
|
149
|
+
const timestamp = entry.timestamp.toISOString();
|
|
150
|
+
let output = `[${timestamp}] [${levelName}] ${entry.message}`;
|
|
151
|
+
if (entry.context && Object.keys(entry.context).length > 0) {
|
|
152
|
+
output += ` ${JSON.stringify(entry.context)}`;
|
|
153
|
+
}
|
|
154
|
+
if (entry.error) {
|
|
155
|
+
const errorStr = entry.error instanceof Error ? `${entry.error.name}: ${entry.error.message}` : String(entry.error);
|
|
156
|
+
output += ` Error: ${errorStr}`;
|
|
157
|
+
}
|
|
158
|
+
return output;
|
|
159
|
+
};
|
|
160
|
+
var consoleTransport = {
|
|
161
|
+
log(entry) {
|
|
162
|
+
const formatted = defaultFormatter(entry);
|
|
163
|
+
if (entry.level >= 3 /* ERROR */) {
|
|
164
|
+
console.error(formatted);
|
|
165
|
+
} else if (entry.level === 2 /* WARN */) {
|
|
166
|
+
console.warn(formatted);
|
|
167
|
+
} else {
|
|
168
|
+
console.log(formatted);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
function createLogger(config) {
|
|
173
|
+
return new Logger(config);
|
|
174
|
+
}
|
|
175
|
+
var globalLogger = null;
|
|
176
|
+
function getGlobalLogger(config) {
|
|
177
|
+
if (!globalLogger) {
|
|
178
|
+
globalLogger = createLogger(config);
|
|
179
|
+
}
|
|
180
|
+
return globalLogger;
|
|
181
|
+
}
|
|
182
|
+
function resetGlobalLogger() {
|
|
183
|
+
globalLogger = null;
|
|
184
|
+
}
|
|
185
|
+
var MemoryTransport = class {
|
|
186
|
+
entries = [];
|
|
187
|
+
log(entry) {
|
|
188
|
+
this.entries.push(entry);
|
|
189
|
+
}
|
|
190
|
+
/** Gets all logged entries */
|
|
191
|
+
getEntries() {
|
|
192
|
+
return [...this.entries];
|
|
193
|
+
}
|
|
194
|
+
/** Gets entries by level */
|
|
195
|
+
getByLevel(level) {
|
|
196
|
+
return this.entries.filter((e) => e.level === level);
|
|
197
|
+
}
|
|
198
|
+
/** Clears all entries */
|
|
199
|
+
clear() {
|
|
200
|
+
this.entries = [];
|
|
201
|
+
}
|
|
202
|
+
/** Gets count of entries */
|
|
203
|
+
size() {
|
|
204
|
+
return this.entries.length;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
export {
|
|
208
|
+
LogLevel,
|
|
209
|
+
Logger,
|
|
210
|
+
MemoryTransport,
|
|
211
|
+
consoleTransport,
|
|
212
|
+
createLogger,
|
|
213
|
+
getGlobalLogger,
|
|
214
|
+
resetGlobalLogger
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @geenius/tools-logger — Structured logging\n *\n * Provides structured logging with levels, formatting, and contextual data.\n * Suitable for both client and server environments.\n */\n\n/**\n * Log levels in order of severity\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n FATAL = 4,\n}\n\n/**\n * Log entry structure\n */\nexport interface LogEntry {\n /** Log level */\n level: LogLevel\n /** Log message */\n message: string\n /** Contextual data */\n context?: Record<string, unknown>\n /** Error object if applicable */\n error?: Error | unknown\n /** Timestamp */\n timestamp: Date\n /** Additional metadata */\n metadata?: Record<string, unknown>\n}\n\n/**\n * Log formatter function\n */\nexport type LogFormatter = (entry: LogEntry) => string\n\n/**\n * Logger transport (where logs go)\n */\nexport interface LogTransport {\n /** Log handler function */\n log(entry: LogEntry): void | Promise<void>\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Minimum log level to output (default: INFO) */\n level?: LogLevel\n /** Custom formatter (default: pretty print) */\n formatter?: LogFormatter\n /** Log transports */\n transports?: LogTransport[]\n /** Whether to include timestamps (default: true) */\n timestamps?: boolean\n /** Whether to include source location (default: false) */\n sourceLocation?: boolean\n}\n\n/**\n * Structured logger with context and levels\n *\n * @example\n * ```ts\n * const logger = createLogger({ level: LogLevel.DEBUG })\n *\n * logger.info('User signed in', { userId: '123' })\n * logger.error('Database error', { error })\n * logger.debug('Cache hit', { key: 'user:123' })\n * ```\n */\nexport class Logger {\n private level: LogLevel\n private formatter: LogFormatter\n private transports: LogTransport[]\n private timestamps: boolean\n private sourceLocation: boolean\n private context: Map<string, unknown> = new Map()\n\n constructor(config: LoggerConfig = {}) {\n this.level = config.level ?? LogLevel.INFO\n this.formatter = config.formatter ?? defaultFormatter\n this.transports = config.transports ?? [consoleTransport]\n this.timestamps = config.timestamps !== false\n this.sourceLocation = config.sourceLocation ?? false\n }\n\n /**\n * Logs with debug level\n */\n debug(message: string, context?: Record<string, unknown>) {\n this.log(LogLevel.DEBUG, message, context)\n }\n\n /**\n * Logs with info level\n */\n info(message: string, context?: Record<string, unknown>) {\n this.log(LogLevel.INFO, message, context)\n }\n\n /**\n * Logs with warn level\n */\n warn(message: string, context?: Record<string, unknown>) {\n this.log(LogLevel.WARN, message, context)\n }\n\n /**\n * Logs with error level\n */\n error(message: string, error?: Error | unknown, context?: Record<string, unknown>) {\n this.log(LogLevel.ERROR, message, context, error)\n }\n\n /**\n * Logs with fatal level\n */\n fatal(message: string, error?: Error | unknown, context?: Record<string, unknown>) {\n this.log(LogLevel.FATAL, message, context, error)\n }\n\n /**\n * Core logging method\n */\n private log(\n level: LogLevel,\n message: string,\n context?: Record<string, unknown>,\n error?: Error | unknown\n ) {\n if (level < this.level) {\n return\n }\n\n const mergedContext = {\n ...Object.fromEntries(this.context),\n ...context,\n }\n\n const entry: LogEntry = {\n level,\n message,\n context: Object.keys(mergedContext).length > 0 ? mergedContext : undefined,\n error,\n timestamp: new Date(),\n }\n\n if (this.sourceLocation) {\n entry.metadata = {\n ...entry.metadata,\n location: this.getSourceLocation(),\n }\n }\n\n const formatted = this.formatter(entry)\n\n for (const transport of this.transports) {\n try {\n void transport.log(entry)\n } catch {\n // Silently fail to prevent logger errors from breaking app\n }\n }\n }\n\n /**\n * Sets context for all subsequent logs\n */\n setContext(key: string, value: unknown) {\n this.context.set(key, value)\n return this\n }\n\n /**\n * Gets current context\n */\n getContext(): Record<string, unknown> {\n return Object.fromEntries(this.context)\n }\n\n /**\n * Clears context\n */\n clearContext() {\n this.context.clear()\n return this\n }\n\n /**\n * Creates a child logger with inherited context\n */\n child(context: Record<string, unknown>): Logger {\n const child = new Logger({\n level: this.level,\n formatter: this.formatter,\n transports: this.transports,\n timestamps: this.timestamps,\n sourceLocation: this.sourceLocation,\n })\n\n // Inherit context\n for (const [key, value] of this.context) {\n child.setContext(key, value)\n }\n\n // Add child context\n for (const [key, value] of Object.entries(context)) {\n child.setContext(key, value)\n }\n\n return child\n }\n\n /**\n * Gets source location from stack trace\n */\n private getSourceLocation(): { file: string; line: number } {\n const stack = new Error().stack || ''\n const lines = stack.split('\\n')\n\n // Skip error message and this method\n for (let i = 2; i < lines.length; i++) {\n const line = lines[i]\n if (line.includes('Logger.') || line.includes('logger.')) {\n continue\n }\n\n const match = line.match(/at\\s+(?:.*?\\s+)?\\(?([^:\\)]+):(\\d+)/)\n if (match) {\n return {\n file: match[1],\n line: parseInt(match[2]),\n }\n }\n }\n\n return { file: 'unknown', line: 0 }\n }\n}\n\n/**\n * Default log formatter with colors (for terminal)\n */\nconst defaultFormatter: LogFormatter = (entry: LogEntry) => {\n const levelName = LogLevel[entry.level]\n const timestamp = entry.timestamp.toISOString()\n\n let output = `[${timestamp}] [${levelName}] ${entry.message}`\n\n if (entry.context && Object.keys(entry.context).length > 0) {\n output += ` ${JSON.stringify(entry.context)}`\n }\n\n if (entry.error) {\n const errorStr =\n entry.error instanceof Error\n ? `${entry.error.name}: ${entry.error.message}`\n : String(entry.error)\n output += ` Error: ${errorStr}`\n }\n\n return output\n}\n\n/**\n * Console transport for logging to stdout/stderr\n */\nexport const consoleTransport: LogTransport = {\n log(entry: LogEntry) {\n const formatted = defaultFormatter(entry)\n\n if (entry.level >= LogLevel.ERROR) {\n console.error(formatted)\n } else if (entry.level === LogLevel.WARN) {\n console.warn(formatted)\n } else {\n console.log(formatted)\n }\n },\n}\n\n/**\n * Creates a new logger instance\n *\n * @param config Logger configuration\n * @returns Configured logger\n *\n * @example\n * ```ts\n * const logger = createLogger({\n * level: LogLevel.DEBUG,\n * timestamps: true\n * })\n * ```\n */\nexport function createLogger(config?: LoggerConfig): Logger {\n return new Logger(config)\n}\n\n/**\n * Global default logger instance\n */\nlet globalLogger: Logger | null = null\n\n/**\n * Gets or creates global logger\n *\n * @param config Configuration for initial creation\n * @returns Global logger instance\n */\nexport function getGlobalLogger(config?: LoggerConfig): Logger {\n if (!globalLogger) {\n globalLogger = createLogger(config)\n }\n return globalLogger\n}\n\n/**\n * Resets global logger (for testing)\n */\nexport function resetGlobalLogger() {\n globalLogger = null\n}\n\n/**\n * Memory transport for testing and analysis\n */\nexport class MemoryTransport implements LogTransport {\n private entries: LogEntry[] = []\n\n log(entry: LogEntry) {\n this.entries.push(entry)\n }\n\n /** Gets all logged entries */\n getEntries(): LogEntry[] {\n return [...this.entries]\n }\n\n /** Gets entries by level */\n getByLevel(level: LogLevel): LogEntry[] {\n return this.entries.filter((e) => e.level === level)\n }\n\n /** Clears all entries */\n clear() {\n this.entries = []\n }\n\n /** Gets count of entries */\n size(): number {\n return this.entries.length\n }\n}\n"],"mappings":"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","names":["LogLevel"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
# ✦ @geenius-
|
|
1
|
+
# ✦ @geenius/tools-logger-react\n\n> React hooks for @geenius/tools-logger\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/tools-logger-react\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/tools-logger-react';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
|
|
@@ -1 +1 @@
|
|
|
1
|
-
# ✦ @geenius-
|
|
1
|
+
# ✦ @geenius/tools-logger-solidjs\n\n> SolidJS primitives for @geenius/tools-logger\n\n---\n\n## Overview\nBuilt with Steve Jobs-level minimalism and Jony Ive-level craftsmanship, this package is designed to deliver unparalleled developer experience (DX) and rock-solid performance.\n\n## Installation\n\n```bash\npnpm add @geenius/tools-logger-solidjs\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius/tools-logger-solidjs';\n\n// Initialize the module with absolute precision\ninit({\n mode: 'premium',\n});\n```\n\n## Architecture\n- **Zero-config**: It just works.\n- **Strictly Typed**: Fully written in TypeScript for flawless IntelliSense.\n- **Framework Agnostic**: seamlessly integrates into the Geenius ecosystem.\n\n---\n\n*Designed by Antigravity HQ*\n
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @geenius/tools-perf — Performance monitoring
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for measuring and tracking performance metrics.
|
|
5
|
+
* Supports timing, memory profiling, and metric collection.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Performance metric entry
|
|
9
|
+
*/
|
|
10
|
+
interface PerfMetric {
|
|
11
|
+
/** Metric name */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Duration in milliseconds */
|
|
14
|
+
duration: number;
|
|
15
|
+
/** When metric was recorded */
|
|
16
|
+
timestamp: Date;
|
|
17
|
+
/** Metric tags */
|
|
18
|
+
tags?: Record<string, string>;
|
|
19
|
+
/** Additional metadata */
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Performance monitor callback
|
|
24
|
+
*/
|
|
25
|
+
type PerfCallback = (metric: PerfMetric) => void | Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Simple timer for measuring duration
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const timer = new Timer()
|
|
32
|
+
* // ... do work ...
|
|
33
|
+
* console.log(timer.elapsed()) // duration in ms
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
declare class Timer {
|
|
37
|
+
private startTime;
|
|
38
|
+
constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Gets elapsed time in milliseconds
|
|
41
|
+
*/
|
|
42
|
+
elapsed(): number;
|
|
43
|
+
/**
|
|
44
|
+
* Resets timer
|
|
45
|
+
*/
|
|
46
|
+
reset(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Gets current time in milliseconds
|
|
49
|
+
*/
|
|
50
|
+
private now;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Performance tracker for named metrics
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* const perf = new PerfTracker()
|
|
58
|
+
* perf.mark('fetch-start')
|
|
59
|
+
* // ... fetch data ...
|
|
60
|
+
* perf.measure('api-call', 'fetch-start')
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
declare class PerfTracker {
|
|
64
|
+
private marks;
|
|
65
|
+
private metrics;
|
|
66
|
+
private callbacks;
|
|
67
|
+
/**
|
|
68
|
+
* Records a performance mark at current time
|
|
69
|
+
*/
|
|
70
|
+
mark(name: string, tags?: Record<string, string>): void;
|
|
71
|
+
/**
|
|
72
|
+
* Measures duration from mark to now
|
|
73
|
+
*/
|
|
74
|
+
measure(name: string, startMark: string, endMark?: string, metadata?: Record<string, unknown>): number;
|
|
75
|
+
/**
|
|
76
|
+
* Times a function execution
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* const duration = await perf.time('fetch', async () => {
|
|
81
|
+
* return fetch('/api/data')
|
|
82
|
+
* })
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
time<T>(name: string, fn: () => T | Promise<T>, metadata?: Record<string, unknown>): Promise<{
|
|
86
|
+
duration: number;
|
|
87
|
+
result: T;
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* Times a sync function execution
|
|
91
|
+
*/
|
|
92
|
+
timeSync<T>(name: string, fn: () => T, metadata?: Record<string, unknown>): {
|
|
93
|
+
duration: number;
|
|
94
|
+
result: T;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Registers callback for metric events
|
|
98
|
+
*/
|
|
99
|
+
on(callback: PerfCallback): () => void;
|
|
100
|
+
/**
|
|
101
|
+
* Emits metric to registered callbacks
|
|
102
|
+
*/
|
|
103
|
+
private emit;
|
|
104
|
+
/**
|
|
105
|
+
* Gets all recorded metrics
|
|
106
|
+
*/
|
|
107
|
+
getMetrics(): PerfMetric[];
|
|
108
|
+
/**
|
|
109
|
+
* Gets metrics by name
|
|
110
|
+
*/
|
|
111
|
+
getByName(name: string): PerfMetric[];
|
|
112
|
+
/**
|
|
113
|
+
* Gets average duration for named metric
|
|
114
|
+
*/
|
|
115
|
+
getAverage(name: string): number;
|
|
116
|
+
/**
|
|
117
|
+
* Clears all metrics
|
|
118
|
+
*/
|
|
119
|
+
clear(): void;
|
|
120
|
+
/**
|
|
121
|
+
* Gets current time in ms
|
|
122
|
+
*/
|
|
123
|
+
private now;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Creates a performance tracker instance
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```ts
|
|
130
|
+
* const perf = createPerfTracker()
|
|
131
|
+
* await perf.time('api-call', () => fetch('/api/data'))
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
declare function createPerfTracker(): PerfTracker;
|
|
135
|
+
/**
|
|
136
|
+
* Measures memory usage (Node.js only)
|
|
137
|
+
*
|
|
138
|
+
* @returns Memory usage in bytes
|
|
139
|
+
*/
|
|
140
|
+
declare function getMemoryUsage(): {
|
|
141
|
+
heapUsed: number;
|
|
142
|
+
heapTotal: number;
|
|
143
|
+
external: number;
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Decorator for automatic function timing
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* class DataService {
|
|
151
|
+
* @Timed()
|
|
152
|
+
* async fetchData() {
|
|
153
|
+
* return fetch('/api/data')
|
|
154
|
+
* }
|
|
155
|
+
* }
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
declare function Timed(name?: string): MethodDecorator;
|
|
159
|
+
/**
|
|
160
|
+
* Debounce function with performance tracking
|
|
161
|
+
*/
|
|
162
|
+
declare function debounce<T extends (...args: any[]) => any>(fn: T, wait: number, name?: string): T;
|
|
163
|
+
/**
|
|
164
|
+
* Throttle function with performance tracking
|
|
165
|
+
*/
|
|
166
|
+
declare function throttle<T extends (...args: any[]) => any>(fn: T, wait: number, name?: string): T;
|
|
167
|
+
|
|
168
|
+
export { type PerfCallback, type PerfMetric, PerfTracker, Timed, Timer, createPerfTracker, debounce, getMemoryUsage, throttle };
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
var Timer = class {
|
|
3
|
+
startTime;
|
|
4
|
+
constructor() {
|
|
5
|
+
this.startTime = this.now();
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Gets elapsed time in milliseconds
|
|
9
|
+
*/
|
|
10
|
+
elapsed() {
|
|
11
|
+
return this.now() - this.startTime;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resets timer
|
|
15
|
+
*/
|
|
16
|
+
reset() {
|
|
17
|
+
this.startTime = this.now();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Gets current time in milliseconds
|
|
21
|
+
*/
|
|
22
|
+
now() {
|
|
23
|
+
if (typeof performance !== "undefined" && performance.now) {
|
|
24
|
+
return performance.now();
|
|
25
|
+
}
|
|
26
|
+
return Date.now();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var PerfTracker = class {
|
|
30
|
+
marks = /* @__PURE__ */ new Map();
|
|
31
|
+
metrics = [];
|
|
32
|
+
callbacks = [];
|
|
33
|
+
/**
|
|
34
|
+
* Records a performance mark at current time
|
|
35
|
+
*/
|
|
36
|
+
mark(name, tags) {
|
|
37
|
+
const now = typeof performance !== "undefined" && performance.now ? performance.now() : Date.now();
|
|
38
|
+
this.marks.set(name, now);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Measures duration from mark to now
|
|
42
|
+
*/
|
|
43
|
+
measure(name, startMark, endMark, metadata) {
|
|
44
|
+
const startTime = this.marks.get(startMark);
|
|
45
|
+
if (startTime === void 0) {
|
|
46
|
+
console.warn(`Mark "${startMark}" not found`);
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
let endTime;
|
|
50
|
+
if (endMark) {
|
|
51
|
+
endTime = this.marks.get(endMark) ?? this.now();
|
|
52
|
+
} else {
|
|
53
|
+
endTime = this.now();
|
|
54
|
+
}
|
|
55
|
+
const duration = endTime - startTime;
|
|
56
|
+
const metric = {
|
|
57
|
+
name,
|
|
58
|
+
duration,
|
|
59
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
60
|
+
metadata
|
|
61
|
+
};
|
|
62
|
+
this.metrics.push(metric);
|
|
63
|
+
this.emit(metric);
|
|
64
|
+
return duration;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Times a function execution
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* const duration = await perf.time('fetch', async () => {
|
|
72
|
+
* return fetch('/api/data')
|
|
73
|
+
* })
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
async time(name, fn, metadata) {
|
|
77
|
+
const timer = new Timer();
|
|
78
|
+
try {
|
|
79
|
+
const result = await Promise.resolve(fn());
|
|
80
|
+
const duration = timer.elapsed();
|
|
81
|
+
const metric = {
|
|
82
|
+
name,
|
|
83
|
+
duration,
|
|
84
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
85
|
+
metadata
|
|
86
|
+
};
|
|
87
|
+
this.metrics.push(metric);
|
|
88
|
+
this.emit(metric);
|
|
89
|
+
return { duration, result };
|
|
90
|
+
} catch (error) {
|
|
91
|
+
const duration = timer.elapsed();
|
|
92
|
+
const metric = {
|
|
93
|
+
name,
|
|
94
|
+
duration,
|
|
95
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
96
|
+
metadata: {
|
|
97
|
+
...metadata,
|
|
98
|
+
error: error instanceof Error ? error.message : String(error)
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
this.metrics.push(metric);
|
|
102
|
+
this.emit(metric);
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Times a sync function execution
|
|
108
|
+
*/
|
|
109
|
+
timeSync(name, fn, metadata) {
|
|
110
|
+
const timer = new Timer();
|
|
111
|
+
try {
|
|
112
|
+
const result = fn();
|
|
113
|
+
const duration = timer.elapsed();
|
|
114
|
+
const metric = {
|
|
115
|
+
name,
|
|
116
|
+
duration,
|
|
117
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
118
|
+
metadata
|
|
119
|
+
};
|
|
120
|
+
this.metrics.push(metric);
|
|
121
|
+
this.emit(metric);
|
|
122
|
+
return { duration, result };
|
|
123
|
+
} catch (error) {
|
|
124
|
+
const duration = timer.elapsed();
|
|
125
|
+
const metric = {
|
|
126
|
+
name,
|
|
127
|
+
duration,
|
|
128
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
129
|
+
metadata: {
|
|
130
|
+
...metadata,
|
|
131
|
+
error: error instanceof Error ? error.message : String(error)
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
this.metrics.push(metric);
|
|
135
|
+
this.emit(metric);
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Registers callback for metric events
|
|
141
|
+
*/
|
|
142
|
+
on(callback) {
|
|
143
|
+
this.callbacks.push(callback);
|
|
144
|
+
return () => {
|
|
145
|
+
this.callbacks = this.callbacks.filter((cb) => cb !== callback);
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Emits metric to registered callbacks
|
|
150
|
+
*/
|
|
151
|
+
emit(metric) {
|
|
152
|
+
for (const callback of this.callbacks) {
|
|
153
|
+
try {
|
|
154
|
+
void callback(metric);
|
|
155
|
+
} catch {
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Gets all recorded metrics
|
|
161
|
+
*/
|
|
162
|
+
getMetrics() {
|
|
163
|
+
return [...this.metrics];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Gets metrics by name
|
|
167
|
+
*/
|
|
168
|
+
getByName(name) {
|
|
169
|
+
return this.metrics.filter((m) => m.name === name);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Gets average duration for named metric
|
|
173
|
+
*/
|
|
174
|
+
getAverage(name) {
|
|
175
|
+
const metrics = this.getByName(name);
|
|
176
|
+
if (metrics.length === 0) return 0;
|
|
177
|
+
const total = metrics.reduce((sum, m) => sum + m.duration, 0);
|
|
178
|
+
return total / metrics.length;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Clears all metrics
|
|
182
|
+
*/
|
|
183
|
+
clear() {
|
|
184
|
+
this.marks.clear();
|
|
185
|
+
this.metrics = [];
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Gets current time in ms
|
|
189
|
+
*/
|
|
190
|
+
now() {
|
|
191
|
+
if (typeof performance !== "undefined" && performance.now) {
|
|
192
|
+
return performance.now();
|
|
193
|
+
}
|
|
194
|
+
return Date.now();
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
function createPerfTracker() {
|
|
198
|
+
return new PerfTracker();
|
|
199
|
+
}
|
|
200
|
+
function getMemoryUsage() {
|
|
201
|
+
if (typeof process !== "undefined" && process.memoryUsage) {
|
|
202
|
+
const usage = process.memoryUsage();
|
|
203
|
+
return {
|
|
204
|
+
heapUsed: usage.heapUsed,
|
|
205
|
+
heapTotal: usage.heapTotal,
|
|
206
|
+
external: usage.external
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
heapUsed: 0,
|
|
211
|
+
heapTotal: 0,
|
|
212
|
+
external: 0
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function Timed(name) {
|
|
216
|
+
return function(target, prop, descriptor) {
|
|
217
|
+
if (!descriptor || typeof descriptor.value !== "function") {
|
|
218
|
+
return descriptor;
|
|
219
|
+
}
|
|
220
|
+
const originalFn = descriptor.value;
|
|
221
|
+
const metricName = name ?? String(prop);
|
|
222
|
+
const tracker = createPerfTracker();
|
|
223
|
+
descriptor.value = async function(...args) {
|
|
224
|
+
const { duration, result } = await tracker.time(
|
|
225
|
+
metricName,
|
|
226
|
+
() => originalFn.apply(this, args)
|
|
227
|
+
);
|
|
228
|
+
return result;
|
|
229
|
+
};
|
|
230
|
+
return descriptor;
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function debounce(fn, wait, name) {
|
|
234
|
+
let timeout = null;
|
|
235
|
+
const tracker = createPerfTracker();
|
|
236
|
+
return ((...args) => {
|
|
237
|
+
if (timeout) {
|
|
238
|
+
clearTimeout(timeout);
|
|
239
|
+
}
|
|
240
|
+
timeout = setTimeout(() => {
|
|
241
|
+
void tracker.timeSync(name ?? fn.name, () => fn(...args));
|
|
242
|
+
}, wait);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
function throttle(fn, wait, name) {
|
|
246
|
+
let last = 0;
|
|
247
|
+
const tracker = createPerfTracker();
|
|
248
|
+
return ((...args) => {
|
|
249
|
+
const now = Date.now();
|
|
250
|
+
if (now - last >= wait) {
|
|
251
|
+
last = now;
|
|
252
|
+
void tracker.timeSync(name ?? fn.name, () => fn(...args));
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
export {
|
|
257
|
+
PerfTracker,
|
|
258
|
+
Timed,
|
|
259
|
+
Timer,
|
|
260
|
+
createPerfTracker,
|
|
261
|
+
debounce,
|
|
262
|
+
getMemoryUsage,
|
|
263
|
+
throttle
|
|
264
|
+
};
|
|
265
|
+
//# sourceMappingURL=index.js.map
|