Skip to content

Commit 2c3f2a4

Browse files
authored
Merge pull request #2 from macropygia/feature/logger
Separate logger
2 parents 7624784 + 4555cae commit 2c3f2a4

7 files changed

+116
-56
lines changed

__test__/const.ts

+3-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { mock } from "bun:test";
22
import type { OidcClient } from "@/core/OidcClient";
33
import { defaultCookieSettings, defaultSettings } from "@/core/const";
4+
import { consoleLogger } from "@/loggers/consoleLogger";
45
import type {
56
OIDCClientActiveSession,
67
OIDCClientOptions,
78
OIDCClientSession,
89
} from "@/types";
910
import type { Cookie } from "elysia";
1011
import type { IdTokenClaims } from "openid-client";
11-
import pino from "pino";
1212

1313
export type DeepPartial<T> = T extends object
1414
? { [P in keyof T]?: DeepPartial<T[P]> }
@@ -21,6 +21,8 @@ export const lokiTempFile = "__test__/temp.db";
2121
export const rpPort = 57828;
2222
export const opPort = 57829;
2323

24+
export const logger = consoleLogger();
25+
2426
export const mockBaseOptions = {
2527
baseUrl: "https://localhost/client",
2628
issuerUrl: "https://localhost/issuer",
@@ -74,16 +76,6 @@ export const getInit: RequestInit = {
7476
},
7577
};
7678

77-
export const logger = pino({
78-
level: "trace",
79-
transport: {
80-
target: "pino-pretty",
81-
options: {
82-
sync: true,
83-
},
84-
},
85-
});
86-
8779
export const mockClaims = {
8880
exp: 5000000000000 / 1000,
8981
iss: `http://localhost:${opPort}`,

__test__/general.test.ts

-9
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,6 @@ describe("Integration/general", async () => {
2121
client_secret,
2222
},
2323
authParams: {},
24-
loggerOptions: {
25-
level: "trace",
26-
transport: {
27-
target: "pino-pretty",
28-
options: {
29-
sync: true,
30-
},
31-
},
32-
},
3324
});
3425
const endpoints = oidcClient.getEndpoints();
3526
const app = new Elysia()

core/BaseOidcClient.ts

