hazo_core 1.0.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 (124) hide show
  1. package/README.md +84 -0
  2. package/SETUP_CHECKLIST.md +114 -0
  3. package/config/hazo_core_config.ini +14 -0
  4. package/dist/config/index.d.ts +35 -0
  5. package/dist/config/index.d.ts.map +1 -0
  6. package/dist/config/index.js +117 -0
  7. package/dist/config/index.js.map +1 -0
  8. package/dist/config/ini_parser.d.ts +10 -0
  9. package/dist/config/ini_parser.d.ts.map +1 -0
  10. package/dist/config/ini_parser.js +45 -0
  11. package/dist/config/ini_parser.js.map +1 -0
  12. package/dist/constants.d.ts +4 -0
  13. package/dist/constants.d.ts.map +1 -0
  14. package/dist/constants.js +4 -0
  15. package/dist/constants.js.map +1 -0
  16. package/dist/context/client.d.ts +27 -0
  17. package/dist/context/client.d.ts.map +1 -0
  18. package/dist/context/client.js +66 -0
  19. package/dist/context/client.js.map +1 -0
  20. package/dist/context/index.d.ts +9 -0
  21. package/dist/context/index.d.ts.map +1 -0
  22. package/dist/context/index.js +8 -0
  23. package/dist/context/index.js.map +1 -0
  24. package/dist/context/server.d.ts +23 -0
  25. package/dist/context/server.d.ts.map +1 -0
  26. package/dist/context/server.js +52 -0
  27. package/dist/context/server.js.map +1 -0
  28. package/dist/context/types.d.ts +14 -0
  29. package/dist/context/types.d.ts.map +1 -0
  30. package/dist/context/types.js +2 -0
  31. package/dist/context/types.js.map +1 -0
  32. package/dist/debug/index.d.ts +20 -0
  33. package/dist/debug/index.d.ts.map +1 -0
  34. package/dist/debug/index.js +78 -0
  35. package/dist/debug/index.js.map +1 -0
  36. package/dist/errors/auth.d.ts +14 -0
  37. package/dist/errors/auth.d.ts.map +1 -0
  38. package/dist/errors/auth.js +19 -0
  39. package/dist/errors/auth.js.map +1 -0
  40. package/dist/errors/base.d.ts +89 -0
  41. package/dist/errors/base.d.ts.map +1 -0
  42. package/dist/errors/base.js +152 -0
  43. package/dist/errors/base.js.map +1 -0
  44. package/dist/errors/config.d.ts +18 -0
  45. package/dist/errors/config.d.ts.map +1 -0
  46. package/dist/errors/config.js +14 -0
  47. package/dist/errors/config.js.map +1 -0
  48. package/dist/errors/conflict.d.ts +9 -0
  49. package/dist/errors/conflict.d.ts.map +1 -0
  50. package/dist/errors/conflict.js +14 -0
  51. package/dist/errors/conflict.js.map +1 -0
  52. package/dist/errors/external.d.ts +9 -0
  53. package/dist/errors/external.d.ts.map +1 -0
  54. package/dist/errors/external.js +14 -0
  55. package/dist/errors/external.js.map +1 -0
  56. package/dist/errors/from_zod.d.ts +33 -0
  57. package/dist/errors/from_zod.d.ts.map +1 -0
  58. package/dist/errors/from_zod.js +63 -0
  59. package/dist/errors/from_zod.js.map +1 -0
  60. package/dist/errors/index.d.ts +22 -0
  61. package/dist/errors/index.d.ts.map +1 -0
  62. package/dist/errors/index.js +12 -0
  63. package/dist/errors/index.js.map +1 -0
  64. package/dist/errors/internal.d.ts +14 -0
  65. package/dist/errors/internal.d.ts.map +1 -0
  66. package/dist/errors/internal.js +14 -0
  67. package/dist/errors/internal.js.map +1 -0
  68. package/dist/errors/not_found.d.ts +9 -0
  69. package/dist/errors/not_found.d.ts.map +1 -0
  70. package/dist/errors/not_found.js +15 -0
  71. package/dist/errors/not_found.js.map +1 -0
  72. package/dist/errors/rate_limit.d.ts +9 -0
  73. package/dist/errors/rate_limit.d.ts.map +1 -0
  74. package/dist/errors/rate_limit.js +14 -0
  75. package/dist/errors/rate_limit.js.map +1 -0
  76. package/dist/errors/unavailable.d.ts +9 -0
  77. package/dist/errors/unavailable.d.ts.map +1 -0
  78. package/dist/errors/unavailable.js +14 -0
  79. package/dist/errors/unavailable.js.map +1 -0
  80. package/dist/errors/validation.d.ts +15 -0
  81. package/dist/errors/validation.d.ts.map +1 -0
  82. package/dist/errors/validation.js +17 -0
  83. package/dist/errors/validation.js.map +1 -0
  84. package/dist/http/fetch_with_request_id.d.ts +14 -0
  85. package/dist/http/fetch_with_request_id.d.ts.map +1 -0
  86. package/dist/http/fetch_with_request_id.js +29 -0
  87. package/dist/http/fetch_with_request_id.js.map +1 -0
  88. package/dist/http/get_origin_url.d.ts +23 -0
  89. package/dist/http/get_origin_url.d.ts.map +1 -0
  90. package/dist/http/get_origin_url.js +61 -0
  91. package/dist/http/get_origin_url.js.map +1 -0
  92. package/dist/http/request_id_middleware.d.ts +38 -0
  93. package/dist/http/request_id_middleware.d.ts.map +1 -0
  94. package/dist/http/request_id_middleware.js +57 -0
  95. package/dist/http/request_id_middleware.js.map +1 -0
  96. package/dist/index.client.d.ts +16 -0
  97. package/dist/index.client.d.ts.map +1 -0
  98. package/dist/index.client.js +19 -0
  99. package/dist/index.client.js.map +1 -0
  100. package/dist/index.d.ts +23 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +27 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/logger/index.d.ts +29 -0
  105. package/dist/logger/index.d.ts.map +1 -0
  106. package/dist/logger/index.js +125 -0
  107. package/dist/logger/index.js.map +1 -0
  108. package/dist/singleton/index.d.ts +16 -0
  109. package/dist/singleton/index.d.ts.map +1 -0
  110. package/dist/singleton/index.js +42 -0
  111. package/dist/singleton/index.js.map +1 -0
  112. package/dist/utils/dates.d.ts +45 -0
  113. package/dist/utils/dates.d.ts.map +1 -0
  114. package/dist/utils/dates.js +79 -0
  115. package/dist/utils/dates.js.map +1 -0
  116. package/dist/utils/env.d.ts +7 -0
  117. package/dist/utils/env.d.ts.map +1 -0
  118. package/dist/utils/env.js +9 -0
  119. package/dist/utils/env.js.map +1 -0
  120. package/dist/utils/index.d.ts +69 -0
  121. package/dist/utils/index.d.ts.map +1 -0
  122. package/dist/utils/index.js +174 -0
  123. package/dist/utils/index.js.map +1 -0
  124. package/package.json +82 -0
