@degel_lc/logger 0.1.6 → 0.1.8

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 CHANGED
@@ -1,11 +1,11 @@
1
- # @phsk/logger
1
+ # @degel_lc/logger
2
2
 
3
3
  phsk関連プロジェクト共通のpino-basedロギングライブラリ。サーバーサイド・クライアントサイド両対応。
4
4
 
5
5
  ## インストール
6
6
 
7
7
  ```bash
8
- pnpm add @phsk/logger
8
+ pnpm add @degel_lc/logger
9
9
  ```
10
10
 
11
11
  ## 使用方法
@@ -13,7 +13,7 @@ pnpm add @phsk/logger
13
13
  ### 基本的な使用法(レガシー形式)
14
14
 
15
15
  ```typescript
16
- import { logger } from '@phsk/logger';
16
+ import { logger } from '@degel_lc/logger';
17
17
 
18
18
  // デバッグログ
19
19
  logger.debug('デバッグ情報です', 'app.ts:10');
@@ -43,7 +43,7 @@ logger.sqlError('クエリ実行に失敗', 'userModel.ts:78', error);
43
43
  APIリクエストのコンテキスト情報を含めたログ出力が可能です。
44
44
 
45
45
  ```typescript
46
- import { logger } from '@phsk/logger';
46
+ import { logger } from '@degel_lc/logger';
47
47
 
48
48
  // コンテキスト付きログ
49
49
  logger.info({ path: '/api/users', method: 'GET', userId: 'user123' }, 'ユーザー一覧取得');
@@ -64,7 +64,7 @@ logger.warn({ path: '/api/orders', orderId: 'order789' }, '在庫不足');
64
64
  Next.jsなどのサーバーサイドアプリケーションでは、起動時に明示的に初期化することを推奨します。
65
65
 
66
66
  ```typescript
67
- import { initializeLogger } from '@phsk/logger';
67
+ import { initializeLogger } from '@degel_lc/logger';
68
68
 
69
69
  // アプリケーション起動時
70
70
  await initializeLogger({
@@ -77,7 +77,7 @@ await initializeLogger({
77
77
  ### カスタムロガーの作成
78
78
 
79
79
  ```typescript
80
- import { createClientLogger, createServerLogger } from '@phsk/logger';
80
+ import { createClientLogger, createServerLogger } from '@degel_lc/logger';
81
81
 
82
82
  // クライアント用