+6-13
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import {
2-
defaultCookieSettings,
3-
defaultLoggerOptions,
4-
defaultSettings,
5-
} from "@/core/const";
1+
import { defaultCookieSettings, defaultSettings } from "@/core/const";
62
import { SQLiteAdapter } from "@/dataAdapters/SQLiteAdapter";
73
import { initialize } from "@/functions/initialize";
84
import { validateOptions } from "@/functions/validateOptions";
5+
import { consoleLogger } from "@/loggers/consoleLogger";
96
import type {
107
OIDCClientCookieSettings,
118
OIDCClientDataAdapter,
@@ -20,7 +17,6 @@ import type {
2017
Issuer,
2118
IssuerMetadata,
2219
} from "openid-client";
23-
import pino from "pino";
2420

2521
/**
2622
* OidcClient without methods for testing
@@ -47,7 +43,7 @@ export class BaseOidcClient {
4743
/** Plugin database */
4844
sessions: OIDCClientDataAdapter;
4945
/** Logger */
50-
logger?: OIDCClientLogger;
46+
logger: OIDCClientLogger | undefined;
5147
/** Initialized */
5248
initialized = false;
5349

@@ -65,7 +61,7 @@ export class BaseOidcClient {
6561
dataAdapter,
6662
settings,
6763
cookieSettings,
68-
loggerOptions,
64+
logger,
6965
} = options;
7066

7167
if (!issuerUrl) {
@@ -87,11 +83,8 @@ export class BaseOidcClient {
8783

8884
this.sessions = dataAdapter || new SQLiteAdapter();
8985

90-
this.logger = pino(
91-
loggerOptions ||
92-
defaultLoggerOptions[process.env.NODE_ENV || "never"] ||
93-
defaultLoggerOptions.default,
94-
);
86+
this.logger =
87+
logger === null ? undefined : logger ? logger : consoleLogger("info");
9588
}
9689

9790
/**

loggers/consoleLogger.ts

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { OIDCClientLogger } from "@/types";
2+
import type { LevelWithSilent } from "pino";
3+
4+
/**
5+
* Console logger
6+
* @param level - Minimum level to be displayed
7+
* @returns Logger (console)
8+
*/
9+
export const consoleLogger = (
10+
level?: keyof typeof levels,
11+
): OIDCClientLogger => ({
12+
silent: levels[level || "trace"] >= 99 ? console.debug : () => undefined,
13+
trace: levels[level || "trace"] >= 10 ? console.debug : () => undefined,
14+
debug: levels[level || "trace"] >= 20 ? console.debug : () => undefined,
15+
info: levels[level || "trace"] >= 30 ? console.info : () => undefined,
16+
warn: levels[level || "trace"] >= 40 ? console.warn : () => undefined,
17+
error: levels[level || "trace"] >= 50 ? console.error : () => undefined,
18+
fatal: levels[level || "trace"] >= 60 ? console.error : () => undefined,
19+
});
20+
21+
const levels: Record<LevelWithSilent, number> = {
22+
silent: 99,
23+
fatal: 60,
24+
error: 50,
25+
warn: 50,
26+
info: 30,
27+
debug: 20,
28+
trace: 10,
29+
};

loggers/pinoPrettyLogger.ts

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import pino, { type LoggerOptions } from "pino";
2+
3+
/**
4+
* Pino pretty logger
5+
* - Requires `pino` and `pino-pretty`
6+
* - If no options are provided, it will use the default options based on `process.env.NODE_ENV`.
7+
* @param options - pino options (optional)
8+
* @returns Logger (pino)
9+
*/
10+
export const pinoPrettyLogger = (options?: LoggerOptions) => {
11+
return pino(
12+
options ||
13+
defaultOptions[process.env.NODE_ENV || "never"] ||
14+
defaultOptions.default,
15+
);
16+
};
17+
18+
/**
19+
* Pino Logger Options
20+
* - Do not add `never`
21+
*/
22+
const defaultOptions: Record<string, LoggerOptions> = {
23+
default: {
24+
level: "trace",
25+
transport: {
26+
target: "pino-pretty",
27+
options: {
28+
sync: true,
29+
},
30+
},
31+
},
32+
development: {
33+
level: "trace",
34+
transport: {
35+
target: "pino-pretty",
36+
options: {
37+
sync: true,
38+
},
39+
},
40+
},
41+
production: {
42+
level: "info",
43+
transport: {
44+
target: "pino-pretty",
45+
options: {
46+
sync: true,
47+
},
48+
},
49+
},
50+
};

package.json

+7-3
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,22 @@
3636
"prepare": "simple-git-hooks"
3737
},
3838
"dependencies": {
39-
"openid-client": "^5.6.5",
40-
"pino": "^8.20.0",
41-
"pino-pretty": "^11.0.0"
39+
"openid-client": "^5.6.5"
4240
},
4341
"peerDependencies": {
4442
"elysia": "^1.0.13",
4543
"ioredis": "^5.4.1",
4644
"lokijs": "^1.5.12",
4745
"lowdb": "^7.0.1",
46+
"pino": "^8.20.0",
47+
"pino-pretty": "^11.0.0",
4848
"typescript": "^5.4.5"
4949
},
5050
"peerDependenciesMeta": {
5151
"ioredis": { "optional": true },
5252
"lokijs": { "optional": true },
53+
"pino": { "optional": true },
54+
"pino-pretty": { "optional": true },
5355
"lowdb": { "optional": true }
5456
},
5557
"devDependencies": {
@@ -65,6 +67,8 @@
6567
"lint-staged": "^15.2.2",
6668
"lokijs": "^1.5.12",
6769
"lowdb": "^7.0.1",
70+
"pino": "^8.20.0",
71+
"pino-pretty": "^11.0.0",
6872
"set-cookie-parser": "^2.6.0",
6973
"simple-git-hooks": "^2.11.1",
7074
"tsup": "^8.0.2",

types.ts

+21-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { LifeCycleType } from "elysia";
22
import type { AuthorizationParameters, ClientMetadata } from "openid-client";
3+
import type { BaseLogger } from "pino";
34

45
/** Session data */
56
export interface OIDCClientSession {
@@ -100,12 +101,15 @@ export interface OIDCClientOptions {
100101
dataAdapter?: OIDCClientDataAdapter;
101102

102103
/**
103-
* Logger Options
104-
* @see
105-
* [pino document](https://github.com/pinojs/pino/)
104+
* Logger
105+
* - pino can be assigned directly.
106+
* @example
107+
* ```
108+
* import pino from "pino";
109+
* const rp = new OidcClient.create({ ..., logger: pino() });
110+
* ```
106111
*/
107-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
108-
loggerOptions?: any;
112+
logger?: OIDCClientLogger | null;
109113
}
110114

111115
/** Plugin settings */
@@ -255,19 +259,16 @@ export interface OIDCClientDataAdapter {
255259

256260
/**
257261
* Logger
262+
* - Suitable for pino
263+
* - Requies `silent` , `trace` , `debug` , `info` , `warn` , `error` and `fatal` method.
264+
* @remarks
265+
* - `silent`: Used to output tokens and other sensitive data. Only display explicitly if needed.
266+
* - `trace`: Functions and methods executed.
267+
* - `debug`: Debug info.
268+
* - `warn`: Outputs for unexpected calls, tampering, and possible attacks.
269+
* - `error`: Caught exceptions, etc.
270+
* - `fatal`: Currently unused.
271+
* @see
272+
* - [Logger Instance](https://getpino.io/#/docs/api?id=logger)
258273
*/
259-
export interface OIDCClientLogger {
260-
/** Used when sensitive data (e.g., tokens) need to be displayed. */
261-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
262-
silent: (message: any) => void;
263-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
264-
trace: (message: any) => void;
265-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
266-
debug: (message: any) => void;
267-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
268-
info: (message: any) => void;
269-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
270-
warn: (message: any) => void;
271-
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
272-
error: (message: any) => void;
273-
}
274+
export interface OIDCClientLogger extends Omit<BaseLogger, "level"> {}

0 commit comments

Comments
 (0)