@revealui/core 0.12.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/dist/api/rest.js +4 -4
- package/dist/client/admin/utils/csrf.d.ts +9 -6
- package/dist/client/admin/utils/csrf.d.ts.map +1 -1
- package/dist/client/admin/utils/csrf.js +9 -6
- package/dist/collections/operations/fieldValidation.d.ts +5 -16
- package/dist/collections/operations/fieldValidation.d.ts.map +1 -1
- package/dist/collections/operations/fieldValidation.js +5 -20
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +4 -2
- package/dist/database/safe-parse.js +3 -3
- package/dist/database/universal-postgres.d.ts.map +1 -1
- package/dist/database/universal-postgres.js +10 -13
- package/dist/deployment-mode.d.ts +44 -0
- package/dist/deployment-mode.d.ts.map +1 -0
- package/dist/deployment-mode.js +58 -0
- package/dist/error-handling/error-boundary.d.ts +16 -2
- package/dist/error-handling/error-boundary.d.ts.map +1 -1
- package/dist/error-handling/error-boundary.js +18 -3
- package/dist/error-handling/error-reporter.d.ts +1 -1
- package/dist/error-handling/error-reporter.d.ts.map +1 -1
- package/dist/error-handling/error-reporter.js +6 -2
- package/dist/error-handling/index.d.ts +1 -1
- package/dist/error-handling/index.d.ts.map +1 -1
- package/dist/error-handling/index.js +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/instance/logger.d.ts +18 -7
- package/dist/instance/logger.d.ts.map +1 -1
- package/dist/instance/logger.js +66 -17
- package/dist/license/mint-client.d.ts +72 -0
- package/dist/license/mint-client.d.ts.map +1 -0
- package/dist/license/mint-client.js +175 -0
- package/dist/license.d.ts +6 -0
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +15 -1
- package/dist/observability/index.d.ts +5 -2
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +5 -2
- package/dist/observability/logger.d.ts +5 -3
- package/dist/observability/logger.d.ts.map +1 -1
- package/dist/observability/logger.js +5 -3
- package/dist/relationships/analyzer.js +2 -2
- package/dist/storage/object-storage.d.ts.map +1 -1
- package/dist/storage/object-storage.js +3 -3
- package/dist/utils/errors.d.ts +16 -4
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +14 -2
- package/dist/utils/json-parsing.d.ts.map +1 -1
- package/dist/utils/json-parsing.js +4 -2
- package/dist/utils/logger-client.d.ts +6 -27
- package/dist/utils/logger-client.d.ts.map +1 -1
- package/dist/utils/logger-client.js +5 -51
- package/dist/utils/logger-server.d.ts +16 -20
- package/dist/utils/logger-server.d.ts.map +1 -1
- package/dist/utils/logger-server.js +40 -53
- package/dist/utils/logger.d.ts +7 -9
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +6 -8
- package/package.json +154 -76
- package/dist/caching/index.d.ts +0 -6
- package/dist/caching/index.d.ts.map +0 -1
- package/dist/caching/index.js +0 -5
- package/dist/observability/tracing.d.ts +0 -149
- package/dist/observability/tracing.d.ts.map +0 -1
- package/dist/observability/tracing.js +0 -380
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { logger } from '../observability/logger.js';
|
|
2
2
|
/**
|
|
3
3
|
* Analyzes a collection or global configuration and extracts all relationship fields
|
|
4
4
|
* with their storage metadata for proper query building.
|
|
@@ -51,7 +51,7 @@ export function getRelationshipFields(config, collectionSlug) {
|
|
|
51
51
|
const validation = validateRelationshipMetadata(relationships);
|
|
52
52
|
if (!validation.valid) {
|
|
53
53
|
for (const error of validation.errors) {
|
|
54
|
-
|
|
54
|
+
logger.warn(`[RelationshipAnalyzer] ${error}`);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
return relationships;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-storage.d.ts","sourceRoot":"","sources":["../../src/storage/object-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,WAAW,CAAC,EAAE;QACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,eAAe,CAAC;IACvC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"object-storage.d.ts","sourceRoot":"","sources":["../../src/storage/object-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,WAAW,CAAC,EAAE;QACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,eAAe,CAAC;IACvC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAuGjE"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* WARNING: This module is server-only.
|
|
18
18
|
* Do NOT import in client-side code or edge runtime.
|
|
19
19
|
*/
|
|
20
|
-
import {
|
|
20
|
+
import { logger } from '../observability/logger.js';
|
|
21
21
|
export function objectStorage(config) {
|
|
22
22
|
const prefix = config.prefix || 'uploads';
|
|
23
23
|
// Memoize the provider so the underlying client (S3 / Blob) is constructed
|
|
@@ -71,7 +71,7 @@ export function objectStorage(config) {
|
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
73
|
catch (error) {
|
|
74
|
-
|
|
74
|
+
logger.error('Object storage upload error', error instanceof Error ? error : new Error(String(error)));
|
|
75
75
|
throw error;
|
|
76
76
|
}
|
|
77
77
|
},
|
|
@@ -86,7 +86,7 @@ export function objectStorage(config) {
|
|
|
86
86
|
await getProvider().del(keyOrUrl);
|
|
87
87
|
}
|
|
88
88
|
catch (error) {
|
|
89
|
-
|
|
89
|
+
logger.error('Object storage delete error', error instanceof Error ? error : new Error(String(error)));
|
|
90
90
|
throw error;
|
|
91
91
|
}
|
|
92
92
|
},
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -14,14 +14,26 @@ export declare class ApplicationError extends Error {
|
|
|
14
14
|
constructor(message: string, code: string, statusCode?: number, context?: Record<string, unknown> | undefined);
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
* Validation Error
|
|
18
|
-
*
|
|
17
|
+
* Validation Error (canonical domain / API / field-ingress class)
|
|
18
|
+
*
|
|
19
|
+
* Single source for server-side validation failures. Carries HTTP 400 via
|
|
20
|
+
* `status` / `statusCode` so REST and middleware treat field-ingress and
|
|
21
|
+
* API validation the same. Distinct from `ClientValidationError` in the
|
|
22
|
+
* React error-boundary module (client form field map).
|
|
23
|
+
*
|
|
24
|
+
* Always branch with `instanceof ValidationError` — never `name ===
|
|
25
|
+
* 'ValidationError'`, which false-positives against other classes that
|
|
26
|
+
* historically shared the same name.
|
|
19
27
|
*/
|
|
20
28
|
export declare class ValidationError extends Error {
|
|
21
29
|
field: string;
|
|
22
|
-
value
|
|
30
|
+
value?: unknown | undefined;
|
|
23
31
|
context?: Record<string, unknown> | undefined;
|
|
24
|
-
|
|
32
|
+
/** HTTP status for transports that read `error.status` (e.g. rest.ts). */
|
|
33
|
+
readonly status = 400;
|
|
34
|
+
/** Alias for handlers that read `statusCode`. */
|
|
35
|
+
readonly statusCode = 400;
|
|
36
|
+
constructor(message: string, field: string, value?: unknown | undefined, context?: Record<string, unknown> | undefined);
|
|
25
37
|
}
|
|
26
38
|
/**
|
|
27
39
|
* Database Error
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAGhC,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,MAAM;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAHxC,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAY,EACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAM3C;AAED
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -22,13 +22,25 @@ export class ApplicationError extends Error {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
* Validation Error
|
|
26
|
-
*
|
|
25
|
+
* Validation Error (canonical domain / API / field-ingress class)
|
|
26
|
+
*
|
|
27
|
+
* Single source for server-side validation failures. Carries HTTP 400 via
|
|
28
|
+
* `status` / `statusCode` so REST and middleware treat field-ingress and
|
|
29
|
+
* API validation the same. Distinct from `ClientValidationError` in the
|
|
30
|
+
* React error-boundary module (client form field map).
|
|
31
|
+
*
|
|
32
|
+
* Always branch with `instanceof ValidationError` — never `name ===
|
|
33
|
+
* 'ValidationError'`, which false-positives against other classes that
|
|
34
|
+
* historically shared the same name.
|
|
27
35
|
*/
|
|
28
36
|
export class ValidationError extends Error {
|
|
29
37
|
field;
|
|
30
38
|
value;
|
|
31
39
|
context;
|
|
40
|
+
/** HTTP status for transports that read `error.status` (e.g. rest.ts). */
|
|
41
|
+
status = 400;
|
|
42
|
+
/** Alias for handlers that read `statusCode`. */
|
|
43
|
+
statusCode = 400;
|
|
32
44
|
constructor(message, field, value, context) {
|
|
33
45
|
super(message);
|
|
34
46
|
this.field = field;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-parsing.d.ts","sourceRoot":"","sources":["../../src/utils/json-parsing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAetD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,SAAS,CAAC,EAAE,MAAM,GACjB,cAAc,
|
|
1
|
+
{"version":3,"file":"json-parsing.d.ts","sourceRoot":"","sources":["../../src/utils/json-parsing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAetD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,SAAS,CAAC,EAAE,MAAM,GACjB,cAAc,CA6DhB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASjE"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Utilities for serializing and deserializing JSON fields in database operations.
|
|
5
5
|
* Handles the _json column pattern used for storing complex field types.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { logger } from '../observability/logger.js';
|
|
8
8
|
/**
|
|
9
9
|
* Parse a JSON field value safely
|
|
10
10
|
*
|
|
@@ -67,7 +67,9 @@ export function deserializeJsonFields(doc, tableName) {
|
|
|
67
67
|
}
|
|
68
68
|
catch (error) {
|
|
69
69
|
// Invalid JSON - log for debugging but continue
|
|
70
|
-
|
|
70
|
+
logger.warn(`Failed to parse _json in ${tableName || 'unknown'}`, {
|
|
71
|
+
error: error instanceof Error ? { message: error.message, name: error.name } : error,
|
|
72
|
+
});
|
|
71
73
|
}
|
|
72
74
|
}
|
|
73
75
|
// Remove _json from result (internal column)
|
|
@@ -1,32 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Client-
|
|
2
|
+
* Client-safe logger entry (ADR-008 D4)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Info/warn messages are no-ops in production to avoid console pollution.
|
|
4
|
+
* Re-exports `@revealui/utils/logger` (no Node async_hooks). Prefer
|
|
5
|
+
* `@revealui/core/observability/logger` for packages that already depend on core.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
* React component. Adding 'use client' causes Next.js to create a reference
|
|
10
|
-
* proxy when imported from server code (API routes), stripping all methods.
|
|
7
|
+
* Package export: `@revealui/core/utils/logger/client`
|
|
11
8
|
*/
|
|
12
|
-
export type
|
|
13
|
-
export
|
|
14
|
-
[key: string]: unknown;
|
|
15
|
-
}
|
|
16
|
-
export interface Logger {
|
|
17
|
-
debug(message: string, context?: LogContext): void;
|
|
18
|
-
info(message: string, context?: LogContext): void;
|
|
19
|
-
warn(message: string, context?: LogContext): void;
|
|
20
|
-
error(message: string, context?: LogContext): void;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Create a client-safe logger instance
|
|
24
|
-
*
|
|
25
|
-
* @returns Logger instance safe for client-side use
|
|
26
|
-
*/
|
|
27
|
-
export declare function createLogger(): Logger;
|
|
28
|
-
/**
|
|
29
|
-
* Default client-safe logger instance
|
|
30
|
-
*/
|
|
31
|
-
export declare const logger: Logger;
|
|
9
|
+
export type { LogContext, LogEntry, LoggerConfig, LogLevel, } from '@revealui/utils/logger';
|
|
10
|
+
export { createLogger, Logger, logAudit, logError, logger, logQuery, } from '@revealui/utils/logger';
|
|
32
11
|
//# sourceMappingURL=logger-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-client.d.ts","sourceRoot":"","sources":["../../src/utils/logger-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logger-client.d.ts","sourceRoot":"","sources":["../../src/utils/logger-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,YAAY,EACV,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,QAAQ,GACT,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,MAAM,wBAAwB,CAAC"}
|
|
@@ -1,55 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Client-
|
|
2
|
+
* Client-safe logger entry (ADR-008 D4)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Info/warn messages are no-ops in production to avoid console pollution.
|
|
4
|
+
* Re-exports `@revealui/utils/logger` (no Node async_hooks). Prefer
|
|
5
|
+
* `@revealui/core/observability/logger` for packages that already depend on core.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
* React component. Adding 'use client' causes Next.js to create a reference
|
|
10
|
-
* proxy when imported from server code (API routes), stripping all methods.
|
|
7
|
+
* Package export: `@revealui/core/utils/logger/client`
|
|
11
8
|
*/
|
|
12
|
-
|
|
13
|
-
* Client-safe logger implementation
|
|
14
|
-
* Simple console-based logging without Node.js dependencies
|
|
15
|
-
*/
|
|
16
|
-
class ClientLogger {
|
|
17
|
-
formatMessage(level, message, context) {
|
|
18
|
-
const timestamp = new Date().toISOString();
|
|
19
|
-
const prefix = `[${timestamp}] [RevealUI] [${level.toUpperCase()}]`;
|
|
20
|
-
if (context && Object.keys(context).length > 0) {
|
|
21
|
-
return `${prefix} ${message} ${JSON.stringify(context)}`;
|
|
22
|
-
}
|
|
23
|
-
return `${prefix} ${message}`;
|
|
24
|
-
}
|
|
25
|
-
debug(message, context) {
|
|
26
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
27
|
-
console.debug(this.formatMessage('debug', message, context));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
info(message, context) {
|
|
31
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
32
|
-
console.info(this.formatMessage('info', message, context));
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
warn(message, context) {
|
|
36
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
37
|
-
console.warn(this.formatMessage('warn', message, context));
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
error(message, context) {
|
|
41
|
-
console.error(this.formatMessage('error', message, context));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Create a client-safe logger instance
|
|
46
|
-
*
|
|
47
|
-
* @returns Logger instance safe for client-side use
|
|
48
|
-
*/
|
|
49
|
-
export function createLogger() {
|
|
50
|
-
return new ClientLogger();
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Default client-safe logger instance
|
|
54
|
-
*/
|
|
55
|
-
export const logger = createLogger();
|
|
9
|
+
export { createLogger, Logger, logAudit, logError, logger, logQuery, } from '@revealui/utils/logger';
|
|
@@ -1,32 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Server
|
|
2
|
+
* Server logger with request-id enrichment (ADR-008 D3/D4)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Thin facade over `@revealui/utils/logger` that injects `requestId` from
|
|
5
|
+
* AsyncLocalStorage (`request-context`) on every log call. Not a second
|
|
6
|
+
* logger implementation.
|
|
7
7
|
*
|
|
8
|
-
* WARNING:
|
|
9
|
-
*
|
|
8
|
+
* WARNING: Uses Node.js APIs (async_hooks via request-context). Do not import
|
|
9
|
+
* from browser / RSC client graphs. Client code: `@revealui/core/utils/logger`
|
|
10
|
+
* or `@revealui/core/observability/logger`.
|
|
11
|
+
*
|
|
12
|
+
* Package export: `@revealui/core/utils/logger/server`
|
|
13
|
+
* Also re-exported from `@revealui/core/server`.
|
|
10
14
|
*/
|
|
11
|
-
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
export interface Logger {
|
|
16
|
-
debug(message: string, context?: LogContext): void;
|
|
17
|
-
info(message: string, context?: LogContext): void;
|
|
18
|
-
warn(message: string, context?: LogContext): void;
|
|
19
|
-
error(message: string, context?: LogContext): void;
|
|
20
|
-
}
|
|
15
|
+
import { type LogContext, type LogLevel, type Logger as UtilsLogger } from '@revealui/utils/logger';
|
|
16
|
+
export type { LogContext, LogLevel };
|
|
17
|
+
export type Logger = Pick<UtilsLogger, 'debug' | 'info' | 'warn' | 'error'>;
|
|
21
18
|
/**
|
|
22
|
-
* Create a logger
|
|
19
|
+
* Create a server logger that enriches context with the active request ID.
|
|
23
20
|
*
|
|
24
|
-
* @param minLevel -
|
|
25
|
-
* @returns Logger instance
|
|
21
|
+
* @param minLevel - Optional minimum level (maps to utils `level` config)
|
|
26
22
|
*/
|
|
27
23
|
export declare function createLogger(minLevel?: LogLevel): Logger;
|
|
28
24
|
/**
|
|
29
|
-
* Default logger
|
|
25
|
+
* Default server logger (request-id enriching).
|
|
30
26
|
*/
|
|
31
27
|
export declare const logger: Logger;
|
|
32
28
|
//# sourceMappingURL=logger-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-server.d.ts","sourceRoot":"","sources":["../../src/utils/logger-server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logger-server.d.ts","sourceRoot":"","sources":["../../src/utils/logger-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,MAAM,IAAI,WAAW,EAE3B,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AACrC,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AA2B5E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAMxD;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,MAA8D,CAAC"}
|
|
@@ -1,68 +1,55 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Server
|
|
2
|
+
* Server logger with request-id enrichment (ADR-008 D3/D4)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Thin facade over `@revealui/utils/logger` that injects `requestId` from
|
|
5
|
+
* AsyncLocalStorage (`request-context`) on every log call. Not a second
|
|
6
|
+
* logger implementation.
|
|
7
7
|
*
|
|
8
|
-
* WARNING:
|
|
9
|
-
*
|
|
8
|
+
* WARNING: Uses Node.js APIs (async_hooks via request-context). Do not import
|
|
9
|
+
* from browser / RSC client graphs. Client code: `@revealui/core/utils/logger`
|
|
10
|
+
* or `@revealui/core/observability/logger`.
|
|
11
|
+
*
|
|
12
|
+
* Package export: `@revealui/core/utils/logger/server`
|
|
13
|
+
* Also re-exported from `@revealui/core/server`.
|
|
10
14
|
*/
|
|
15
|
+
import { createLogger as createUtilsLogger, Logger as UtilsLoggerClass, } from '@revealui/utils/logger';
|
|
11
16
|
import { getRequestId } from './request-context.js';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
shouldLog(level) {
|
|
18
|
-
const levels = ['debug', 'info', 'warn', 'error'];
|
|
19
|
-
return levels.indexOf(level) >= levels.indexOf(this.minLevel);
|
|
20
|
-
}
|
|
21
|
-
formatMessage(level, message, context) {
|
|
22
|
-
const timestamp = new Date().toISOString();
|
|
23
|
-
const prefix = `[${timestamp}] [${level.toUpperCase()}]`;
|
|
24
|
-
// Automatically include request ID if available
|
|
25
|
-
const requestId = getRequestId();
|
|
26
|
-
const enrichedContext = requestId ? { requestId, ...context } : context;
|
|
27
|
-
if (enrichedContext && Object.keys(enrichedContext).length > 0) {
|
|
28
|
-
return `${prefix} ${message} ${JSON.stringify(enrichedContext)}`;
|
|
29
|
-
}
|
|
30
|
-
return `${prefix} ${message}`;
|
|
31
|
-
}
|
|
32
|
-
debug(message, context) {
|
|
33
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
34
|
-
console.debug(this.formatMessage('debug', message, context));
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
info(message, context) {
|
|
38
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
39
|
-
console.info(this.formatMessage('info', message, context));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
warn(message, context) {
|
|
43
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
44
|
-
console.warn(this.formatMessage('warn', message, context));
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
error(message, context) {
|
|
48
|
-
if (this.shouldLog('error')) {
|
|
49
|
-
console.error(this.formatMessage('error', message, context));
|
|
50
|
-
}
|
|
17
|
+
function withRequestId(context) {
|
|
18
|
+
const requestId = getRequestId();
|
|
19
|
+
if (!requestId) {
|
|
20
|
+
return context;
|
|
51
21
|
}
|
|
22
|
+
return { requestId, ...context };
|
|
23
|
+
}
|
|
24
|
+
function wrap(backend) {
|
|
25
|
+
return {
|
|
26
|
+
debug(message, context) {
|
|
27
|
+
backend.debug(message, withRequestId(context));
|
|
28
|
+
},
|
|
29
|
+
info(message, context) {
|
|
30
|
+
backend.info(message, withRequestId(context));
|
|
31
|
+
},
|
|
32
|
+
warn(message, context) {
|
|
33
|
+
backend.warn(message, withRequestId(context));
|
|
34
|
+
},
|
|
35
|
+
error(message, context) {
|
|
36
|
+
backend.error(message, withRequestId(context));
|
|
37
|
+
},
|
|
38
|
+
};
|
|
52
39
|
}
|
|
53
40
|
/**
|
|
54
|
-
* Create a logger
|
|
41
|
+
* Create a server logger that enriches context with the active request ID.
|
|
55
42
|
*
|
|
56
|
-
* @param minLevel -
|
|
57
|
-
* @returns Logger instance
|
|
43
|
+
* @param minLevel - Optional minimum level (maps to utils `level` config)
|
|
58
44
|
*/
|
|
59
45
|
export function createLogger(minLevel) {
|
|
60
|
-
// In production, can be extended to use structured logging services
|
|
61
|
-
// For now, use console-based logger
|
|
62
46
|
const level = minLevel || process.env.LOG_LEVEL || 'info';
|
|
63
|
-
|
|
47
|
+
const backend = new UtilsLoggerClass({
|
|
48
|
+
level,
|
|
49
|
+
}).child({ component: 'core-server' });
|
|
50
|
+
return wrap(backend);
|
|
64
51
|
}
|
|
65
52
|
/**
|
|
66
|
-
* Default logger
|
|
53
|
+
* Default server logger (request-id enriching).
|
|
67
54
|
*/
|
|
68
|
-
export const logger =
|
|
55
|
+
export const logger = wrap(createUtilsLogger({ component: 'core-server' }));
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Logger
|
|
2
|
+
* Logger barrel (client-safe) — ADR-008 D4
|
|
3
3
|
*
|
|
4
|
-
* Re-exports
|
|
5
|
-
*
|
|
6
|
-
* without Node.js dependencies (no async_hooks, no crypto).
|
|
4
|
+
* Re-exports `@revealui/utils/logger`. Prefer
|
|
5
|
+
* `@revealui/core/observability/logger` for new core-dependent code.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* import { logger } from '@revealui/core/utils/logger/server'
|
|
7
|
+
* Server + request-id: `@revealui/core/server` or
|
|
8
|
+
* `@revealui/core/utils/logger/server`.
|
|
11
9
|
*/
|
|
12
|
-
export type { LogContext,
|
|
13
|
-
export { createLogger, logger } from '
|
|
10
|
+
export type { LogContext, LogEntry, LoggerConfig, LogLevel, } from '@revealui/utils/logger';
|
|
11
|
+
export { createLogger, Logger, logAudit, logError, logger, logQuery, } from '@revealui/utils/logger';
|
|
14
12
|
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EACV,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,QAAQ,GACT,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,MAAM,wBAAwB,CAAC"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Logger
|
|
2
|
+
* Logger barrel (client-safe) — ADR-008 D4
|
|
3
3
|
*
|
|
4
|
-
* Re-exports
|
|
5
|
-
*
|
|
6
|
-
* without Node.js dependencies (no async_hooks, no crypto).
|
|
4
|
+
* Re-exports `@revealui/utils/logger`. Prefer
|
|
5
|
+
* `@revealui/core/observability/logger` for new core-dependent code.
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* import { logger } from '@revealui/core/utils/logger/server'
|
|
7
|
+
* Server + request-id: `@revealui/core/server` or
|
|
8
|
+
* `@revealui/core/utils/logger/server`.
|
|
11
9
|
*/
|
|
12
|
-
export { createLogger, logger } from '
|
|
10
|
+
export { createLogger, Logger, logAudit, logError, logger, logQuery, } from '@revealui/utils/logger';
|