@bloomneo/appkit 1.2.9 → 1.5.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/AGENTS.md +195 -0
- package/CHANGELOG.md +253 -0
- package/README.md +147 -799
- package/bin/commands/generate.js +7 -7
- package/cookbook/README.md +26 -0
- package/cookbook/api-key-service.ts +106 -0
- package/cookbook/auth-protected-crud.ts +112 -0
- package/cookbook/file-upload-pipeline.ts +113 -0
- package/cookbook/multi-tenant-saas.ts +87 -0
- package/cookbook/real-time-chat.ts +121 -0
- package/dist/auth/auth.d.ts +21 -4
- package/dist/auth/auth.d.ts.map +1 -1
- package/dist/auth/auth.js +56 -44
- package/dist/auth/auth.js.map +1 -1
- package/dist/auth/defaults.d.ts +1 -1
- package/dist/auth/defaults.js +35 -35
- package/dist/cache/cache.d.ts +29 -6
- package/dist/cache/cache.d.ts.map +1 -1
- package/dist/cache/cache.js +72 -44
- package/dist/cache/cache.js.map +1 -1
- package/dist/cache/defaults.js +29 -29
- package/dist/cache/index.d.ts +19 -10
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +21 -18
- package/dist/cache/index.js.map +1 -1
- package/dist/config/defaults.d.ts +1 -1
- package/dist/config/defaults.js +11 -11
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.js +4 -4
- package/dist/database/adapters/mongoose.d.ts +4 -4
- package/dist/database/adapters/mongoose.js +7 -7
- package/dist/database/adapters/prisma.d.ts +4 -4
- package/dist/database/adapters/prisma.js +7 -7
- package/dist/database/defaults.d.ts +1 -1
- package/dist/database/defaults.js +4 -4
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/email/defaults.js +26 -26
- package/dist/email/index.js +7 -7
- package/dist/email/strategies/resend.js +1 -1
- package/dist/error/defaults.d.ts +1 -1
- package/dist/error/defaults.js +13 -13
- package/dist/error/error.d.ts +12 -0
- package/dist/error/error.d.ts.map +1 -1
- package/dist/error/error.js +19 -0
- package/dist/error/error.js.map +1 -1
- package/dist/error/index.d.ts +14 -3
- package/dist/error/index.d.ts.map +1 -1
- package/dist/error/index.js +14 -3
- package/dist/error/index.js.map +1 -1
- package/dist/event/defaults.js +35 -35
- package/dist/event/index.js +7 -7
- package/dist/logger/defaults.d.ts +1 -1
- package/dist/logger/defaults.js +40 -40
- package/dist/logger/index.d.ts +1 -0
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js.map +1 -1
- package/dist/logger/logger.d.ts +8 -0
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +13 -3
- package/dist/logger/logger.js.map +1 -1
- package/dist/logger/transports/console.js +2 -2
- package/dist/logger/transports/http.d.ts +1 -1
- package/dist/logger/transports/http.js +2 -2
- package/dist/logger/transports/webhook.d.ts +1 -1
- package/dist/logger/transports/webhook.js +3 -3
- package/dist/queue/defaults.d.ts +2 -2
- package/dist/queue/defaults.js +38 -38
- package/dist/security/defaults.d.ts +1 -1
- package/dist/security/defaults.js +30 -30
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.js +3 -3
- package/dist/security/security.d.ts +1 -1
- package/dist/security/security.js +4 -4
- package/dist/storage/defaults.js +26 -26
- package/dist/storage/index.js +3 -3
- package/dist/util/defaults.d.ts +1 -1
- package/dist/util/defaults.js +41 -41
- package/dist/util/env.d.ts +35 -0
- package/dist/util/env.d.ts.map +1 -0
- package/dist/util/env.js +50 -0
- package/dist/util/env.js.map +1 -0
- package/dist/util/errors.d.ts +52 -0
- package/dist/util/errors.d.ts.map +1 -0
- package/dist/util/errors.js +82 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/util.js +1 -1
- package/examples/.env.example +80 -0
- package/examples/README.md +16 -0
- package/examples/auth.ts +228 -0
- package/examples/cache.ts +36 -0
- package/examples/config.ts +45 -0
- package/examples/database.ts +69 -0
- package/examples/email.ts +53 -0
- package/examples/error.ts +50 -0
- package/examples/event.ts +42 -0
- package/examples/logger.ts +41 -0
- package/examples/queue.ts +58 -0
- package/examples/security.ts +46 -0
- package/examples/storage.ts +44 -0
- package/examples/util.ts +47 -0
- package/llms.txt +591 -0
- package/package.json +19 -10
- package/src/auth/README.md +850 -0
- package/src/cache/README.md +756 -0
- package/src/config/README.md +604 -0
- package/src/database/README.md +818 -0
- package/src/email/README.md +759 -0
- package/src/error/README.md +660 -0
- package/src/event/README.md +729 -0
- package/src/logger/README.md +435 -0
- package/src/queue/README.md +851 -0
- package/src/security/README.md +612 -0
- package/src/storage/README.md +1008 -0
- package/src/util/README.md +955 -0
- package/bin/templates/backend/docs/APPKIT_CLI.md +0 -507
- package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +0 -61
- package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +0 -2539
package/dist/error/defaults.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @llm-rule NOTE: Called once at startup, cached globally for performance
|
|
9
9
|
*/
|
|
10
10
|
/**
|
|
11
|
-
* Gets smart defaults using
|
|
11
|
+
* Gets smart defaults using BLOOM_ERROR_* environment variables
|
|
12
12
|
* @llm-rule WHEN: App startup to get production-ready error configuration
|
|
13
13
|
* @llm-rule AVOID: Calling repeatedly - expensive validation, cache the result
|
|
14
14
|
* @llm-rule NOTE: Automatically configures dev vs production error behavior
|
|
@@ -23,7 +23,7 @@ export function getSmartDefaults() {
|
|
|
23
23
|
// Error message defaults with environment awareness
|
|
24
24
|
messages: {
|
|
25
25
|
badRequest: 'Bad Request',
|
|
26
|
-
unauthorized: process.env.
|
|
26
|
+
unauthorized: process.env.BLOOM_AUTH_MESSAGE || 'Authentication required',
|
|
27
27
|
forbidden: 'Access denied',
|
|
28
28
|
notFound: 'Not found',
|
|
29
29
|
conflict: 'Conflict',
|
|
@@ -31,8 +31,8 @@ export function getSmartDefaults() {
|
|
|
31
31
|
},
|
|
32
32
|
// Error handling behavior with smart defaults
|
|
33
33
|
middleware: {
|
|
34
|
-
showStack: process.env.
|
|
35
|
-
logErrors: process.env.
|
|
34
|
+
showStack: process.env.BLOOM_ERROR_STACK === 'true' || isDevelopment,
|
|
35
|
+
logErrors: process.env.BLOOM_ERROR_LOG !== 'false',
|
|
36
36
|
},
|
|
37
37
|
// Environment information
|
|
38
38
|
environment: {
|
|
@@ -50,25 +50,25 @@ export function getSmartDefaults() {
|
|
|
50
50
|
* @llm-rule NOTE: Validates essential boolean environment variables and NODE_ENV only
|
|
51
51
|
*/
|
|
52
52
|
function validateEnvironment() {
|
|
53
|
-
// Validate
|
|
54
|
-
const errorStack = process.env.
|
|
53
|
+
// Validate BLOOM_ERROR_STACK (essential for security)
|
|
54
|
+
const errorStack = process.env.BLOOM_ERROR_STACK;
|
|
55
55
|
if (errorStack && !['true', 'false'].includes(errorStack.toLowerCase())) {
|
|
56
|
-
throw new Error(`Invalid
|
|
56
|
+
throw new Error(`Invalid BLOOM_ERROR_STACK: "${errorStack}". Must be "true" or "false"`);
|
|
57
57
|
}
|
|
58
|
-
// Validate
|
|
59
|
-
const errorLog = process.env.
|
|
58
|
+
// Validate BLOOM_ERROR_LOG (essential for debugging)
|
|
59
|
+
const errorLog = process.env.BLOOM_ERROR_LOG;
|
|
60
60
|
if (errorLog && !['true', 'false'].includes(errorLog.toLowerCase())) {
|
|
61
|
-
throw new Error(`Invalid
|
|
61
|
+
throw new Error(`Invalid BLOOM_ERROR_LOG: "${errorLog}". Must be "true" or "false"`);
|
|
62
62
|
}
|
|
63
63
|
// Validate NODE_ENV (essential for environment detection)
|
|
64
64
|
const nodeEnv = process.env.NODE_ENV;
|
|
65
65
|
if (nodeEnv && !['development', 'production', 'test', 'staging'].includes(nodeEnv)) {
|
|
66
|
-
console.warn(`[
|
|
66
|
+
console.warn(`[Bloomneo AppKit] Unusual NODE_ENV: "${nodeEnv}". ` +
|
|
67
67
|
`Expected: development, production, test, or staging`);
|
|
68
68
|
}
|
|
69
69
|
// Essential production safety check
|
|
70
|
-
if (nodeEnv === 'production' && process.env.
|
|
71
|
-
console.warn(`[
|
|
70
|
+
if (nodeEnv === 'production' && process.env.BLOOM_ERROR_STACK === 'true') {
|
|
71
|
+
console.warn(`[Bloomneo AppKit] Security warning: BLOOM_ERROR_STACK=true in production. ` +
|
|
72
72
|
`Stack traces may expose internal application structure. Consider setting to false.`);
|
|
73
73
|
}
|
|
74
74
|
}
|
package/dist/error/error.d.ts
CHANGED
|
@@ -82,6 +82,18 @@ export declare class ErrorClass {
|
|
|
82
82
|
* @llm-rule NOTE: PATTERN: catch (dbError) { throw error.serverError('Database unavailable'); }
|
|
83
83
|
*/
|
|
84
84
|
serverError(message?: string): AppError;
|
|
85
|
+
/**
|
|
86
|
+
* Creates a 429 Too Many Requests error
|
|
87
|
+
* @llm-rule WHEN: Client has exceeded rate limits
|
|
88
|
+
* @llm-rule NOTE: PATTERN: if (rateExceeded) throw error.tooMany('Slow down');
|
|
89
|
+
*/
|
|
90
|
+
tooMany(message?: string): AppError;
|
|
91
|
+
/**
|
|
92
|
+
* Creates a 500 Internal Server Error (alias for serverError — prefer serverError())
|
|
93
|
+
* @llm-rule WHEN: Unexpected internal failures where serverError() feels too generic
|
|
94
|
+
* @llm-rule NOTE: Identical to serverError() — use either, not both in the same codebase
|
|
95
|
+
*/
|
|
96
|
+
internal(message?: string): AppError;
|
|
85
97
|
/**
|
|
86
98
|
* Creates a custom error with any status code
|
|
87
99
|
* @llm-rule WHEN: Need custom HTTP status codes not covered by semantic methods
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/error/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1C,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,mBAAmB,KACtB,IAAI,CAAC;AAEV,MAAM,MAAM,iBAAiB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,mBAAmB,KACtB,OAAO,CAAC,GAAG,CAAC,CAAC;AAElB,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,UAAU;IACd,MAAM,EAAE,WAAW,CAAC;gBAEf,MAAM,EAAE,WAAW;IAI/B;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOtC;;;;;;OAMG;IACH,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOxC;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOrC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOpC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOpC;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOvC;;;;;;OAMG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOzE;;;;;;OAMG;IACH,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,mBAAmB;IAyCpE;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,EAAE,iBAAiB,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,KAAK,IAAI;IAMjH;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIvC;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIvC;;;;OAIG;IACH,kBAAkB,IAAI;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAQxF;;;;OAIG;IACH,SAAS,IAAI,WAAW;CAGzB"}
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/error/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1C,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,mBAAmB,KACtB,IAAI,CAAC;AAEV,MAAM,MAAM,iBAAiB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,mBAAmB,KACtB,OAAO,CAAC,GAAG,CAAC,CAAC;AAElB,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,UAAU;IACd,MAAM,EAAE,WAAW,CAAC;gBAEf,MAAM,EAAE,WAAW;IAI/B;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOtC;;;;;;OAMG;IACH,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOxC;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOrC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOpC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOpC;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOvC;;;;OAIG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOnC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ;IAIpC;;;;;;OAMG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOzE;;;;;;OAMG;IACH,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,mBAAmB;IAyCpE;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,EAAE,iBAAiB,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,KAAK,IAAI;IAMjH;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIvC;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIvC;;;;OAIG;IACH,kBAAkB,IAAI;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAQxF;;;;OAIG;IACH,SAAS,IAAI,WAAW;CAGzB"}
|
package/dist/error/error.js
CHANGED
|
@@ -93,6 +93,25 @@ export class ErrorClass {
|
|
|
93
93
|
error.type = 'SERVER_ERROR';
|
|
94
94
|
return error;
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Creates a 429 Too Many Requests error
|
|
98
|
+
* @llm-rule WHEN: Client has exceeded rate limits
|
|
99
|
+
* @llm-rule NOTE: PATTERN: if (rateExceeded) throw error.tooMany('Slow down');
|
|
100
|
+
*/
|
|
101
|
+
tooMany(message) {
|
|
102
|
+
const error = new Error(message || 'Too many requests');
|
|
103
|
+
error.statusCode = 429;
|
|
104
|
+
error.type = 'TOO_MANY_REQUESTS';
|
|
105
|
+
return error;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Creates a 500 Internal Server Error (alias for serverError — prefer serverError())
|
|
109
|
+
* @llm-rule WHEN: Unexpected internal failures where serverError() feels too generic
|
|
110
|
+
* @llm-rule NOTE: Identical to serverError() — use either, not both in the same codebase
|
|
111
|
+
*/
|
|
112
|
+
internal(message) {
|
|
113
|
+
return this.serverError(message);
|
|
114
|
+
}
|
|
96
115
|
/**
|
|
97
116
|
* Creates a custom error with any status code
|
|
98
117
|
* @llm-rule WHEN: Need custom HTTP status codes not covered by semantic methods
|
package/dist/error/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/error/error.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/error/error.ts"],"names":[],"mappings":"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"}
|
package/dist/error/index.d.ts
CHANGED
|
@@ -104,11 +104,22 @@ export declare const errorClass: {
|
|
|
104
104
|
* @llm-rule NOTE: PATTERN: catch (dbError) { throw error.serverError('DB unavailable'); }
|
|
105
105
|
*/
|
|
106
106
|
readonly serverError: (message?: string) => import("./error.js").AppError;
|
|
107
|
+
/**
|
|
108
|
+
* Creates 429 Too Many Requests error
|
|
109
|
+
* @llm-rule WHEN: Client exceeded rate limit
|
|
110
|
+
* @llm-rule NOTE: PATTERN: if (rateExceeded) throw error.tooMany('Slow down');
|
|
111
|
+
*/
|
|
112
|
+
readonly tooMany: (message?: string) => import("./error.js").AppError;
|
|
113
|
+
/**
|
|
114
|
+
* Creates 500 Internal Server Error (alias for serverError)
|
|
115
|
+
* @llm-rule WHEN: Unexpected internal failures
|
|
116
|
+
* @llm-rule NOTE: Identical to serverError() — use either, not both in the same codebase
|
|
117
|
+
*/
|
|
118
|
+
readonly internal: (message?: string) => import("./error.js").AppError;
|
|
107
119
|
/**
|
|
108
120
|
* Creates custom error with any status code
|
|
109
|
-
* @llm-rule WHEN: Need non-standard HTTP status codes
|
|
110
|
-
* @llm-rule NOTE:
|
|
111
|
-
* @llm-rule NOTE: PATTERN: error.createError(429, 'Rate limited', 'RATE_LIMIT');
|
|
121
|
+
* @llm-rule WHEN: Need non-standard HTTP status codes not covered above
|
|
122
|
+
* @llm-rule NOTE: PATTERN: error.createError(503, 'Maintenance mode', 'MAINTENANCE');
|
|
112
123
|
*/
|
|
113
124
|
readonly createError: (statusCode: number, message: string, type?: string) => import("./error.js").AppError;
|
|
114
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/error/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAEnE,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1C,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,mBAAmB,KACtB,IAAI,CAAC;AAEV,MAAM,MAAM,iBAAiB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,mBAAmB,KACtB,OAAO,CAAC,GAAG,CAAC,CAAC;AAElB,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAKD;;;;;;;GAOG;AACH,iBAAS,GAAG,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,UAAU,CAS7D;AAED;;;;;GAKG;AACH,iBAAS,KAAK,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,UAAU,CAK/D;AAED;;;;GAIG;AACH,iBAAS,UAAU,IAAI,IAAI,CAE1B;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU;;;;IASrB;;;;;OAKG;oCACoB,MAAM;IAE7B;;;;;OAKG;sCACsB,MAAM;IAE/B;;;;;OAKG;mCACmB,MAAM;IAE5B;;;;;OAKG;kCACkB,MAAM;IAE3B;;;;;OAKG;kCACkB,MAAM;IAE3B;;;;;OAKG;qCACqB,MAAM;IAE9B
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/error/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAEnE,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,CAAC;IAC1C,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,mBAAmB,KACtB,IAAI,CAAC;AAEV,MAAM,MAAM,iBAAiB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,mBAAmB,KACtB,OAAO,CAAC,GAAG,CAAC,CAAC;AAElB,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAKD;;;;;;;GAOG;AACH,iBAAS,GAAG,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,UAAU,CAS7D;AAED;;;;;GAKG;AACH,iBAAS,KAAK,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,UAAU,CAK/D;AAED;;;;GAIG;AACH,iBAAS,UAAU,IAAI,IAAI,CAE1B;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU;;;;IASrB;;;;;OAKG;oCACoB,MAAM;IAE7B;;;;;OAKG;sCACsB,MAAM;IAE/B;;;;;OAKG;mCACmB,MAAM;IAE5B;;;;;OAKG;kCACkB,MAAM;IAE3B;;;;;OAKG;kCACkB,MAAM;IAE3B;;;;;OAKG;qCACqB,MAAM;IAE9B;;;;OAIG;iCACiB,MAAM;IAE1B;;;;OAIG;kCACkB,MAAM;IAE3B;;;;OAIG;uCACuB,MAAM,WAAW,MAAM,SAAS,MAAM;IAGhE;;;;;;OAMG;sCACsB,mBAAmB;IAE5C;;;;;;OAMG;8BACc,iBAAiB;IAElC;;;;OAIG;kCACkB,QAAQ;IAE7B;;;;OAIG;kCACkB,QAAQ;CACrB,CAAC;AAGX,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/error/index.js
CHANGED
|
@@ -104,11 +104,22 @@ export const errorClass = {
|
|
|
104
104
|
* @llm-rule NOTE: PATTERN: catch (dbError) { throw error.serverError('DB unavailable'); }
|
|
105
105
|
*/
|
|
106
106
|
serverError: (message) => get().serverError(message),
|
|
107
|
+
/**
|
|
108
|
+
* Creates 429 Too Many Requests error
|
|
109
|
+
* @llm-rule WHEN: Client exceeded rate limit
|
|
110
|
+
* @llm-rule NOTE: PATTERN: if (rateExceeded) throw error.tooMany('Slow down');
|
|
111
|
+
*/
|
|
112
|
+
tooMany: (message) => get().tooMany(message),
|
|
113
|
+
/**
|
|
114
|
+
* Creates 500 Internal Server Error (alias for serverError)
|
|
115
|
+
* @llm-rule WHEN: Unexpected internal failures
|
|
116
|
+
* @llm-rule NOTE: Identical to serverError() — use either, not both in the same codebase
|
|
117
|
+
*/
|
|
118
|
+
internal: (message) => get().internal(message),
|
|
107
119
|
/**
|
|
108
120
|
* Creates custom error with any status code
|
|
109
|
-
* @llm-rule WHEN: Need non-standard HTTP status codes
|
|
110
|
-
* @llm-rule NOTE:
|
|
111
|
-
* @llm-rule NOTE: PATTERN: error.createError(429, 'Rate limited', 'RATE_LIMIT');
|
|
121
|
+
* @llm-rule WHEN: Need non-standard HTTP status codes not covered above
|
|
122
|
+
* @llm-rule NOTE: PATTERN: error.createError(503, 'Maintenance mode', 'MAINTENANCE');
|
|
112
123
|
*/
|
|
113
124
|
createError: (statusCode, message, type) => get().createError(statusCode, message, type),
|
|
114
125
|
// Middleware and utility shortcuts
|
package/dist/error/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/error/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAoB,MAAM,eAAe,CAAC;AAsCnE,wCAAwC;AACxC,IAAI,WAAW,GAAsB,IAAI,CAAC;AAE1C;;;;;;;GAOG;AACH,SAAS,GAAG,CAAC,YAAkC,EAAE;IAC/C,+CAA+C;IAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAgB,EAAE,GAAG,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;QAC1D,WAAW,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,SAAS,KAAK,CAAC,YAAkC,EAAE;IACjD,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAgB,EAAE,GAAG,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;IAC1D,WAAW,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU;IACjB,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,cAAc;IACd,GAAG;IAEH,kBAAkB;IAClB,KAAK;IACL,UAAU;IAEV,sDAAsD;IACtD;;;;;OAKG;IACH,UAAU,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;IAE3D;;;;;OAKG;IACH,YAAY,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;IAE/D;;;;;OAKG;IACH,SAAS,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;IAEzD;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;IAEvD;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;IAEvD;;;;;OAKG;IACH,WAAW,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC;IAE7D
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/error/index.ts"],"names":[],"mappings":"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"}
|
package/dist/event/defaults.js
CHANGED
|
@@ -26,28 +26,28 @@ export function getSmartDefaults() {
|
|
|
26
26
|
// Strategy selection with smart detection
|
|
27
27
|
strategy,
|
|
28
28
|
// Namespace with service identification
|
|
29
|
-
namespace: process.env.
|
|
29
|
+
namespace: process.env.BLOOM_EVENT_NAMESPACE || process.env.BLOOM_SERVICE_NAME || 'default',
|
|
30
30
|
// Redis configuration (only used when strategy is 'redis')
|
|
31
31
|
redis: {
|
|
32
32
|
url: process.env.REDIS_URL || 'redis://localhost:6379',
|
|
33
33
|
password: process.env.REDIS_PASSWORD,
|
|
34
|
-
maxRetries: parseInt(process.env.
|
|
35
|
-
retryDelay: parseInt(process.env.
|
|
36
|
-
connectTimeout: parseInt(process.env.
|
|
37
|
-
commandTimeout: parseInt(process.env.
|
|
38
|
-
keyPrefix: process.env.
|
|
34
|
+
maxRetries: parseInt(process.env.BLOOM_EVENT_REDIS_RETRIES || '3'),
|
|
35
|
+
retryDelay: parseInt(process.env.BLOOM_EVENT_REDIS_RETRY_DELAY || '1000'),
|
|
36
|
+
connectTimeout: parseInt(process.env.BLOOM_EVENT_REDIS_CONNECT_TIMEOUT || '10000'),
|
|
37
|
+
commandTimeout: parseInt(process.env.BLOOM_EVENT_REDIS_COMMAND_TIMEOUT || '5000'),
|
|
38
|
+
keyPrefix: process.env.BLOOM_EVENT_REDIS_PREFIX || 'events',
|
|
39
39
|
},
|
|
40
40
|
// Memory configuration (only used when strategy is 'memory')
|
|
41
41
|
memory: {
|
|
42
|
-
maxListeners: parseInt(process.env.
|
|
43
|
-
maxHistory: parseInt(process.env.
|
|
44
|
-
checkInterval: parseInt(process.env.
|
|
45
|
-
enableGC: process.env.
|
|
42
|
+
maxListeners: parseInt(process.env.BLOOM_EVENT_MEMORY_MAX_LISTENERS || '1000'),
|
|
43
|
+
maxHistory: parseInt(process.env.BLOOM_EVENT_MEMORY_HISTORY || '100'),
|
|
44
|
+
checkInterval: parseInt(process.env.BLOOM_EVENT_MEMORY_CHECK_INTERVAL || '30000'), // 30 seconds
|
|
45
|
+
enableGC: process.env.BLOOM_EVENT_MEMORY_GC !== 'false',
|
|
46
46
|
},
|
|
47
47
|
// Event history configuration
|
|
48
48
|
history: {
|
|
49
|
-
enabled: process.env.
|
|
50
|
-
maxSize: parseInt(process.env.
|
|
49
|
+
enabled: process.env.BLOOM_EVENT_HISTORY_ENABLED !== 'false',
|
|
50
|
+
maxSize: parseInt(process.env.BLOOM_EVENT_HISTORY_SIZE || (isProduction ? '50' : '100')),
|
|
51
51
|
},
|
|
52
52
|
// Environment information
|
|
53
53
|
environment: {
|
|
@@ -66,7 +66,7 @@ export function getSmartDefaults() {
|
|
|
66
66
|
*/
|
|
67
67
|
function detectEventStrategy() {
|
|
68
68
|
// Explicit override wins (for testing/debugging)
|
|
69
|
-
const explicit = process.env.
|
|
69
|
+
const explicit = process.env.BLOOM_EVENT_STRATEGY?.toLowerCase();
|
|
70
70
|
if (explicit === 'redis' || explicit === 'memory') {
|
|
71
71
|
return explicit;
|
|
72
72
|
}
|
|
@@ -76,7 +76,7 @@ function detectEventStrategy() {
|
|
|
76
76
|
}
|
|
77
77
|
// Default to memory for development/testing
|
|
78
78
|
if (process.env.NODE_ENV === 'production') {
|
|
79
|
-
console.warn('[
|
|
79
|
+
console.warn('[Bloomneo AppKit] No REDIS_URL found in production. ' +
|
|
80
80
|
'Using memory event strategy which will not work across multiple servers. ' +
|
|
81
81
|
'Set REDIS_URL for distributed events.');
|
|
82
82
|
}
|
|
@@ -90,9 +90,9 @@ function detectEventStrategy() {
|
|
|
90
90
|
*/
|
|
91
91
|
function validateEnvironment() {
|
|
92
92
|
// Validate event strategy if explicitly set
|
|
93
|
-
const strategy = process.env.
|
|
93
|
+
const strategy = process.env.BLOOM_EVENT_STRATEGY;
|
|
94
94
|
if (strategy && !['redis', 'memory'].includes(strategy.toLowerCase())) {
|
|
95
|
-
throw new Error(`Invalid
|
|
95
|
+
throw new Error(`Invalid BLOOM_EVENT_STRATEGY: "${strategy}". Must be "redis" or "memory"`);
|
|
96
96
|
}
|
|
97
97
|
// Validate Redis URL if provided
|
|
98
98
|
const redisUrl = process.env.REDIS_URL;
|
|
@@ -100,23 +100,23 @@ function validateEnvironment() {
|
|
|
100
100
|
throw new Error(`Invalid REDIS_URL: "${redisUrl}". Must start with redis:// or rediss://`);
|
|
101
101
|
}
|
|
102
102
|
// Validate namespace
|
|
103
|
-
const namespace = process.env.
|
|
103
|
+
const namespace = process.env.BLOOM_EVENT_NAMESPACE;
|
|
104
104
|
if (namespace && !/^[a-zA-Z0-9_-]+$/.test(namespace)) {
|
|
105
|
-
throw new Error(`Invalid
|
|
105
|
+
throw new Error(`Invalid BLOOM_EVENT_NAMESPACE: "${namespace}". Must contain only letters, numbers, underscores, and hyphens`);
|
|
106
106
|
}
|
|
107
107
|
// Validate numeric values
|
|
108
|
-
validateNumericEnv('
|
|
109
|
-
validateNumericEnv('
|
|
110
|
-
validateNumericEnv('
|
|
111
|
-
validateNumericEnv('
|
|
112
|
-
validateNumericEnv('
|
|
113
|
-
validateNumericEnv('
|
|
114
|
-
validateNumericEnv('
|
|
115
|
-
validateNumericEnv('
|
|
108
|
+
validateNumericEnv('BLOOM_EVENT_REDIS_RETRIES', 0, 10);
|
|
109
|
+
validateNumericEnv('BLOOM_EVENT_REDIS_RETRY_DELAY', 100, 10000);
|
|
110
|
+
validateNumericEnv('BLOOM_EVENT_REDIS_CONNECT_TIMEOUT', 1000, 60000);
|
|
111
|
+
validateNumericEnv('BLOOM_EVENT_REDIS_COMMAND_TIMEOUT', 1000, 30000);
|
|
112
|
+
validateNumericEnv('BLOOM_EVENT_MEMORY_MAX_LISTENERS', 10, 10000);
|
|
113
|
+
validateNumericEnv('BLOOM_EVENT_MEMORY_HISTORY', 10, 1000);
|
|
114
|
+
validateNumericEnv('BLOOM_EVENT_MEMORY_CHECK_INTERVAL', 5000, 300000); // 5s to 5min
|
|
115
|
+
validateNumericEnv('BLOOM_EVENT_HISTORY_SIZE', 1, 1000);
|
|
116
116
|
// Validate Redis key prefix
|
|
117
|
-
const keyPrefix = process.env.
|
|
117
|
+
const keyPrefix = process.env.BLOOM_EVENT_REDIS_PREFIX;
|
|
118
118
|
if (keyPrefix && !/^[a-zA-Z0-9_-]+$/.test(keyPrefix)) {
|
|
119
|
-
throw new Error(`Invalid
|
|
119
|
+
throw new Error(`Invalid BLOOM_EVENT_REDIS_PREFIX: "${keyPrefix}". Must contain only letters, numbers, underscores, and hyphens`);
|
|
120
120
|
}
|
|
121
121
|
// Production-specific validations
|
|
122
122
|
const nodeEnv = process.env.NODE_ENV;
|
|
@@ -125,7 +125,7 @@ function validateEnvironment() {
|
|
|
125
125
|
}
|
|
126
126
|
// Validate NODE_ENV
|
|
127
127
|
if (nodeEnv && !['development', 'production', 'test', 'staging'].includes(nodeEnv)) {
|
|
128
|
-
console.warn(`[
|
|
128
|
+
console.warn(`[Bloomneo AppKit] Unusual NODE_ENV: "${nodeEnv}". ` +
|
|
129
129
|
`Expected: development, production, test, or staging`);
|
|
130
130
|
}
|
|
131
131
|
}
|
|
@@ -165,15 +165,15 @@ function validateNumericEnv(name, min, max) {
|
|
|
165
165
|
function validateProductionConfig() {
|
|
166
166
|
const strategy = detectEventStrategy();
|
|
167
167
|
if (strategy === 'memory') {
|
|
168
|
-
console.warn('[
|
|
168
|
+
console.warn('[Bloomneo AppKit] Using memory event strategy in production. ' +
|
|
169
169
|
'Events will only work within single server instance. ' +
|
|
170
170
|
'Set REDIS_URL for distributed events across multiple servers.');
|
|
171
171
|
}
|
|
172
172
|
// Validate namespace is set in production
|
|
173
|
-
const namespace = process.env.
|
|
173
|
+
const namespace = process.env.BLOOM_EVENT_NAMESPACE;
|
|
174
174
|
if (!namespace) {
|
|
175
|
-
console.warn('[
|
|
176
|
-
'Set
|
|
175
|
+
console.warn('[Bloomneo AppKit] No event namespace configured in production. ' +
|
|
176
|
+
'Set BLOOM_EVENT_NAMESPACE for proper event isolation.');
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
/**
|
|
@@ -200,7 +200,7 @@ export function validateProductionRequirements() {
|
|
|
200
200
|
const config = getSmartDefaults();
|
|
201
201
|
if (config.environment.isProduction) {
|
|
202
202
|
if (config.strategy === 'memory') {
|
|
203
|
-
console.warn('[
|
|
203
|
+
console.warn('[Bloomneo AppKit] Using memory event strategy in production. ' +
|
|
204
204
|
'Events will not work across multiple server instances. ' +
|
|
205
205
|
'Set REDIS_URL for distributed events.');
|
|
206
206
|
}
|
|
@@ -241,7 +241,7 @@ export function validateStartupConfiguration() {
|
|
|
241
241
|
// Namespace validation
|
|
242
242
|
if (!config.namespace || config.namespace === 'default') {
|
|
243
243
|
if (config.environment.isProduction) {
|
|
244
|
-
warnings.push('Using default namespace in production - consider setting
|
|
244
|
+
warnings.push('Using default namespace in production - consider setting BLOOM_EVENT_NAMESPACE');
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
247
|
// Environment-specific warnings
|
package/dist/event/index.js
CHANGED
|
@@ -170,13 +170,13 @@ function validateConfig() {
|
|
|
170
170
|
try {
|
|
171
171
|
const validation = validateStartupConfiguration();
|
|
172
172
|
if (validation.errors.length > 0) {
|
|
173
|
-
console.error('[
|
|
173
|
+
console.error('[Bloomneo AppKit] Event configuration errors:', validation.errors);
|
|
174
174
|
}
|
|
175
175
|
if (validation.warnings.length > 0) {
|
|
176
|
-
console.warn('[
|
|
176
|
+
console.warn('[Bloomneo AppKit] Event configuration warnings:', validation.warnings);
|
|
177
177
|
}
|
|
178
178
|
if (validation.ready) {
|
|
179
|
-
console.log(`✅ [
|
|
179
|
+
console.log(`✅ [Bloomneo AppKit] Events configured with ${validation.strategy} strategy`);
|
|
180
180
|
}
|
|
181
181
|
return {
|
|
182
182
|
valid: validation.errors.length === 0,
|
|
@@ -188,7 +188,7 @@ function validateConfig() {
|
|
|
188
188
|
}
|
|
189
189
|
catch (error) {
|
|
190
190
|
const errorMessage = error.message;
|
|
191
|
-
console.error('[
|
|
191
|
+
console.error('[Bloomneo AppKit] Event configuration validation failed:', errorMessage);
|
|
192
192
|
return {
|
|
193
193
|
valid: false,
|
|
194
194
|
strategy: 'unknown',
|
|
@@ -208,13 +208,13 @@ function validateProduction() {
|
|
|
208
208
|
try {
|
|
209
209
|
validateProductionRequirements();
|
|
210
210
|
if (process.env.NODE_ENV === 'production' && !hasRedis()) {
|
|
211
|
-
console.warn('[
|
|
211
|
+
console.warn('[Bloomneo AppKit] No Redis configured in production. ' +
|
|
212
212
|
'Set REDIS_URL for distributed events across servers.');
|
|
213
213
|
}
|
|
214
|
-
console.log('✅ [
|
|
214
|
+
console.log('✅ [Bloomneo AppKit] Production event requirements validated');
|
|
215
215
|
}
|
|
216
216
|
catch (error) {
|
|
217
|
-
console.error('[
|
|
217
|
+
console.error('[Bloomneo AppKit] Production event validation failed:', error.message);
|
|
218
218
|
throw error;
|
|
219
219
|
}
|
|
220
220
|
}
|
|
@@ -52,7 +52,7 @@ export interface LoggingConfig {
|
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* Get smart defaults using direct
|
|
55
|
+
* Get smart defaults using direct BLOOM_LOGGER_* environment access
|
|
56
56
|
* @llm-rule WHEN: App startup to get production-ready logging configuration
|
|
57
57
|
* @llm-rule AVOID: Calling repeatedly - validates environment each time, expensive operation
|
|
58
58
|
* @llm-rule NOTE: Called once at startup, cached globally for performance
|
package/dist/logger/defaults.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* @llm-rule NOTE: Now includes visual error configuration for enhanced developer experience
|
|
10
10
|
*/
|
|
11
11
|
/**
|
|
12
|
-
* Get smart defaults using direct
|
|
12
|
+
* Get smart defaults using direct BLOOM_LOGGER_* environment access
|
|
13
13
|
* @llm-rule WHEN: App startup to get production-ready logging configuration
|
|
14
14
|
* @llm-rule AVOID: Calling repeatedly - validates environment each time, expensive operation
|
|
15
15
|
* @llm-rule NOTE: Called once at startup, cached globally for performance
|
|
@@ -34,39 +34,39 @@ export function getSmartDefaults() {
|
|
|
34
34
|
transports,
|
|
35
35
|
// Console config - direct env access
|
|
36
36
|
console: {
|
|
37
|
-
colorize: process.env.
|
|
38
|
-
timestamps: process.env.
|
|
37
|
+
colorize: process.env.BLOOM_LOGGER_CONSOLE_COLOR !== 'false' && !isProduction,
|
|
38
|
+
timestamps: process.env.BLOOM_LOGGER_CONSOLE_TIME !== 'false',
|
|
39
39
|
prettyPrint: isDevelopment && !minimal,
|
|
40
40
|
},
|
|
41
41
|
// File config - direct env access
|
|
42
42
|
file: {
|
|
43
|
-
dir: process.env.
|
|
44
|
-
filename: process.env.
|
|
45
|
-
maxSize: parseInt(process.env.
|
|
46
|
-
retentionDays: parseInt(process.env.
|
|
43
|
+
dir: process.env.BLOOM_LOGGER_DIR || 'logs',
|
|
44
|
+
filename: process.env.BLOOM_LOGGER_FILE_NAME || 'app.log',
|
|
45
|
+
maxSize: parseInt(process.env.BLOOM_LOGGER_FILE_SIZE || (isProduction ? '50000000' : '10000000')),
|
|
46
|
+
retentionDays: parseInt(process.env.BLOOM_LOGGER_FILE_RETENTION || (isProduction ? '30' : '7')),
|
|
47
47
|
},
|
|
48
48
|
// Database config - direct env access
|
|
49
49
|
database: {
|
|
50
50
|
url: process.env.DATABASE_URL || null,
|
|
51
|
-
table: process.env.
|
|
52
|
-
batchSize: parseInt(process.env.
|
|
51
|
+
table: process.env.BLOOM_LOGGER_DB_TABLE || 'logs',
|
|
52
|
+
batchSize: parseInt(process.env.BLOOM_LOGGER_DB_BATCH || (minimal ? '50' : '100')),
|
|
53
53
|
},
|
|
54
54
|
// HTTP config - direct env access
|
|
55
55
|
http: {
|
|
56
|
-
url: process.env.
|
|
57
|
-
batchSize: parseInt(process.env.
|
|
58
|
-
timeout: parseInt(process.env.
|
|
56
|
+
url: process.env.BLOOM_LOGGER_HTTP_URL || null,
|
|
57
|
+
batchSize: parseInt(process.env.BLOOM_LOGGER_HTTP_BATCH || (minimal ? '25' : '50')),
|
|
58
|
+
timeout: parseInt(process.env.BLOOM_LOGGER_HTTP_TIMEOUT || '30000'),
|
|
59
59
|
},
|
|
60
60
|
// Webhook config - direct env access
|
|
61
61
|
webhook: {
|
|
62
|
-
url: process.env.
|
|
63
|
-
level: process.env.
|
|
64
|
-
rateLimit: parseInt(process.env.
|
|
62
|
+
url: process.env.BLOOM_LOGGER_WEBHOOK_URL || null,
|
|
63
|
+
level: process.env.BLOOM_LOGGER_WEBHOOK_LEVEL || 'error',
|
|
64
|
+
rateLimit: parseInt(process.env.BLOOM_LOGGER_WEBHOOK_RATE || (minimal ? '5' : '10')),
|
|
65
65
|
},
|
|
66
66
|
// Service identification - direct env access
|
|
67
67
|
service: {
|
|
68
|
-
name: process.env.
|
|
69
|
-
version: process.env.
|
|
68
|
+
name: process.env.BLOOM_SERVICE_NAME || process.env.npm_package_name || 'app',
|
|
69
|
+
version: process.env.BLOOM_SERVICE_VERSION || process.env.npm_package_version || '1.0.0',
|
|
70
70
|
environment: nodeEnv,
|
|
71
71
|
},
|
|
72
72
|
};
|
|
@@ -78,7 +78,7 @@ export function getSmartDefaults() {
|
|
|
78
78
|
*/
|
|
79
79
|
function getScope() {
|
|
80
80
|
// Manual override wins (like auth module pattern)
|
|
81
|
-
const manual = process.env.
|
|
81
|
+
const manual = process.env.BLOOM_LOGGER_SCOPE?.toLowerCase();
|
|
82
82
|
if (manual === 'minimal' || manual === 'full') {
|
|
83
83
|
return manual;
|
|
84
84
|
}
|
|
@@ -87,7 +87,7 @@ function getScope() {
|
|
|
87
87
|
return 'minimal'; // CI/CD pipelines
|
|
88
88
|
if (process.env.NODE_ENV === 'production')
|
|
89
89
|
return 'minimal'; // Production efficiency
|
|
90
|
-
if (process.env.DEBUG || process.env.
|
|
90
|
+
if (process.env.DEBUG || process.env.BLOOM_DEBUG)
|
|
91
91
|
return 'full'; // Debug sessions
|
|
92
92
|
return 'minimal'; // Safe default for clean logs
|
|
93
93
|
}
|
|
@@ -98,7 +98,7 @@ function getScope() {
|
|
|
98
98
|
*/
|
|
99
99
|
function getLevel(isProduction, isDevelopment) {
|
|
100
100
|
// Manual override wins (like auth module)
|
|
101
|
-
const manual = process.env.
|
|
101
|
+
const manual = process.env.BLOOM_LOGGER_LEVEL?.toLowerCase();
|
|
102
102
|
if (manual && ['debug', 'info', 'warn', 'error'].includes(manual)) {
|
|
103
103
|
return manual;
|
|
104
104
|
}
|
|
@@ -118,15 +118,15 @@ function getLevel(isProduction, isDevelopment) {
|
|
|
118
118
|
function getEnabledTransports(isTest) {
|
|
119
119
|
return {
|
|
120
120
|
// Console: default on (except test)
|
|
121
|
-
console: process.env.
|
|
121
|
+
console: process.env.BLOOM_LOGGER_CONSOLE !== 'false' && !isTest,
|
|
122
122
|
// File: default on (except test)
|
|
123
|
-
file: process.env.
|
|
123
|
+
file: process.env.BLOOM_LOGGER_FILE !== 'false' && !isTest,
|
|
124
124
|
// Database: auto-enable if DATABASE_URL exists
|
|
125
|
-
database: process.env.
|
|
125
|
+
database: process.env.BLOOM_LOGGER_DATABASE === 'true' && !!process.env.DATABASE_URL,
|
|
126
126
|
// HTTP: auto-enable if URL provided
|
|
127
|
-
http: !!process.env.
|
|
127
|
+
http: !!process.env.BLOOM_LOGGER_HTTP_URL,
|
|
128
128
|
// Webhook: auto-enable if URL provided
|
|
129
|
-
webhook: !!process.env.
|
|
129
|
+
webhook: !!process.env.BLOOM_LOGGER_WEBHOOK_URL,
|
|
130
130
|
};
|
|
131
131
|
}
|
|
132
132
|
/**
|
|
@@ -136,42 +136,42 @@ function getEnabledTransports(isTest) {
|
|
|
136
136
|
*/
|
|
137
137
|
export function validateEnvironment() {
|
|
138
138
|
// Validate log level
|
|
139
|
-
const level = process.env.
|
|
139
|
+
const level = process.env.BLOOM_LOGGER_LEVEL;
|
|
140
140
|
if (level && !['debug', 'info', 'warn', 'error'].includes(level)) {
|
|
141
|
-
throw new Error(`Invalid
|
|
141
|
+
throw new Error(`Invalid BLOOM_LOGGER_LEVEL: "${level}". Must be: debug, info, warn, error`);
|
|
142
142
|
}
|
|
143
143
|
// Validate scope
|
|
144
|
-
const scope = process.env.
|
|
144
|
+
const scope = process.env.BLOOM_LOGGER_SCOPE;
|
|
145
145
|
if (scope && !['minimal', 'full'].includes(scope.toLowerCase())) {
|
|
146
|
-
throw new Error(`Invalid
|
|
146
|
+
throw new Error(`Invalid BLOOM_LOGGER_SCOPE: "${scope}". Must be: minimal, full`);
|
|
147
147
|
}
|
|
148
148
|
// Validate visual errors setting
|
|
149
|
-
const visualErrors = process.env.
|
|
149
|
+
const visualErrors = process.env.BLOOM_VISUAL_ERRORS;
|
|
150
150
|
if (visualErrors && !['true', 'false'].includes(visualErrors)) {
|
|
151
|
-
throw new Error(`Invalid
|
|
151
|
+
throw new Error(`Invalid BLOOM_VISUAL_ERRORS: "${visualErrors}". Must be: true, false`);
|
|
152
152
|
}
|
|
153
153
|
// Validate URLs if provided
|
|
154
|
-
const httpUrl = process.env.
|
|
154
|
+
const httpUrl = process.env.BLOOM_LOGGER_HTTP_URL;
|
|
155
155
|
if (httpUrl && !isValidUrl(httpUrl)) {
|
|
156
|
-
throw new Error(`Invalid
|
|
156
|
+
throw new Error(`Invalid BLOOM_LOGGER_HTTP_URL: "${httpUrl}"`);
|
|
157
157
|
}
|
|
158
|
-
const webhookUrl = process.env.
|
|
158
|
+
const webhookUrl = process.env.BLOOM_LOGGER_WEBHOOK_URL;
|
|
159
159
|
if (webhookUrl && !isValidUrl(webhookUrl)) {
|
|
160
|
-
throw new Error(`Invalid
|
|
160
|
+
throw new Error(`Invalid BLOOM_LOGGER_WEBHOOK_URL: "${webhookUrl}"`);
|
|
161
161
|
}
|
|
162
162
|
// Validate database URL if database logging enabled
|
|
163
|
-
const dbEnabled = process.env.
|
|
163
|
+
const dbEnabled = process.env.BLOOM_LOGGER_DATABASE === 'true';
|
|
164
164
|
const dbUrl = process.env.DATABASE_URL;
|
|
165
165
|
if (dbEnabled && !dbUrl) {
|
|
166
|
-
throw new Error('
|
|
166
|
+
throw new Error('BLOOM_LOGGER_DATABASE=true but DATABASE_URL not provided');
|
|
167
167
|
}
|
|
168
168
|
if (dbUrl && !isValidDatabaseUrl(dbUrl)) {
|
|
169
169
|
throw new Error(`Invalid DATABASE_URL: "${dbUrl}"`);
|
|
170
170
|
}
|
|
171
171
|
// Validate numeric values
|
|
172
|
-
validateNumericEnv('
|
|
173
|
-
validateNumericEnv('
|
|
174
|
-
validateNumericEnv('
|
|
172
|
+
validateNumericEnv('BLOOM_LOGGER_FILE_SIZE', 1000000, 100000000); // 1MB to 100MB
|
|
173
|
+
validateNumericEnv('BLOOM_LOGGER_FILE_RETENTION', 1, 365); // 1 to 365 days
|
|
174
|
+
validateNumericEnv('BLOOM_LOGGER_HTTP_TIMEOUT', 1000, 300000); // 1s to 5min
|
|
175
175
|
}
|
|
176
176
|
/**
|
|
177
177
|
* Validate numeric environment variable
|
package/dist/logger/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export interface Logger {
|
|
|
16
16
|
error(message: string, meta?: LogMeta): void;
|
|
17
17
|
warn(message: string, meta?: LogMeta): void;
|
|
18
18
|
debug(message: string, meta?: LogMeta): void;
|
|
19
|
+
fatal(message: string, meta?: LogMeta): void;
|
|
19
20
|
child(bindings: LogMeta): Logger;
|
|
20
21
|
flush(): Promise<void>;
|
|
21
22
|
close(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;GAMG;AACH,iBAAS,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBvC;AAED;;;;GAIG;AACH,iBAAe,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpC;AAED;;;;GAIG;AACH,iBAAS,mBAAmB,IAAI,MAAM,EAAE,CAKvC;AAED;;;;GAIG;AACH,iBAAS,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK3C;AAED;;;;GAIG;AACH,iBAAS,SAAS;;;;;;;;;;;;;;;;SAKjB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;CASd,CAAC;AAGX,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAe,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;GAMG;AACH,iBAAS,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBvC;AAED;;;;GAIG;AACH,iBAAe,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpC;AAED;;;;GAIG;AACH,iBAAS,mBAAmB,IAAI,MAAM,EAAE,CAKvC;AAED;;;;GAIG;AACH,iBAAS,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK3C;AAED;;;;GAIG;AACH,iBAAS,SAAS;;;;;;;;;;;;;;;;SAKjB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;CASd,CAAC;AAGX,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAe,WAAW,CAAC"}
|