@geenius/tools 0.1.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 (160) hide show
  1. package/.changeset/config.json +11 -0
  2. package/.env.example +2 -0
  3. package/.github/CODEOWNERS +1 -0
  4. package/.github/ISSUE_TEMPLATE/bug_report.md +16 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +11 -0
  6. package/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  7. package/.github/dependabot.yml +11 -0
  8. package/.github/workflows/ci.yml +23 -0
  9. package/.github/workflows/release.yml +29 -0
  10. package/.node-version +1 -0
  11. package/.nvmrc +1 -0
  12. package/.prettierrc +7 -0
  13. package/.project/ACCOUNT.yaml +4 -0
  14. package/.project/IDEAS.yaml +7 -0
  15. package/.project/PROJECT.yaml +11 -0
  16. package/.project/ROADMAP.yaml +15 -0
  17. package/CHANGELOG.md +16 -0
  18. package/CODE_OF_CONDUCT.md +26 -0
  19. package/CONTRIBUTING.md +69 -0
  20. package/LICENSE +21 -0
  21. package/README.md +1 -0
  22. package/SECURITY.md +18 -0
  23. package/SUPPORT.md +14 -0
  24. package/package.json +75 -0
  25. package/packages/convex/shared/README.md +1 -0
  26. package/packages/convex/shared/package.json +42 -0
  27. package/packages/convex/shared/src/audit/index.ts +5 -0
  28. package/packages/convex/shared/src/audit/presets.ts +165 -0
  29. package/packages/convex/shared/src/audit/schema.ts +85 -0
  30. package/packages/convex/shared/src/audit/write.ts +102 -0
  31. package/packages/convex/shared/src/extract.ts +75 -0
  32. package/packages/convex/shared/src/index.ts +41 -0
  33. package/packages/convex/shared/src/messages.ts +45 -0
  34. package/packages/convex/shared/src/security.ts +112 -0
  35. package/packages/convex/shared/src/throw.ts +184 -0
  36. package/packages/convex/shared/src/types.ts +57 -0
  37. package/packages/convex/shared/src/utils.ts +58 -0
  38. package/packages/convex/shared/tsconfig.json +28 -0
  39. package/packages/convex/shared/tsup.config.ts +12 -0
  40. package/packages/devtools/package.json +27 -0
  41. package/packages/devtools/react/README.md +1 -0
  42. package/packages/devtools/react/package.json +53 -0
  43. package/packages/devtools/react/src/components/DesignPreview.tsx +59 -0
  44. package/packages/devtools/react/src/components/DesignSwitcherDropdown.tsx +99 -0
  45. package/packages/devtools/react/src/components/DevSidebar.tsx +247 -0
  46. package/packages/devtools/react/src/components/DevToolbar.tsx +242 -0
  47. package/packages/devtools/react/src/components/GitHubIssueDialog.tsx +402 -0
  48. package/packages/devtools/react/src/components/InspectorOverlay.tsx +312 -0
  49. package/packages/devtools/react/src/components/PageLoadWaterfall.tsx +144 -0
  50. package/packages/devtools/react/src/components/PerformancePanel.tsx +330 -0
  51. package/packages/devtools/react/src/context/DevModeContext.tsx +226 -0
  52. package/packages/devtools/react/src/context/PerformanceContext.tsx +143 -0
  53. package/packages/devtools/react/src/data/designs.ts +13 -0
  54. package/packages/devtools/react/src/hooks/useGitHubLabels.ts +47 -0
  55. package/packages/devtools/react/src/hooks/useVirtualList.ts +124 -0
  56. package/packages/devtools/react/src/index.ts +77 -0
  57. package/packages/devtools/react/src/panels/ConvexSpy.tsx +130 -0
  58. package/packages/devtools/react/src/panels/DatabaseSeeder.tsx +116 -0
  59. package/packages/devtools/react/src/panels/DevModePhase2.tsx +191 -0
  60. package/packages/devtools/react/src/panels/DevModePhase3.tsx +234 -0
  61. package/packages/devtools/react/src/panels/FeatureFlagsToggle.tsx +104 -0
  62. package/packages/devtools/react/src/panels/QuickRouteJump.tsx +152 -0
  63. package/packages/devtools/react/src/services/github-service.ts +247 -0
  64. package/packages/devtools/react/tsconfig.json +31 -0
  65. package/packages/devtools/react/tsup.config.ts +18 -0
  66. package/packages/devtools/solidjs/README.md +1 -0
  67. package/packages/devtools/solidjs/package.json +49 -0
  68. package/packages/devtools/solidjs/src/components/DesignPreview.tsx +51 -0
  69. package/packages/devtools/solidjs/src/components/DesignSwitcherDropdown.tsx +95 -0
  70. package/packages/devtools/solidjs/src/components/DevSidebar.tsx +247 -0
  71. package/packages/devtools/solidjs/src/components/DevToolbar.tsx +242 -0
  72. package/packages/devtools/solidjs/src/components/GitHubIssueDialog.tsx +400 -0
  73. package/packages/devtools/solidjs/src/components/InspectorOverlay.tsx +311 -0
  74. package/packages/devtools/solidjs/src/components/PageLoadWaterfall.tsx +144 -0
  75. package/packages/devtools/solidjs/src/components/PerformancePanel.tsx +330 -0
  76. package/packages/devtools/solidjs/src/context/DevModeContext.tsx +216 -0
  77. package/packages/devtools/solidjs/src/context/PerformanceContext.tsx +135 -0
  78. package/packages/devtools/solidjs/src/data/designs.ts +13 -0
  79. package/packages/devtools/solidjs/src/hooks/createGitHubLabels.ts +47 -0
  80. package/packages/devtools/solidjs/src/index.ts +64 -0
  81. package/packages/devtools/solidjs/src/services/github-service.ts +247 -0
  82. package/packages/devtools/solidjs/tsconfig.json +21 -0
  83. package/packages/devtools/src/index.ts +377 -0
  84. package/packages/devtools/tsup.config.ts +12 -0
  85. package/packages/env/package.json +30 -0
  86. package/packages/env/src/index.ts +264 -0
  87. package/packages/env/tsup.config.ts +12 -0
  88. package/packages/errors/package.json +27 -0
  89. package/packages/errors/react/README.md +1 -0
  90. package/packages/errors/react/package.json +72 -0
  91. package/packages/errors/react/src/analytics.ts +16 -0
  92. package/packages/errors/react/src/components/ErrorBoundary.tsx +248 -0
  93. package/packages/errors/react/src/components/ErrorDisplay.tsx +328 -0
  94. package/packages/errors/react/src/components/ValidationErrors.tsx +102 -0
  95. package/packages/errors/react/src/config.ts +199 -0
  96. package/packages/errors/react/src/constants.ts +74 -0
  97. package/packages/errors/react/src/hooks/useErrorBoundary.ts +92 -0
  98. package/packages/errors/react/src/hooks/useErrorHandler.ts +87 -0
  99. package/packages/errors/react/src/index.ts +96 -0
  100. package/packages/errors/react/src/types.ts +102 -0
  101. package/packages/errors/react/src/utils/errorMessages.ts +35 -0
  102. package/packages/errors/react/src/utils/errorPolicy.ts +139 -0
  103. package/packages/errors/react/src/utils/extractAppError.ts +174 -0
  104. package/packages/errors/react/src/utils/formatError.ts +112 -0
  105. package/packages/errors/react/tsconfig.json +25 -0
  106. package/packages/errors/react/tsup.config.ts +24 -0
  107. package/packages/errors/solidjs/README.md +1 -0
  108. package/packages/errors/solidjs/package.json +46 -0
  109. package/packages/errors/solidjs/src/components/ErrorDisplay.tsx +179 -0
  110. package/packages/errors/solidjs/src/config.ts +98 -0
  111. package/packages/errors/solidjs/src/hooks/createErrorHandler.ts +107 -0
  112. package/packages/errors/solidjs/src/index.ts +61 -0
  113. package/packages/errors/solidjs/src/types.ts +34 -0
  114. package/packages/errors/solidjs/src/utils/errorPolicy.ts +56 -0
  115. package/packages/errors/solidjs/src/utils/extractAppError.ts +94 -0
  116. package/packages/errors/solidjs/src/utils/formatError.ts +33 -0
  117. package/packages/errors/solidjs/tsconfig.json +26 -0
  118. package/packages/errors/solidjs/tsup.config.ts +21 -0
  119. package/packages/errors/src/index.ts +320 -0
  120. package/packages/errors/tsup.config.ts +12 -0
  121. package/packages/logger/package.json +27 -0
  122. package/packages/logger/react/README.md +1 -0
  123. package/packages/logger/react/package.json +46 -0
  124. package/packages/logger/react/src/index.ts +4 -0
  125. package/packages/logger/react/src/useMetrics.ts +42 -0
  126. package/packages/logger/react/src/usePerformanceLog.ts +61 -0
  127. package/packages/logger/react/tsconfig.json +31 -0
  128. package/packages/logger/react/tsup.config.ts +12 -0
  129. package/packages/logger/solidjs/README.md +1 -0
  130. package/packages/logger/solidjs/package.json +45 -0
  131. package/packages/logger/solidjs/src/createMetrics.ts +37 -0
  132. package/packages/logger/solidjs/src/createPerformanceLog.ts +58 -0
  133. package/packages/logger/solidjs/src/index.ts +4 -0
  134. package/packages/logger/solidjs/tsconfig.json +32 -0
  135. package/packages/logger/solidjs/tsup.config.ts +12 -0
  136. package/packages/logger/src/index.ts +363 -0
  137. package/packages/logger/tsup.config.ts +12 -0
  138. package/packages/perf/package.json +27 -0
  139. package/packages/perf/react/README.md +1 -0
  140. package/packages/perf/react/package.json +59 -0
  141. package/packages/perf/react/src/components/PerformanceDashboard.tsx +257 -0
  142. package/packages/perf/react/src/hooks/useMonitoredQuery.ts +89 -0
  143. package/packages/perf/react/src/hooks/usePerformanceMetrics.ts +78 -0
  144. package/packages/perf/react/src/index.ts +33 -0
  145. package/packages/perf/react/src/services/PerformanceMonitor.ts +313 -0
  146. package/packages/perf/react/src/types.ts +77 -0
  147. package/packages/perf/react/tsconfig.json +25 -0
  148. package/packages/perf/react/tsup.config.ts +19 -0
  149. package/packages/perf/solidjs/README.md +1 -0
  150. package/packages/perf/solidjs/package.json +41 -0
  151. package/packages/perf/solidjs/src/components/PerformanceDashboard.tsx +207 -0
  152. package/packages/perf/solidjs/src/hooks/createPerformanceMetrics.ts +73 -0
  153. package/packages/perf/solidjs/src/index.ts +31 -0
  154. package/packages/perf/solidjs/src/services/PerformanceMonitor.ts +134 -0
  155. package/packages/perf/solidjs/src/types.ts +78 -0
  156. package/packages/perf/solidjs/tsconfig.json +26 -0
  157. package/packages/perf/solidjs/tsup.config.ts +14 -0
  158. package/packages/perf/src/index.ts +410 -0
  159. package/packages/perf/tsup.config.ts +12 -0
  160. package/pnpm-workspace.yaml +2 -0
