@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.
Files changed (177) hide show
  1. package/package.json +62 -3
  2. package/packages/convex/shared/README.md +1 -1
  3. package/packages/devtools/dist/index.d.ts +204 -0
  4. package/packages/devtools/dist/index.js +186 -0
  5. package/packages/devtools/dist/index.js.map +1 -0
  6. package/packages/devtools/react/README.md +1 -1
  7. package/packages/devtools/solidjs/README.md +1 -1
  8. package/packages/devtools/solidjs/dist/index.js +1830 -0
  9. package/packages/devtools/solidjs/dist/index.js.map +1 -0
  10. package/packages/env/dist/index.d.ts +151 -0
  11. package/packages/env/dist/index.js +93 -0
  12. package/packages/env/dist/index.js.map +1 -0
  13. package/packages/errors/dist/index.d.ts +177 -0
  14. package/packages/errors/dist/index.js +187 -0
  15. package/packages/errors/dist/index.js.map +1 -0
  16. package/packages/errors/react/README.md +1 -1
  17. package/packages/errors/solidjs/README.md +1 -1
  18. package/packages/logger/dist/index.d.ts +171 -0
  19. package/packages/logger/dist/index.js +216 -0
  20. package/packages/logger/dist/index.js.map +1 -0
  21. package/packages/logger/react/README.md +1 -1
  22. package/packages/logger/solidjs/README.md +1 -1
  23. package/packages/perf/dist/index.d.ts +168 -0
  24. package/packages/perf/dist/index.js +265 -0
  25. package/packages/perf/dist/index.js.map +1 -0
  26. package/packages/perf/react/README.md +1 -1
  27. package/packages/perf/solidjs/README.md +1 -1
  28. package/packages/shared/dist/index.d.ts +253 -0
  29. package/packages/shared/dist/index.js +278 -0
  30. package/packages/shared/dist/index.js.map +1 -0
  31. package/.changeset/config.json +0 -11
  32. package/.env.example +0 -2
  33. package/.github/CODEOWNERS +0 -1
  34. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -16
  35. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -11
  36. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  37. package/.github/dependabot.yml +0 -11
  38. package/.github/workflows/ci.yml +0 -23
  39. package/.github/workflows/release.yml +0 -29
  40. package/.node-version +0 -1
  41. package/.nvmrc +0 -1
  42. package/.prettierrc +0 -7
  43. package/.project/ACCOUNT.yaml +0 -4
  44. package/.project/IDEAS.yaml +0 -7
  45. package/.project/PROJECT.yaml +0 -11
  46. package/.project/ROADMAP.yaml +0 -15
  47. package/CODE_OF_CONDUCT.md +0 -26
  48. package/CONTRIBUTING.md +0 -69
  49. package/SECURITY.md +0 -18
  50. package/SUPPORT.md +0 -14
  51. package/packages/convex/shared/package.json +0 -42
  52. package/packages/convex/shared/src/audit/index.ts +0 -5
  53. package/packages/convex/shared/src/audit/presets.ts +0 -165
  54. package/packages/convex/shared/src/audit/schema.ts +0 -85
  55. package/packages/convex/shared/src/audit/write.ts +0 -102
  56. package/packages/convex/shared/src/extract.ts +0 -75
  57. package/packages/convex/shared/src/index.ts +0 -41
  58. package/packages/convex/shared/src/messages.ts +0 -45
  59. package/packages/convex/shared/src/security.ts +0 -112
  60. package/packages/convex/shared/src/throw.ts +0 -184
  61. package/packages/convex/shared/src/types.ts +0 -57
  62. package/packages/convex/shared/src/utils.ts +0 -58
  63. package/packages/convex/shared/tsconfig.json +0 -28
  64. package/packages/convex/shared/tsup.config.ts +0 -12
  65. package/packages/devtools/package.json +0 -27
  66. package/packages/devtools/react/package.json +0 -53
  67. package/packages/devtools/react/src/components/DesignPreview.tsx +0 -59
  68. package/packages/devtools/react/src/components/DesignSwitcherDropdown.tsx +0 -99
  69. package/packages/devtools/react/src/components/DevSidebar.tsx +0 -247
  70. package/packages/devtools/react/src/components/DevToolbar.tsx +0 -242
  71. package/packages/devtools/react/src/components/GitHubIssueDialog.tsx +0 -402
  72. package/packages/devtools/react/src/components/InspectorOverlay.tsx +0 -312
  73. package/packages/devtools/react/src/components/PageLoadWaterfall.tsx +0 -144
  74. package/packages/devtools/react/src/components/PerformancePanel.tsx +0 -330
  75. package/packages/devtools/react/src/context/DevModeContext.tsx +0 -226
  76. package/packages/devtools/react/src/context/PerformanceContext.tsx +0 -143
  77. package/packages/devtools/react/src/data/designs.ts +0 -13
  78. package/packages/devtools/react/src/hooks/useGitHubLabels.ts +0 -47
  79. package/packages/devtools/react/src/hooks/useVirtualList.ts +0 -124
  80. package/packages/devtools/react/src/index.ts +0 -77
  81. package/packages/devtools/react/src/panels/ConvexSpy.tsx +0 -130
  82. package/packages/devtools/react/src/panels/DatabaseSeeder.tsx +0 -116
  83. package/packages/devtools/react/src/panels/DevModePhase2.tsx +0 -191
  84. package/packages/devtools/react/src/panels/DevModePhase3.tsx +0 -234
  85. package/packages/devtools/react/src/panels/FeatureFlagsToggle.tsx +0 -104
  86. package/packages/devtools/react/src/panels/QuickRouteJump.tsx +0 -152
  87. package/packages/devtools/react/src/services/github-service.ts +0 -247
  88. package/packages/devtools/react/tsconfig.json +0 -31
  89. package/packages/devtools/react/tsup.config.ts +0 -18
  90. package/packages/devtools/solidjs/package.json +0 -49
  91. package/packages/devtools/solidjs/src/components/DesignPreview.tsx +0 -51
  92. package/packages/devtools/solidjs/src/components/DesignSwitcherDropdown.tsx +0 -95
  93. package/packages/devtools/solidjs/src/components/DevSidebar.tsx +0 -247
  94. package/packages/devtools/solidjs/src/components/DevToolbar.tsx +0 -242
  95. package/packages/devtools/solidjs/src/components/GitHubIssueDialog.tsx +0 -400
  96. package/packages/devtools/solidjs/src/components/InspectorOverlay.tsx +0 -311
  97. package/packages/devtools/solidjs/src/components/PageLoadWaterfall.tsx +0 -144
  98. package/packages/devtools/solidjs/src/components/PerformancePanel.tsx +0 -330
  99. package/packages/devtools/solidjs/src/context/DevModeContext.tsx +0 -216
  100. package/packages/devtools/solidjs/src/context/PerformanceContext.tsx +0 -135
  101. package/packages/devtools/solidjs/src/data/designs.ts +0 -13
  102. package/packages/devtools/solidjs/src/hooks/createGitHubLabels.ts +0 -47
  103. package/packages/devtools/solidjs/src/index.ts +0 -64
  104. package/packages/devtools/solidjs/src/services/github-service.ts +0 -247
  105. package/packages/devtools/solidjs/tsconfig.json +0 -21
  106. package/packages/devtools/src/index.ts +0 -377
  107. package/packages/devtools/tsup.config.ts +0 -12
  108. package/packages/env/package.json +0 -30
  109. package/packages/env/src/index.ts +0 -264
  110. package/packages/env/tsup.config.ts +0 -12
  111. package/packages/errors/package.json +0 -27
  112. package/packages/errors/react/package.json +0 -72
  113. package/packages/errors/react/src/analytics.ts +0 -16
  114. package/packages/errors/react/src/components/ErrorBoundary.tsx +0 -248
  115. package/packages/errors/react/src/components/ErrorDisplay.tsx +0 -328
  116. package/packages/errors/react/src/components/ValidationErrors.tsx +0 -102
  117. package/packages/errors/react/src/config.ts +0 -199
  118. package/packages/errors/react/src/constants.ts +0 -74
  119. package/packages/errors/react/src/hooks/useErrorBoundary.ts +0 -92
  120. package/packages/errors/react/src/hooks/useErrorHandler.ts +0 -87
  121. package/packages/errors/react/src/index.ts +0 -96
  122. package/packages/errors/react/src/types.ts +0 -102
  123. package/packages/errors/react/src/utils/errorMessages.ts +0 -35
  124. package/packages/errors/react/src/utils/errorPolicy.ts +0 -139
  125. package/packages/errors/react/src/utils/extractAppError.ts +0 -174
  126. package/packages/errors/react/src/utils/formatError.ts +0 -112
  127. package/packages/errors/react/tsconfig.json +0 -25
  128. package/packages/errors/react/tsup.config.ts +0 -24
  129. package/packages/errors/solidjs/package.json +0 -46
  130. package/packages/errors/solidjs/src/components/ErrorDisplay.tsx +0 -179
  131. package/packages/errors/solidjs/src/config.ts +0 -98
  132. package/packages/errors/solidjs/src/hooks/createErrorHandler.ts +0 -107
  133. package/packages/errors/solidjs/src/index.ts +0 -61
  134. package/packages/errors/solidjs/src/types.ts +0 -34
  135. package/packages/errors/solidjs/src/utils/errorPolicy.ts +0 -56
  136. package/packages/errors/solidjs/src/utils/extractAppError.ts +0 -94
  137. package/packages/errors/solidjs/src/utils/formatError.ts +0 -33
  138. package/packages/errors/solidjs/tsconfig.json +0 -26
  139. package/packages/errors/solidjs/tsup.config.ts +0 -21
  140. package/packages/errors/src/index.ts +0 -320
  141. package/packages/errors/tsup.config.ts +0 -12
  142. package/packages/logger/package.json +0 -27
  143. package/packages/logger/react/package.json +0 -46
  144. package/packages/logger/react/src/index.ts +0 -4
  145. package/packages/logger/react/src/useMetrics.ts +0 -42
  146. package/packages/logger/react/src/usePerformanceLog.ts +0 -61
  147. package/packages/logger/react/tsconfig.json +0 -31
  148. package/packages/logger/react/tsup.config.ts +0 -12
  149. package/packages/logger/solidjs/package.json +0 -45
  150. package/packages/logger/solidjs/src/createMetrics.ts +0 -37
  151. package/packages/logger/solidjs/src/createPerformanceLog.ts +0 -58
  152. package/packages/logger/solidjs/src/index.ts +0 -4
  153. package/packages/logger/solidjs/tsconfig.json +0 -32
  154. package/packages/logger/solidjs/tsup.config.ts +0 -12
  155. package/packages/logger/src/index.ts +0 -363
  156. package/packages/logger/tsup.config.ts +0 -12
  157. package/packages/perf/package.json +0 -27
  158. package/packages/perf/react/package.json +0 -59
  159. package/packages/perf/react/src/components/PerformanceDashboard.tsx +0 -257
  160. package/packages/perf/react/src/hooks/useMonitoredQuery.ts +0 -89
  161. package/packages/perf/react/src/hooks/usePerformanceMetrics.ts +0 -78
  162. package/packages/perf/react/src/index.ts +0 -33
  163. package/packages/perf/react/src/services/PerformanceMonitor.ts +0 -313
  164. package/packages/perf/react/src/types.ts +0 -77
  165. package/packages/perf/react/tsconfig.json +0 -25
  166. package/packages/perf/react/tsup.config.ts +0 -19
  167. package/packages/perf/solidjs/package.json +0 -41
  168. package/packages/perf/solidjs/src/components/PerformanceDashboard.tsx +0 -207
  169. package/packages/perf/solidjs/src/hooks/createPerformanceMetrics.ts +0 -73
  170. package/packages/perf/solidjs/src/index.ts +0 -31
  171. package/packages/perf/solidjs/src/services/PerformanceMonitor.ts +0 -134
  172. package/packages/perf/solidjs/src/types.ts +0 -78
  173. package/packages/perf/solidjs/tsconfig.json +0 -26
  174. package/packages/perf/solidjs/tsup.config.ts +0 -14
  175. package/packages/perf/src/index.ts +0 -410
  176. package/packages/perf/tsup.config.ts +0 -12
  177. 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-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
+ # ✦ @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-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
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