hazo_logs 1.2.1 → 2.0.2

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 (68) hide show
  1. package/README.md +73 -0
  2. package/config/hazo_logs_config.ini.sample +2 -0
  3. package/dist/index.d.ts +6 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +6 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/alert-triggers.d.ts.map +1 -1
  8. package/dist/lib/alert-triggers.js +4 -5
  9. package/dist/lib/alert-triggers.js.map +1 -1
  10. package/dist/lib/config_loader.d.ts.map +1 -1
  11. package/dist/lib/config_loader.js +0 -6
  12. package/dist/lib/config_loader.js.map +1 -1
  13. package/dist/lib/console-logger.d.ts +16 -1
  14. package/dist/lib/console-logger.d.ts.map +1 -1
  15. package/dist/lib/console-logger.js +36 -0
  16. package/dist/lib/console-logger.js.map +1 -1
  17. package/dist/lib/eslint_plugin/index.d.ts +109 -0
  18. package/dist/lib/eslint_plugin/index.d.ts.map +1 -0
  19. package/dist/lib/eslint_plugin/index.js +168 -0
  20. package/dist/lib/eslint_plugin/index.js.map +1 -0
  21. package/dist/lib/global-error-handlers.d.ts.map +1 -1
  22. package/dist/lib/global-error-handlers.js +2 -1
  23. package/dist/lib/global-error-handlers.js.map +1 -1
  24. package/dist/lib/hazo_logger.d.ts.map +1 -1
  25. package/dist/lib/hazo_logger.js +1 -0
  26. package/dist/lib/hazo_logger.js.map +1 -1
  27. package/dist/lib/level_resolver.d.ts +26 -0
  28. package/dist/lib/level_resolver.d.ts.map +1 -0
  29. package/dist/lib/level_resolver.js +65 -0
  30. package/dist/lib/level_resolver.js.map +1 -0
  31. package/dist/lib/log-reader.d.ts.map +1 -1
  32. package/dist/lib/log-reader.js +1 -0
  33. package/dist/lib/log-reader.js.map +1 -1
  34. package/dist/lib/package_logger.d.ts +46 -3
  35. package/dist/lib/package_logger.d.ts.map +1 -1
  36. package/dist/lib/package_logger.js +190 -6
  37. package/dist/lib/package_logger.js.map +1 -1
  38. package/dist/lib/ring_buffer.d.ts +51 -0
  39. package/dist/lib/ring_buffer.d.ts.map +1 -0
  40. package/dist/lib/ring_buffer.js +107 -0
  41. package/dist/lib/ring_buffer.js.map +1 -0
  42. package/dist/lib/types.d.ts +24 -1
  43. package/dist/lib/types.d.ts.map +1 -1
  44. package/dist/lib/universal-logger.d.ts.map +1 -1
  45. package/dist/lib/universal-logger.js +15 -0
  46. package/dist/lib/universal-logger.js.map +1 -1
  47. package/dist/lib/utils/caller_info.d.ts +25 -1
  48. package/dist/lib/utils/caller_info.d.ts.map +1 -1
  49. package/dist/lib/utils/caller_info.js +62 -1
  50. package/dist/lib/utils/caller_info.js.map +1 -1
  51. package/dist/lib/with-error-handler.d.ts.map +1 -1
  52. package/dist/lib/with-error-handler.js +2 -1
  53. package/dist/lib/with-error-handler.js.map +1 -1
  54. package/dist/server.d.ts +14 -3
  55. package/dist/server.d.ts.map +1 -1
  56. package/dist/server.js +13 -2
  57. package/dist/server.js.map +1 -1
  58. package/dist/ui/components/ErrorBoundary.d.ts.map +1 -1
  59. package/dist/ui/components/ErrorBoundary.js +3 -2
  60. package/dist/ui/components/ErrorBoundary.js.map +1 -1
  61. package/dist/ui/hooks/useErrorReporter.d.ts.map +1 -1
  62. package/dist/ui/hooks/useErrorReporter.js +4 -3
  63. package/dist/ui/hooks/useErrorReporter.js.map +1 -1
  64. package/dist/ui/server.d.ts +10 -4
  65. package/dist/ui/server.d.ts.map +1 -1
  66. package/dist/ui/server.js +10 -4
  67. package/dist/ui/server.js.map +1 -1
  68. package/package.json +15 -7