@@ -0,0 +1,37 @@
1
+ // @geenius-tools/logger-solid — src/createMetrics.ts
2
+
3
+ import { createSignal, onCleanup } from 'solid-js'
4
+ import { metricsStore, type PerformanceMetric, type MetricsStore } from '@geenius-tools/logger'
5
+
6
+ /**
7
+ * SolidJS reactive primitive for subscribing to the MetricsStore.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * import { createMetrics } from '@geenius-tools/logger-solidjs'
12
+ * import { For } from 'solid-js'
13
+ *
14
+ * function DevPanel() {
15
+ * const metrics = createMetrics()
16
+ *
17
+ * return (
18
+ * <ul>
19
+ * <For each={metrics()}>
20
+ * {(m) => <li>{m.name}: {m.duration?.toFixed(2)}ms</li>}
21
+ * </For>
22
+ * </ul>
23
+ * )
24
+ * }
25
+ * ```
26
+ */
27
+ export function createMetrics(store: MetricsStore = metricsStore) {
28
+ const [metrics, setMetrics] = createSignal<PerformanceMetric[]>(store.getMetrics())
29
+
30
+ const unsubscribe = store.subscribe(() => {
31
+ setMetrics([...store.getMetrics()])
32
+ })
33
+
34
+ onCleanup(unsubscribe)
35
+
36
+ return metrics
37
+ }
@@ -0,0 +1,58 @@
1
+ // @geenius-tools/logger-solid — src/createPerformanceLog.ts
2
+
3
+ import {
4
+ perfLog,
5
+ type LogCategory,
6
+ type PerformanceLogger,
7
+ } from '@geenius-tools/logger'
8
+
9
+ /**
10
+ * SolidJS helper for component-scoped performance logging.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * import { createPerformanceLog } from '@geenius-tools/logger-solidjs'
15
+ *
16
+ * function MyComponent() {
17
+ * const perf = createPerformanceLog('MyComponent')
18
+ *
19
+ * onMount(() => {
20
+ * perf.logMount()
21
+ * })
22
+ *
23
+ * onCleanup(() => {
24
+ * perf.logUnmount()
25
+ * })
26
+ *
27
+ * const handleClick = async () => {
28
+ * const end = perf.start('fetch data', 'query')
29
+ * await fetchData()
30
+ * end()
31
+ * }
32
+ * }
33
+ * ```
34
+ */
35
+ export function createPerformanceLog(
36
+ componentName: string,
37
+ logger: PerformanceLogger = perfLog,
38
+ ) {
39
+ return {
40
+ /** Log component mounted */
41
+ logMount: () =>
42
+ logger.log(componentName, 'Component mounted', undefined, 'component'),
43
+ /** Log component unmounted */
44
+ logUnmount: () =>
45
+ logger.log(componentName, 'Component unmounted', undefined, 'component'),
46
+ /** Track render count */
47
+ logRender: () => logger.renderCount(componentName),
48
+ /** Log an effect execution */
49
+ logEffect: (effectName: string) =>
50
+ logger.log(componentName, `Effect: ${effectName}`, undefined, 'effect'),
51
+ /** Start a timed operation, returns stop function */
52
+ start: (operation: string, category?: LogCategory) =>
53
+ logger.start(componentName, operation, category),
54
+ /** Generic log scoped to this component */
55
+ log: (message: string, data?: unknown, category?: LogCategory) =>
56
+ logger.log(componentName, message, data, category),
57
+ }
58
+ }
@@ -0,0 +1,4 @@
1
+ // @geenius-tools/logger-solid — src/index.ts
2
+
3
+ export { createPerformanceLog } from './createPerformanceLog'
4
+ export { createMetrics } from './createMetrics'
@@ -0,0 +1,32 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "jsx": "preserve",
7
+ "jsxImportSource": "solid-js",
8
+ "lib": [
9
+ "ES2022",
10
+ "DOM",
11
+ "DOM.Iterable"
12
+ ],
13
+ "strict": true,
14
+ "esModuleInterop": true,
15
+ "skipLibCheck": true,
16
+ "forceConsistentCasingInFileNames": true,
17
+ "resolveJsonModule": true,
18
+ "isolatedModules": true,
19
+ "declaration": true,
20
+ "declarationMap": true,
21
+ "sourceMap": true,
22
+ "outDir": "./dist",
23
+ "rootDir": "./src"
24
+ },
25
+ "include": [
26
+ "src"
27
+ ],
28
+ "exclude": [
29
+ "node_modules",
30
+ "dist"
31
+ ]
32
+ }
@@ -0,0 +1,12 @@
1
+ import { defineConfig } from 'tsup'
2
+
3
+ export default defineConfig({
4
+ entry: { index: 'src/index.ts' },
5
+ outDir: 'dist',
6
+ format: ['esm'],
7
+ dts: true,
8
+ sourcemap: true,
9
+ clean: true,
10
+ treeshake: true,
11
+ external: ['solid-js', '@geenius-tools/logger'],
12
+ })
@@ -0,0 +1,363 @@
1
+ /**
2
+ * @geenius-tools/logger — Structured logging
3
+ *
4
+ * Provides structured logging with levels, formatting, and contextual data.
5
+ * Suitable for both client and server environments.
6
+ */
7
+
8
+ /**
9
+ * Log levels in order of severity
10
+ */
11
+ export enum LogLevel {
12
+ DEBUG = 0,
13
+ INFO = 1,
14
+ WARN = 2,
15
+ ERROR = 3,
16
+ FATAL = 4,
17
+ }
18
+
19
+ /**
20
+ * Log entry structure
21
+ */
22
+ export interface LogEntry {
23
+ /** Log level */
24
+ level: LogLevel
25
+ /** Log message */
26
+ message: string
27
+ /** Contextual data */
28
+ context?: Record<string, unknown>
29
+ /** Error object if applicable */
30
+ error?: Error | unknown
31
+ /** Timestamp */
32
+ timestamp: Date
33
+ /** Additional metadata */
34
+ metadata?: Record<string, unknown>
35
+ }
36
+
37
+ /**
38
+ * Log formatter function
39
+ */
40
+ export type LogFormatter = (entry: LogEntry) => string
41
+
42
+ /**
43
+ * Logger transport (where logs go)
44
+ */
45
+ export interface LogTransport {
46
+ /** Log handler function */
47
+ log(entry: LogEntry): void | Promise<void>
48
+ }
49
+
50
+ /**
51
+ * Logger configuration
52
+ */
53
+ export interface LoggerConfig {
54
+ /** Minimum log level to output (default: INFO) */
55
+ level?: LogLevel
56
+ /** Custom formatter (default: pretty print) */
57
+ formatter?: LogFormatter
58
+ /** Log transports */
59
+ transports?: LogTransport[]
60
+ /** Whether to include timestamps (default: true) */
61
+ timestamps?: boolean
62
+ /** Whether to include source location (default: false) */
63
+ sourceLocation?: boolean
64
+ }
65
+
66
+ /**
67
+ * Structured logger with context and levels
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * const logger = createLogger({ level: LogLevel.DEBUG })
72
+ *
73
+ * logger.info('User signed in', { userId: '123' })
74
+ * logger.error('Database error', { error })
75
+ * logger.debug('Cache hit', { key: 'user:123' })
76
+ * ```
77
+ */
78
+ export class Logger {
79
+ private level: LogLevel
80
+ private formatter: LogFormatter
81
+ private transports: LogTransport[]
82
+ private timestamps: boolean
83
+ private sourceLocation: boolean
84
+ private context: Map<string, unknown> = new Map()
85
+
86
+ constructor(config: LoggerConfig = {}) {
87
+ this.level = config.level ?? LogLevel.INFO
88
+ this.formatter = config.formatter ?? defaultFormatter
89
+ this.transports = config.transports ?? [consoleTransport]
90
+ this.timestamps = config.timestamps !== false
91
+ this.sourceLocation = config.sourceLocation ?? false
92
+ }
93
+
94
+ /**
95
+ * Logs with debug level
96
+ */
97
+ debug(message: string, context?: Record<string, unknown>) {
98
+ this.log(LogLevel.DEBUG, message, context)
99
+ }
100
+
101
+ /**
102
+ * Logs with info level
103
+ */
104
+ info(message: string, context?: Record<string, unknown>) {
105
+ this.log(LogLevel.INFO, message, context)
106
+ }
107
+
108
+ /**
109
+ * Logs with warn level
110
+ */
111
+ warn(message: string, context?: Record<string, unknown>) {
112
+ this.log(LogLevel.WARN, message, context)
113
+ }
114
+
115
+ /**
116
+ * Logs with error level
117
+ */
118
+ error(message: string, error?: Error | unknown, context?: Record<string, unknown>) {
119
+ this.log(LogLevel.ERROR, message, context, error)
120
+ }
121
+
122
+ /**
123
+ * Logs with fatal level
124
+ */
125
+ fatal(message: string, error?: Error | unknown, context?: Record<string, unknown>) {
126
+ this.log(LogLevel.FATAL, message, context, error)
127
+ }
128
+
129
+ /**
130
+ * Core logging method
131
+ */
132
+ private log(
133
+ level: LogLevel,
134
+ message: string,
135
+ context?: Record<string, unknown>,
136
+ error?: Error | unknown
137
+ ) {
138
+ if (level < this.level) {
139
+ return
140
+ }
141
+
142
+ const mergedContext = {
143
+ ...Object.fromEntries(this.context),
144
+ ...context,
145
+ }
146
+
147
+ const entry: LogEntry = {
148
+ level,
149
+ message,
150
+ context: Object.keys(mergedContext).length > 0 ? mergedContext : undefined,
151
+ error,
152
+ timestamp: new Date(),
153
+ }
154
+
155
+ if (this.sourceLocation) {
156
+ entry.metadata = {
157
+ ...entry.metadata,
158
+ location: this.getSourceLocation(),
159
+ }
160
+ }
161
+
162
+ const formatted = this.formatter(entry)
163
+
164
+ for (const transport of this.transports) {
165
+ try {
166
+ void transport.log(entry)
167
+ } catch {
168
+ // Silently fail to prevent logger errors from breaking app
169
+ }
170
+ }
171
+ }
172
+
173
+ /**
174
+ * Sets context for all subsequent logs
175
+ */
176
+ setContext(key: string, value: unknown) {
177
+ this.context.set(key, value)
178
+ return this
179
+ }
180
+
181
+ /**
182
+ * Gets current context
183
+ */
184
+ getContext(): Record<string, unknown> {
185
+ return Object.fromEntries(this.context)
186
+ }
187
+
188
+ /**
189
+ * Clears context
190
+ */
191
+ clearContext() {
192
+ this.context.clear()
193
+ return this
194
+ }
195
+
196
+ /**
197
+ * Creates a child logger with inherited context
198
+ */
199
+ child(context: Record<string, unknown>): Logger {
200
+ const child = new Logger({
201
+ level: this.level,
202
+ formatter: this.formatter,
203
+ transports: this.transports,
204
+ timestamps: this.timestamps,
205
+ sourceLocation: this.sourceLocation,
206
+ })
207
+
208
+ // Inherit context
209
+ for (const [key, value] of this.context) {
210
+ child.setContext(key, value)
211
+ }
212
+
213
+ // Add child context
214
+ for (const [key, value] of Object.entries(context)) {
215
+ child.setContext(key, value)
216
+ }
217
+
218
+ return child
219
+ }
220
+
221
+ /**
222
+ * Gets source location from stack trace
223
+ */
224
+ private getSourceLocation(): { file: string; line: number } {
225
+ const stack = new Error().stack || ''
226
+ const lines = stack.split('\n')
227
+
228
+ // Skip error message and this method
229
+ for (let i = 2; i < lines.length; i++) {
230
+ const line = lines[i]
231
+ if (line.includes('Logger.') || line.includes('logger.')) {
232
+ continue
233
+ }
234
+
235
+ const match = line.match(/at\s+(?:.*?\s+)?\(?([^:\)]+):(\d+)/)
236
+ if (match) {
237
+ return {
238
+ file: match[1],
239
+ line: parseInt(match[2]),
240
+ }
241
+ }
242
+ }
243
+
244
+ return { file: 'unknown', line: 0 }
245
+ }
246
+ }
247
+
248
+ /**
249
+ * Default log formatter with colors (for terminal)
250
+ */
251
+ const defaultFormatter: LogFormatter = (entry: LogEntry) => {
252
+ const levelName = LogLevel[entry.level]
253
+ const timestamp = entry.timestamp.toISOString()
254
+
255
+ let output = `[${timestamp}] [${levelName}] ${entry.message}`
256
+
257
+ if (entry.context && Object.keys(entry.context).length > 0) {
258
+ output += ` ${JSON.stringify(entry.context)}`
259
+ }
260
+
261
+ if (entry.error) {
262
+ const errorStr =
263
+ entry.error instanceof Error
264
+ ? `${entry.error.name}: ${entry.error.message}`
265
+ : String(entry.error)
266
+ output += ` Error: ${errorStr}`
267
+ }
268
+
269
+ return output
270
+ }
271
+
272
+ /**
273
+ * Console transport for logging to stdout/stderr
274
+ */
275
+ export const consoleTransport: LogTransport = {
276
+ log(entry: LogEntry) {
277
+ const formatted = defaultFormatter(entry)
278
+
279
+ if (entry.level >= LogLevel.ERROR) {
280
+ console.error(formatted)
281
+ } else if (entry.level === LogLevel.WARN) {
282
+ console.warn(formatted)
283
+ } else {
284
+ console.log(formatted)
285
+ }
286
+ },
287
+ }
288
+
289
+ /**
290
+ * Creates a new logger instance
291
+ *
292
+ * @param config Logger configuration
293
+ * @returns Configured logger
294
+ *
295
+ * @example
296
+ * ```ts
297
+ * const logger = createLogger({
298
+ * level: LogLevel.DEBUG,
299
+ * timestamps: true
300
+ * })
301
+ * ```
302
+ */
303
+ export function createLogger(config?: LoggerConfig): Logger {
304
+ return new Logger(config)
305
+ }
306
+
307
+ /**
308
+ * Global default logger instance
309
+ */
310
+ let globalLogger: Logger | null = null
311
+
312
+ /**
313
+ * Gets or creates global logger
314
+ *
315
+ * @param config Configuration for initial creation
316
+ * @returns Global logger instance
317
+ */
318
+ export function getGlobalLogger(config?: LoggerConfig): Logger {
319
+ if (!globalLogger) {
320
+ globalLogger = createLogger(config)
321
+ }
322
+ return globalLogger
323
+ }
324
+
325
+ /**
326
+ * Resets global logger (for testing)
327
+ */
328
+ export function resetGlobalLogger() {
329
+ globalLogger = null
330
+ }
331
+
332
+ /**
333
+ * Memory transport for testing and analysis
334
+ */
335
+ export class MemoryTransport implements LogTransport {
336
+ private entries: LogEntry[] = []
337
+
338
+ log(entry: LogEntry) {
339
+ this.entries.push(entry)
340
+ }
341
+
342
+ /** Gets all logged entries */
343
+ getEntries(): LogEntry[] {
344
+ return [...this.entries]
345
+ }
346
+
347
+ /** Gets entries by level */
348
+ getByLevel(level: LogLevel): LogEntry[] {
349
+ return this.entries.filter((e) => e.level === level)
350
+ }
351
+
352
+ /** Clears all entries */
353
+ clear() {
354
+ this.entries = []
355
+ }
356
+
357
+ /** Gets count of entries */
358
+ size(): number {
359
+ return this.entries.length
360
+ }
361
+ }
362
+
363
+ export { LogLevel } from './index'
@@ -0,0 +1,12 @@
1
+ import { defineConfig } from 'tsup'
2
+
3
+ export default defineConfig({
4
+ entry: {
5
+ index: 'src/index.ts',
6
+ },
7
+ format: ['esm'],
8
+ dts: true,
9
+ clean: true,
10
+ sourcemap: true,
11
+ })
12
+
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@geenius-tools/perf",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Performance monitoring utilities for Geenius projects",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsup",
16
+ "type-check": "tsc --noEmit",
17
+ "clean": "rm -rf dist .turbo"
18
+ },
19
+ "devDependencies": {
20
+ "typescript": "~6.0.2",
21
+ "tsup": "^8.0.1"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "license": "MIT"
27
+ }
@@ -0,0 +1 @@
1
+ # ✦ @geenius-tools/perf-react\n\n> React performance monitoring — dashboard, metrics hooks, query tracking\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/perf-react\n```\n\n## Usage\n\n```typescript\nimport { init } from '@geenius-tools/perf-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
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@geenius-tools/perf-react",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "React performance monitoring \u2014 dashboard, metrics hooks, query tracking",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "dev": "tsup --watch",
23
+ "typecheck": "tsc --noEmit"
24
+ },
25
+ "devDependencies": {
26
+ "@geenius-ui/react": "workspace:*",
27
+ "@tanstack/react-query": "^5.91.3",
28
+ "@types/react": "^19.0.0",
29
+ "@types/react-dom": "^19.0.0",
30
+ "lucide-react": "^0.577.0",
31
+ "react": "^19.2.4",
32
+ "react-dom": "^19.2.4",
33
+ "tsup": "^8.5.1",
34
+ "typescript": "~5.9.3"
35
+ },
36
+ "peerDependencies": {
37
+ "react": "^18.0.0 || ^19.0.0",
38
+ "react-dom": "^18.0.0 || ^19.0.0"
39
+ },
40
+ "peerDependenciesMeta": {
41
+ "lucide-react": {
42
+ "optional": true
43
+ },
44
+ "@geenius-ui/react": {
45
+ "optional": true
46
+ },
47
+ "@tanstack/react-query": {
48
+ "optional": true
49
+ }
50
+ },
51
+ "author": "Antigravity HQ",
52
+ "license": "MIT",
53
+ "engines": {
54
+ "node": ">=20.0.0"
55
+ },
56
+ "publishConfig": {
57
+ "access": "public"
58
+ }
59
+ }