@@ -0,0 +1,52 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { registerSingleton, getSingleton } from '../singleton/index.js';
3
+ import { generateRequestId } from '../utils/index.js';
4
+ /**
5
+ * The AsyncLocalStorage instance is registered as a singleton on globalThis so that
6
+ * even if multiple copies of hazo_core end up in the module graph, they all share the
7
+ * same storage — ensuring correlation IDs flow correctly across the entire suite.
8
+ */
9
+ const storage = getSingleton('hazo_core:context_als') ??
10
+ registerSingleton('hazo_core:context_als', new AsyncLocalStorage());
11
+ /**
12
+ * Expose the ALS on globalThis so HazoError's constructor can lazily read the
13
+ * correlationId without creating a circular import dependency.
14
+ */
15
+ globalThis['__hazo_core_context_store__'] = storage;
16
+ /**
17
+ * Run `fn` within a new context that merges `values` on top of the parent context.
18
+ *
19
+ * Merge rules:
20
+ * 1. Parent context fields are inherited unless explicitly overridden by `values`.
21
+ * 2. `correlationId` is generated if neither `values` nor parent provides one.
22
+ *
23
+ * This means a child span always carries the parent's correlationId unless the caller
24
+ * explicitly wants to start a new correlation boundary.
25
+ */
26
+ export function withContext(values, fn) {
27
+ const parent = storage.getStore();
28
+ const merged = {
29
+ // Start with parent fields
30
+ ...parent,
31
+ // Override with provided values
32
+ ...values,
33
+ // Ensure correlationId is always set — prefer explicit > parent > generated
34
+ correlationId: values.correlationId ?? parent?.correlationId ?? generateRequestId(),
35
+ };
36
+ return storage.run(merged, fn);
37
+ }
38
+ /**
39
+ * Read the current context, if any.
40
+ * Returns undefined when called outside a withContext() scope.
41
+ */
42
+ export function getContext() {
43
+ return storage.getStore();
44
+ }
45
+ /**
46
+ * Convenience accessor for the most-commonly-needed context field.
47
+ * Returns undefined when called outside a withContext() scope.
48
+ */
49
+ export function getCorrelationId() {
50
+ return storage.getStore()?.correlationId;
51
+ }
52
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/context/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,OAAO,GACX,YAAY,CAAiC,uBAAuB,CAAC;IACrE,iBAAiB,CAAC,uBAAuB,EAAE,IAAI,iBAAiB,EAAe,CAAC,CAAC;AAEnF;;;GAGG;AACF,UAAsC,CAAC,6BAA6B,CAAC,GAAG,OAAO,CAAC;AAEjF;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAI,MAA4B,EAAE,EAAW;IACtE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAElC,MAAM,MAAM,GAAgB;QAC1B,2BAA2B;QAC3B,GAAG,MAAM;QACT,gCAAgC;QAChC,GAAG,MAAM;QACT,4EAA4E;QAC5E,aAAa,EACX,MAAM,CAAC,aAAa,IAAI,MAAM,EAAE,aAAa,IAAI,iBAAiB,EAAE;KACvE,CAAC;IAEF,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Ambient request/operation context propagated via AsyncLocalStorage (server)
3
+ * or a mutable ref (browser).
4
+ *
5
+ * This interface is additive: new fields can be added without breaking existing callers.
6
+ * Consumers should always check existence of optional fields before accessing them.
7
+ */
8
+ export interface HazoContext {
9
+ /** Correlation ID tying together all log entries and error reports for this request/operation */
10
+ correlationId: string;
11
+ /** Authenticated user ID — set by hazo_auth middleware when a session is present */
12
+ userId?: string;
13
+ }
14
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,iGAAiG;IACjG,aAAa,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * hazo_core debug factory — wraps hazo_debug and injects correlationId.
3
+ * Returns a complete no-op when hazo_debug is not installed.
4
+ *
5
+ * Per architecture.md §10 and D-007.
6
+ */
7
+ export interface HazoCoreDebug {
8
+ /** Log a debug event with optional payload data. */
9
+ log(namespace: string, data?: unknown): void;
10
+ }
11
+ /**
12
+ * Create a debug instance for a hazo package.
13
+ *
14
+ * When hazo_debug is installed and exposes createDebug, wraps it and injects
15
+ * the current correlationId into every log call.
16
+ *
17
+ * When hazo_debug is absent or has no createDebug export, returns a no-op.
18
+ */
19
+ export declare function createDebug(pkg: string): HazoCoreDebug;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAkED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAUtD"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * hazo_core debug factory — wraps hazo_debug and injects correlationId.
3
+ * Returns a complete no-op when hazo_debug is not installed.
4
+ *
5
+ * Per architecture.md §10 and D-007.
6
+ */
7
+ import { createRequire } from 'node:module';
8
+ // ---------------------------------------------------------------------------
9
+ // Detect hazo_debug at module init time
10
+ // ---------------------------------------------------------------------------
11
+ const _require = createRequire(import.meta.url);
12
+ let hazoDebugModule = null;
13
+ try {
14
+ hazoDebugModule = _require('hazo_debug');
15
+ }
16
+ catch {
17
+ // hazo_debug not installed — use no-op fallback
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // Resolve correlationId lazily (same pattern as logger/index.ts)
21
+ // ---------------------------------------------------------------------------
22
+ function getCorrelationIdLazy() {
23
+ try {
24
+ const store = globalThis['__hazo_core_context_store__'];
25
+ if (store && typeof store === 'object' && 'getStore' in store) {
26
+ const ctx = store.getStore();
27
+ return ctx?.['correlationId'];
28
+ }
29
+ }
30
+ catch {
31
+ // Ignore
32
+ }
33
+ return undefined;
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // No-op fallback
37
+ // ---------------------------------------------------------------------------
38
+ const noopDebug = {
39
+ log: () => undefined,
40
+ };
41
+ // ---------------------------------------------------------------------------
42
+ // hazo_debug wrapper
43
+ // ---------------------------------------------------------------------------
44
+ function makeWrappedDebug(inner) {
45
+ return {
46
+ log: (namespace, data) => {
47
+ const correlationId = getCorrelationIdLazy();
48
+ const enriched = data !== null && typeof data === 'object' && !Array.isArray(data)
49
+ ? { ...data, correlationId }
50
+ : { data, correlationId };
51
+ inner.log(namespace, enriched);
52
+ },
53
+ };
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Public factory
57
+ // ---------------------------------------------------------------------------
58
+ /**
59
+ * Create a debug instance for a hazo package.
60
+ *
61
+ * When hazo_debug is installed and exposes createDebug, wraps it and injects
62
+ * the current correlationId into every log call.
63
+ *
64
+ * When hazo_debug is absent or has no createDebug export, returns a no-op.
65
+ */
66
+ export function createDebug(pkg) {
67
+ if (hazoDebugModule && typeof hazoDebugModule.createDebug === 'function') {
68
+ try {
69
+ const inner = hazoDebugModule.createDebug(pkg);
70
+ return makeWrappedDebug(inner);
71
+ }
72
+ catch {
73
+ // Fall through to no-op
74
+ }
75
+ }
76
+ return noopDebug;
77
+ }
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAW5C,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAOhD,IAAI,eAAe,GAA2B,IAAI,CAAC;AACnD,IAAI,CAAC;IACH,eAAe,GAAG,QAAQ,CAAC,YAAY,CAAoB,CAAC;AAC9D,CAAC;AAAC,MAAM,CAAC;IACP,gDAAgD;AAClD,CAAC;AAED,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,MAAM,KAAK,GAAI,UAAsC,CAAC,6BAA6B,CAAC,CAAC;QACrF,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAI,KAA6D,CAAC,QAAQ,EAAE,CAAC;YACtF,OAAO,GAAG,EAAE,CAAC,eAAe,CAAuB,CAAC;QACtD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,SAAS,GAAkB;IAC/B,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;CACrB,CAAC;AAEF,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,KAAoB;IAC5C,OAAO;QACL,GAAG,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;YAC7C,MAAM,QAAQ,GACZ,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC/D,CAAC,CAAC,EAAE,GAAI,IAAgC,EAAE,aAAa,EAAE;gBACzD,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,eAAe,IAAI,OAAO,eAAe,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QACzE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC/C,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { HazoError, type HazoErrorOptions } from './base.js';
2
+ export interface HazoAuthErrorOptions extends Omit<HazoErrorOptions, 'httpStatus' | 'retryable'> {
3
+ /**
4
+ * When true, sets httpStatus to 403 and uses the _FORBIDDEN code prefix.
5
+ * Default false → 401 with _UNAUTHORIZED prefix.
6
+ */
7
+ forbidden?: boolean;
8
+ }
9
+ export declare class HazoAuthError extends HazoError {
10
+ readonly forbidden: boolean;
11
+ constructor(opts: HazoAuthErrorOptions);
12
+ toUserMessage(): string;
13
+ }
14
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/errors/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,WAAW,CAAC;IAC9F;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,aAAc,SAAQ,SAAS;IAC1C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,IAAI,EAAE,oBAAoB;IAUtC,aAAa,IAAI,MAAM;CAKxB"}
@@ -0,0 +1,19 @@
1
+ import { HazoError } from './base.js';
2
+ export class HazoAuthError extends HazoError {
3
+ forbidden;
4
+ constructor(opts) {
5
+ const { forbidden = false, ...rest } = opts;
6
+ super({
7
+ httpStatus: forbidden ? 403 : 401,
8
+ retryable: false,
9
+ ...rest,
10
+ });
11
+ this.forbidden = forbidden;
12
+ }
13
+ toUserMessage() {
14
+ return this.forbidden
15
+ ? "You don't have permission to do that."
16
+ : 'Authentication required.';
17
+ }
18
+ }
19
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/errors/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,WAAW,CAAC;AAU7D,MAAM,OAAO,aAAc,SAAQ,SAAS;IACjC,SAAS,CAAU;IAE5B,YAAY,IAA0B;QACpC,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QAC5C,KAAK,CAAC;YACJ,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YACjC,SAAS,EAAE,KAAK;YAChB,GAAG,IAAI;SACR,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,SAAS;YACnB,CAAC,CAAC,uCAAuC;YACzC,CAAC,CAAC,0BAA0B,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,89 @@
1
+ import { HAZO_ERROR_SYMBOL } from '../constants.js';
2
+ export interface HazoErrorOptions {
3
+ code: string;
4
+ pkg: string;
5
+ message: string;
6
+ httpStatus?: number;
7
+ context?: Record<string, unknown>;
8
+ retryable?: boolean;
9
+ cause?: Error;
10
+ }
11
+ export declare class HazoError extends Error {
12
+ readonly code: string;
13
+ readonly pkg: string;
14
+ readonly httpStatus?: number;
15
+ readonly context?: Record<string, unknown>;
16
+ readonly correlationId?: string;
17
+ readonly env: string;
18
+ readonly retryable: boolean;
19
+ readonly cause?: Error;
20
+ /** Symbol marker used by HazoError.is() — survives realm boundaries and duplicate copies */
21
+ readonly [HAZO_ERROR_SYMBOL]: true;
22
+ constructor(opts: HazoErrorOptions);
23
+ /**
24
+ * Full serialisation of this error.
25
+ *
26
+ * Stack is included only when:
27
+ * - process.env.HAZO_INCLUDE_STACK === '1', OR
28
+ * - process.env.NODE_ENV !== 'production'
29
+ *
30
+ * Stack is never included in a browser context (typeof window !== 'undefined').
31
+ */
32
+ toJSON(): {
33
+ name: string;
34
+ code: string;
35
+ pkg: string;
36
+ message: string;
37
+ httpStatus?: number;
38
+ context?: Record<string, unknown>;
39
+ correlationId?: string;
40
+ env: string;
41
+ retryable: boolean;
42
+ cause?: {
43
+ name: string;
44
+ message: string;
45
+ stack?: string;
46
+ };
47
+ stack?: string;
48
+ };
49
+ /**
50
+ * Produces a safe HTTP response body.
51
+ * Never includes stack traces regardless of environment.
52
+ * httpStatus defaults to 500.
53
+ */
54
+ toHttpResponse(): {
55
+ status: number;
56
+ body: {
57
+ error: {
58
+ code: string;
59
+ message: string;
60
+ correlationId?: string;
61
+ context?: Record<string, unknown>;
62
+ };
63
+ };
64
+ };
65
+ /**
66
+ * Returns a safe, user-facing error message.
67
+ *
68
+ * Never includes stack traces, file paths, internal codes, or implementation details.
69
+ * Subclasses override this to provide more precise messages where the extra context
70
+ * is still user-safe (e.g. HazoNotFoundError can name the missing resource type).
71
+ *
72
+ * Status-based defaults:
73
+ * 400 → the error message (validation failures are written for users)
74
+ * 401/403 → permission/auth message
75
+ * 404 → not found
76
+ * 409 → conflict
77
+ * 429 → rate limit
78
+ * 503 → service unavailable
79
+ * 500 → unexpected error
80
+ * other → generic fallback
81
+ */
82
+ toUserMessage(): string;
83
+ /**
84
+ * Type guard that checks the symbol marker.
85
+ * Safer than instanceof — works across realm boundaries and duplicate hazo_core copies.
86
+ */
87
+ static is(value: unknown): value is HazoError;
88
+ }
89
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/errors/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIpD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAEvB,4FAA4F;IAC5F,SAAiB,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;gBAE/B,IAAI,EAAE,gBAAgB;IAsClC;;;;;;;;OAQG;IACH,MAAM,IAAI;QACR,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAsCD;;;;OAIG;IACH,cAAc,IAAI;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,MAAM,CAAC;gBAChB,aAAa,CAAC,EAAE,MAAM,CAAC;gBACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;aACnC,CAAC;SACH,CAAC;KACH;IAwBD;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,IAAI,MAAM;IAYvB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS;CAO9C"}
@@ -0,0 +1,152 @@
1
+ import { HAZO_ERROR_SYMBOL } from '../constants.js';
2
+ import { getCurrentEnv } from '../utils/env.js';
3
+ import { registerSingleton } from '../singleton/index.js';
4
+ export class HazoError extends Error {
5
+ code;
6
+ pkg;
7
+ httpStatus;
8
+ context;
9
+ correlationId;
10
+ env;
11
+ retryable;
12
+ cause;
13
+ constructor(opts) {
14
+ super(opts.message);
15
+ this.name = this.constructor.name;
16
+ this.code = opts.code;
17
+ this.pkg = opts.pkg;
18
+ this.httpStatus = opts.httpStatus;
19
+ this.context = opts.context;
20
+ this.retryable = opts.retryable ?? false;
21
+ this.cause = opts.cause;
22
+ this.env = getCurrentEnv();
23
+ // Set the symbol marker for cross-realm instanceof safety
24
+ this[HAZO_ERROR_SYMBOL] = true;
25
+ // Attempt to attach correlationId from AsyncLocalStorage context.
26
+ // Uses globalThis-based access to avoid circular imports — context/server.ts
27
+ // sets globalThis.__hazo_core_context_store__ when it initialises.
28
+ let cid;
29
+ try {
30
+ const store = globalThis['__hazo_core_context_store__'];
31
+ cid = store?.getStore?.()?.correlationId;
32
+ }
33
+ catch {
34
+ // ignore — context module not loaded yet
35
+ }
36
+ this.correlationId = cid;
37
+ // Preserve stack trace in V8
38
+ if (Error.captureStackTrace) {
39
+ Error.captureStackTrace(this, this.constructor);
40
+ }
41
+ // Register this class as the canonical error class (belt-and-braces for cross-realm safety)
42
+ registerSingleton('hazo_core:error_class', HazoError);
43
+ }
44
+ /**
45
+ * Full serialisation of this error.
46
+ *
47
+ * Stack is included only when:
48
+ * - process.env.HAZO_INCLUDE_STACK === '1', OR
49
+ * - process.env.NODE_ENV !== 'production'
50
+ *
51
+ * Stack is never included in a browser context (typeof window !== 'undefined').
52
+ */
53
+ toJSON() {
54
+ const includeStack = typeof window === 'undefined' &&
55
+ (process.env['HAZO_INCLUDE_STACK'] === '1' ||
56
+ getCurrentEnv() !== 'production');
57
+ const result = {
58
+ name: this.name,
59
+ code: this.code,
60
+ pkg: this.pkg,
61
+ message: this.message,
62
+ retryable: this.retryable,
63
+ env: this.env,
64
+ };
65
+ if (this.httpStatus !== undefined) {
66
+ result.httpStatus = this.httpStatus;
67
+ }
68
+ if (this.context !== undefined) {
69
+ result.context = this.context;
70
+ }
71
+ if (this.correlationId !== undefined) {
72
+ result.correlationId = this.correlationId;
73
+ }
74
+ if (this.cause !== undefined) {
75
+ result.cause = {
76
+ name: this.cause.name,
77
+ message: this.cause.message,
78
+ ...(includeStack && this.cause.stack ? { stack: this.cause.stack } : {}),
79
+ };
80
+ }
81
+ if (includeStack && this.stack) {
82
+ result.stack = this.stack;
83
+ }
84
+ return result;
85
+ }
86
+ /**
87
+ * Produces a safe HTTP response body.
88
+ * Never includes stack traces regardless of environment.
89
+ * httpStatus defaults to 500.
90
+ */
91
+ toHttpResponse() {
92
+ const error = {
93
+ code: this.code,
94
+ message: this.message,
95
+ };
96
+ if (this.correlationId !== undefined) {
97
+ error.correlationId = this.correlationId;
98
+ }
99
+ if (this.context !== undefined) {
100
+ error.context = this.context;
101
+ }
102
+ return {
103
+ status: this.httpStatus ?? 500,
104
+ body: { error },
105
+ };
106
+ }
107
+ /**
108
+ * Returns a safe, user-facing error message.
109
+ *
110
+ * Never includes stack traces, file paths, internal codes, or implementation details.
111
+ * Subclasses override this to provide more precise messages where the extra context
112
+ * is still user-safe (e.g. HazoNotFoundError can name the missing resource type).
113
+ *
114
+ * Status-based defaults:
115
+ * 400 → the error message (validation failures are written for users)
116
+ * 401/403 → permission/auth message
117
+ * 404 → not found
118
+ * 409 → conflict
119
+ * 429 → rate limit
120
+ * 503 → service unavailable
121
+ * 500 → unexpected error
122
+ * other → generic fallback
123
+ */
124
+ toUserMessage() {
125
+ const status = this.httpStatus;
126
+ if (status === 400)
127
+ return this.message;
128
+ if (status === 401 || status === 403)
129
+ return "You don't have permission to do that.";
130
+ if (status === 404)
131
+ return 'The requested resource was not found.';
132
+ if (status === 409)
133
+ return 'This action conflicts with existing data.';
134
+ if (status === 429)
135
+ return 'Too many requests. Please try again later.';
136
+ if (status === 503)
137
+ return 'Service temporarily unavailable. Please try again.';
138
+ if (status === 500)
139
+ return 'An unexpected error occurred. Please try again.';
140
+ return 'An error occurred.';
141
+ }
142
+ /**
143
+ * Type guard that checks the symbol marker.
144
+ * Safer than instanceof — works across realm boundaries and duplicate hazo_core copies.
145
+ */
146
+ static is(value) {
147
+ return (typeof value === 'object' &&
148
+ value !== null &&
149
+ value[HAZO_ERROR_SYMBOL] === true);
150
+ }
151
+ }
152
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/errors/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { HazoError, type HazoErrorOptions } from './base.js';
2
+ /**
3
+ * HazoConfigError — thrown when a package's config fails validation.
4
+ *
5
+ * httpStatus is intentionally undefined: config errors are process-exit-level failures,
6
+ * not HTTP errors. They should crash the process at startup, not be caught and 500'd.
7
+ *
8
+ * Code convention: HAZO_<PKG>_CONFIG_<DETAIL>
9
+ * Example: HAZO_AUTH_CONFIG_INVALID_SESSION_TIMEOUT
10
+ */
11
+ export type HazoConfigErrorOptions = Omit<HazoErrorOptions, 'httpStatus' | 'retryable'> & {
12
+ httpStatus?: undefined;
13
+ };
14
+ export declare class HazoConfigError extends HazoError {
15
+ constructor(opts: HazoConfigErrorOptions);
16
+ toUserMessage(): string;
17
+ }
18
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/errors/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG;IACxF,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB,CAAC;AAEF,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,IAAI,EAAE,sBAAsB;IAQxC,aAAa,IAAI,MAAM;CAGxB"}
@@ -0,0 +1,14 @@
1
+ import { HazoError } from './base.js';
2
+ export class HazoConfigError extends HazoError {
3
+ constructor(opts) {
4
+ super({
5
+ retryable: false,
6
+ ...opts,
7
+ httpStatus: undefined,
8
+ });
9
+ }
10
+ toUserMessage() {
11
+ return 'Configuration error. Please contact support.';
12
+ }
13
+ }
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/errors/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,WAAW,CAAC;AAe7D,MAAM,OAAO,eAAgB,SAAQ,SAAS;IAC5C,YAAY,IAA4B;QACtC,KAAK,CAAC;YACJ,SAAS,EAAE,KAAK;YAChB,GAAG,IAAI;YACP,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;IAED,aAAa;QACX,OAAO,8CAA8C,CAAC;IACxD,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { HazoError, type HazoErrorOptions } from './base.js';
2
+ export type HazoConflictErrorOptions = Omit<HazoErrorOptions, 'httpStatus' | 'retryable'> & {
3
+ httpStatus?: number;
4
+ };
5
+ export declare class HazoConflictError extends HazoError {
6
+ constructor(opts: HazoConflictErrorOptions);
7
+ toUserMessage(): string;
8
+ }
9
+ //# sourceMappingURL=conflict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../../src/errors/conflict.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,IAAI,EAAE,wBAAwB;IAQ1C,aAAa,IAAI,MAAM;CAGxB"}
@@ -0,0 +1,14 @@
1
+ import { HazoError } from './base.js';
2
+ export class HazoConflictError extends HazoError {
3
+ constructor(opts) {
4
+ super({
5
+ httpStatus: 409,
6
+ retryable: false,
7
+ ...opts,
8
+ });
9
+ }
10
+ toUserMessage() {
11
+ return 'This action conflicts with existing data. Please refresh and try again.';
12
+ }
13
+ }
14
+ //# sourceMappingURL=conflict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/errors/conflict.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,WAAW,CAAC;AAM7D,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C,YAAY,IAA8B;QACxC,KAAK,CAAC;YACJ,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,KAAK;YAChB,GAAG,IAAI;SACR,CAAC,CAAC;IACL,CAAC;IAED,aAAa;QACX,OAAO,yEAAyE,CAAC;IACnF,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { HazoError, type HazoErrorOptions } from './base.js';
2
+ export type HazoExternalErrorOptions = Omit<HazoErrorOptions, 'httpStatus' | 'retryable'> & {
3
+ httpStatus?: number;
4
+ };
5
+ export declare class HazoExternalError extends HazoError {
6
+ constructor(opts: HazoExternalErrorOptions);
7
+ toUserMessage(): string;
8
+ }
9
+ //# sourceMappingURL=external.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external.d.ts","sourceRoot":"","sources":["../../src/errors/external.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,IAAI,EAAE,wBAAwB;IAQ1C,aAAa,IAAI,MAAM;CAGxB"}
@@ -0,0 +1,14 @@
1
+ import { HazoError } from './base.js';
2
+ export class HazoExternalError extends HazoError {
3
+ constructor(opts) {
4
+ super({
5
+ httpStatus: 502,
6
+ retryable: true,
7
+ ...opts,
8
+ });
9
+ }
10
+ toUserMessage() {
11
+ return 'An external service is unavailable. Please try again.';
12
+ }
13
+ }
14
+ //# sourceMappingURL=external.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external.js","sourceRoot":"","sources":["../../src/errors/external.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,WAAW,CAAC;AAM7D,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C,YAAY,IAA8B;QACxC,KAAK,CAAC;YACJ,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,IAAI;YACf,GAAG,IAAI;SACR,CAAC,CAAC;IACL,CAAC;IAED,aAAa;QACX,OAAO,uDAAuD,CAAC;IACjE,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import type { ZodError } from 'zod';
2
+ import { HazoValidationError } from './validation.js';
3
+ import { HazoConfigError } from './config.js';
4
+ /**
5
+ * Create a HazoValidationError from a ZodError.
6
+ * Typically used for request body / query param validation failures.
7
+ *
8
+ * @example
9
+ * const result = mySchema.safeParse(input);
10
+ * if (!result.success) {
11
+ * throw fromZodValidation(result.error, { pkg: 'hazo_auth', code: 'HAZO_AUTH_INVALID_INPUT' });
12
+ * }
13
+ */
14
+ export declare function fromZodValidation(zodError: ZodError, opts: {
15
+ pkg: string;
16
+ code: string;
17
+ httpStatus?: number;
18
+ }): HazoValidationError;
19
+ /**
20
+ * Create a HazoConfigError from a ZodError.
21
+ * Typically used when a package's INI config fails its Zod schema validation.
22
+ *
23
+ * @example
24
+ * const result = configSchema.safeParse(rawConfig);
25
+ * if (!result.success) {
26
+ * throw fromZodConfig(result.error, { pkg: 'hazo_auth', code: 'HAZO_AUTH_CONFIG_INVALID' });
27
+ * }
28
+ */
29
+ export declare function fromZodConfig(zodError: ZodError, opts: {
30
+ pkg: string;
31
+ code: string;
32
+ }): HazoConfigError;
33
+ //# sourceMappingURL=from_zod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from_zod.d.ts","sourceRoot":"","sources":["../../src/errors/from_zod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAwB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAY9C;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD,mBAAmB,CAiBrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC,eAAe,CAgBjB"}