package/README.md CHANGED
@@ -5,6 +5,79 @@ A Winston-based logging library for Node.js/Next.js applications with a built-in
5
5
  [![npm version](https://img.shields.io/npm/v/hazo_logs.svg)](https://www.npmjs.com/package/hazo_logs)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
7
7
 
8
+ ## Log Level Convention
9
+
10
+ hazo_logs uses a 5-level system (from design spec D-015). Each level has a defined purpose — use the narrowest one that fits.
11
+
12
+ | Level | When to use |
13
+ |-------|-------------|
14
+ | `TRACE` | High-frequency operational noise: polling ticks, cache hits, ping responses. Off in production. |
15
+ | `DEBUG` | Operational detail useful when actively debugging a problem. Off in production. |
16
+ | `INFO` | State changes and user-facing events (login, job started, order placed). Default level in dev. |
17
+ | `WARN` | Recoverable problems: rate-limited, retrying, degraded-mode fallback. Default level in production. |
18
+ | `ERROR` | Unrecovered failures that require attention: unhandled exception, data loss, external service down. |
19
+
20
+ ### Default levels
21
+
22
+ | Environment | Default level |
23
+ |-------------|--------------|
24
+ | `development` / `test` (`NODE_ENV`) | `info` |
25
+ | `production` / `staging` (`HAZO_ENV` or `NODE_ENV`) | `warn` |
26
+
27
+ The resolver checks `HAZO_ENV` first, then `NODE_ENV`, then falls back to `development`.
28
+
29
+ ### Per-namespace overrides (INI config)
30
+
31
+ Fine-tune the level for a specific package or sub-namespace in `config/hazo_logs_config.ini`:
32
+
33
+ ```ini
34
+ [log.overrides]
35
+ ; Package-level — matches hazo_chat and any hazo_chat/* sub-namespace
36
+ hazo_chat = warn
37
+
38
+ ; Sub-namespace — more specific, takes precedence over the package-level override
39
+ hazo_chat/poll = error
40
+
41
+ ; Prefix match — matches any hazo_files/* sub-namespace
42
+ hazo_files/ = debug
43
+ ```
44
+
45
+ Precedence (highest wins): exact match > prefix match > package-level > global default.
46
+
47
+ You can also use environment variables to override INI config at runtime:
48
+
49
+ ```bash
50
+ HAZO_LOGS_LOG_OVERRIDES_hazo_files=debug node server.js
51
+ ```
52
+
53
+ ### Smart logging helpers
54
+
55
+ Use these instead of raw `log.info` loops to reduce noise without losing signal:
56
+
57
+ **`log.heartbeat(name, { status, ...fields }, opts?)`**
58
+ Emits only on state change. Silent on repeated same-status calls. Use for "is it still working?" checks on polled resources (DB connectivity, external API, queue depth).
59
+
60
+ ```typescript
61
+ // Emits once when connected, once on disconnect, once when it reconnects
62
+ log.heartbeat('db.primary', { status: connected ? 'ok' : 'down', latencyMs });
63
+ ```
64
+
65
+ **`log.sampled(level, msg, fields?, { sample })`**
66
+ Emits with the given probability. Default sample rate is 0.1 (10%). Use for high-frequency paths where you want occasional visibility without flooding logs.
67
+
68
+ ```typescript
69
+ // Logs roughly 1 in 10 cache hits
70
+ log.sampled('debug', 'cache.hit', { key }, { sample: 0.1 });
71
+ ```
72
+
73
+ **`log.dedupe(level, msg, fields?, { window, key? })`**
74
+ Collapses identical-keyed messages within a time window. The first occurrence emits immediately; at window end, if more than one occurred, emits a summary `"msg (×N over Xs)"`. Use when the same warning fires rapidly (e.g. validation errors on bulk import).
75
+
76
+ ```typescript
77
+ // First occurrence emits; subsequent in the same minute are collapsed
78
+ log.dedupe('warn', 'validation.failed', { field }, { window: '1m' });
79
+ ```
80
+
8
81
  ## Features
9
82
 
10
83
  - **Structured Logging**: Winston wrapper with singleton pattern for consistent logging across your app
@@ -0,0 +1,2 @@
1
+ ; hazo_logs configuration sample
2
+ ; Copy to hazo_logs_config.ini and fill in values.
package/dist/index.d.ts CHANGED
@@ -33,5 +33,10 @@
33
33
  * ```
34
34
  */
35
35
  export { createLogger, createLoggerAsync, preloadServerLogger, ConsoleLogger, } from './lib/universal-logger.js';
36
- export type { Logger, LogLevel, LogData, LogEntry, LogContext, HazoLogConfig, PackageLoggerOptions, LogSource, LogOrigin, } from './lib/types.js';
36
+ export { getRingBuffer, RingBuffer, RingBufferRegistry, ringBufferRegistry } from './lib/ring_buffer.js';
37
+ export { getCallerInfo, get_filename, get_line_number } from './lib/utils/caller_info.js';
38
+ export type { CallerInfo } from './lib/utils/caller_info.js';
39
+ export { LevelResolver } from './lib/level_resolver.js';
40
+ export type { OverrideMap } from './lib/level_resolver.js';
41
+ export type { Logger, LogLevel, LogData, LogEntry, LogContext, HazoLogConfig, PackageLoggerOptions, LogSource, LogOrigin, RingBufferEntry, } from './lib/types.js';
37
42
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EACV,MAAM,EACN,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,SAAS,GACV,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGzG,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC1F,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,YAAY,EACV,MAAM,EACN,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,SAAS,EACT,eAAe,GAChB,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -34,4 +34,10 @@
34
34
  */
35
35
  // Universal logger - works on both server and client
36
36
  export { createLogger, createLoggerAsync, preloadServerLogger, ConsoleLogger, } from './lib/universal-logger.js';
37
+ // Ring buffer — safe for server; no-ops on client
38
+ export { getRingBuffer, RingBuffer, RingBufferRegistry, ringBufferRegistry } from './lib/ring_buffer.js';
39
+ // Caller-info utilities — server-side stack-trace helpers
40
+ export { getCallerInfo, get_filename, get_line_number } from './lib/utils/caller_info.js';
41
+ // LevelResolver — pure logic, no Node.js deps, safe for universal use
42
+ export { LevelResolver } from './lib/level_resolver.js';
37
43
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,qDAAqD;AACrD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,qDAAqD;AACrD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,kDAAkD;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEzG,0DAA0D;AAC1D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG1F,sEAAsE;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"alert-triggers.d.ts","sourceRoot":"","sources":["../../src/lib/alert-triggers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,gBAAgB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;IAC7D,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE;QACT,iDAAiD;QACjD,KAAK,EAAE,MAAM,CAAC;QACd,yEAAyE;QACzE,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AA0DD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,IAAI,CA2B3E"}
1
+ {"version":3,"file":"alert-triggers.d.ts","sourceRoot":"","sources":["../../src/lib/alert-triggers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,gBAAgB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;IAC7D,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE;QACT,iDAAiD;QACjD,KAAK,EAAE,MAAM,CAAC;QACd,yEAAyE;QACzE,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AA2DD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,IAAI,CA2B3E"}
@@ -4,6 +4,7 @@
4
4
  * Requires hazo_notify to be installed (optional peer dep).
5
5
  * Sliding window state is in-memory — resets on process restart.
6
6
  */
7
+ import { optional_import } from 'hazo_core';
7
8
  import { HazoLogger } from './hazo_logger.js';
8
9
  const HAZO_LOG_LEVEL_PRIORITY = {
9
10
  fatal: 0,
@@ -11,6 +12,7 @@ const HAZO_LOG_LEVEL_PRIORITY = {
11
12
  warn: 2,
12
13
  info: 3,
13
14
  debug: 4,
15
+ trace: 5,
14
16
  };
15
17
  function matchesTrigger(entry, match) {
16
18
  if (match.level) {
@@ -28,11 +30,8 @@ function matchesTrigger(entry, match) {
28
30
  return true;
29
31
  }
30
32
  async function fireNotification(config, entry) {
31
- let dispatcher;
32
- try {
33
- dispatcher = await import('hazo_notify/dispatcher');
34
- }
35
- catch {
33
+ const dispatcher = await optional_import('hazo_notify/dispatcher');
34
+ if (!dispatcher) {
36
35
  console.error(`[hazo_logs] Alert trigger "${config.id}" fired but hazo_notify is not installed. ` +
37
36
  'Add hazo_notify as a dependency to receive alert notifications.');
38
37
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"alert-triggers.js","sourceRoot":"","sources":["../../src/lib/alert-triggers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alert-triggers.js","sourceRoot":"","sources":["../../src/lib/alert-triggers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config_loader.d.ts","sourceRoot":"","sources":["../../src/lib/config_loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,YAAY,CAAC;AAQhE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAmC7D"}
1
+ {"version":3,"file":"config_loader.d.ts","sourceRoot":"","sources":["../../src/lib/config_loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,YAAY,CAAC;AAKhE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CA6B7D"}
@@ -7,8 +7,6 @@ import path from 'path';
7
7
  import ini from 'ini';
8
8
  import { DEFAULT_CONFIG } from './utils/constants.js';
9
9
  const CONFIG_FILENAME = 'config/hazo_logs_config.ini';
10
- // Track whether the missing config warning has been shown
11
- let _config_warning_shown = false;
12
10
  /**
13
11
  * Load configuration from INI file
14
12
  * @param configPath - Optional explicit path to config file
@@ -17,10 +15,6 @@ let _config_warning_shown = false;
17
15
  export function loadConfig(configPath) {
18
16
  const resolvedPath = configPath || findConfigFile();
19
17
  if (!resolvedPath || !fs.existsSync(resolvedPath)) {
20
- if (!_config_warning_shown) {
21
- _config_warning_shown = true;
22
- console.warn(`[HazoLog] No config found, using defaults. Create ${CONFIG_FILENAME} to customize.`);
23
- }
24
18
  return { ...DEFAULT_CONFIG };
25
19
  }
26
20
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"config_loader.js","sourceRoot":"","sources":["../../src/lib/config_loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config_loader.js","sourceRoot":"","sources":["../../src/lib/config_loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,eAAe,GAAG,6BAA6B,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,YAAY,GAAG,UAAU,IAAI,cAAc,EAAE,CAAC;IAEpD,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAE9C,OAAO;YACL,aAAa,EAAE,WAAW,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;YACxE,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC;YAClD,cAAc,EAAE,SAAS,CAAC,WAAW,CAAC,cAAc,EAAE,cAAc,CAAC,cAAc,CAAC;YACpF,WAAW,EAAE,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC;YAC3E,aAAa,EAAE,WAAW,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;YACxE,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,cAAc,CAAC,SAAS;YAC5D,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,cAAc,CAAC,YAAY;YACrE,yBAAyB;YACzB,iBAAiB,EAAE,SAAS,CAAC,WAAW,CAAC,iBAAiB,EAAE,cAAc,CAAC,iBAAiB,CAAC;YAC7F,oBAAoB,EAAE,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,oBAAoB;YAC3G,sBAAsB,EAAE,QAAQ,CAAC,WAAW,CAAC,sBAAsB,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,sBAAsB;SAClH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;QAC3D,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc;IACrB,OAAO;QACL,OAAO,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc;IACrB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAyB;IACjD,MAAM,WAAW,GAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,WAAW,CAAC,QAAQ,CAAC,KAAuB,CAAC,CAAC,CAAC,CAAE,KAAwB,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC;AAC9G,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAmC,EAAE,YAAqB;IAC3E,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IAC7C,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,GAAG,CAAC;AACjD,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * This module imports ONLY from types.ts (pure type definitions)
6
6
  * so it is safe for both server and client environments.
7
7
  */
8
- import type { Logger, LogData, LogLevel } from './types.js';
8
+ import type { Logger, LogData, LogLevel, RingBufferEntry } from './types.js';
9
9
  export declare const LOG_LEVEL_PRIORITY: Record<LogLevel, number>;
10
10
  /**
11
11
  * Console-based logger for client-side use
@@ -23,5 +23,20 @@ export declare class ConsoleLogger implements Logger {
23
23
  warn(message: string, data?: LogData): void;
24
24
  info(message: string, data?: LogData): void;
25
25
  debug(message: string, data?: LogData): void;
26
+ trace(message: string, data?: LogData): void;
27
+ heartbeat(_name: string, _fields: {
28
+ status: string;
29
+ [key: string]: unknown;
30
+ }, _opts?: {
31
+ trigger?: (prev: Record<string, unknown>, curr: Record<string, unknown>) => boolean;
32
+ }): void;
33
+ sampled(level: 'trace' | 'debug' | 'info' | 'warn', msg: string, fields?: Record<string, unknown>, opts?: {
34
+ sample: number;
35
+ }): void;
36
+ dedupe(level: 'trace' | 'debug' | 'info' | 'warn', msg: string, fields?: Record<string, unknown>, _opts?: {
37
+ window: string;
38
+ key?: string;
39
+ }): void;
40
+ getRingBuffer(_correlationId: string, _n?: number): RingBufferEntry[];
26
41
  }
27
42
  //# sourceMappingURL=console-logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"console-logger.d.ts","sourceRoot":"","sources":["../../src/lib/console-logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE5D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAMvD,CAAC;AAEF;;;GAGG;AACH,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAC,CAA2E;gBAE9E,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAkB,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI;IAMhJ,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;IAKrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAO5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAO5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAO3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAO3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;CAM7C"}
1
+ {"version":3,"file":"console-logger.d.ts","sourceRoot":"","sources":["../../src/lib/console-logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7E,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAOvD,CAAC;AAEF;;;GAGG;AACH,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAC,CAA2E;gBAE9E,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAkB,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI;IAMhJ,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;IAKrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAO5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAO5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAO3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAO3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAO5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAU5C,SAAS,CACP,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EACnD,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;KAAE,GAC9F,IAAI;IAOP,OAAO,CACL,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAC1C,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GACxB,IAAI;IAUP,MAAM,CACJ,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAC1C,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACvC,IAAI;IASP,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE;CAItE"}
@@ -11,6 +11,7 @@ export const LOG_LEVEL_PRIORITY = {
11
11
  warn: 2,
12
12
  info: 3,
13
13
  debug: 4,
14
+ trace: 5,
14
15
  };
15
16
  /**
16
17
  * Console-based logger for client-side use
@@ -62,5 +63,40 @@ export class ConsoleLogger {
62
63
  this.on_log?.('debug', message, data);
63
64
  }
64
65
  }
66
+ trace(message, data) {
67
+ if (this.shouldLog('trace')) {
68
+ // Use console.debug for trace — console.trace prints a stack trace
69
+ console.debug(this.formatMessage('trace', message), data ?? '');
70
+ this.on_log?.('trace', message, data);
71
+ }
72
+ }
73
+ // ─── Smart helpers (no-ops on client — server-side state would be meaningless) ─
74
+ heartbeat(_name, _fields, _opts) {
75
+ // Client-side: emit at debug level so it is at least visible when debugging
76
+ if (this.shouldLog('debug')) {
77
+ console.debug(this.formatMessage('debug', `heartbeat: ${_name}`), _fields);
78
+ }
79
+ }
80
+ sampled(level, msg, fields, opts) {
81
+ const sample = opts?.sample ?? 0.1;
82
+ if (Math.random() < sample && this.shouldLog(level)) {
83
+ const sampleLabel = `(sampled ~1/${Math.round(1 / sample)})`;
84
+ const method = level === 'warn' ? 'warn' : level === 'info' ? 'info' : 'debug';
85
+ console[method](this.formatMessage(level, `${msg} ${sampleLabel}`), fields ?? '');
86
+ this.on_log?.(level, `${msg} ${sampleLabel}`, fields);
87
+ }
88
+ }
89
+ dedupe(level, msg, fields, _opts) {
90
+ // Client-side: no deduplication state — just emit
91
+ if (this.shouldLog(level)) {
92
+ const method = level === 'warn' ? 'warn' : level === 'info' ? 'info' : 'debug';
93
+ console[method](this.formatMessage(level, msg), fields ?? '');
94
+ this.on_log?.(level, msg, fields);
95
+ }
96
+ }
97
+ getRingBuffer(_correlationId, _n) {
98
+ // Client-side: no ring buffer
99
+ return [];
100
+ }
65
101
  }
66
102
  //# sourceMappingURL=console-logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"console-logger.js","sourceRoot":"","sources":["../../src/lib/console-logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"console-logger.js","sourceRoot":"","sources":["../../src/lib/console-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * hazo-logs ESLint plugin
3
+ *
4
+ * Provides 3 rules that enforce the structured-first log API from design spec §2.5.
5
+ *
6
+ * Usage (flat-config):
7
+ * import { plugin as hazoLogsPlugin } from 'hazo_logs/eslint-plugin';
8
+ *
9
+ * export default [
10
+ * {
11
+ * plugins: { 'hazo-logs': hazoLogsPlugin },
12
+ * rules: {
13
+ * ...hazoLogsPlugin.configs.recommended.rules,
14
+ * },
15
+ * },
16
+ * ];
17
+ */
18
+ interface Node {
19
+ type: string;
20
+ }
21
+ interface MemberExpression extends Node {
22
+ type: 'MemberExpression';
23
+ computed: boolean;
24
+ property: Node;
25
+ }
26
+ interface CallExpressionNode extends Node {
27
+ type: 'CallExpression';
28
+ callee: MemberExpression & Node;
29
+ arguments: Node[];
30
+ }
31
+ export declare const plugin: {
32
+ rules: {
33
+ 'no-template-message': {
34
+ meta: {
35
+ type: "suggestion";
36
+ docs: {
37
+ description: string;
38
+ recommended: boolean;
39
+ };
40
+ schema: never[];
41
+ messages: {
42
+ noTemplate: string;
43
+ };
44
+ };
45
+ create(context: {
46
+ report(opts: {
47
+ node: Node;
48
+ messageId: string;
49
+ }): void;
50
+ }): {
51
+ CallExpression(node: CallExpressionNode): void;
52
+ };
53
+ };
54
+ 'no-string-concat-message': {
55
+ meta: {
56
+ type: "suggestion";
57
+ docs: {
58
+ description: string;
59
+ recommended: boolean;
60
+ };
61
+ schema: never[];
62
+ messages: {
63
+ noConcat: string;
64
+ };
65
+ };
66
+ create(context: {
67
+ report(opts: {
68
+ node: Node;
69
+ messageId: string;
70
+ }): void;
71
+ }): {
72
+ CallExpression(node: CallExpressionNode): void;
73
+ };
74
+ };
75
+ 'event-name-format': {
76
+ meta: {
77
+ type: "suggestion";
78
+ docs: {
79
+ description: string;
80
+ recommended: boolean;
81
+ };
82
+ schema: never[];
83
+ messages: {
84
+ sentenceCase: string;
85
+ };
86
+ };
87
+ create(context: {
88
+ report(opts: {
89
+ node: Node;
90
+ messageId: string;
91
+ data?: Record<string, string>;
92
+ }): void;
93
+ }): {
94
+ CallExpression(node: CallExpressionNode): void;
95
+ };
96
+ };
97
+ };
98
+ configs: {
99
+ recommended: {
100
+ rules: {
101
+ 'hazo-logs/no-template-message': string;
102
+ 'hazo-logs/no-string-concat-message': string;
103
+ 'hazo-logs/event-name-format': string;
104
+ };
105
+ };
106
+ };
107
+ };
108
+ export default plugin;
109
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/eslint_plugin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAuBH,UAAU,IAAI;IAAG,IAAI,EAAE,MAAM,CAAA;CAAE;AAK/B,UAAU,gBAAiB,SAAQ,IAAI;IAAG,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE;AACvG,UAAU,kBAAmB,SAAQ,IAAI;IAAG,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,IAAI,EAAE,CAAA;CAAE;AAiIxH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;4BA5GD;gBAAE,MAAM,CAAC,IAAI,EAAE;oBAAE,IAAI,EAAE,IAAI,CAAC;oBAAC,SAAS,EAAE,MAAM,CAAA;iBAAE,GAAG,IAAI,CAAA;aAAE;qCAEhD,kBAAkB;;;;;;;;;;;;;;;4BA4C3B;gBAAE,MAAM,CAAC,IAAI,EAAE;oBAAE,IAAI,EAAE,IAAI,CAAC;oBAAC,SAAS,EAAE,MAAM,CAAA;iBAAE,GAAG,IAAI,CAAA;aAAE;qCAEhD,kBAAkB;;;;;;;;;;;;;;;4BAqC3B;gBAAE,MAAM,CAAC,IAAI,EAAE;oBAAE,IAAI,EAAE,IAAI,CAAC;oBAAC,SAAS,EAAE,MAAM,CAAC;oBAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;iBAAE,GAAG,IAAI,CAAA;aAAE;qCAE/E,kBAAkB;;;;;;;;;;;;;CAoC5C,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * hazo-logs ESLint plugin
3
+ *
4
+ * Provides 3 rules that enforce the structured-first log API from design spec §2.5.
5
+ *
6
+ * Usage (flat-config):
7
+ * import { plugin as hazoLogsPlugin } from 'hazo_logs/eslint-plugin';
8
+ *
9
+ * export default [
10
+ * {
11
+ * plugins: { 'hazo-logs': hazoLogsPlugin },
12
+ * rules: {
13
+ * ...hazoLogsPlugin.configs.recommended.rules,
14
+ * },
15
+ * },
16
+ * ];
17
+ */
18
+ // ─── Shared helpers ───────────────────────────────────────────────────────────
19
+ /** The log method names we care about */
20
+ const LOG_METHODS = new Set(['trace', 'debug', 'info', 'warn', 'error', 'fatal']);
21
+ /**
22
+ * Returns true when the call expression is a log method call:
23
+ * log.info(...) logger.warn(...) this.log.debug(...)
24
+ */
25
+ function isLogCall(node) {
26
+ if (node.callee.type !== 'MemberExpression')
27
+ return false;
28
+ const prop = node.callee.property;
29
+ return (!node.callee.computed &&
30
+ prop.type === 'Identifier' &&
31
+ LOG_METHODS.has(prop.name));
32
+ }
33
+ // ─── Rule: no-template-message ────────────────────────────────────────────────
34
+ /**
35
+ * Flags: log.info(`User ${id} did something`)
36
+ * Template literals with embedded expressions in the first arg of a log call.
37
+ */
38
+ const noTemplateMessage = {
39
+ meta: {
40
+ type: 'suggestion',
41
+ docs: {
42
+ description: 'Disallow template literals with expressions as log message argument',
43
+ recommended: true,
44
+ },
45
+ schema: [],
46
+ messages: {
47
+ noTemplate: 'Log message should be a plain string event name (e.g. "user.logged_in"), not a template literal with interpolations. Put variable data in the second argument (fields).',
48
+ },
49
+ },
50
+ create(context) {
51
+ return {
52
+ CallExpression(node) {
53
+ if (!isLogCall(node))
54
+ return;
55
+ const firstArg = node.arguments[0];
56
+ if (!firstArg)
57
+ return;
58
+ if (firstArg.type === 'TemplateLiteral' &&
59
+ firstArg.expressions.length > 0) {
60
+ context.report({ node: firstArg, messageId: 'noTemplate' });
61
+ }
62
+ },
63
+ };
64
+ },
65
+ };
66
+ // ─── Rule: no-string-concat-message ──────────────────────────────────────────
67
+ /**
68
+ * Flags: log.info('User ' + userId + ' logged in')
69
+ * Binary `+` expressions anywhere in the first arg.
70
+ */
71
+ function containsStringConcat(node) {
72
+ if (node.type !== 'BinaryExpression')
73
+ return false;
74
+ const bin = node;
75
+ return (bin.operator === '+' ||
76
+ containsStringConcat(bin.left) ||
77
+ containsStringConcat(bin.right));
78
+ }
79
+ const noStringConcatMessage = {
80
+ meta: {
81
+ type: 'suggestion',
82
+ docs: {
83
+ description: 'Disallow string concatenation in log message argument',
84
+ recommended: true,
85
+ },
86
+ schema: [],
87
+ messages: {
88
+ noConcat: 'Log message should be a plain string event name, not a concatenated string. Put variable data in the second argument (fields).',
89
+ },
90
+ },
91
+ create(context) {
92
+ return {
93
+ CallExpression(node) {
94
+ if (!isLogCall(node))
95
+ return;
96
+ const firstArg = node.arguments[0];
97
+ if (!firstArg)
98
+ return;
99
+ if (containsStringConcat(firstArg)) {
100
+ context.report({ node: firstArg, messageId: 'noConcat' });
101
+ }
102
+ },
103
+ };
104
+ },
105
+ };
106
+ // ─── Rule: event-name-format ──────────────────────────────────────────────────
107
+ /**
108
+ * Flags: log.info('File was uploaded successfully')
109
+ * Sentence-case strings (starts with uppercase, contains spaces) are likely
110
+ * free-form sentences rather than structured event names.
111
+ *
112
+ * Allowed: 'file.uploaded', 'db.slow', 'request.headers'
113
+ * Flagged: 'File was uploaded', 'Polling channels'
114
+ */
115
+ const SENTENCE_CASE_RE = /^[A-Z][a-z].*\s/;
116
+ const eventNameFormat = {
117
+ meta: {
118
+ type: 'suggestion',
119
+ docs: {
120
+ description: 'Log message should be a dotted lowercase event name, not a sentence',
121
+ recommended: true,
122
+ },
123
+ schema: [],
124
+ messages: {
125
+ sentenceCase: 'Log message looks like a sentence ("{{value}}"). Prefer a dotted lowercase event name (e.g. "file.uploaded") so it is grep-friendly and structured.',
126
+ },
127
+ },
128
+ create(context) {
129
+ return {
130
+ CallExpression(node) {
131
+ if (!isLogCall(node))
132
+ return;
133
+ const firstArg = node.arguments[0];
134
+ if (!firstArg)
135
+ return;
136
+ if (firstArg.type === 'Literal') {
137
+ const value = firstArg.value;
138
+ if (typeof value === 'string' && SENTENCE_CASE_RE.test(value)) {
139
+ context.report({
140
+ node: firstArg,
141
+ messageId: 'sentenceCase',
142
+ data: { value: value.slice(0, 40) },
143
+ });
144
+ }
145
+ }
146
+ },
147
+ };
148
+ },
149
+ };
150
+ // ─── Plugin export ────────────────────────────────────────────────────────────
151
+ export const plugin = {
152
+ rules: {
153
+ 'no-template-message': noTemplateMessage,
154
+ 'no-string-concat-message': noStringConcatMessage,
155
+ 'event-name-format': eventNameFormat,
156
+ },
157
+ configs: {
158
+ recommended: {
159
+ rules: {
160
+ 'hazo-logs/no-template-message': 'warn',
161
+ 'hazo-logs/no-string-concat-message': 'warn',
162
+ 'hazo-logs/event-name-format': 'warn',
163
+ },
164
+ },
165
+ },
166
+ };
167
+ export default plugin;
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/eslint_plugin/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"global-error-handlers.d.ts","sourceRoot":"","sources":["../../src/lib/global-error-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,MAAM,WAAW,yBAAyB;IACxC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA6BD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,yBAA8B,GAAG,IAAI,CASxF"}
1
+ {"version":3,"file":"global-error-handlers.d.ts","sourceRoot":"","sources":["../../src/lib/global-error-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,yBAAyB;IACxC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA6BD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,yBAA8B,GAAG,IAAI,CASxF"}
@@ -10,11 +10,12 @@
10
10
  *
11
11
  * Call once at process startup, before any other code.
12
12
  */
13
+ import { generateRequestId } from 'hazo_core';
13
14
  import { createLogger } from './package_logger.js';
14
15
  const logger = createLogger('hazo_logs.globalHandlers');
15
16
  const FLUSH_DELAY_MS = 500;
16
17
  async function handleFatal(err, source, options) {
17
- const correlationId = crypto.randomUUID();
18
+ const correlationId = generateRequestId();
18
19
  logger.fatal(`[${source}] ${err.message}`, {
19
20
  correlationId,
20
21
  source,
@@ -1 +1 @@
1
- {"version":3,"file":"global-error-handlers.js","sourceRoot":"","sources":["../../src/lib/global-error-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AAExD,MAAM,cAAc,GAAG,GAAG,CAAC;AAY3B,KAAK,UAAU,WAAW,CACxB,GAAU,EACV,MAAkD,EAClD,OAAkC;IAElC,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAE1C,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE;QACzC,aAAa;QACb,MAAM;QACN,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACrC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,cAAc,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAAqC,EAAE;IAChF,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,KAAK,WAAW,CAAC,GAAG,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,KAAK,WAAW,CAAC,GAAG,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"global-error-handlers.js","sourceRoot":"","sources":["../../src/lib/global-error-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AAExD,MAAM,cAAc,GAAG,GAAG,CAAC;AAY3B,KAAK,UAAU,WAAW,CACxB,GAAU,EACV,MAAkD,EAClD,OAAkC;IAElC,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAE1C,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE;QACzC,aAAa;QACb,MAAM;QACN,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACrC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,cAAc,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAAqC,EAAE;IAChF,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,KAAK,WAAW,CAAC,GAAG,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,KAAK,WAAW,CAAC,GAAG,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC"}