@miketako3/cloki 0.1.19 → 0.1.21

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 MikeTako
3
+ Copyright (c) 2025 Kaito Hiruta
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -51,6 +51,113 @@ await logger.error({message: "Hello World!", error: error});
51
51
  await logger.info({message: "Hello World!"}, {foo: "bar"});
52
52
  ```
53
53
 
54
+ ### Advanced Usage
55
+
56
+ #### 1. Default Labels and Minimum Log Level
57
+
58
+ You can set default labels that will be added to every log, and specify a minimum log level.
59
+
60
+ ```typescript
61
+ const logger = getLokiLogger({
62
+ lokiHost: "...",
63
+ lokiUser: "...",
64
+ lokiToken: "...",
65
+ defaultLabels: { env: "production", app: "my-service" },
66
+ minLevel: "info" // 'debug' | 'info' | 'warn' | 'error'
67
+ });
68
+ ```
69
+
70
+ #### 2. String Messages
71
+
72
+ You can pass a string directly as a message. It will be converted to `{"message": "your string"}`.
73
+
74
+ ```typescript
75
+ await logger.info("Hello World!");
76
+ ```
77
+
78
+ #### 3. Cloudflare Workers `ctx.waitUntil` and `cf` properties
79
+
80
+ To prevent the log sending from being cancelled when the worker returns a response, you can pass the `ExecutionContext` to `getLokiLogger` or to each log method. You can also automatically add labels from `request.cf`.
81
+
82
+ ```typescript
83
+ export default {
84
+ async fetch(request, env, ctx) {
85
+ const logger = getLokiLogger({
86
+ cf: request.cf, // Automatically add cf_colo, cf_country, etc.
87
+ ctx: ctx // Use ctx.waitUntil internally for all logs
88
+ });
89
+
90
+ // This will use ctx.waitUntil internally and won't block the response
91
+ logger.info("Request received", { path: new URL(request.url).pathname });
92
+
93
+ return new Response("OK");
94
+ }
95
+ }
96
+ ```
97
+
98
+ #### 4. Zero Configuration (Environment Variables)
99
+
100
+ If you set the following environment variables, you can initialize the logger without any arguments:
101
+
102
+ - `LOKI_HOST` (e.g., `logs-prod-us-central1.grafana.net`)
103
+ - `LOKI_USER`
104
+ - `LOKI_TOKEN`
105
+
106
+ Standard usage for Cloudflare Workers:
107
+
108
+ ```typescript
109
+ export default {
110
+ async fetch(request, env, ctx) {
111
+ const logger = getLokiLogger({ cf: request.cf, ctx });
112
+ // ...
113
+ }
114
+ }
115
+ ```
116
+
117
+ #### 5. Retries and Error Handling
118
+
119
+ You can configure retries and a callback for when sending fails.
120
+
121
+ ```typescript
122
+ const logger = getLokiLogger({
123
+ retries: 3,
124
+ onSendError: (err, msg) => {
125
+ console.error("Failed to send to Loki after retries", err);
126
+ }
127
+ });
128
+ ```
129
+
130
+ #### 6. Custom Formatter and Silent Mode
131
+
132
+ ```typescript
133
+ const logger = getLokiLogger({
134
+ silent: process.env.NODE_ENV === 'development',
135
+ format: (level, msg, labels) => {
136
+ // Return custom LokiMessage structure
137
+ return {
138
+ streams: [{
139
+ stream: { ...labels, level, custom: 'label' },
140
+ values: [[Date.now().toString() + "000000", JSON.stringify(msg)]]
141
+ }]
142
+ };
143
+ }
144
+ });
145
+ ```
146
+
147
+ #### 7. TypeScript Type Safety for Labels
148
+
149
+ You can define the allowed label keys using Generics.
150
+
151
+ ```typescript
152
+ type MyLabels = 'env' | 'service' | 'version';
153
+ const logger = getLokiLogger<MyLabels>({
154
+ defaultLabels: { env: 'prod' } // Type checked
155
+ });
156
+
157
+ await logger.info("Hello", { service: 'api' }); // Type checked
158
+ // await logger.info("Hello", { unknown: 'label' }); // TypeScript Error
159
+ ```
160
+
54
161
  ## Contributing
55
162
 
56
163
  Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
package/dist/logger.d.ts CHANGED
@@ -1,37 +1,95 @@
1
1
  /**
2
2
  * Loki config
3
3
  */
4
- export type LokiConfig = {
5
- lokiHost: string;
6
- lokiToken: string;
7
- lokiUser: string;
4
+ export type LokiConfig<T extends string = string> = {
5
+ lokiHost?: string;
6
+ lokiToken?: string;
7
+ lokiUser?: string;
8
+ /**
9
+ * Default labels added to all logs
10
+ */
11
+ defaultLabels?: LokiLabels<T>;
12
+ /**
13
+ * Minimum log level to send to Loki
14
+ */
15
+ minLevel?: LogLevel;
16
+ /**
17
+ * Number of retries for fetch (default: 0)
18
+ */
19
+ retries?: number;
20
+ /**
21
+ * Callback when fetch fails
22
+ */
23
+ onSendError?: (error: unknown, message: LokiMessage<T>) => void;
24
+ /**
25
+ * Custom formatter for Loki message
26
+ */
27
+ format?: (logLevel: LogLevel, message: object, labels: LokiLabels<T>) => LokiMessage<T>;
28
+ /**
29
+ * If true, don't send to Loki (just console.log)
30
+ */
31
+ silent?: boolean;
32
+ /**
33
+ * Automatically add labels from request.cf
34
+ */
35
+ cf?: CfProperties;
36
+ /**
37
+ * Default ExecutionContext for ctx.waitUntil
38
+ */
39
+ ctx?: ExecutionContext;
8
40
  };
41
+ /**
42
+ * Log levels
43
+ */
44
+ export type LogLevel = "debug" | "info" | "warn" | "error";
9
45
  /**
10
46
  * Loki labels
11
47
  */
12
- export type LokiLabels = {
48
+ export type LokiLabels<T extends string = string> = {
49
+ [key in T]?: string;
50
+ } & {
13
51
  [key: string]: string;
14
52
  };
15
53
  /**
16
54
  * Loki message
17
55
  */
18
- export type LokiMessage = {
56
+ export type LokiMessage<T extends string = string> = {
19
57
  streams: [
20
58
  {
21
- stream: LokiLabels;
59
+ stream: LokiLabels<T>;
22
60
  values: [string[]];
23
61
  }
24
62
  ];
25
63
  };
64
+ /**
65
+ * Cloudflare Workers IncomingRequestCfProperties
66
+ */
67
+ export type CfProperties = {
68
+ colo?: string;
69
+ country?: string;
70
+ city?: string;
71
+ asn?: number;
72
+ [key: string]: unknown;
73
+ };
74
+ /**
75
+ * Cloudflare Workers ExecutionContext
76
+ */
77
+ export type ExecutionContext = {
78
+ waitUntil(promise: Promise<unknown>): void;
79
+ };
80
+ /**
81
+ * Log message type
82
+ */
83
+ export type LogMessage = string | object;
26
84
  /**
27
85
  * Create a Loki logger
28
86
  * logger has some async logging methods like info, error, warn, etc.
29
87
  *
30
88
  * @param config
31
89
  */
32
- export declare const getLokiLogger: (config: LokiConfig) => {
33
- info: (message: object, labels?: LokiLabels) => Promise<void>;
34
- warn: (message: object, labels?: LokiLabels) => Promise<void>;
35
- error: (message: object, labels?: LokiLabels) => Promise<void>;
36
- debug: (message: object, labels?: LokiLabels) => Promise<void>;
90
+ export declare const getLokiLogger: <T extends string = string>(config?: LokiConfig<T>) => {
91
+ info: (message: LogMessage, labels?: LokiLabels<T> | undefined, ctx?: ExecutionContext) => Promise<void>;
92
+ warn: (message: LogMessage, labels?: LokiLabels<T> | undefined, ctx?: ExecutionContext) => Promise<void>;
93
+ error: (message: LogMessage, labels?: LokiLabels<T> | undefined, ctx?: ExecutionContext) => Promise<void>;
94
+ debug: (message: LogMessage, labels?: LokiLabels<T> | undefined, ctx?: ExecutionContext) => Promise<void>;
37
95
  };
package/dist/logger.js CHANGED
@@ -10,52 +10,80 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getLokiLogger = void 0;
13
+ const LOG_LEVEL_PRIORITY = {
14
+ debug: 0,
15
+ info: 1,
16
+ warn: 2,
17
+ error: 3,
18
+ };
13
19
  /**
14
20
  * Create a Loki logger
15
21
  * logger has some async logging methods like info, error, warn, etc.
16
22
  *
17
23
  * @param config
18
24
  */
19
- const getLokiLogger = (config) => {
25
+ const getLokiLogger = (config = {}) => {
26
+ var _a;
27
+ const mergedConfig = Object.assign(Object.assign({}, config), { lokiHost: config.lokiHost ||
28
+ getEnv("LOKI_HOST") ||
29
+ ((_a = getEnv("LOKI_URL")) === null || _a === void 0 ? void 0 : _a.replace(/^https?:\/\//, "")), lokiToken: config.lokiToken || getEnv("LOKI_TOKEN"), lokiUser: config.lokiUser || getEnv("LOKI_USER") });
20
30
  return {
21
- info: lokiInfo(config),
22
- warn: lokiWarn(config),
23
- error: lokiError(config),
24
- debug: lokiDebug(config),
31
+ info: lokiInfo(mergedConfig),
32
+ warn: lokiWarn(mergedConfig),
33
+ error: lokiError(mergedConfig),
34
+ debug: lokiDebug(mergedConfig),
25
35
  };
26
36
  };
27
37
  exports.getLokiLogger = getLokiLogger;
38
+ /**
39
+ * Get environment variable from various sources
40
+ */
41
+ function getEnv(name) {
42
+ try {
43
+ // Node.js
44
+ if (typeof process !== "undefined" && process.env) {
45
+ return process.env[name];
46
+ }
47
+ // Global
48
+ if (typeof globalThis !== "undefined") {
49
+ const global = globalThis;
50
+ return global[name];
51
+ }
52
+ }
53
+ catch (_e) { }
54
+ return undefined;
55
+ }
28
56
  /**
29
57
  * Log info to Loki curried
30
58
  *
31
59
  * @param config
32
60
  */
33
- const lokiInfo = (config) => (message, labels = {}) => __awaiter(void 0, void 0, void 0, function* () {
34
- yield log(config, "info", message, labels);
61
+ const lokiInfo = (config) => (message, labels = {}, ctx) => __awaiter(void 0, void 0, void 0, function* () {
62
+ yield log(config, "info", message, labels, ctx);
35
63
  });
36
64
  /**
37
65
  * Log warn to Loki curried
38
66
  *
39
67
  * @param config
40
68
  */
41
- const lokiWarn = (config) => (message, labels = {}) => __awaiter(void 0, void 0, void 0, function* () {
42
- yield log(config, "warn", message, labels);
69
+ const lokiWarn = (config) => (message, labels = {}, ctx) => __awaiter(void 0, void 0, void 0, function* () {
70
+ yield log(config, "warn", message, labels, ctx);
43
71
  });
44
72
  /**
45
73
  * Log error to Loki curried
46
74
  *
47
75
  * @param config
48
76
  */
49
- const lokiError = (config) => (message, labels = {}) => __awaiter(void 0, void 0, void 0, function* () {
50
- yield log(config, "error", message, labels);
77
+ const lokiError = (config) => (message, labels = {}, ctx) => __awaiter(void 0, void 0, void 0, function* () {
78
+ yield log(config, "error", message, labels, ctx);
51
79
  });
52
80
  /**
53
81
  * Log debug to Loki curried
54
82
  *
55
83
  * @param config
56
84
  */
57
- const lokiDebug = (config) => (message, labels = {}) => __awaiter(void 0, void 0, void 0, function* () {
58
- yield log(config, "debug", message, labels);
85
+ const lokiDebug = (config) => (message, labels = {}, ctx) => __awaiter(void 0, void 0, void 0, function* () {
86
+ yield log(config, "debug", message, labels, ctx);
59
87
  });
60
88
  /**
61
89
  * Log to Loki
@@ -64,31 +92,89 @@ const lokiDebug = (config) => (message, labels = {}) => __awaiter(void 0, void 0
64
92
  * @param logLevel
65
93
  * @param message
66
94
  * @param labels
95
+ * @param ctx
67
96
  */
68
- function log(config, logLevel, message, labels) {
97
+ function log(config, logLevel, message, labels, ctx) {
69
98
  return __awaiter(this, void 0, void 0, function* () {
70
- console.log(JSON.stringify(message));
71
- const lokiMessage = generateLokiMessage(logLevel, message, labels);
72
- yield sendToLoki(config, lokiMessage);
99
+ const minLevel = config.minLevel || "debug";
100
+ if (LOG_LEVEL_PRIORITY[logLevel] < LOG_LEVEL_PRIORITY[minLevel]) {
101
+ return;
102
+ }
103
+ const normalizedMessage = typeof message === "string" ? { message } : message;
104
+ console.log(JSON.stringify(normalizedMessage));
105
+ if (config.silent) {
106
+ return;
107
+ }
108
+ const lokiMessage = config.format
109
+ ? config.format(logLevel, normalizedMessage, labels)
110
+ : generateLokiMessage(config, logLevel, normalizedMessage, labels);
111
+ const promise = sendWithRetry(config, lokiMessage);
112
+ const effectiveCtx = ctx || config.ctx;
113
+ if (effectiveCtx) {
114
+ effectiveCtx.waitUntil(promise);
115
+ }
116
+ else {
117
+ yield promise;
118
+ }
73
119
  });
74
120
  }
75
121
  /**
76
122
  * Generate a Loki message object
77
123
  *
124
+ * @param config
78
125
  * @param logLevel
79
126
  * @param message
80
127
  * @param labels
81
128
  */
82
- function generateLokiMessage(logLevel, message, labels) {
129
+ function generateLokiMessage(config, logLevel, message, labels) {
130
+ const cfLabels = {};
131
+ if (config.cf) {
132
+ if (config.cf.colo)
133
+ cfLabels.cf_colo = config.cf.colo;
134
+ if (config.cf.country)
135
+ cfLabels.cf_country = config.cf.country;
136
+ if (config.cf.city)
137
+ cfLabels.cf_city = config.cf.city;
138
+ if (config.cf.asn)
139
+ cfLabels.cf_asn = config.cf.asn.toString();
140
+ }
83
141
  return {
84
142
  streams: [
85
143
  {
86
- stream: Object.assign({ level: logLevel }, labels),
144
+ stream: Object.assign(Object.assign(Object.assign({ level: logLevel }, config.defaultLabels), cfLabels), labels),
87
145
  values: [[`${Date.now().toString()}000000`, JSON.stringify(message)]],
88
146
  },
89
147
  ],
90
148
  };
91
149
  }
150
+ /**
151
+ * Send with retry
152
+ */
153
+ function sendWithRetry(config, lokiMessage) {
154
+ return __awaiter(this, void 0, void 0, function* () {
155
+ const retries = config.retries || 0;
156
+ let lastError;
157
+ for (let i = 0; i <= retries; i++) {
158
+ try {
159
+ yield sendToLoki(config, lokiMessage);
160
+ return; // Success
161
+ }
162
+ catch (e) {
163
+ lastError = e;
164
+ if (i < retries) {
165
+ // Simple backoff: 100ms, 200ms, 400ms...
166
+ yield new Promise((resolve) => setTimeout(resolve, 100 * 2 ** i));
167
+ }
168
+ }
169
+ }
170
+ if (config.onSendError) {
171
+ config.onSendError(lastError, lokiMessage);
172
+ }
173
+ else {
174
+ console.error("Loki logging failed after retries:", lastError);
175
+ }
176
+ });
177
+ }
92
178
  /**
93
179
  * Send a message to Loki
94
180
  *
@@ -97,22 +183,20 @@ function generateLokiMessage(logLevel, message, labels) {
97
183
  */
98
184
  function sendToLoki(config, lokiMessage) {
99
185
  return __awaiter(this, void 0, void 0, function* () {
100
- yield fetch(`https://${config.lokiHost}/loki/api/v1/push`, {
186
+ if (!config.lokiHost || !config.lokiUser || !config.lokiToken) {
187
+ throw new Error("Loki configuration missing (host, user, or token)");
188
+ }
189
+ const response = yield fetch(`https://${config.lokiHost}/loki/api/v1/push`, {
101
190
  method: "POST",
102
191
  headers: {
103
192
  "Content-Type": "application/json",
104
193
  Authorization: `Basic ${btoa(`${config.lokiUser}:${config.lokiToken}`)}`,
105
194
  },
106
195
  body: JSON.stringify(lokiMessage),
107
- })
108
- .then((r) => {
109
- if (!r.ok) {
110
- throw new Error(r.statusText);
111
- }
112
- })
113
- .catch((e) => {
114
- console.error("Error:", e);
115
196
  });
