ee-core 5.0.0 → 5.0.2
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/dist/cjs/log/index.d.ts +1 -1
- package/dist/cjs/log/index.d.ts.map +1 -1
- package/dist/cjs/log/index.js +51 -26
- package/dist/cjs/log/index.js.map +1 -1
- package/dist/cjs/storage/index.d.ts +15 -0
- package/dist/cjs/storage/index.d.ts.map +1 -1
- package/dist/cjs/storage/index.js +15 -0
- package/dist/cjs/storage/index.js.map +1 -1
- package/dist/cjs/storage/sqliteStorage.d.ts +18 -18
- package/dist/cjs/storage/sqliteStorage.d.ts.map +1 -1
- package/dist/cjs/storage/sqliteStorage.js +63 -20
- package/dist/cjs/storage/sqliteStorage.js.map +1 -1
- package/dist/esm/log/index.d.ts +1 -1
- package/dist/esm/log/index.d.ts.map +1 -1
- package/dist/esm/log/index.js +51 -26
- package/dist/esm/log/index.js.map +1 -1
- package/dist/esm/storage/index.d.ts +15 -0
- package/dist/esm/storage/index.d.ts.map +1 -1
- package/dist/esm/storage/index.js +15 -0
- package/dist/esm/storage/index.js.map +1 -1
- package/dist/esm/storage/sqliteStorage.d.ts +18 -18
- package/dist/esm/storage/sqliteStorage.d.ts.map +1 -1
- package/dist/esm/storage/sqliteStorage.js +30 -20
- package/dist/esm/storage/sqliteStorage.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/log/index.d.ts
CHANGED
|
@@ -54,6 +54,6 @@ export declare function getLoggers(): PinoLoggers;
|
|
|
54
54
|
export declare const logger: EeLogger;
|
|
55
55
|
/** Framework core log instance (Proxy wrapped) */
|
|
56
56
|
export declare const coreLogger: EeLogger;
|
|
57
|
-
/** Error log instance (Proxy wrapped, error/fatal level only) */
|
|
57
|
+
/** Error log instance (Proxy wrapped, error/fatal level only; sole writer of ee-error.log) */
|
|
58
58
|
export declare const errorLogger: EeLogger;
|
|
59
59
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/log/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAU,MAAM,aAAa,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAC1C;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAEvE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,WAAW,CAGxC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/log/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAU,MAAM,aAAa,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAC1C;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAEvE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,WAAW,CAGxC;AA4GD,+CAA+C;AAC/C,eAAO,MAAM,MAAM,EAAE,QAAiE,CAAC;AACvF,kDAAkD;AAClD,eAAO,MAAM,UAAU,EAAE,QAAsE,CAAC;AAChG,8FAA8F;AAC9F,eAAO,MAAM,WAAW,EAAE,QAA+D,CAAC"}
|
package/dist/cjs/log/index.js
CHANGED
|
@@ -78,46 +78,71 @@ function formatArg(a) {
|
|
|
78
78
|
* @param getter - Deferred function to get pino.Logger instance
|
|
79
79
|
* @returns EeLogger proxy object
|
|
80
80
|
*/
|
|
81
|
-
|
|
81
|
+
/** Log levels that are aggregated into errorLogger (ee-error.log) */
|
|
82
|
+
const ERROR_LEVELS = new Set(['error', 'fatal']);
|
|
83
|
+
/**
|
|
84
|
+
* Invoke a single pino method, normalizing the multiple supported calling styles.
|
|
85
|
+
*
|
|
86
|
+
* Shared by the direct write and the error/fatal aggregation forward so both
|
|
87
|
+
* paths interpret arguments identically.
|
|
88
|
+
*/
|
|
89
|
+
function applyLog(l, prop, args) {
|
|
90
|
+
const method = l[prop];
|
|
91
|
+
if (!method)
|
|
92
|
+
return;
|
|
93
|
+
// Single argument, call directly
|
|
94
|
+
if (args.length <= 1) {
|
|
95
|
+
method.call(l, ...args);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const first = args[0];
|
|
99
|
+
// pino standard: first argument is a plain object → (mergeObj, msg, ...args)
|
|
100
|
+
if (typeof first === 'object' && first !== null && !(first instanceof Error)) {
|
|
101
|
+
method.call(l, ...args);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// pino printf: first argument contains %s/%d formatting → keep as-is
|
|
105
|
+
if (typeof first === 'string' && /%[sdijo]/.test(first)) {
|
|
106
|
+
method.call(l, ...args);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Concatenation mode: logger.info('msg:', value) → 'msg: value'
|
|
110
|
+
method.call(l, args.map(formatArg).join(' '));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create log proxy object
|
|
114
|
+
*
|
|
115
|
+
* @param getter - Deferred function to get pino.Logger instance
|
|
116
|
+
* @param source - Origin tag ('app' / 'core'); when set, error/fatal records are
|
|
117
|
+
* additionally aggregated into errorLogger (ee-error.log) with a `from` binding.
|
|
118
|
+
* errorLogger itself passes no source, so it never forwards to avoid double writes.
|
|
119
|
+
* @returns EeLogger proxy object
|
|
120
|
+
*/
|
|
121
|
+
function createLoggerProxy(getter, source) {
|
|
82
122
|
return new Proxy({}, {
|
|
83
123
|
get(_target, prop) {
|
|
84
|
-
// child() returns sub-logger proxy
|
|
124
|
+
// child() returns sub-logger proxy (preserves source so children still aggregate)
|
|
85
125
|
if (prop === 'child') {
|
|
86
|
-
return (bindings) => createLoggerProxy(() => getter().child(bindings));
|
|
126
|
+
return (bindings) => createLoggerProxy(() => getter().child(bindings), source);
|
|
87
127
|
}
|
|
88
128
|
if (!LOG_METHODS.has(prop))
|
|
89
129
|
return undefined;
|
|
90
130
|
return (...args) => {
|
|
91
131
|
const l = getter();
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
method.call(l, ...args);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
const first = args[0];
|
|
101
|
-
// pino standard: first argument is a plain object → (mergeObj, msg, ...args)
|
|
102
|
-
if (typeof first === 'object' && first !== null && !(first instanceof Error)) {
|
|
103
|
-
method.call(l, ...args);
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
// pino printf: first argument contains %s/%d formatting → keep as-is
|
|
107
|
-
if (typeof first === 'string' && /%[sdijo]/.test(first)) {
|
|
108
|
-
method.call(l, ...args);
|
|
109
|
-
return;
|
|
132
|
+
applyLog(l, prop, args);
|
|
133
|
+
// Aggregate error/fatal into ee-error.log (single writer = errorLogger).
|
|
134
|
+
// Skipped for errorLogger itself (source undefined) to prevent double writes.
|
|
135
|
+
if (source && ERROR_LEVELS.has(prop)) {
|
|
136
|
+
applyLog(_getLoggerBy('errorLogger').child({ from: source }), prop, args);
|
|
110
137
|
}
|
|
111
|
-
// Concatenation mode: logger.info('msg:', value) → 'msg: value'
|
|
112
|
-
method.call(l, args.map(formatArg).join(' '));
|
|
113
138
|
};
|
|
114
139
|
},
|
|
115
140
|
});
|
|
116
141
|
}
|
|
117
142
|
/** Application log instance (Proxy wrapped) */
|
|
118
|
-
exports.logger = createLoggerProxy(() => _getLoggerBy('logger'));
|
|
143
|
+
exports.logger = createLoggerProxy(() => _getLoggerBy('logger'), 'app');
|
|
119
144
|
/** Framework core log instance (Proxy wrapped) */
|
|
120
|
-
exports.coreLogger = createLoggerProxy(() => _getLoggerBy('coreLogger'));
|
|
121
|
-
/** Error log instance (Proxy wrapped, error/fatal level only) */
|
|
145
|
+
exports.coreLogger = createLoggerProxy(() => _getLoggerBy('coreLogger'), 'core');
|
|
146
|
+
/** Error log instance (Proxy wrapped, error/fatal level only; sole writer of ee-error.log) */
|
|
122
147
|
exports.errorLogger = createLoggerProxy(() => _getLoggerBy('errorLogger'));
|
|
123
148
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/log/index.ts"],"names":[],"mappings":";;;AA0CA,8BAEC;AAOD,0BAEC;AASD,gCAGC;AAlDD,2CAAkD;AAkBlD,uDAAuD;AACvD,IAAI,OAAO,GAAuB,IAAI,CAAC;AAEvC;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,MAAgC;IACxD,OAAO,IAAA,kBAAM,EAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO;IACrB,OAAO,GAAG,IAAA,kBAAM,GAAE,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU;IACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC5B,OAAO,OAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAA6C;IACjE,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC5B,OAAO,OAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,wCAAwC;AACxC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAElF;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,CAAU;IAC3B,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC;IACpD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/log/index.ts"],"names":[],"mappings":";;;AA0CA,8BAEC;AAOD,0BAEC;AASD,gCAGC;AAlDD,2CAAkD;AAkBlD,uDAAuD;AACvD,IAAI,OAAO,GAAuB,IAAI,CAAC;AAEvC;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,MAAgC;IACxD,OAAO,IAAA,kBAAM,EAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO;IACrB,OAAO,GAAG,IAAA,kBAAM,GAAE,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU;IACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC5B,OAAO,OAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAA6C;IACjE,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC5B,OAAO,OAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,wCAAwC;AACxC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAElF;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,CAAU;IAC3B,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC;IACpD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,qEAAqE;AACrE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjD;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,CAAc,EAAE,IAAY,EAAE,IAAe;IAC7D,MAAM,MAAM,GAAI,CAA6D,CAAC,IAAI,CAAC,CAAC;IACpF,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,iCAAiC;IACjC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,6EAA6E;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IACD,qEAAqE;IACrE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IACD,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,iBAAiB,CAAC,MAAyB,EAAE,MAAe;IACnE,OAAO,IAAI,KAAK,CAAC,EAAyB,EAAE;QAC1C,GAAG,CAAC,OAAO,EAAE,IAAI;YACf,kFAAkF;YAClF,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,OAAO,CAAC,QAAuB,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YAChG,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAc,CAAC;gBAAE,OAAO,SAAS,CAAC;YAEvD,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;gBAC5B,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;gBACnB,QAAQ,CAAC,CAAC,EAAE,IAAc,EAAE,IAAI,CAAC,CAAC;gBAElC,yEAAyE;gBACzE,8EAA8E;gBAC9E,IAAI,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,IAAc,CAAC,EAAE,CAAC;oBAC/C,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAc,EAAE,IAAI,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,+CAA+C;AAClC,QAAA,MAAM,GAAa,iBAAiB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AACvF,kDAAkD;AACrC,QAAA,UAAU,GAAa,iBAAiB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;AAChG,8FAA8F;AACjF,QAAA,WAAW,GAAa,iBAAiB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC"}
|
|
@@ -1,2 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module storage
|
|
3
|
+
* @description Data storage module entry point. Provides SqliteStorage for SQLite database operations.
|
|
4
|
+
*
|
|
5
|
+
* SqliteStorage class is exported statically — loading this module only imports built-in
|
|
6
|
+
* Node.js modules (assert, fs, path), NOT better-sqlite3. The native better-sqlite3 binding
|
|
7
|
+
* is only loaded when `SqliteStorage.init()` is called, via dynamic import().
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { SqliteStorage } from 'ee-core/storage';
|
|
12
|
+
* const db = new SqliteStorage('myapp.db');
|
|
13
|
+
* await db.init(); // ← here better-sqlite3 is actually loaded
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
1
16
|
export { SqliteStorage } from './sqliteStorage.js';
|
|
2
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SqliteStorage = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @module storage
|
|
6
|
+
* @description Data storage module entry point. Provides SqliteStorage for SQLite database operations.
|
|
7
|
+
*
|
|
8
|
+
* SqliteStorage class is exported statically — loading this module only imports built-in
|
|
9
|
+
* Node.js modules (assert, fs, path), NOT better-sqlite3. The native better-sqlite3 binding
|
|
10
|
+
* is only loaded when `SqliteStorage.init()` is called, via dynamic import().
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { SqliteStorage } from 'ee-core/storage';
|
|
15
|
+
* const db = new SqliteStorage('myapp.db');
|
|
16
|
+
* await db.init(); // ← here better-sqlite3 is actually loaded
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
4
19
|
var sqliteStorage_js_1 = require("./sqliteStorage.js");
|
|
5
20
|
Object.defineProperty(exports, "SqliteStorage", { enumerable: true, get: function () { return sqliteStorage_js_1.SqliteStorage; } });
|
|
6
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AAA1C,iHAAA,aAAa,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;GAcG;AACH,uDAAmD;AAA1C,iHAAA,aAAa,OAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
2
|
/**
|
|
3
3
|
* SqliteStorage - SQLite database storage class
|
|
4
4
|
*
|
|
@@ -15,6 +15,12 @@ import Database from 'better-sqlite3';
|
|
|
15
15
|
* Security:
|
|
16
16
|
* The constructor validates the database name for path traversal, disallowing ".." in the name
|
|
17
17
|
* to prevent malicious input from accessing files outside the intended directory.
|
|
18
|
+
*
|
|
19
|
+
* Lazy loading:
|
|
20
|
+
* better-sqlite3 is a native module that requires electron-rebuild for Electron.
|
|
21
|
+
* The constructor only computes paths (synchronous). The `init()` method lazily imports
|
|
22
|
+
* better-sqlite3 and opens the database connection. Projects that don't use SQLite
|
|
23
|
+
* never load the native binding.
|
|
18
24
|
*/
|
|
19
25
|
export declare class SqliteStorage {
|
|
20
26
|
/** Database name (original input value) */
|
|
@@ -25,42 +31,36 @@ export declare class SqliteStorage {
|
|
|
25
31
|
dbDir: string;
|
|
26
32
|
/** Database filename (only the filename part, excluding directory) */
|
|
27
33
|
fileName: string;
|
|
28
|
-
/** better-sqlite3 database instance */
|
|
34
|
+
/** better-sqlite3 database instance (set after init()) */
|
|
29
35
|
db: Database.Database;
|
|
30
36
|
/**
|
|
31
|
-
* Create a SqliteStorage instance
|
|
37
|
+
* Create a SqliteStorage instance (path computation only, DB not yet opened)
|
|
32
38
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* 3. Create the database file directory (_createDatabaseDir)
|
|
37
|
-
* 4. Extract the filename part (_formatFileName)
|
|
38
|
-
* 5. Open the database connection (_initDB)
|
|
39
|
+
* The constructor only validates the name, infers the storage mode, computes paths,
|
|
40
|
+
* and creates the database directory. It does NOT open the database connection —
|
|
41
|
+
* call `init()` to lazily load better-sqlite3 and open the DB.
|
|
39
42
|
*
|
|
40
43
|
* @param name - Database name or path. Supports the following formats:
|
|
41
44
|
* - ":memory:" - In-memory database
|
|
42
45
|
* - "app.db" - Filename only, stored under {dataDir}/db/
|
|
43
46
|
* - "sub/app.db" - Relative path, relative to {dataDir}/db/
|
|
44
47
|
* - "/tmp/app.db" - Absolute path
|
|
45
|
-
* @param opt - better-sqlite3 database options, defaults merged with timeout: 5000
|
|
46
48
|
* @throws Asserts error if name is empty or contains ".." path traversal characters
|
|
47
49
|
*/
|
|
48
|
-
constructor(name: string
|
|
50
|
+
constructor(name: string);
|
|
49
51
|
/**
|
|
50
52
|
* Initialize the database connection
|
|
51
53
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* - file mode: Uses getFilePath() to get the full database file path
|
|
54
|
+
* Lazily imports better-sqlite3 via dynamic import() and opens the database.
|
|
55
|
+
* This is the only point where the native .node binding is loaded.
|
|
55
56
|
*
|
|
56
|
-
*
|
|
57
|
-
* If the file does not exist, throws an assertion error (possibly due to insufficient directory permissions, etc.).
|
|
57
|
+
* Must be called after construction before using `this.db`.
|
|
58
58
|
*
|
|
59
59
|
* @param opt - better-sqlite3 database options, defaults merged with { timeout: 5000 }
|
|
60
|
-
* @returns
|
|
60
|
+
* @returns this SqliteStorage instance (for chaining: `const db = await new SqliteStorage('app.db').init()`)
|
|
61
61
|
* @throws Asserts error if the database file was not created successfully in file mode
|
|
62
62
|
*/
|
|
63
|
-
|
|
63
|
+
init(opt?: Record<string, unknown>): Promise<this>;
|
|
64
64
|
/**
|
|
65
65
|
* Extract the database filename
|
|
66
66
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteStorage.d.ts","sourceRoot":"","sources":["../../../src/storage/sqliteStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqliteStorage.d.ts","sourceRoot":"","sources":["../../../src/storage/sqliteStorage.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,aAAa;IACxB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IAEb,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IAEb,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IAEd,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IAEjB,0DAA0D;IAC1D,EAAE,EAAG,QAAQ,CAAC,QAAQ,CAAC;IAEvB;;;;;;;;;;;;;OAaG;gBACS,IAAI,EAAE,MAAM;IAWxB;;;;;;;;;;;OAWG;IACG,IAAI,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5D;;;;;;;;OAQG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAOrC;;;;;;;;;;;OAWG;IACH,kBAAkB,IAAI,MAAM;IAc5B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAe7B;;;;OAIG;IACH,QAAQ,IAAI,MAAM;IAIlB;;;;;;;OAOG;IACH,WAAW,IAAI,MAAM;CAGtB"}
|
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -15,25 +48,32 @@ exports.SqliteStorage = void 0;
|
|
|
15
48
|
* - Prevent path traversal attacks (validates that ".." is not present in the name during construction)
|
|
16
49
|
* - Provide a unified interface for obtaining database file paths
|
|
17
50
|
*
|
|
51
|
+
* better-sqlite3 is lazily imported — only loaded when `init()` is called to open the database.
|
|
52
|
+
* This avoids loading the native .node binding at module import time, which would happen unconditionally
|
|
53
|
+
* even if the consumer never uses SQLite.
|
|
54
|
+
*
|
|
18
55
|
* Usage examples:
|
|
19
56
|
* ```ts
|
|
20
57
|
* // Name-only mode: file stored at {dataDir}/db/{name}.db
|
|
21
58
|
* const db1 = new SqliteStorage('myapp.db');
|
|
59
|
+
* await db1.init();
|
|
22
60
|
*
|
|
23
61
|
* // Relative path mode: file stored at {dataDir}/db/sub/myapp.db
|
|
24
62
|
* const db2 = new SqliteStorage('sub/myapp.db');
|
|
63
|
+
* await db2.init();
|
|
25
64
|
*
|
|
26
65
|
* // Absolute path mode: file stored at the specified path
|
|
27
66
|
* const db3 = new SqliteStorage('/tmp/data/myapp.db');
|
|
67
|
+
* await db3.init();
|
|
28
68
|
*
|
|
29
69
|
* // In-memory mode: not persisted, data is lost when the process exits
|
|
30
70
|
* const db4 = new SqliteStorage(':memory:');
|
|
71
|
+
* await db4.init();
|
|
31
72
|
* ```
|
|
32
73
|
*/
|
|
33
74
|
const assert_1 = __importDefault(require("assert"));
|
|
34
75
|
const fs_1 = __importDefault(require("fs"));
|
|
35
76
|
const path_1 = __importDefault(require("path"));
|
|
36
|
-
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
37
77
|
const helper_js_1 = require("../utils/helper.js");
|
|
38
78
|
const index_js_1 = require("../ps/index.js");
|
|
39
79
|
/**
|
|
@@ -52,27 +92,29 @@ const index_js_1 = require("../ps/index.js");
|
|
|
52
92
|
* Security:
|
|
53
93
|
* The constructor validates the database name for path traversal, disallowing ".." in the name
|
|
54
94
|
* to prevent malicious input from accessing files outside the intended directory.
|
|
95
|
+
*
|
|
96
|
+
* Lazy loading:
|
|
97
|
+
* better-sqlite3 is a native module that requires electron-rebuild for Electron.
|
|
98
|
+
* The constructor only computes paths (synchronous). The `init()` method lazily imports
|
|
99
|
+
* better-sqlite3 and opens the database connection. Projects that don't use SQLite
|
|
100
|
+
* never load the native binding.
|
|
55
101
|
*/
|
|
56
102
|
class SqliteStorage {
|
|
57
103
|
/**
|
|
58
|
-
* Create a SqliteStorage instance
|
|
104
|
+
* Create a SqliteStorage instance (path computation only, DB not yet opened)
|
|
59
105
|
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* 3. Create the database file directory (_createDatabaseDir)
|
|
64
|
-
* 4. Extract the filename part (_formatFileName)
|
|
65
|
-
* 5. Open the database connection (_initDB)
|
|
106
|
+
* The constructor only validates the name, infers the storage mode, computes paths,
|
|
107
|
+
* and creates the database directory. It does NOT open the database connection —
|
|
108
|
+
* call `init()` to lazily load better-sqlite3 and open the DB.
|
|
66
109
|
*
|
|
67
110
|
* @param name - Database name or path. Supports the following formats:
|
|
68
111
|
* - ":memory:" - In-memory database
|
|
69
112
|
* - "app.db" - Filename only, stored under {dataDir}/db/
|
|
70
113
|
* - "sub/app.db" - Relative path, relative to {dataDir}/db/
|
|
71
114
|
* - "/tmp/app.db" - Absolute path
|
|
72
|
-
* @param opt - better-sqlite3 database options, defaults merged with timeout: 5000
|
|
73
115
|
* @throws Asserts error if name is empty or contains ".." path traversal characters
|
|
74
116
|
*/
|
|
75
|
-
constructor(name
|
|
117
|
+
constructor(name) {
|
|
76
118
|
(0, assert_1.default)(name, `db name ${name} Cannot be empty`);
|
|
77
119
|
// Prevent path traversal attacks: disallow ".." in the name to avoid directory backtracking
|
|
78
120
|
(0, assert_1.default)(!name.includes('..'), `db name ${name} contains path traversal`);
|
|
@@ -80,35 +122,36 @@ class SqliteStorage {
|
|
|
80
122
|
this.mode = this.getMode(name);
|
|
81
123
|
this.dbDir = this._createDatabaseDir();
|
|
82
124
|
this.fileName = this._formatFileName(name);
|
|
83
|
-
this.db = this._initDB(opt);
|
|
84
125
|
}
|
|
85
126
|
/**
|
|
86
127
|
* Initialize the database connection
|
|
87
128
|
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* - file mode: Uses getFilePath() to get the full database file path
|
|
129
|
+
* Lazily imports better-sqlite3 via dynamic import() and opens the database.
|
|
130
|
+
* This is the only point where the native .node binding is loaded.
|
|
91
131
|
*
|
|
92
|
-
*
|
|
93
|
-
* If the file does not exist, throws an assertion error (possibly due to insufficient directory permissions, etc.).
|
|
132
|
+
* Must be called after construction before using `this.db`.
|
|
94
133
|
*
|
|
95
134
|
* @param opt - better-sqlite3 database options, defaults merged with { timeout: 5000 }
|
|
96
|
-
* @returns
|
|
135
|
+
* @returns this SqliteStorage instance (for chaining: `const db = await new SqliteStorage('app.db').init()`)
|
|
97
136
|
* @throws Asserts error if the database file was not created successfully in file mode
|
|
98
137
|
*/
|
|
99
|
-
|
|
138
|
+
async init(opt = {}) {
|
|
139
|
+
// Lazy import: better-sqlite3 is only loaded when actually needed.
|
|
140
|
+
// This avoids loading the native .node binding at module import time.
|
|
141
|
+
// better-sqlite3 is a CJS package; dynamic import() resolves it correctly.
|
|
142
|
+
const { default: Database } = await Promise.resolve().then(() => __importStar(require('better-sqlite3')));
|
|
100
143
|
const options = Object.assign({ timeout: 5000 }, opt);
|
|
101
144
|
// Storage type: db file, in-memory (:memory:)
|
|
102
145
|
let dbPath = this.name;
|
|
103
146
|
if (this.mode !== 'memory') {
|
|
104
147
|
dbPath = this.getFilePath();
|
|
105
148
|
}
|
|
106
|
-
|
|
149
|
+
this.db = new Database(dbPath, options);
|
|
107
150
|
// For file mode, check if the file was created successfully
|
|
108
151
|
if (this.mode !== 'memory') {
|
|
109
152
|
(0, assert_1.default)(fs_1.default.existsSync(dbPath), `error: db ${dbPath} not exists`);
|
|
110
153
|
}
|
|
111
|
-
return
|
|
154
|
+
return this;
|
|
112
155
|
}
|
|
113
156
|
/**
|
|
114
157
|
* Extract the database filename
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteStorage.js","sourceRoot":"","sources":["../../../src/storage/sqliteStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqliteStorage.js","sourceRoot":"","sources":["../../../src/storage/sqliteStorage.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/log/index.d.ts
CHANGED
|
@@ -54,6 +54,6 @@ export declare function getLoggers(): PinoLoggers;
|
|
|
54
54
|
export declare const logger: EeLogger;
|
|
55
55
|
/** Framework core log instance (Proxy wrapped) */
|
|
56
56
|
export declare const coreLogger: EeLogger;
|
|
57
|
-
/** Error log instance (Proxy wrapped, error/fatal level only) */
|
|
57
|
+
/** Error log instance (Proxy wrapped, error/fatal level only; sole writer of ee-error.log) */
|
|
58
58
|
export declare const errorLogger: EeLogger;
|
|
59
59
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/log/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAU,MAAM,aAAa,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAC1C;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAEvE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,WAAW,CAGxC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/log/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAU,MAAM,aAAa,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;CAC1C;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAEvE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,IAAI,WAAW,CAGxC;AA4GD,+CAA+C;AAC/C,eAAO,MAAM,MAAM,EAAE,QAAiE,CAAC;AACvF,kDAAkD;AAClD,eAAO,MAAM,UAAU,EAAE,QAAsE,CAAC;AAChG,8FAA8F;AAC9F,eAAO,MAAM,WAAW,EAAE,QAA+D,CAAC"}
|
package/dist/esm/log/index.js
CHANGED
|
@@ -78,46 +78,71 @@ function formatArg(a) {
|
|
|
78
78
|
* @param getter - Deferred function to get pino.Logger instance
|
|
79
79
|
* @returns EeLogger proxy object
|
|
80
80
|
*/
|
|
81
|
-
|
|
81
|
+
/** Log levels that are aggregated into errorLogger (ee-error.log) */
|
|
82
|
+
const ERROR_LEVELS = new Set(['error', 'fatal']);
|
|
83
|
+
/**
|
|
84
|
+
* Invoke a single pino method, normalizing the multiple supported calling styles.
|
|
85
|
+
*
|
|
86
|
+
* Shared by the direct write and the error/fatal aggregation forward so both
|
|
87
|
+
* paths interpret arguments identically.
|
|
88
|
+
*/
|
|
89
|
+
function applyLog(l, prop, args) {
|
|
90
|
+
const method = l[prop];
|
|
91
|
+
if (!method)
|
|
92
|
+
return;
|
|
93
|
+
// Single argument, call directly
|
|
94
|
+
if (args.length <= 1) {
|
|
95
|
+
method.call(l, ...args);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const first = args[0];
|
|
99
|
+
// pino standard: first argument is a plain object → (mergeObj, msg, ...args)
|
|
100
|
+
if (typeof first === 'object' && first !== null && !(first instanceof Error)) {
|
|
101
|
+
method.call(l, ...args);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// pino printf: first argument contains %s/%d formatting → keep as-is
|
|
105
|
+
if (typeof first === 'string' && /%[sdijo]/.test(first)) {
|
|
106
|
+
method.call(l, ...args);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Concatenation mode: logger.info('msg:', value) → 'msg: value'
|
|
110
|
+
method.call(l, args.map(formatArg).join(' '));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create log proxy object
|
|
114
|
+
*
|
|
115
|
+
* @param getter - Deferred function to get pino.Logger instance
|
|
116
|
+
* @param source - Origin tag ('app' / 'core'); when set, error/fatal records are
|
|
117
|
+
* additionally aggregated into errorLogger (ee-error.log) with a `from` binding.
|
|
118
|
+
* errorLogger itself passes no source, so it never forwards to avoid double writes.
|
|
119
|
+
* @returns EeLogger proxy object
|
|
120
|
+
*/
|
|
121
|
+
function createLoggerProxy(getter, source) {
|
|
82
122
|
return new Proxy({}, {
|
|
83
123
|
get(_target, prop) {
|
|
84
|
-
// child() returns sub-logger proxy
|
|
124
|
+
// child() returns sub-logger proxy (preserves source so children still aggregate)
|
|
85
125
|
if (prop === 'child') {
|
|
86
|
-
return (bindings) => createLoggerProxy(() => getter().child(bindings));
|
|
126
|
+
return (bindings) => createLoggerProxy(() => getter().child(bindings), source);
|
|
87
127
|
}
|
|
88
128
|
if (!LOG_METHODS.has(prop))
|
|
89
129
|
return undefined;
|
|
90
130
|
return (...args) => {
|
|
91
131
|
const l = getter();
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
method.call(l, ...args);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
const first = args[0];
|
|
101
|
-
// pino standard: first argument is a plain object → (mergeObj, msg, ...args)
|
|
102
|
-
if (typeof first === 'object' && first !== null && !(first instanceof Error)) {
|
|
103
|
-
method.call(l, ...args);
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
// pino printf: first argument contains %s/%d formatting → keep as-is
|
|
107
|
-
if (typeof first === 'string' && /%[sdijo]/.test(first)) {
|
|
108
|
-
method.call(l, ...args);
|
|
109
|
-
return;
|
|
132
|
+
applyLog(l, prop, args);
|
|
133
|
+
// Aggregate error/fatal into ee-error.log (single writer = errorLogger).
|
|
134
|
+
// Skipped for errorLogger itself (source undefined) to prevent double writes.
|
|
135
|
+
if (source && ERROR_LEVELS.has(prop)) {
|
|
136
|
+
applyLog(_getLoggerBy('errorLogger').child({ from: source }), prop, args);
|
|
110
137
|
}
|
|
111
|
-
// Concatenation mode: logger.info('msg:', value) → 'msg: value'
|
|
112
|
-
method.call(l, args.map(formatArg).join(' '));
|
|
113
138
|
};
|
|
114
139
|
},
|
|
115
140
|
});
|
|
116
141
|
}
|
|
117
142
|
/** Application log instance (Proxy wrapped) */
|
|
118
|
-
exports.logger = createLoggerProxy(() => _getLoggerBy('logger'));
|
|
143
|
+
exports.logger = createLoggerProxy(() => _getLoggerBy('logger'), 'app');
|
|
119
144
|
/** Framework core log instance (Proxy wrapped) */
|
|
120
|
-
exports.coreLogger = createLoggerProxy(() => _getLoggerBy('coreLogger'));
|
|
121
|
-
/** Error log instance (Proxy wrapped, error/fatal level only) */
|
|
145
|
+
exports.coreLogger = createLoggerProxy(() => _getLoggerBy('coreLogger'), 'core');
|
|
146
|
+
/** Error log instance (Proxy wrapped, error/fatal level only; sole writer of ee-error.log) */
|
|
122
147
|
exports.errorLogger = createLoggerProxy(() => _getLoggerBy('errorLogger'));
|
|
123
148
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/log/index.ts"],"names":[],"mappings":";;;AA0CA,8BAEC;AAOD,0BAEC;AASD,gCAGC;AAlDD,2CAAkD;AAkBlD,uDAAuD;AACvD,IAAI,OAAO,GAAuB,IAAI,CAAC;AAEvC;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,MAAgC;IACxD,OAAO,IAAA,kBAAM,EAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO;IACrB,OAAO,GAAG,IAAA,kBAAM,GAAE,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU;IACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC5B,OAAO,OAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAA6C;IACjE,IAAI,CAAC,OAAO,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAC5B,OAAO,OAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,wCAAwC;AACxC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAElF;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,CAAU;IAC3B,IAAI,CAAC,YAAY,KAAK;QAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC;IACpD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/log/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module storage
|
|
3
|
+
* @description Data storage module entry point. Provides SqliteStorage for SQLite database operations.
|
|
4
|
+
*
|
|
5
|
+
* SqliteStorage class is exported statically — loading this module only imports built-in
|
|
6
|
+
* Node.js modules (assert, fs, path), NOT better-sqlite3. The native better-sqlite3 binding
|
|
7
|
+
* is only loaded when `SqliteStorage.init()` is called, via dynamic import().
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { SqliteStorage } from 'ee-core/storage';
|
|
12
|
+
* const db = new SqliteStorage('myapp.db');
|
|
13
|
+
* await db.init(); // ← here better-sqlite3 is actually loaded
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
1
16
|
export { SqliteStorage } from './sqliteStorage.js';
|
|
2
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SqliteStorage = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @module storage
|
|
6
|
+
* @description Data storage module entry point. Provides SqliteStorage for SQLite database operations.
|
|
7
|
+
*
|
|
8
|
+
* SqliteStorage class is exported statically — loading this module only imports built-in
|
|
9
|
+
* Node.js modules (assert, fs, path), NOT better-sqlite3. The native better-sqlite3 binding
|
|
10
|
+
* is only loaded when `SqliteStorage.init()` is called, via dynamic import().
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { SqliteStorage } from 'ee-core/storage';
|
|
15
|
+
* const db = new SqliteStorage('myapp.db');
|
|
16
|
+
* await db.init(); // ← here better-sqlite3 is actually loaded
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
4
19
|
var sqliteStorage_js_1 = require("./sqliteStorage.js");
|
|
5
20
|
Object.defineProperty(exports, "SqliteStorage", { enumerable: true, get: function () { return sqliteStorage_js_1.SqliteStorage; } });
|
|
6
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AAA1C,iHAAA,aAAa,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;GAcG;AACH,uDAAmD;AAA1C,iHAAA,aAAa,OAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
2
|
/**
|
|
3
3
|
* SqliteStorage - SQLite database storage class
|
|
4
4
|
*
|
|
@@ -15,6 +15,12 @@ import Database from 'better-sqlite3';
|
|
|
15
15
|
* Security:
|
|
16
16
|
* The constructor validates the database name for path traversal, disallowing ".." in the name
|
|
17
17
|
* to prevent malicious input from accessing files outside the intended directory.
|
|
18
|
+
*
|
|
19
|
+
* Lazy loading:
|
|
20
|
+
* better-sqlite3 is a native module that requires electron-rebuild for Electron.
|
|
21
|
+
* The constructor only computes paths (synchronous). The `init()` method lazily imports
|
|
22
|
+
* better-sqlite3 and opens the database connection. Projects that don't use SQLite
|
|
23
|
+
* never load the native binding.
|
|
18
24
|
*/
|
|
19
25
|
export declare class SqliteStorage {
|
|
20
26
|
/** Database name (original input value) */
|
|
@@ -25,42 +31,36 @@ export declare class SqliteStorage {
|
|
|
25
31
|
dbDir: string;
|
|
26
32
|
/** Database filename (only the filename part, excluding directory) */
|
|
27
33
|
fileName: string;
|
|
28
|
-
/** better-sqlite3 database instance */
|
|
34
|
+
/** better-sqlite3 database instance (set after init()) */
|
|
29
35
|
db: Database.Database;
|
|
30
36
|
/**
|
|
31
|
-
* Create a SqliteStorage instance
|
|
37
|
+
* Create a SqliteStorage instance (path computation only, DB not yet opened)
|
|
32
38
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* 3. Create the database file directory (_createDatabaseDir)
|
|
37
|
-
* 4. Extract the filename part (_formatFileName)
|
|
38
|
-
* 5. Open the database connection (_initDB)
|
|
39
|
+
* The constructor only validates the name, infers the storage mode, computes paths,
|
|
40
|
+
* and creates the database directory. It does NOT open the database connection —
|
|
41
|
+
* call `init()` to lazily load better-sqlite3 and open the DB.
|
|
39
42
|
*
|
|
40
43
|
* @param name - Database name or path. Supports the following formats:
|
|
41
44
|
* - ":memory:" - In-memory database
|
|
42
45
|
* - "app.db" - Filename only, stored under {dataDir}/db/
|
|
43
46
|
* - "sub/app.db" - Relative path, relative to {dataDir}/db/
|
|
44
47
|
* - "/tmp/app.db" - Absolute path
|
|
45
|
-
* @param opt - better-sqlite3 database options, defaults merged with timeout: 5000
|
|
46
48
|
* @throws Asserts error if name is empty or contains ".." path traversal characters
|
|
47
49
|
*/
|
|
48
|
-
constructor(name: string
|
|
50
|
+
constructor(name: string);
|
|
49
51
|
/**
|
|
50
52
|
* Initialize the database connection
|
|
51
53
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* - file mode: Uses getFilePath() to get the full database file path
|
|
54
|
+
* Lazily imports better-sqlite3 via dynamic import() and opens the database.
|
|
55
|
+
* This is the only point where the native .node binding is loaded.
|
|
55
56
|
*
|
|
56
|
-
*
|
|
57
|
-
* If the file does not exist, throws an assertion error (possibly due to insufficient directory permissions, etc.).
|
|
57
|
+
* Must be called after construction before using `this.db`.
|
|
58
58
|
*
|
|
59
59
|
* @param opt - better-sqlite3 database options, defaults merged with { timeout: 5000 }
|
|
60
|
-
* @returns
|
|
60
|
+
* @returns this SqliteStorage instance (for chaining: `const db = await new SqliteStorage('app.db').init()`)
|
|
61
61
|
* @throws Asserts error if the database file was not created successfully in file mode
|
|
62
62
|
*/
|
|
63
|
-
|
|
63
|
+
init(opt?: Record<string, unknown>): Promise<this>;
|
|
64
64
|
/**
|
|
65
65
|
* Extract the database filename
|
|
66
66
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteStorage.d.ts","sourceRoot":"","sources":["../../../src/storage/sqliteStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqliteStorage.d.ts","sourceRoot":"","sources":["../../../src/storage/sqliteStorage.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,aAAa;IACxB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IAEb,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IAEb,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IAEd,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IAEjB,0DAA0D;IAC1D,EAAE,EAAG,QAAQ,CAAC,QAAQ,CAAC;IAEvB;;;;;;;;;;;;;OAaG;gBACS,IAAI,EAAE,MAAM;IAWxB;;;;;;;;;;;OAWG;IACG,IAAI,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB5D;;;;;;;;OAQG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAOrC;;;;;;;;;;;OAWG;IACH,kBAAkB,IAAI,MAAM;IAc5B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAe7B;;;;OAIG;IACH,QAAQ,IAAI,MAAM;IAIlB;;;;;;;OAOG;IACH,WAAW,IAAI,MAAM;CAGtB"}
|
|
@@ -15,25 +15,32 @@ exports.SqliteStorage = void 0;
|
|
|
15
15
|
* - Prevent path traversal attacks (validates that ".." is not present in the name during construction)
|
|
16
16
|
* - Provide a unified interface for obtaining database file paths
|
|
17
17
|
*
|
|
18
|
+
* better-sqlite3 is lazily imported — only loaded when `init()` is called to open the database.
|
|
19
|
+
* This avoids loading the native .node binding at module import time, which would happen unconditionally
|
|
20
|
+
* even if the consumer never uses SQLite.
|
|
21
|
+
*
|
|
18
22
|
* Usage examples:
|
|
19
23
|
* ```ts
|
|
20
24
|
* // Name-only mode: file stored at {dataDir}/db/{name}.db
|
|
21
25
|
* const db1 = new SqliteStorage('myapp.db');
|
|
26
|
+
* await db1.init();
|
|
22
27
|
*
|
|
23
28
|
* // Relative path mode: file stored at {dataDir}/db/sub/myapp.db
|
|
24
29
|
* const db2 = new SqliteStorage('sub/myapp.db');
|
|
30
|
+
* await db2.init();
|
|
25
31
|
*
|
|
26
32
|
* // Absolute path mode: file stored at the specified path
|
|
27
33
|
* const db3 = new SqliteStorage('/tmp/data/myapp.db');
|
|
34
|
+
* await db3.init();
|
|
28
35
|
*
|
|
29
36
|
* // In-memory mode: not persisted, data is lost when the process exits
|
|
30
37
|
* const db4 = new SqliteStorage(':memory:');
|
|
38
|
+
* await db4.init();
|
|
31
39
|
* ```
|
|
32
40
|
*/
|
|
33
41
|
const assert_1 = __importDefault(require("assert"));
|
|
34
42
|
const fs_1 = __importDefault(require("fs"));
|
|
35
43
|
const path_1 = __importDefault(require("path"));
|
|
36
|
-
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
37
44
|
const helper_js_1 = require("../utils/helper.js");
|
|
38
45
|
const index_js_1 = require("../ps/index.js");
|
|
39
46
|
/**
|
|
@@ -52,27 +59,29 @@ const index_js_1 = require("../ps/index.js");
|
|
|
52
59
|
* Security:
|
|
53
60
|
* The constructor validates the database name for path traversal, disallowing ".." in the name
|
|
54
61
|
* to prevent malicious input from accessing files outside the intended directory.
|
|
62
|
+
*
|
|
63
|
+
* Lazy loading:
|
|
64
|
+
* better-sqlite3 is a native module that requires electron-rebuild for Electron.
|
|
65
|
+
* The constructor only computes paths (synchronous). The `init()` method lazily imports
|
|
66
|
+
* better-sqlite3 and opens the database connection. Projects that don't use SQLite
|
|
67
|
+
* never load the native binding.
|
|
55
68
|
*/
|
|
56
69
|
class SqliteStorage {
|
|
57
70
|
/**
|
|
58
|
-
* Create a SqliteStorage instance
|
|
71
|
+
* Create a SqliteStorage instance (path computation only, DB not yet opened)
|
|
59
72
|
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* 3. Create the database file directory (_createDatabaseDir)
|
|
64
|
-
* 4. Extract the filename part (_formatFileName)
|
|
65
|
-
* 5. Open the database connection (_initDB)
|
|
73
|
+
* The constructor only validates the name, infers the storage mode, computes paths,
|
|
74
|
+
* and creates the database directory. It does NOT open the database connection —
|
|
75
|
+
* call `init()` to lazily load better-sqlite3 and open the DB.
|
|
66
76
|
*
|
|
67
77
|
* @param name - Database name or path. Supports the following formats:
|
|
68
78
|
* - ":memory:" - In-memory database
|
|
69
79
|
* - "app.db" - Filename only, stored under {dataDir}/db/
|
|
70
80
|
* - "sub/app.db" - Relative path, relative to {dataDir}/db/
|
|
71
81
|
* - "/tmp/app.db" - Absolute path
|
|
72
|
-
* @param opt - better-sqlite3 database options, defaults merged with timeout: 5000
|
|
73
82
|
* @throws Asserts error if name is empty or contains ".." path traversal characters
|
|
74
83
|
*/
|
|
75
|
-
constructor(name
|
|
84
|
+
constructor(name) {
|
|
76
85
|
(0, assert_1.default)(name, `db name ${name} Cannot be empty`);
|
|
77
86
|
// Prevent path traversal attacks: disallow ".." in the name to avoid directory backtracking
|
|
78
87
|
(0, assert_1.default)(!name.includes('..'), `db name ${name} contains path traversal`);
|
|
@@ -80,35 +89,36 @@ class SqliteStorage {
|
|
|
80
89
|
this.mode = this.getMode(name);
|
|
81
90
|
this.dbDir = this._createDatabaseDir();
|
|
82
91
|
this.fileName = this._formatFileName(name);
|
|
83
|
-
this.db = this._initDB(opt);
|
|
84
92
|
}
|
|
85
93
|
/**
|
|
86
94
|
* Initialize the database connection
|
|
87
95
|
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* - file mode: Uses getFilePath() to get the full database file path
|
|
96
|
+
* Lazily imports better-sqlite3 via dynamic import() and opens the database.
|
|
97
|
+
* This is the only point where the native .node binding is loaded.
|
|
91
98
|
*
|
|
92
|
-
*
|
|
93
|
-
* If the file does not exist, throws an assertion error (possibly due to insufficient directory permissions, etc.).
|
|
99
|
+
* Must be called after construction before using `this.db`.
|
|
94
100
|
*
|
|
95
101
|
* @param opt - better-sqlite3 database options, defaults merged with { timeout: 5000 }
|
|
96
|
-
* @returns
|
|
102
|
+
* @returns this SqliteStorage instance (for chaining: `const db = await new SqliteStorage('app.db').init()`)
|
|
97
103
|
* @throws Asserts error if the database file was not created successfully in file mode
|
|
98
104
|
*/
|
|
99
|
-
|
|
105
|
+
async init(opt = {}) {
|
|
106
|
+
// Lazy import: better-sqlite3 is only loaded when actually needed.
|
|
107
|
+
// This avoids loading the native .node binding at module import time.
|
|
108
|
+
// better-sqlite3 is a CJS package; dynamic import() resolves it correctly.
|
|
109
|
+
const { default: Database } = await import('better-sqlite3');
|
|
100
110
|
const options = Object.assign({ timeout: 5000 }, opt);
|
|
101
111
|
// Storage type: db file, in-memory (:memory:)
|
|
102
112
|
let dbPath = this.name;
|
|
103
113
|
if (this.mode !== 'memory') {
|
|
104
114
|
dbPath = this.getFilePath();
|
|
105
115
|
}
|
|
106
|
-
|
|
116
|
+
this.db = new Database(dbPath, options);
|
|
107
117
|
// For file mode, check if the file was created successfully
|
|
108
118
|
if (this.mode !== 'memory') {
|
|
109
119
|
(0, assert_1.default)(fs_1.default.existsSync(dbPath), `error: db ${dbPath} not exists`);
|
|
110
120
|
}
|
|
111
|
-
return
|
|
121
|
+
return this;
|
|
112
122
|
}
|
|
113
123
|
/**
|
|
114
124
|
* Extract the database filename
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteStorage.js","sourceRoot":"","sources":["../../../src/storage/sqliteStorage.ts"],"names":[],"mappings":";;;;;;AAAA
|
|
1
|
+
{"version":3,"file":"sqliteStorage.js","sourceRoot":"","sources":["../../../src/storage/sqliteStorage.ts"],"names":[],"mappings":"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"}
|