83
83
  const clientLogger = createClientLogger({
@@ -219,15 +219,41 @@ export async function register() {
219
219
 
220
220
  このパッケージは Next.js(webpack/Turbopack)との互換性を考慮して設計されています。
221
221
 
222
- - **コード分割**: サーバー専用コード(`fs`/`path`モジュール使用)は別チャンクに分離
223
- - **動的インポート**: `createServerLogger` は内部で動的インポートを使用
224
- - **静的インポート可**: `instrumentation.ts` などで静的インポートが可能
222
+ ### 必須設定(Next.jsプロジェクト)
223
+
224
+ **重要**: Next.jsで使用する場合、`next.config.ts`に以下の設定が必要です。
225
225
 
226
226
  ```typescript
227
- // ✅ 静的インポートOK(Next.js 16対応)
227
+ // next.config.ts
228
+ const nextConfig: NextConfig = {
229
+ // @degel_lc/loggerをサーバーサイドでのみ解決し、クライアントバンドルから除外
230
+ serverExternalPackages: ['@degel_lc/logger'],
231
+ };
232
+ ```
233
+
234
+ この設定により「Module not found: Can't resolve 'fs'」エラーを回避できます。
235
+
236
+ ### 使用例
237
+
238
+ ```typescript
239
+ // instrumentation.ts - 静的インポートOK
228
240
  import { initializeLogger, setSentryModule } from '@degel_lc/logger';
241
+
242
+ export async function register() {
243
+ if (process.env.NEXT_RUNTIME === 'nodejs') {
244
+ await initializeLogger({ logDir: './logs', enableSentry: true });
245
+ }
246
+ }
229
247
  ```
230
248
 
249
+ ### 技術的詳細
250
+
251
+ - **コード分割**: サーバー専用コード(`fs`/`path`モジュール使用)は別チャンクに分離
252
+ - **動的インポート**: `createServerLogger` は内部で動的インポートを使用
253
+ - **serverExternalPackages**: Next.jsがパッケージをNode.js `require`で解決し、クライアントバンドルから除外
254
+
255
+ **補足**: Next.jsは`pino`、`pino-pretty`などを自動的に除外リストに含めていますが、`@degel_lc/logger`のようなラッパーパッケージは手動で追加が必要です。
256
+
231
257
  ## 開発
232
258
 
233
259
  ```bash
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var chunkUDIZDVDO_cjs = require('./chunk-UDIZDVDO.cjs');
6
+ var chunk3QE5XQOJ_cjs = require('./chunk-3QE5XQOJ.cjs');
7
+
8
+ // src/browser.ts
9
+ async function createServerLogger(_config) {
10
+ console.warn("[logger] createServerLogger is not available in browser/edge environment");
11
+ return chunkUDIZDVDO_cjs.createClientLogger(_config);
12
+ }
13
+ function getLogger() {
14
+ if (globalThis.__DEGEL_LOGGER__) {
15
+ return globalThis.__DEGEL_LOGGER__;
16
+ }
17
+ globalThis.__DEGEL_LOGGER__ = chunkUDIZDVDO_cjs.createClientLogger();
18
+ return globalThis.__DEGEL_LOGGER__;
19
+ }
20
+ async function initializeLogger(config) {
21
+ if (globalThis.__DEGEL_LOGGER__ && globalThis.__DEGEL_LOGGER_INITIALIZED__) {
22
+ return globalThis.__DEGEL_LOGGER__;
23
+ }
24
+ globalThis.__DEGEL_LOGGER__ = chunkUDIZDVDO_cjs.createClientLogger(config);
25
+ globalThis.__DEGEL_LOGGER_INITIALIZED__ = true;
26
+ return globalThis.__DEGEL_LOGGER__;
27
+ }
28
+ var logger = {
29
+ debug: (ctxOrMessage, messageOrLocation, originalError) => getLogger().debug(ctxOrMessage, messageOrLocation, originalError),
30
+ info: (ctxOrMessage, messageOrLocation, originalError) => getLogger().info(ctxOrMessage, messageOrLocation, originalError),
31
+ warn: (ctxOrMessage, messageOrLocation, originalError) => getLogger().warn(ctxOrMessage, messageOrLocation, originalError),
32
+ error: (ctxOrMessage, messageOrLocation, originalError) => getLogger().error(
33
+ ctxOrMessage,
34
+ messageOrLocation,
35
+ originalError
36
+ ),
37
+ fatal: (ctxOrMessage, messageOrLocation, originalError) => getLogger().fatal(
38
+ ctxOrMessage,
39
+ messageOrLocation,
40
+ originalError
41
+ ),
42
+ sqlError: (message, location, originalError) => getLogger().sqlError(message, location, originalError)
43
+ };
44
+ var browser_default = logger;
45
+
46
+ Object.defineProperty(exports, "createClientLogger", {
47
+ enumerable: true,
48
+ get: function () { return chunkUDIZDVDO_cjs.createClientLogger; }
49
+ });
50
+ Object.defineProperty(exports, "LOG_FILE_PREFIX", {
51
+ enumerable: true,
52
+ get: function () { return chunk3QE5XQOJ_cjs.LOG_FILE_PREFIX; }
53
+ });
54
+ Object.defineProperty(exports, "LOG_LEVEL_PRIORITY", {
55
+ enumerable: true,
56
+ get: function () { return chunk3QE5XQOJ_cjs.LOG_LEVEL_PRIORITY; }
57
+ });
58
+ Object.defineProperty(exports, "LOG_ROTATION", {
59
+ enumerable: true,
60
+ get: function () { return chunk3QE5XQOJ_cjs.LOG_ROTATION; }
61
+ });
62
+ Object.defineProperty(exports, "TIMEZONE", {
63
+ enumerable: true,
64
+ get: function () { return chunk3QE5XQOJ_cjs.TIMEZONE; }
65
+ });
66
+ Object.defineProperty(exports, "VALID_LOG_LEVELS", {
67
+ enumerable: true,
68
+ get: function () { return chunk3QE5XQOJ_cjs.VALID_LOG_LEVELS; }
69
+ });
70
+ Object.defineProperty(exports, "isSentryEnabled", {
71
+ enumerable: true,
72
+ get: function () { return chunk3QE5XQOJ_cjs.isSentryEnabled; }
73
+ });
74
+ Object.defineProperty(exports, "setSentryModule", {
75
+ enumerable: true,
76
+ get: function () { return chunk3QE5XQOJ_cjs.setSentryModule; }
77
+ });
78
+ exports.createServerLogger = createServerLogger;
79
+ exports.default = browser_default;
80
+ exports.getLogger = getLogger;
81
+ exports.initializeLogger = initializeLogger;
82
+ exports.logger = logger;
83
+ //# sourceMappingURL=browser.cjs.map
84
+ //# sourceMappingURL=browser.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browser.ts"],"names":["createClientLogger"],"mappings":";;;;;;;;AA0CA,eAAsB,mBAAmB,OAAA,EAAyC;AAChF,EAAA,OAAA,CAAQ,KAAK,0EAA0E,CAAA;AACvF,EAAA,OAAOA,qCAAmB,OAAO,CAAA;AACnC;AASO,SAAS,SAAA,GAAoB;AAClC,EAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AACA,EAAA,UAAA,CAAW,mBAAmBA,oCAAA,EAAmB;AACjD,EAAA,OAAO,UAAA,CAAW,gBAAA;AACpB;AAEA,eAAsB,iBAAiB,MAAA,EAAwC;AAC7E,EAAA,IAAI,UAAA,CAAW,gBAAA,IAAoB,UAAA,CAAW,4BAAA,EAA8B;AAC1E,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AACA,EAAA,UAAA,CAAW,gBAAA,GAAmBA,qCAAmB,MAAM,CAAA;AACvD,EAAA,UAAA,CAAW,4BAAA,GAA+B,IAAA;AAC1C,EAAA,OAAO,UAAA,CAAW,gBAAA;AACpB;AAEO,IAAM,MAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA,CAAM,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC5E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,aAAA,KAC5B,WAAU,CAAE,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,aAAa;AACzD;AAEA,IAAO,eAAA,GAAQ","file":"browser.cjs","sourcesContent":["/**\n * ブラウザ/Edge Runtime用エントリーポイント\n * サーバーサイドモジュール(fs, path)を一切参照しない\n */\nimport { createClientLogger } from './client.js';\nimport type {\n LogContext,\n LogLevel,\n LogMethod,\n LogMethodWithContext,\n LogTypeConfig,\n Logger,\n LoggerConfig,\n SentryModule,\n} from './types.js';\n\nexport type {\n LogContext,\n Logger,\n LoggerConfig,\n LogLevel,\n LogMethod,\n LogMethodWithContext,\n LogTypeConfig,\n SentryModule,\n};\n\nexport { createClientLogger };\nexport { isSentryEnabled, setSentryModule } from './sentry.js';\n\n// Constants\nexport {\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\n\n/**\n * ブラウザ環境ではサーバーロガーは使用不可\n */\nexport async function createServerLogger(_config?: LoggerConfig): Promise<Logger> {\n console.warn('[logger] createServerLogger is not available in browser/edge environment');\n return createClientLogger(_config);\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __DEGEL_LOGGER__: Logger | undefined;\n // eslint-disable-next-line no-var\n var __DEGEL_LOGGER_INITIALIZED__: boolean | undefined;\n}\n\nexport function getLogger(): Logger {\n if (globalThis.__DEGEL_LOGGER__) {\n return globalThis.__DEGEL_LOGGER__;\n }\n globalThis.__DEGEL_LOGGER__ = createClientLogger();\n return globalThis.__DEGEL_LOGGER__;\n}\n\nexport async function initializeLogger(config?: LoggerConfig): Promise<Logger> {\n if (globalThis.__DEGEL_LOGGER__ && globalThis.__DEGEL_LOGGER_INITIALIZED__) {\n return globalThis.__DEGEL_LOGGER__;\n }\n globalThis.__DEGEL_LOGGER__ = createClientLogger(config);\n globalThis.__DEGEL_LOGGER_INITIALIZED__ = true;\n return globalThis.__DEGEL_LOGGER__;\n}\n\nexport const logger: Logger = {\n debug: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().debug(ctxOrMessage as string, messageOrLocation, originalError),\n info: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().info(ctxOrMessage as string, messageOrLocation, originalError),\n warn: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().warn(ctxOrMessage as string, messageOrLocation, originalError),\n error: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().error(\n ctxOrMessage as string,\n messageOrLocation,\n originalError as Error | string | null | undefined\n ),\n fatal: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().fatal(\n ctxOrMessage as string,\n messageOrLocation,\n originalError as Error | string | null | undefined\n ),\n sqlError: (message, location, originalError) =>\n getLogger().sqlError(message, location, originalError),\n} as Logger;\n\nexport default logger;\n"]}
@@ -0,0 +1,22 @@
1
+ import { L as Logger, a as LoggerConfig } from './constants-Dw2vmgrv.cjs';
2
+ export { h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-Dw2vmgrv.cjs';
3
+ import 'pino';
4
+
5
+ /**
6
+ * ブラウザ/Edge Runtime用エントリーポイント
7
+ * サーバーサイドモジュール(fs, path)を一切参照しない
8
+ */
9
+
10
+ /**
11
+ * ブラウザ環境ではサーバーロガーは使用不可
12
+ */
13
+ declare function createServerLogger(_config?: LoggerConfig): Promise<Logger>;
14
+ declare global {
15
+ var __DEGEL_LOGGER__: Logger | undefined;
16
+ var __DEGEL_LOGGER_INITIALIZED__: boolean | undefined;
17
+ }
18
+ declare function getLogger(): Logger;
19
+ declare function initializeLogger(config?: LoggerConfig): Promise<Logger>;
20
+ declare const logger: Logger;
21
+
22
+ export { Logger, LoggerConfig, createServerLogger, logger as default, getLogger, initializeLogger, logger };
@@ -0,0 +1,22 @@
1
+ import { L as Logger, a as LoggerConfig } from './constants-Dw2vmgrv.js';
2
+ export { h as LOG_FILE_PREFIX, j as LOG_LEVEL_PRIORITY, k as LOG_ROTATION, b as LogContext, c as LogLevel, d as LogMethod, e as LogMethodWithContext, f as LogTypeConfig, S as SentryModule, T as TIMEZONE, V as VALID_LOG_LEVELS, g as createClientLogger, i as isSentryEnabled, s as setSentryModule } from './constants-Dw2vmgrv.js';
3
+ import 'pino';
4
+
5
+ /**
6
+ * ブラウザ/Edge Runtime用エントリーポイント
7
+ * サーバーサイドモジュール(fs, path)を一切参照しない
8
+ */
9
+
10
+ /**
11
+ * ブラウザ環境ではサーバーロガーは使用不可
12
+ */
13
+ declare function createServerLogger(_config?: LoggerConfig): Promise<Logger>;
14
+ declare global {
15
+ var __DEGEL_LOGGER__: Logger | undefined;
16
+ var __DEGEL_LOGGER_INITIALIZED__: boolean | undefined;
17
+ }
18
+ declare function getLogger(): Logger;
19
+ declare function initializeLogger(config?: LoggerConfig): Promise<Logger>;
20
+ declare const logger: Logger;
21
+
22
+ export { Logger, LoggerConfig, createServerLogger, logger as default, getLogger, initializeLogger, logger };
@@ -0,0 +1,45 @@
1
+ import { createClientLogger } from './chunk-4NWY6SZL.js';
2
+ export { createClientLogger } from './chunk-4NWY6SZL.js';
3
+ export { LOG_FILE_PREFIX, LOG_LEVEL_PRIORITY, LOG_ROTATION, TIMEZONE, VALID_LOG_LEVELS, isSentryEnabled, setSentryModule } from './chunk-B7IDJBGL.js';
4
+
5
+ // src/browser.ts
6
+ async function createServerLogger(_config) {
7
+ console.warn("[logger] createServerLogger is not available in browser/edge environment");
8
+ return createClientLogger(_config);
9
+ }
10
+ function getLogger() {
11
+ if (globalThis.__DEGEL_LOGGER__) {
12
+ return globalThis.__DEGEL_LOGGER__;
13
+ }
14
+ globalThis.__DEGEL_LOGGER__ = createClientLogger();
15
+ return globalThis.__DEGEL_LOGGER__;
16
+ }
17
+ async function initializeLogger(config) {
18
+ if (globalThis.__DEGEL_LOGGER__ && globalThis.__DEGEL_LOGGER_INITIALIZED__) {
19
+ return globalThis.__DEGEL_LOGGER__;
20
+ }
21
+ globalThis.__DEGEL_LOGGER__ = createClientLogger(config);
22
+ globalThis.__DEGEL_LOGGER_INITIALIZED__ = true;
23
+ return globalThis.__DEGEL_LOGGER__;
24
+ }
25
+ var logger = {
26
+ debug: (ctxOrMessage, messageOrLocation, originalError) => getLogger().debug(ctxOrMessage, messageOrLocation, originalError),
27
+ info: (ctxOrMessage, messageOrLocation, originalError) => getLogger().info(ctxOrMessage, messageOrLocation, originalError),
28
+ warn: (ctxOrMessage, messageOrLocation, originalError) => getLogger().warn(ctxOrMessage, messageOrLocation, originalError),
29
+ error: (ctxOrMessage, messageOrLocation, originalError) => getLogger().error(
30
+ ctxOrMessage,
31
+ messageOrLocation,
32
+ originalError
33
+ ),
34
+ fatal: (ctxOrMessage, messageOrLocation, originalError) => getLogger().fatal(
35
+ ctxOrMessage,
36
+ messageOrLocation,
37
+ originalError
38
+ ),
39
+ sqlError: (message, location, originalError) => getLogger().sqlError(message, location, originalError)
40
+ };
41
+ var browser_default = logger;
42
+
43
+ export { createServerLogger, browser_default as default, getLogger, initializeLogger, logger };
44
+ //# sourceMappingURL=browser.js.map
45
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browser.ts"],"names":[],"mappings":";;;;;AA0CA,eAAsB,mBAAmB,OAAA,EAAyC;AAChF,EAAA,OAAA,CAAQ,KAAK,0EAA0E,CAAA;AACvF,EAAA,OAAO,mBAAmB,OAAO,CAAA;AACnC;AASO,SAAS,SAAA,GAAoB;AAClC,EAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AACA,EAAA,UAAA,CAAW,mBAAmB,kBAAA,EAAmB;AACjD,EAAA,OAAO,UAAA,CAAW,gBAAA;AACpB;AAEA,eAAsB,iBAAiB,MAAA,EAAwC;AAC7E,EAAA,IAAI,UAAA,CAAW,gBAAA,IAAoB,UAAA,CAAW,4BAAA,EAA8B;AAC1E,IAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,EACpB;AACA,EAAA,UAAA,CAAW,gBAAA,GAAmB,mBAAmB,MAAM,CAAA;AACvD,EAAA,UAAA,CAAW,4BAAA,GAA+B,IAAA;AAC1C,EAAA,OAAO,UAAA,CAAW,gBAAA;AACpB;AAEO,IAAM,MAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA,CAAM,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC5E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACtC,WAAU,CAAE,IAAA,CAAK,YAAA,EAAwB,iBAAA,EAAmB,aAAa,CAAA;AAAA,EAC3E,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,OAAO,CAAC,YAAA,EAAc,iBAAA,EAAmB,aAAA,KACvC,WAAU,CAAE,KAAA;AAAA,IACV,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACF,QAAA,EAAU,CAAC,OAAA,EAAS,QAAA,EAAU,aAAA,KAC5B,WAAU,CAAE,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,aAAa;AACzD;AAEA,IAAO,eAAA,GAAQ","file":"browser.js","sourcesContent":["/**\n * ブラウザ/Edge Runtime用エントリーポイント\n * サーバーサイドモジュール(fs, path)を一切参照しない\n */\nimport { createClientLogger } from './client.js';\nimport type {\n LogContext,\n LogLevel,\n LogMethod,\n LogMethodWithContext,\n LogTypeConfig,\n Logger,\n LoggerConfig,\n SentryModule,\n} from './types.js';\n\nexport type {\n LogContext,\n Logger,\n LoggerConfig,\n LogLevel,\n LogMethod,\n LogMethodWithContext,\n LogTypeConfig,\n SentryModule,\n};\n\nexport { createClientLogger };\nexport { isSentryEnabled, setSentryModule } from './sentry.js';\n\n// Constants\nexport {\n LOG_FILE_PREFIX,\n LOG_LEVEL_PRIORITY,\n LOG_ROTATION,\n TIMEZONE,\n VALID_LOG_LEVELS,\n} from './constants.js';\n\n/**\n * ブラウザ環境ではサーバーロガーは使用不可\n */\nexport async function createServerLogger(_config?: LoggerConfig): Promise<Logger> {\n console.warn('[logger] createServerLogger is not available in browser/edge environment');\n return createClientLogger(_config);\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __DEGEL_LOGGER__: Logger | undefined;\n // eslint-disable-next-line no-var\n var __DEGEL_LOGGER_INITIALIZED__: boolean | undefined;\n}\n\nexport function getLogger(): Logger {\n if (globalThis.__DEGEL_LOGGER__) {\n return globalThis.__DEGEL_LOGGER__;\n }\n globalThis.__DEGEL_LOGGER__ = createClientLogger();\n return globalThis.__DEGEL_LOGGER__;\n}\n\nexport async function initializeLogger(config?: LoggerConfig): Promise<Logger> {\n if (globalThis.__DEGEL_LOGGER__ && globalThis.__DEGEL_LOGGER_INITIALIZED__) {\n return globalThis.__DEGEL_LOGGER__;\n }\n globalThis.__DEGEL_LOGGER__ = createClientLogger(config);\n globalThis.__DEGEL_LOGGER_INITIALIZED__ = true;\n return globalThis.__DEGEL_LOGGER__;\n}\n\nexport const logger: Logger = {\n debug: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().debug(ctxOrMessage as string, messageOrLocation, originalError),\n info: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().info(ctxOrMessage as string, messageOrLocation, originalError),\n warn: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().warn(ctxOrMessage as string, messageOrLocation, originalError),\n error: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().error(\n ctxOrMessage as string,\n messageOrLocation,\n originalError as Error | string | null | undefined\n ),\n fatal: (ctxOrMessage, messageOrLocation, originalError) =>\n getLogger().fatal(\n ctxOrMessage as string,\n messageOrLocation,\n originalError as Error | string | null | undefined\n ),\n sqlError: (message, location, originalError) =>\n getLogger().sqlError(message, location, originalError),\n} as Logger;\n\nexport default logger;\n"]}
@@ -0,0 +1,144 @@
1
+ 'use strict';
2
+
3
+ // src/constants.ts
4
+ var VALID_LOG_LEVELS = [
5
+ "debug",
6
+ "info",
7
+ "warn",
8
+ "error",
9
+ "fatal"
10
+ ];
11
+ var LOG_LEVEL_PRIORITY = {
12
+ debug: 0,
13
+ info: 1,
14
+ warn: 2,
15
+ error: 3,
16
+ fatal: 4
17
+ };
18
+ var TIMEZONE = {
19
+ /** 日本標準時(JST)のUTCオフセット(分) */
20
+ JST_OFFSET_MINUTES: 540
21
+ };
22
+ var LOG_ROTATION = {
23
+ /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */
24
+ DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1e3
25
+ };
26
+ var LOG_FILE_PREFIX = {
27
+ DEBUG: "debug_log",
28
+ INFO: "info_log",
29
+ ERROR: "error_log",
30
+ FATAL: "fatal_log",
31
+ SQL_ERROR: "sql_error_log"
32
+ };
33
+ var LOG_MESSAGES = {
34
+ /** エラー情報がない場合のデフォルト表示 */
35
+ NO_ERROR: "\u306A\u3057"
36
+ };
37
+
38
+ // src/utils.ts
39
+ var DEFAULT_TIMEZONE_OFFSET = TIMEZONE.JST_OFFSET_MINUTES;
40
+ function getCurrentDate(timezoneOffset = DEFAULT_TIMEZONE_OFFSET) {
41
+ const now = /* @__PURE__ */ new Date();
42
+ now.setTime(now.getTime() + timezoneOffset * 60 * 1e3);
43
+ const year = now.getUTCFullYear();
44
+ const month = String(now.getUTCMonth() + 1).padStart(2, "0");
45
+ const day = String(now.getUTCDate()).padStart(2, "0");
46
+ return `${year}_${month}_${day}`;
47
+ }
48
+ function getFormattedDateTime(timezoneOffset = DEFAULT_TIMEZONE_OFFSET) {
49
+ const now = /* @__PURE__ */ new Date();
50
+ now.setTime(now.getTime() + timezoneOffset * 60 * 1e3);
51
+ const year = now.getUTCFullYear();
52
+ const month = String(now.getUTCMonth() + 1).padStart(2, "0");
53
+ const day = String(now.getUTCDate()).padStart(2, "0");
54
+ const hours = String(now.getUTCHours()).padStart(2, "0");
55
+ const minutes = String(now.getUTCMinutes()).padStart(2, "0");
56
+ const seconds = String(now.getUTCSeconds()).padStart(2, "0");
57
+ return `${year}_${month}_${day} ${hours}:${minutes}:${seconds}`;
58
+ }
59
+ function formatLogMessage(level, message, location, originalError, timezoneOffset = DEFAULT_TIMEZONE_OFFSET) {
60
+ const formattedDate = getFormattedDateTime(timezoneOffset);
61
+ const errorType = level.toUpperCase();
62
+ const locationInfo = location ?? "Unknown";
63
+ const original = originalError ? originalError.toString() : originalError === null ? message : LOG_MESSAGES.NO_ERROR;
64
+ return `${formattedDate}\uFF1A${errorType}\uFF1A${message}\uFF1A${locationInfo}\uFF1A${original}`;
65
+ }
66
+ function isLogContext(arg) {
67
+ return typeof arg === "object" && arg !== null && !Array.isArray(arg) && typeof arg !== "string";
68
+ }
69
+ function formatContext(ctx) {
70
+ const parts = [];
71
+ if (ctx.path) parts.push(`path=${ctx.path}`);
72
+ if (ctx.method) parts.push(`method=${ctx.method}`);
73
+ if (ctx.userId) parts.push(`userId=${ctx.userId}`);
74
+ if (ctx.tenantId) parts.push(`tenantId=${ctx.tenantId}`);
75
+ if (ctx.location) parts.push(`location=${ctx.location}`);
76
+ for (const [key, value] of Object.entries(ctx)) {
77
+ if (!["path", "method", "userId", "tenantId", "location"].includes(key) && value !== void 0) {
78
+ parts.push(`${key}=${String(value)}`);
79
+ }
80
+ }
81
+ return parts.length > 0 ? `[${parts.join(", ")}]` : "";
82
+ }
83
+ function formatLogMessageWithContext(level, message, ctx, error, timezoneOffset = DEFAULT_TIMEZONE_OFFSET) {
84
+ const formattedDate = getFormattedDateTime(timezoneOffset);
85
+ const errorType = level.toUpperCase();
86
+ const contextInfo = formatContext(ctx);
87
+ let errorInfo = "";
88
+ if (error instanceof Error) {
89
+ errorInfo = ` | Error: ${error.message}`;
90
+ if (error.stack) {
91
+ errorInfo += `
92
+ ${error.stack}`;
93
+ }
94
+ } else if (error !== void 0 && error !== null) {
95
+ errorInfo = ` | Error: ${String(error)}`;
96
+ }
97
+ const contextPart = contextInfo ? ` ${contextInfo}` : "";
98
+ return `${formattedDate}\uFF1A${errorType}\uFF1A${message}${contextPart}${errorInfo}`;
99
+ }
100
+
101
+ // src/sentry.ts
102
+ var sentryModule = null;
103
+ function setSentryModule(sentry) {
104
+ sentryModule = sentry;
105
+ }
106
+ function isSentryEnabled() {
107
+ return sentryModule !== null;
108
+ }
109
+ function captureError(ctx, message, error) {
110
+ if (!sentryModule) return;
111
+ if (error instanceof Error) {
112
+ sentryModule.captureException(error, {
113
+ extra: {
114
+ ...ctx,
115
+ message
116
+ }
117
+ });
118
+ } else if (error) {
119
+ sentryModule.captureMessage(`${message}: ${String(error)}`, {
120
+ level: "error",
121
+ extra: ctx
122
+ });
123
+ } else {
124
+ sentryModule.captureMessage(message, {
125
+ level: "error",
126
+ extra: ctx
127
+ });
128
+ }
129
+ }
130
+
131
+ exports.LOG_FILE_PREFIX = LOG_FILE_PREFIX;
132
+ exports.LOG_LEVEL_PRIORITY = LOG_LEVEL_PRIORITY;
133
+ exports.LOG_ROTATION = LOG_ROTATION;
134
+ exports.TIMEZONE = TIMEZONE;
135
+ exports.VALID_LOG_LEVELS = VALID_LOG_LEVELS;
136
+ exports.captureError = captureError;
137
+ exports.formatLogMessage = formatLogMessage;
138
+ exports.formatLogMessageWithContext = formatLogMessageWithContext;
139
+ exports.getCurrentDate = getCurrentDate;
140
+ exports.isLogContext = isLogContext;
141
+ exports.isSentryEnabled = isSentryEnabled;
142
+ exports.setSentryModule = setSentryModule;
143
+ //# sourceMappingURL=chunk-3QE5XQOJ.cjs.map
144
+ //# sourceMappingURL=chunk-3QE5XQOJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/sentry.ts"],"names":[],"mappings":"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","file":"chunk-3QE5XQOJ.cjs","sourcesContent":["/**\n * ログレベル関連の定数\n */\n\nimport type { LogLevel } from './types.js';\n\n/**\n * 有効なログレベル一覧\n * LogLevel型と同期した配列\n */\nexport const VALID_LOG_LEVELS: readonly LogLevel[] = [\n 'debug',\n 'info',\n 'warn',\n 'error',\n 'fatal',\n] as const;\n\n/**\n * ログレベルの優先度マップ\n * 数値が大きいほど優先度が高い\n */\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\n/**\n * タイムゾーン関連\n */\nexport const TIMEZONE = {\n /** 日本標準時(JST)のUTCオフセット(分) */\n JST_OFFSET_MINUTES: 540 as number,\n};\n\n/**\n * ログローテーション関連\n */\nexport const LOG_ROTATION = {\n /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */\n DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1000,\n} as const;\n\n/**\n * ログファイル名プレフィックス\n */\nexport const LOG_FILE_PREFIX = {\n DEBUG: 'debug_log',\n INFO: 'info_log',\n ERROR: 'error_log',\n FATAL: 'fatal_log',\n SQL_ERROR: 'sql_error_log',\n} as const;\n\n/**\n * ログメッセージ関連の定数\n */\nexport const LOG_MESSAGES = {\n /** エラー情報がない場合のデフォルト表示 */\n NO_ERROR: 'なし',\n} as const;\n","import { LOG_MESSAGES, TIMEZONE } from './constants.js';\nimport type { LogContext } from './types.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = TIMEZONE.JST_OFFSET_MINUTES;\n\n/**\n * 現在の日付を YYYY_MM_DD 形式で取得\n */\nexport function getCurrentDate(timezoneOffset = DEFAULT_TIMEZONE_OFFSET): string {\n const now = new Date();\n now.setTime(now.getTime() + timezoneOffset * 60 * 1000);\n\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const day = String(now.getUTCDate()).padStart(2, '0');\n\n return `${year}_${month}_${day}`;\n}\n\n/**\n * 現在の日時をフォーマットする(タイムゾーン調整付き)\n */\nexport function getFormattedDateTime(timezoneOffset = DEFAULT_TIMEZONE_OFFSET): string {\n const now = new Date();\n now.setTime(now.getTime() + timezoneOffset * 60 * 1000);\n\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const day = String(now.getUTCDate()).padStart(2, '0');\n const hours = String(now.getUTCHours()).padStart(2, '0');\n const minutes = String(now.getUTCMinutes()).padStart(2, '0');\n const seconds = String(now.getUTCSeconds()).padStart(2, '0');\n\n return `${year}_${month}_${day} ${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * ログメッセージをフォーマットする\n */\nexport function formatLogMessage(\n level: string,\n message: string,\n location: string | null,\n originalError: Error | string | null,\n timezoneOffset = DEFAULT_TIMEZONE_OFFSET\n): string {\n const formattedDate = getFormattedDateTime(timezoneOffset);\n const errorType = level.toUpperCase();\n const locationInfo = location ?? 'Unknown';\n const original = originalError\n ? originalError.toString()\n : originalError === null\n ? message\n : LOG_MESSAGES.NO_ERROR;\n\n return `${formattedDate}:${errorType}:${message}:${locationInfo}:${original}`;\n}\n\n/**\n * 引数がLogContextかどうかを判定\n */\nexport function isLogContext(arg: unknown): arg is LogContext {\n return typeof arg === 'object' && arg !== null && !Array.isArray(arg) && typeof arg !== 'string';\n}\n\n/**\n * コンテキスト情報をフォーマットする\n */\nfunction formatContext(ctx: LogContext): string {\n const parts: string[] = [];\n\n if (ctx.path) parts.push(`path=${ctx.path}`);\n if (ctx.method) parts.push(`method=${ctx.method}`);\n if (ctx.userId) parts.push(`userId=${ctx.userId}`);\n if (ctx.tenantId) parts.push(`tenantId=${ctx.tenantId}`);\n if (ctx.location) parts.push(`location=${ctx.location}`);\n\n // その他のカスタムフィールド\n for (const [key, value] of Object.entries(ctx)) {\n if (\n !['path', 'method', 'userId', 'tenantId', 'location'].includes(key) &&\n value !== undefined\n ) {\n parts.push(`${key}=${String(value)}`);\n }\n }\n\n return parts.length > 0 ? `[${parts.join(', ')}]` : '';\n}\n\n/**\n * 構造化コンテキスト対応のログメッセージをフォーマットする\n */\nexport function formatLogMessageWithContext(\n level: string,\n message: string,\n ctx: LogContext,\n error: unknown,\n timezoneOffset = DEFAULT_TIMEZONE_OFFSET\n): string {\n const formattedDate = getFormattedDateTime(timezoneOffset);\n const errorType = level.toUpperCase();\n const contextInfo = formatContext(ctx);\n\n let errorInfo = '';\n if (error instanceof Error) {\n errorInfo = ` | Error: ${error.message}`;\n if (error.stack) {\n errorInfo += `\\n${error.stack}`;\n }\n } else if (error !== undefined && error !== null) {\n errorInfo = ` | Error: ${String(error)}`;\n }\n\n const contextPart = contextInfo ? ` ${contextInfo}` : '';\n return `${formattedDate}:${errorType}:${message}${contextPart}${errorInfo}`;\n}\n","/**\n * Sentry連携ヘルパー\n */\n\nimport type { LogContext, SentryModule } from './types.js';\n\nlet sentryModule: SentryModule | null = null;\n\n/**\n * Sentryモジュールを設定\n */\nexport function setSentryModule(sentry: SentryModule): void {\n sentryModule = sentry;\n}\n\n/**\n * Sentryが有効かどうか\n */\nexport function isSentryEnabled(): boolean {\n return sentryModule !== null;\n}\n\n/**\n * Sentryモジュールをクリア(テスト用)\n */\nexport function clearSentryModule(): void {\n sentryModule = null;\n}\n\n/**\n * エラーをSentryに送信\n */\nexport function captureError(ctx: LogContext, message: string, error?: unknown): void {\n if (!sentryModule) return;\n\n if (error instanceof Error) {\n sentryModule.captureException(error, {\n extra: {\n ...ctx,\n message,\n },\n });\n } else if (error) {\n sentryModule.captureMessage(`${message}: ${String(error)}`, {\n level: 'error',\n extra: ctx,\n });\n } else {\n sentryModule.captureMessage(message, {\n level: 'error',\n extra: ctx,\n });\n }\n}\n"]}
@@ -0,0 +1,57 @@
1
+ import { VALID_LOG_LEVELS, isLogContext, formatLogMessageWithContext, formatLogMessage, LOG_LEVEL_PRIORITY } from './chunk-B7IDJBGL.js';
2
+
3
+ // src/client.ts
4
+ function shouldLog(logLevel, minLevel) {
5
+ return LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[minLevel];
6
+ }
7
+ function createClientLogger(config = {}) {
8
+ const { timezoneOffset = 540, enableConsole = true, level = "debug" } = config;
9
+ const minLevel = VALID_LOG_LEVELS.includes(level) ? level : "debug";
10
+ const logToConsole = (logLevel, displayLevel, consoleMethod, ctxOrMessage, messageOrLocation, errorOrOriginal) => {
11
+ if (!enableConsole) return;
12
+ if (!shouldLog(logLevel, minLevel)) return;
13
+ let formattedMessage;
14
+ if (isLogContext(ctxOrMessage)) {
15
+ formattedMessage = formatLogMessageWithContext(
16
+ displayLevel,
17
+ messageOrLocation ?? "",
18
+ ctxOrMessage,
19
+ errorOrOriginal,
20
+ timezoneOffset
21
+ );
22
+ } else {
23
+ formattedMessage = formatLogMessage(
24
+ displayLevel,
25
+ ctxOrMessage,
26
+ messageOrLocation ?? null,
27
+ errorOrOriginal ?? null,
28
+ timezoneOffset
29
+ );
30
+ }
31
+ consoleMethod(formattedMessage);
32
+ };
33
+ return {
34
+ debug: (ctxOrMessage, messageOrLocation, originalError) => {
35
+ logToConsole("debug", "debug", console.debug, ctxOrMessage, messageOrLocation, originalError);
36
+ },
37
+ info: (ctxOrMessage, messageOrLocation, originalError) => {
38
+ logToConsole("info", "info", console.info, ctxOrMessage, messageOrLocation, originalError);
39
+ },
40
+ warn: (ctxOrMessage, messageOrLocation, originalError) => {
41
+ logToConsole("warn", "warn", console.warn, ctxOrMessage, messageOrLocation, originalError);
42
+ },
43
+ error: (ctxOrMessage, messageOrLocation, originalError) => {
44
+ logToConsole("error", "error", console.error, ctxOrMessage, messageOrLocation, originalError);
45
+ },
46
+ fatal: (ctxOrMessage, messageOrLocation, originalError) => {
47
+ logToConsole("fatal", "fatal", console.error, ctxOrMessage, messageOrLocation, originalError);
48
+ },
49
+ sqlError: (message, location, originalError) => {
50
+ logToConsole("error", "sql_error", console.error, message, location, originalError);
51
+ }
52
+ };
53
+ }
54
+
55
+ export { createClientLogger };
56
+ //# sourceMappingURL=chunk-4NWY6SZL.js.map
57
+ //# sourceMappingURL=chunk-4NWY6SZL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;AAOA,SAAS,SAAA,CAAU,UAAoB,QAAA,EAA6B;AAClE,EAAA,OAAO,kBAAA,CAAmB,QAAQ,CAAA,IAAK,kBAAA,CAAmB,QAAQ,CAAA;AACpE;AAKO,SAAS,kBAAA,CAAmB,MAAA,GAAuB,EAAC,EAAW;AACpE,EAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAK,gBAAgB,IAAA,EAAM,KAAA,GAAQ,SAAQ,GAAI,MAAA;AAGxE,EAAA,MAAM,QAAA,GAAqB,gBAAA,CAAiB,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,OAAA;AAEtE,EAAA,MAAM,eAAe,CACnB,QAAA,EACA,cACA,aAAA,EACA,YAAA,EACA,mBACA,eAAA,KACS;AACT,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAA,EAAG;AAEpC,IAAA,IAAI,gBAAA;AAEJ,IAAA,IAAI,YAAA,CAAa,YAAY,CAAA,EAAG;AAE9B,MAAA,gBAAA,GAAmB,2BAAA;AAAA,QACjB,YAAA;AAAA,QACA,iBAAA,IAAqB,EAAA;AAAA,QACrB,YAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,gBAAA,GAAmB,gBAAA;AAAA,QACjB,YAAA;AAAA,QACA,YAAA;AAAA,QACC,iBAAA,IAAgC,IAAA;AAAA,QAChC,eAAA,IAAsC,IAAA;AAAA,QACvC;AAAA,OACF;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,gBAAgB,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,IAAA,EAAM,CACJ,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,QAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC3F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,KAAA,EAAO,CACL,YAAA,EACA,iBAAA,EACA,aAAA,KACG;AACH,MAAA,YAAA,CAAa,SAAS,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAc,mBAAmB,aAAa,CAAA;AAAA,IAC9F,CAAA;AAAA,IACA,QAAA,EAAU,CACR,OAAA,EACA,QAAA,EACA,aAAA,KACG;AAEH,MAAA,YAAA,CAAa,SAAS,WAAA,EAAa,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,UAAU,aAAa,CAAA;AAAA,IACpF;AAAA,GACF;AACF","file":"chunk-4NWY6SZL.js","sourcesContent":["import { LOG_LEVEL_PRIORITY, VALID_LOG_LEVELS } from './constants.js';\nimport type { LogContext, LogLevel, Logger, LoggerConfig } from './types.js';\nimport { formatLogMessage, formatLogMessageWithContext, isLogContext } from './utils.js';\n\n/**\n * 指定されたログレベルが最小レベル以上かどうかを判定\n */\nfunction shouldLog(logLevel: LogLevel, minLevel: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[logLevel] >= LOG_LEVEL_PRIORITY[minLevel];\n}\n\n/**\n * クライアントサイド用ロガーを作成\n */\nexport function createClientLogger(config: LoggerConfig = {}): Logger {\n const { timezoneOffset = 540, enableConsole = true, level = 'debug' } = config;\n\n // 有効なログレベルかどうかを検証\n const minLevel: LogLevel = VALID_LOG_LEVELS.includes(level) ? level : 'debug';\n\n const logToConsole = (\n logLevel: LogLevel,\n displayLevel: string,\n consoleMethod: (...args: unknown[]) => void,\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n errorOrOriginal?: unknown\n ): void => {\n if (!enableConsole) return;\n if (!shouldLog(logLevel, minLevel)) return;\n\n let formattedMessage: string;\n\n if (isLogContext(ctxOrMessage)) {\n // 構造化コンテキスト形式: (ctx, message, error?)\n formattedMessage = formatLogMessageWithContext(\n displayLevel,\n messageOrLocation ?? '',\n ctxOrMessage,\n errorOrOriginal,\n timezoneOffset\n );\n } else {\n // レガシー形式: (message, location?, originalError?)\n formattedMessage = formatLogMessage(\n displayLevel,\n ctxOrMessage,\n (messageOrLocation as string) ?? null,\n (errorOrOriginal as Error | string) ?? null,\n timezoneOffset\n );\n }\n\n consoleMethod(formattedMessage);\n };\n\n return {\n debug: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('debug', 'debug', console.debug, ctxOrMessage, messageOrLocation, originalError);\n },\n info: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('info', 'info', console.info, ctxOrMessage, messageOrLocation, originalError);\n },\n warn: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('warn', 'warn', console.warn, ctxOrMessage, messageOrLocation, originalError);\n },\n error: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('error', 'error', console.error, ctxOrMessage, messageOrLocation, originalError);\n },\n fatal: (\n ctxOrMessage: LogContext | string,\n messageOrLocation?: string | null,\n originalError?: unknown\n ) => {\n logToConsole('fatal', 'fatal', console.error, ctxOrMessage, messageOrLocation, originalError);\n },\n sqlError: (\n message: string,\n location?: string | null,\n originalError?: Error | string | null\n ) => {\n // sqlErrorはerrorレベルとしてフィルタリング、表示はsql_error\n logToConsole('error', 'sql_error', console.error, message, location, originalError);\n },\n } as Logger;\n}\n"]}
@@ -1,5 +1,40 @@
1
+ // src/constants.ts
2
+ var VALID_LOG_LEVELS = [
3
+ "debug",
4
+ "info",
5
+ "warn",
6
+ "error",
7
+ "fatal"
8
+ ];
9
+ var LOG_LEVEL_PRIORITY = {
10
+ debug: 0,
11
+ info: 1,
12
+ warn: 2,
13
+ error: 3,
14
+ fatal: 4
15
+ };
16
+ var TIMEZONE = {
17
+ /** 日本標準時(JST)のUTCオフセット(分) */
18
+ JST_OFFSET_MINUTES: 540
19
+ };
20
+ var LOG_ROTATION = {
21
+ /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */
22
+ DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1e3
23
+ };
24
+ var LOG_FILE_PREFIX = {
25
+ DEBUG: "debug_log",
26
+ INFO: "info_log",
27
+ ERROR: "error_log",
28
+ FATAL: "fatal_log",
29
+ SQL_ERROR: "sql_error_log"
30
+ };
31
+ var LOG_MESSAGES = {
32
+ /** エラー情報がない場合のデフォルト表示 */
33
+ NO_ERROR: "\u306A\u3057"
34
+ };
35
+
1
36
  // src/utils.ts
2
- var DEFAULT_TIMEZONE_OFFSET = 540;
37
+ var DEFAULT_TIMEZONE_OFFSET = TIMEZONE.JST_OFFSET_MINUTES;
3
38
  function getCurrentDate(timezoneOffset = DEFAULT_TIMEZONE_OFFSET) {
4
39
  const now = /* @__PURE__ */ new Date();
5
40
  now.setTime(now.getTime() + timezoneOffset * 60 * 1e3);
@@ -23,7 +58,7 @@ function formatLogMessage(level, message, location, originalError, timezoneOffse
23
58
  const formattedDate = getFormattedDateTime(timezoneOffset);
24
59
  const errorType = level.toUpperCase();
25
60
  const locationInfo = location ?? "Unknown";
26
- const original = originalError ? originalError.toString() : originalError === null ? message : "\u306A\u3057";
61
+ const original = originalError ? originalError.toString() : originalError === null ? message : LOG_MESSAGES.NO_ERROR;
27
62
  return `${formattedDate}\uFF1A${errorType}\uFF1A${message}\uFF1A${locationInfo}\uFF1A${original}`;
28
63
  }
29
64
  function isLogContext(arg) {
@@ -91,6 +126,6 @@ function captureError(ctx, message, error) {
91
126
  }
92
127
  }
93
128
 
94
- export { captureError, formatLogMessage, formatLogMessageWithContext, getCurrentDate, isLogContext, isSentryEnabled, setSentryModule };
95
- //# sourceMappingURL=chunk-34MNPN6V.js.map
96
- //# sourceMappingURL=chunk-34MNPN6V.js.map
129
+ export { LOG_FILE_PREFIX, LOG_LEVEL_PRIORITY, LOG_ROTATION, TIMEZONE, VALID_LOG_LEVELS, captureError, formatLogMessage, formatLogMessageWithContext, getCurrentDate, isLogContext, isSentryEnabled, setSentryModule };
130
+ //# sourceMappingURL=chunk-B7IDJBGL.js.map
131
+ //# sourceMappingURL=chunk-B7IDJBGL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/sentry.ts"],"names":[],"mappings":"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","file":"chunk-B7IDJBGL.js","sourcesContent":["/**\n * ログレベル関連の定数\n */\n\nimport type { LogLevel } from './types.js';\n\n/**\n * 有効なログレベル一覧\n * LogLevel型と同期した配列\n */\nexport const VALID_LOG_LEVELS: readonly LogLevel[] = [\n 'debug',\n 'info',\n 'warn',\n 'error',\n 'fatal',\n] as const;\n\n/**\n * ログレベルの優先度マップ\n * 数値が大きいほど優先度が高い\n */\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\n/**\n * タイムゾーン関連\n */\nexport const TIMEZONE = {\n /** 日本標準時(JST)のUTCオフセット(分) */\n JST_OFFSET_MINUTES: 540 as number,\n};\n\n/**\n * ログローテーション関連\n */\nexport const LOG_ROTATION = {\n /** デフォルトのローテーションチェック間隔(ミリ秒): 1時間 */\n DEFAULT_CHECK_INTERVAL_MS: 60 * 60 * 1000,\n} as const;\n\n/**\n * ログファイル名プレフィックス\n */\nexport const LOG_FILE_PREFIX = {\n DEBUG: 'debug_log',\n INFO: 'info_log',\n ERROR: 'error_log',\n FATAL: 'fatal_log',\n SQL_ERROR: 'sql_error_log',\n} as const;\n\n/**\n * ログメッセージ関連の定数\n */\nexport const LOG_MESSAGES = {\n /** エラー情報がない場合のデフォルト表示 */\n NO_ERROR: 'なし',\n} as const;\n","import { LOG_MESSAGES, TIMEZONE } from './constants.js';\nimport type { LogContext } from './types.js';\n\nconst DEFAULT_TIMEZONE_OFFSET = TIMEZONE.JST_OFFSET_MINUTES;\n\n/**\n * 現在の日付を YYYY_MM_DD 形式で取得\n */\nexport function getCurrentDate(timezoneOffset = DEFAULT_TIMEZONE_OFFSET): string {\n const now = new Date();\n now.setTime(now.getTime() + timezoneOffset * 60 * 1000);\n\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const day = String(now.getUTCDate()).padStart(2, '0');\n\n return `${year}_${month}_${day}`;\n}\n\n/**\n * 現在の日時をフォーマットする(タイムゾーン調整付き)\n */\nexport function getFormattedDateTime(timezoneOffset = DEFAULT_TIMEZONE_OFFSET): string {\n const now = new Date();\n now.setTime(now.getTime() + timezoneOffset * 60 * 1000);\n\n const year = now.getUTCFullYear();\n const month = String(now.getUTCMonth() + 1).padStart(2, '0');\n const day = String(now.getUTCDate()).padStart(2, '0');\n const hours = String(now.getUTCHours()).padStart(2, '0');\n const minutes = String(now.getUTCMinutes()).padStart(2, '0');\n const seconds = String(now.getUTCSeconds()).padStart(2, '0');\n\n return `${year}_${month}_${day} ${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * ログメッセージをフォーマットする\n */\nexport function formatLogMessage(\n level: string,\n message: string,\n location: string | null,\n originalError: Error | string | null,\n timezoneOffset = DEFAULT_TIMEZONE_OFFSET\n): string {\n const formattedDate = getFormattedDateTime(timezoneOffset);\n const errorType = level.toUpperCase();\n const locationInfo = location ?? 'Unknown';\n const original = originalError\n ? originalError.toString()\n : originalError === null\n ? message\n : LOG_MESSAGES.NO_ERROR;\n\n return `${formattedDate}:${errorType}:${message}:${locationInfo}:${original}`;\n}\n\n/**\n * 引数がLogContextかどうかを判定\n */\nexport function isLogContext(arg: unknown): arg is LogContext {\n return typeof arg === 'object' && arg !== null && !Array.isArray(arg) && typeof arg !== 'string';\n}\n\n/**\n * コンテキスト情報をフォーマットする\n */\nfunction formatContext(ctx: LogContext): string {\n const parts: string[] = [];\n\n if (ctx.path) parts.push(`path=${ctx.path}`);\n if (ctx.method) parts.push(`method=${ctx.method}`);\n if (ctx.userId) parts.push(`userId=${ctx.userId}`);\n if (ctx.tenantId) parts.push(`tenantId=${ctx.tenantId}`);\n if (ctx.location) parts.push(`location=${ctx.location}`);\n\n // その他のカスタムフィールド\n for (const [key, value] of Object.entries(ctx)) {\n if (\n !['path', 'method', 'userId', 'tenantId', 'location'].includes(key) &&\n value !== undefined\n ) {\n parts.push(`${key}=${String(value)}`);\n }\n }\n\n return parts.length > 0 ? `[${parts.join(', ')}]` : '';\n}\n\n/**\n * 構造化コンテキスト対応のログメッセージをフォーマットする\n */\nexport function formatLogMessageWithContext(\n level: string,\n message: string,\n ctx: LogContext,\n error: unknown,\n timezoneOffset = DEFAULT_TIMEZONE_OFFSET\n): string {\n const formattedDate = getFormattedDateTime(timezoneOffset);\n const errorType = level.toUpperCase();\n const contextInfo = formatContext(ctx);\n\n let errorInfo = '';\n if (error instanceof Error) {\n errorInfo = ` | Error: ${error.message}`;\n if (error.stack) {\n errorInfo += `\\n${error.stack}`;\n }\n } else if (error !== undefined && error !== null) {\n errorInfo = ` | Error: ${String(error)}`;\n }\n\n const contextPart = contextInfo ? ` ${contextInfo}` : '';\n return `${formattedDate}:${errorType}:${message}${contextPart}${errorInfo}`;\n}\n","/**\n * Sentry連携ヘルパー\n */\n\nimport type { LogContext, SentryModule } from './types.js';\n\nlet sentryModule: SentryModule | null = null;\n\n/**\n * Sentryモジュールを設定\n */\nexport function setSentryModule(sentry: SentryModule): void {\n sentryModule = sentry;\n}\n\n/**\n * Sentryが有効かどうか\n */\nexport function isSentryEnabled(): boolean {\n return sentryModule !== null;\n}\n\n/**\n * Sentryモジュールをクリア(テスト用)\n */\nexport function clearSentryModule(): void {\n sentryModule = null;\n}\n\n/**\n * エラーをSentryに送信\n */\nexport function captureError(ctx: LogContext, message: string, error?: unknown): void {\n if (!sentryModule) return;\n\n if (error instanceof Error) {\n sentryModule.captureException(error, {\n extra: {\n ...ctx,\n message,\n },\n });\n } else if (error) {\n sentryModule.captureMessage(`${message}: ${String(error)}`, {\n level: 'error',\n extra: ctx,\n });\n } else {\n sentryModule.captureMessage(message, {\n level: 'error',\n extra: ctx,\n });\n }\n}\n"]}