197
+ if (!response.ok) {
198
+ throw new Error(`Loki push failed: ${response.status} ${response.statusText}`);
199
+ }
116
200
  });
117
201
  }
118
202
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -76,9 +76,129 @@ Date.now = vitest_1.vi.fn(() => 1482363367071);
76
76
  },
77
77
  body: `{"streams":[{"stream":{"level":"${method}","hoge":"huga"},"values":[["1482363367071000000","{\\"test\\":\\"message\\"}"]]}]}`,
78
78
  });
79
- // Reset the spy
80
79
  consoleSpy.mockRestore();
81
80
  }));
82
81
  });
83
82
  });
83
+ (0, vitest_1.describe)("Advanced Features", () => {
84
+ const mockConfig = {
85
+ lokiHost: "testhost",
86
+ lokiToken: "token123",
87
+ lokiUser: "user",
88
+ };
89
+ (0, vitest_1.beforeEach)(() => {
90
+ vitest_1.vi.clearAllMocks();
91
+ });
92
+ (0, vitest_1.it)("should support zero config from env", () => __awaiter(void 0, void 0, void 0, function* () {
93
+ // Mock environment variables
94
+ process.env.LOKI_HOST = "env-host";
95
+ process.env.LOKI_TOKEN = "env-token";
96
+ process.env.LOKI_USER = "env-user";
97
+ const logger = (0, logger_1.getLokiLogger)();
98
+ yield logger.info({ msg: "test" });
99
+ (0, vitest_1.expect)(fetch).toHaveBeenCalledWith(vitest_1.expect.stringContaining("env-host"), vitest_1.expect.objectContaining({
100
+ headers: vitest_1.expect.objectContaining({
101
+ Authorization: `Basic ${btoa("env-user:env-token")}`,
102
+ }),
103
+ }));
104
+ // Cleanup
105
+ delete process.env.LOKI_HOST;
106
+ delete process.env.LOKI_TOKEN;
107
+ delete process.env.LOKI_USER;
108
+ }));
109
+ (0, vitest_1.it)("should not send when silent: true", () => __awaiter(void 0, void 0, void 0, function* () {
110
+ const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { silent: true }));
111
+ yield logger.info({ msg: "test" });
112
+ (0, vitest_1.expect)(fetch).not.toHaveBeenCalled();
113
+ }));
114
+ (0, vitest_1.it)("should retry on failure", () => __awaiter(void 0, void 0, void 0, function* () {
115
+ let callCount = 0;
116
+ global.fetch = vitest_1.vi.fn(() => __awaiter(void 0, void 0, void 0, function* () {
117
+ callCount++;
118
+ if (callCount < 3) {
119
+ return { ok: false, status: 500, statusText: "Error" };
120
+ }
121
+ return { ok: true };
122
+ }));
123
+ const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { retries: 3 }));
124
+ yield logger.info({ msg: "test" });
125
+ (0, vitest_1.expect)(fetch).toHaveBeenCalledTimes(3);
126
+ }));
127
+ (0, vitest_1.it)("should call onSendError after retries fail", () => __awaiter(void 0, void 0, void 0, function* () {
128
+ global.fetch = vitest_1.vi.fn(() => __awaiter(void 0, void 0, void 0, function* () {
129
+ return ({
130
+ ok: false,
131
+ status: 500,
132
+ statusText: "Fatal",
133
+ });
134
+ }));
135
+ const onSendError = vitest_1.vi.fn();
136
+ const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { retries: 1, onSendError }));
137
+ yield logger.info({ msg: "test" });
138
+ (0, vitest_1.expect)(fetch).toHaveBeenCalledTimes(2);
139
+ (0, vitest_1.expect)(onSendError).toHaveBeenCalled();
140
+ }));
141
+ (0, vitest_1.it)("should support custom format", () => __awaiter(void 0, void 0, void 0, function* () {
142
+ const format = vitest_1.vi.fn((_level, _msg, _labels) => ({
143
+ streams: [
144
+ {
145
+ stream: { custom: "label" },
146
+ values: [["123456", "custom-body"]],
147
+ },
148
+ ],
149
+ }));
150
+ const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { format: format }));
151
+ yield logger.info({ msg: "test" });
152
+ const fetchMock = fetch;
153
+ const _body = JSON.parse(fetchMock.mock.calls[0][1].body);
154
+ (0, vitest_1.expect)(format).toHaveBeenCalled();
155
+ (0, vitest_1.expect)(fetch).toHaveBeenCalledWith(vitest_1.expect.any(String), vitest_1.expect.objectContaining({
156
+ body: vitest_1.expect.stringContaining("custom-body"),
157
+ }));
158
+ }));
159
+ (0, vitest_1.it)("should add labels from cf properties", () => __awaiter(void 0, void 0, void 0, function* () {
160
+ const cf = {
161
+ colo: "KIX",
162
+ country: "JP",
163
+ city: "Osaka",
164
+ asn: 12345,
165
+ };
166
+ const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { cf }));
167
+ yield logger.info({ msg: "test" });
168
+ const fetchMock = fetch;
169
+ const body = JSON.parse(fetchMock.mock.calls[0][1].body);
170
+ const stream = body.streams[0].stream;
171
+ (0, vitest_1.expect)(stream.cf_colo).toBe("KIX");
172
+ (0, vitest_1.expect)(stream.cf_country).toBe("JP");
173
+ (0, vitest_1.expect)(stream.cf_city).toBe("Osaka");
174
+ (0, vitest_1.expect)(stream.cf_asn).toBe("12345");
175
+ }));
176
+ });
177
+ (0, vitest_1.describe)("Cloudflare Workers context", () => {
178
+ const mockConfig = {
179
+ lokiHost: "testhost",
180
+ lokiToken: "token123",
181
+ lokiUser: "user",
182
+ };
183
+ (0, vitest_1.it)("should use ctx from getLokiLogger", () => __awaiter(void 0, void 0, void 0, function* () {
184
+ const ctx = {
185
+ waitUntil: vitest_1.vi.fn(),
186
+ };
187
+ const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { ctx }));
188
+ yield logger.info("test");
189
+ (0, vitest_1.expect)(ctx.waitUntil).toHaveBeenCalled();
190
+ }));
191
+ (0, vitest_1.it)("should use ctx from method call even if getLokiLogger has one", () => __awaiter(void 0, void 0, void 0, function* () {
192
+ const ctx1 = {
193
+ waitUntil: vitest_1.vi.fn(),
194
+ };
195
+ const ctx2 = {
196
+ waitUntil: vitest_1.vi.fn(),
197
+ };
198
+ const logger = (0, logger_1.getLokiLogger)(Object.assign(Object.assign({}, mockConfig), { ctx: ctx1 }));
199
+ yield logger.info("test", {}, ctx2);
200
+ (0, vitest_1.expect)(ctx2.waitUntil).toHaveBeenCalled();
201
+ (0, vitest_1.expect)(ctx1.waitUntil).not.toHaveBeenCalled();
202
+ }));
203
+ });
84
204
  //# sourceMappingURL=logger.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../src/logger.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../src/logger.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miketako3/cloki",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "cloki is zero dependency and simple logger library for Loki and Cloudflare Workers.",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -13,7 +13,8 @@
13
13
  "build": "tsc",
14
14
  "format": "bunx @biomejs/biome check . --write",
15
15
  "lint": "bunx @biomejs/biome check .",
16
- "test": "vitest run"
16
+ "test": "vitest run",
17
+ "typecheck": "tsc --noEmit"
17
18
  },
18
19
  "repository": {
19
20
  "type": "git",