@bloomneo/appkit 1.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +902 -0
- package/bin/appkit.js +71 -0
- package/bin/commands/generate.js +1050 -0
- package/bin/templates/backend/README.md.template +39 -0
- package/bin/templates/backend/api.http.template +0 -0
- package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
- package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
- package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
- package/bin/templates/backend/package.json.template +34 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
- package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
- package/bin/templates/backend/src/api/server.ts.template +188 -0
- package/bin/templates/backend/tsconfig.api.json.template +24 -0
- package/bin/templates/backend/tsconfig.json.template +40 -0
- package/bin/templates/feature/feature.http.template +63 -0
- package/bin/templates/feature/feature.route.ts.template +36 -0
- package/bin/templates/feature/feature.service.ts.template +81 -0
- package/bin/templates/feature/feature.types.ts.template +23 -0
- package/bin/templates/feature-db/feature.http.template +63 -0
- package/bin/templates/feature-db/feature.model.ts.template +74 -0
- package/bin/templates/feature-db/feature.route.ts.template +58 -0
- package/bin/templates/feature-db/feature.service.ts.template +231 -0
- package/bin/templates/feature-db/feature.types.ts.template +25 -0
- package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
- package/bin/templates/feature-db/seeding/README.md.template +57 -0
- package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
- package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
- package/bin/templates/feature-user/user.http.template +157 -0
- package/bin/templates/feature-user/user.model.ts.template +244 -0
- package/bin/templates/feature-user/user.route.ts.template +379 -0
- package/bin/templates/feature-user/user.seed.js.template +182 -0
- package/bin/templates/feature-user/user.service.ts.template +426 -0
- package/bin/templates/feature-user/user.types.ts.template +127 -0
- package/dist/auth/auth.d.ts +182 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +477 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/defaults.d.ts +104 -0
- package/dist/auth/defaults.d.ts.map +1 -0
- package/dist/auth/defaults.js +374 -0
- package/dist/auth/defaults.js.map +1 -0
- package/dist/auth/index.d.ts +70 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +94 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/cache.d.ts +118 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +249 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/defaults.d.ts +63 -0
- package/dist/cache/defaults.d.ts.map +1 -0
- package/dist/cache/defaults.js +193 -0
- package/dist/cache/defaults.js.map +1 -0
- package/dist/cache/index.d.ts +101 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +203 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/strategies/memory.d.ts +138 -0
- package/dist/cache/strategies/memory.d.ts.map +1 -0
- package/dist/cache/strategies/memory.js +348 -0
- package/dist/cache/strategies/memory.js.map +1 -0
- package/dist/cache/strategies/redis.d.ts +105 -0
- package/dist/cache/strategies/redis.d.ts.map +1 -0
- package/dist/cache/strategies/redis.js +318 -0
- package/dist/cache/strategies/redis.js.map +1 -0
- package/dist/config/config.d.ts +62 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +107 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +44 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +217 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +105 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +163 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/adapters/mongoose.d.ts +106 -0
- package/dist/database/adapters/mongoose.d.ts.map +1 -0
- package/dist/database/adapters/mongoose.js +480 -0
- package/dist/database/adapters/mongoose.js.map +1 -0
- package/dist/database/adapters/prisma.d.ts +106 -0
- package/dist/database/adapters/prisma.d.ts.map +1 -0
- package/dist/database/adapters/prisma.js +494 -0
- package/dist/database/adapters/prisma.js.map +1 -0
- package/dist/database/defaults.d.ts +87 -0
- package/dist/database/defaults.d.ts.map +1 -0
- package/dist/database/defaults.js +271 -0
- package/dist/database/defaults.js.map +1 -0
- package/dist/database/index.d.ts +137 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +490 -0
- package/dist/database/index.js.map +1 -0
- package/dist/email/defaults.d.ts +100 -0
- package/dist/email/defaults.d.ts.map +1 -0
- package/dist/email/defaults.js +400 -0
- package/dist/email/defaults.js.map +1 -0
- package/dist/email/email.d.ts +139 -0
- package/dist/email/email.d.ts.map +1 -0
- package/dist/email/email.js +316 -0
- package/dist/email/email.js.map +1 -0
- package/dist/email/index.d.ts +176 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +251 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/strategies/console.d.ts +90 -0
- package/dist/email/strategies/console.d.ts.map +1 -0
- package/dist/email/strategies/console.js +268 -0
- package/dist/email/strategies/console.js.map +1 -0
- package/dist/email/strategies/resend.d.ts +84 -0
- package/dist/email/strategies/resend.d.ts.map +1 -0
- package/dist/email/strategies/resend.js +266 -0
- package/dist/email/strategies/resend.js.map +1 -0
- package/dist/email/strategies/smtp.d.ts +77 -0
- package/dist/email/strategies/smtp.d.ts.map +1 -0
- package/dist/email/strategies/smtp.js +286 -0
- package/dist/email/strategies/smtp.js.map +1 -0
- package/dist/error/defaults.d.ts +40 -0
- package/dist/error/defaults.d.ts.map +1 -0
- package/dist/error/defaults.js +75 -0
- package/dist/error/defaults.js.map +1 -0
- package/dist/error/error.d.ts +140 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/error.js +200 -0
- package/dist/error/error.js.map +1 -0
- package/dist/error/index.d.ts +145 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +145 -0
- package/dist/error/index.js.map +1 -0
- package/dist/event/defaults.d.ts +111 -0
- package/dist/event/defaults.d.ts.map +1 -0
- package/dist/event/defaults.js +378 -0
- package/dist/event/defaults.js.map +1 -0
- package/dist/event/event.d.ts +171 -0
- package/dist/event/event.d.ts.map +1 -0
- package/dist/event/event.js +391 -0
- package/dist/event/event.js.map +1 -0
- package/dist/event/index.d.ts +173 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/index.js +302 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/strategies/memory.d.ts +122 -0
- package/dist/event/strategies/memory.d.ts.map +1 -0
- package/dist/event/strategies/memory.js +331 -0
- package/dist/event/strategies/memory.js.map +1 -0
- package/dist/event/strategies/redis.d.ts +115 -0
- package/dist/event/strategies/redis.d.ts.map +1 -0
- package/dist/event/strategies/redis.js +434 -0
- package/dist/event/strategies/redis.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/defaults.d.ts +67 -0
- package/dist/logger/defaults.d.ts.map +1 -0
- package/dist/logger/defaults.js +213 -0
- package/dist/logger/defaults.js.map +1 -0
- package/dist/logger/index.d.ts +84 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +101 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +165 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +843 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/transports/console.d.ts +102 -0
- package/dist/logger/transports/console.d.ts.map +1 -0
- package/dist/logger/transports/console.js +276 -0
- package/dist/logger/transports/console.js.map +1 -0
- package/dist/logger/transports/database.d.ts +153 -0
- package/dist/logger/transports/database.d.ts.map +1 -0
- package/dist/logger/transports/database.js +539 -0
- package/dist/logger/transports/database.js.map +1 -0
- package/dist/logger/transports/file.d.ts +146 -0
- package/dist/logger/transports/file.d.ts.map +1 -0
- package/dist/logger/transports/file.js +464 -0
- package/dist/logger/transports/file.js.map +1 -0
- package/dist/logger/transports/http.d.ts +128 -0
- package/dist/logger/transports/http.d.ts.map +1 -0
- package/dist/logger/transports/http.js +401 -0
- package/dist/logger/transports/http.js.map +1 -0
- package/dist/logger/transports/webhook.d.ts +152 -0
- package/dist/logger/transports/webhook.d.ts.map +1 -0
- package/dist/logger/transports/webhook.js +485 -0
- package/dist/logger/transports/webhook.js.map +1 -0
- package/dist/queue/defaults.d.ts +66 -0
- package/dist/queue/defaults.d.ts.map +1 -0
- package/dist/queue/defaults.js +205 -0
- package/dist/queue/defaults.js.map +1 -0
- package/dist/queue/index.d.ts +124 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +116 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.d.ts +156 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +387 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/transports/database.d.ts +165 -0
- package/dist/queue/transports/database.d.ts.map +1 -0
- package/dist/queue/transports/database.js +595 -0
- package/dist/queue/transports/database.js.map +1 -0
- package/dist/queue/transports/memory.d.ts +143 -0
- package/dist/queue/transports/memory.d.ts.map +1 -0
- package/dist/queue/transports/memory.js +415 -0
- package/dist/queue/transports/memory.js.map +1 -0
- package/dist/queue/transports/redis.d.ts +203 -0
- package/dist/queue/transports/redis.d.ts.map +1 -0
- package/dist/queue/transports/redis.js +744 -0
- package/dist/queue/transports/redis.js.map +1 -0
- package/dist/security/defaults.d.ts +64 -0
- package/dist/security/defaults.d.ts.map +1 -0
- package/dist/security/defaults.js +159 -0
- package/dist/security/defaults.js.map +1 -0
- package/dist/security/index.d.ts +110 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +160 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security.d.ts +138 -0
- package/dist/security/security.d.ts.map +1 -0
- package/dist/security/security.js +419 -0
- package/dist/security/security.js.map +1 -0
- package/dist/storage/defaults.d.ts +79 -0
- package/dist/storage/defaults.d.ts.map +1 -0
- package/dist/storage/defaults.js +358 -0
- package/dist/storage/defaults.js.map +1 -0
- package/dist/storage/index.d.ts +153 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +242 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/storage.d.ts +151 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +439 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/strategies/local.d.ts +117 -0
- package/dist/storage/strategies/local.d.ts.map +1 -0
- package/dist/storage/strategies/local.js +368 -0
- package/dist/storage/strategies/local.js.map +1 -0
- package/dist/storage/strategies/r2.d.ts +130 -0
- package/dist/storage/strategies/r2.d.ts.map +1 -0
- package/dist/storage/strategies/r2.js +470 -0
- package/dist/storage/strategies/r2.js.map +1 -0
- package/dist/storage/strategies/s3.d.ts +121 -0
- package/dist/storage/strategies/s3.d.ts.map +1 -0
- package/dist/storage/strategies/s3.js +461 -0
- package/dist/storage/strategies/s3.js.map +1 -0
- package/dist/util/defaults.d.ts +77 -0
- package/dist/util/defaults.d.ts.map +1 -0
- package/dist/util/defaults.js +193 -0
- package/dist/util/defaults.js.map +1 -0
- package/dist/util/index.d.ts +97 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +165 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/util.d.ts +145 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +481 -0
- package/dist/util/util.js.map +1 -0
- package/package.json +234 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ultra-simple role-level-permission authentication that just works
|
|
3
|
+
* @module @bloomneo/appkit/auth
|
|
4
|
+
* @file src/auth/index.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: Building apps that need authentication with user roles and permissions
|
|
7
|
+
* @llm-rule AVOID: Complex auth setups with multiple libraries - this handles JWT + bcrypt + middleware in one API
|
|
8
|
+
* @llm-rule NOTE: Uses role.level hierarchy (user.basic → admin.system) with automatic inheritance
|
|
9
|
+
* @llm-rule NOTE: Common pattern - auth.requireLoginToken() → auth.requireUserRoles() → handler
|
|
10
|
+
* @llm-rule NOTE: Safe user access - const user = auth.user(req); if (!user) return error;
|
|
11
|
+
*/
|
|
12
|
+
import { AuthenticationClass } from './auth.js';
|
|
13
|
+
import { getSmartDefaults } from './defaults.js';
|
|
14
|
+
// Global authentication instance for performance
|
|
15
|
+
let globalAuthentication = null;
|
|
16
|
+
/**
|
|
17
|
+
* Get authentication instance - the only function you need to learn
|
|
18
|
+
* Environment variables parsed once for performance
|
|
19
|
+
* @llm-rule WHEN: Starting any auth operation - this is your main entry point
|
|
20
|
+
* @llm-rule AVOID: Calling new AuthenticationClass() directly - always use this function
|
|
21
|
+
* @llm-rule NOTE: Typical flow - get() → generateLoginToken() → middleware → user()
|
|
22
|
+
*/
|
|
23
|
+
function get(overrides = {}) {
|
|
24
|
+
// Lazy initialization - parse environment once
|
|
25
|
+
if (!globalAuthentication) {
|
|
26
|
+
const defaults = getSmartDefaults();
|
|
27
|
+
const config = { ...defaults, ...overrides };
|
|
28
|
+
globalAuthentication = new AuthenticationClass(config);
|
|
29
|
+
}
|
|
30
|
+
return globalAuthentication;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Reset global instance (useful for testing or config changes)
|
|
34
|
+
* @llm-rule WHEN: Testing auth logic with different configurations
|
|
35
|
+
* @llm-rule AVOID: Using in production - only for tests and development
|
|
36
|
+
*/
|
|
37
|
+
function reset(newConfig = {}) {
|
|
38
|
+
const defaults = getSmartDefaults();
|
|
39
|
+
const config = { ...defaults, ...newConfig };
|
|
40
|
+
globalAuthentication = new AuthenticationClass(config);
|
|
41
|
+
return globalAuthentication;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get current role hierarchy for inspection
|
|
45
|
+
* @llm-rule WHEN: Need to see available role.levels for debugging or UI
|
|
46
|
+
* @llm-rule AVOID: Using for authorization logic - use hasRole() method instead
|
|
47
|
+
*/
|
|
48
|
+
function getRoles() {
|
|
49
|
+
const auth = get();
|
|
50
|
+
return auth.config.roles;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get current permission configuration for inspection
|
|
54
|
+
* @llm-rule WHEN: Need to see default permissions for debugging or documentation
|
|
55
|
+
* @llm-rule AVOID: Using for permission checks - use can() method instead
|
|
56
|
+
*/
|
|
57
|
+
function getPermissions() {
|
|
58
|
+
const auth = get();
|
|
59
|
+
return auth.config.permissions;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if a role.level exists in current configuration
|
|
63
|
+
* @llm-rule WHEN: Validating user input or config before creating tokens
|
|
64
|
+
* @llm-rule AVOID: Using for runtime authorization - this is for validation only
|
|
65
|
+
*/
|
|
66
|
+
function isValidRole(roleLevel) {
|
|
67
|
+
const auth = get();
|
|
68
|
+
return auth.config.roles[roleLevel] !== undefined;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get all available role.levels in hierarchy order
|
|
72
|
+
* @llm-rule WHEN: Building role selection UI or generating documentation
|
|
73
|
+
* @llm-rule AVOID: Hardcoding role lists - use this to stay in sync with config
|
|
74
|
+
*/
|
|
75
|
+
function getAllRoles() {
|
|
76
|
+
const auth = get();
|
|
77
|
+
const roles = auth.config.roles;
|
|
78
|
+
return Object.keys(roles).sort((a, b) => roles[a].level - roles[b].level);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Single authentication export with minimal functionality
|
|
82
|
+
*/
|
|
83
|
+
export const authClass = {
|
|
84
|
+
// Core method
|
|
85
|
+
get,
|
|
86
|
+
// Utility methods
|
|
87
|
+
reset,
|
|
88
|
+
getRoles,
|
|
89
|
+
getPermissions,
|
|
90
|
+
isValidRole,
|
|
91
|
+
getAllRoles,
|
|
92
|
+
};
|
|
93
|
+
export { AuthenticationClass } from './auth.js';
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAuC,MAAM,eAAe,CAAC;AAEtF,iDAAiD;AACjD,IAAI,oBAAoB,GAA+B,IAAI,CAAC;AAE5D;;;;;;GAMG;AACH,SAAS,GAAG,CAAC,YAAiC,EAAE;IAC9C,+CAA+C;IAC/C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAe,EAAE,GAAG,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;QACzD,oBAAoB,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAS,KAAK,CAAC,YAAiC,EAAE;IAChD,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAe,EAAE,GAAG,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;IACzD,oBAAoB,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ;IACf,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC;IACnB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC;IACnB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,SAAiB;IACpC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC;IACnB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW;IAClB,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAEhC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,cAAc;IACd,GAAG;IAEH,kBAAkB;IAClB,KAAK;IACL,QAAQ;IACR,cAAc;IACd,WAAW;IACX,WAAW;CACH,CAAC;AAoBX,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core cache class with Redis and Memory strategies and simplified API
|
|
3
|
+
* @module @bloomneo/appkit/cache
|
|
4
|
+
* @file src/cache/cache.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: Building apps that need caching with automatic strategy selection
|
|
7
|
+
* @llm-rule AVOID: Using directly - always get instance via cacheClass.get()
|
|
8
|
+
* @llm-rule NOTE: Auto-detects Redis vs Memory from environment, namespace passed to get() function
|
|
9
|
+
*/
|
|
10
|
+
import type { CacheConfig } from './defaults.js';
|
|
11
|
+
export interface CacheStrategy {
|
|
12
|
+
connect(): Promise<void>;
|
|
13
|
+
disconnect(): Promise<void>;
|
|
14
|
+
get(key: string): Promise<any>;
|
|
15
|
+
set(key: string, value: any, ttl?: number): Promise<boolean>;
|
|
16
|
+
delete(key: string): Promise<boolean>;
|
|
17
|
+
clear(): Promise<boolean>;
|
|
18
|
+
has(key: string): Promise<boolean>;
|
|
19
|
+
keys(pattern?: string): Promise<string[]>;
|
|
20
|
+
deleteMany(keys: string[]): Promise<number>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Cache class with automatic strategy selection and ultra-simple API
|
|
24
|
+
*/
|
|
25
|
+
export declare class CacheClass {
|
|
26
|
+
config: CacheConfig;
|
|
27
|
+
namespace: string;
|
|
28
|
+
private strategy;
|
|
29
|
+
private connected;
|
|
30
|
+
constructor(config: CacheConfig, namespace: string);
|
|
31
|
+
/**
|
|
32
|
+
* Creates appropriate strategy based on configuration
|
|
33
|
+
* @llm-rule WHEN: Cache initialization - selects Redis or Memory based on environment
|
|
34
|
+
* @llm-rule AVOID: Manual strategy creation - configuration handles strategy selection
|
|
35
|
+
*/
|
|
36
|
+
private createStrategy;
|
|
37
|
+
/**
|
|
38
|
+
* Connects to cache backend with automatic retry logic
|
|
39
|
+
* @llm-rule WHEN: Cache initialization or reconnection after failure
|
|
40
|
+
* @llm-rule AVOID: Manual connection management - this handles connection state
|
|
41
|
+
*/
|
|
42
|
+
connect(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Disconnects from cache backend gracefully
|
|
45
|
+
* @llm-rule WHEN: App shutdown or cache cleanup
|
|
46
|
+
* @llm-rule AVOID: Abrupt disconnection - graceful shutdown prevents data loss
|
|
47
|
+
*/
|
|
48
|
+
disconnect(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Gets a value from cache with automatic key prefixing
|
|
51
|
+
* @llm-rule WHEN: Retrieving cached data by key
|
|
52
|
+
* @llm-rule AVOID: Manual key management - automatic prefixing handles namespacing
|
|
53
|
+
* @llm-rule NOTE: Returns null if key not found or expired
|
|
54
|
+
*/
|
|
55
|
+
get(key: string): Promise<any>;
|
|
56
|
+
/**
|
|
57
|
+
* Sets a value in cache with TTL and automatic key prefixing
|
|
58
|
+
* @llm-rule WHEN: Storing data in cache with optional expiration
|
|
59
|
+
* @llm-rule AVOID: Storing large objects without TTL - can cause memory issues
|
|
60
|
+
* @llm-rule NOTE: Uses default TTL from config if not specified
|
|
61
|
+
*/
|
|
62
|
+
set(key: string, value: any, ttl?: number): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Deletes a key from cache
|
|
65
|
+
* @llm-rule WHEN: Removing specific cached data or cache invalidation
|
|
66
|
+
* @llm-rule AVOID: Mass deletion without consideration - use clear() for full cache clear
|
|
67
|
+
*/
|
|
68
|
+
delete(key: string): Promise<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* Clears entire namespace in cache
|
|
71
|
+
* @llm-rule WHEN: Cache invalidation or cleanup operations for this namespace
|
|
72
|
+
* @llm-rule AVOID: Using in production without careful consideration - affects all namespace data
|
|
73
|
+
* @llm-rule NOTE: Only clears keys within current namespace, not entire cache
|
|
74
|
+
*/
|
|
75
|
+
clear(): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Gets a value from cache or sets it using a factory function
|
|
78
|
+
* @llm-rule WHEN: Cache-aside pattern - get cached value or compute and cache
|
|
79
|
+
* @llm-rule AVOID: Manual get/set logic - this handles race conditions properly
|
|
80
|
+
* @llm-rule NOTE: Factory function only called on cache miss
|
|
81
|
+
*/
|
|
82
|
+
getOrSet(key: string, factory: () => Promise<any>, ttl?: number): Promise<any>;
|
|
83
|
+
/**
|
|
84
|
+
* Gets current cache strategy name for debugging
|
|
85
|
+
* @llm-rule WHEN: Debugging or health checks to see which strategy is active
|
|
86
|
+
* @llm-rule AVOID: Using for application logic - cache should be transparent
|
|
87
|
+
*/
|
|
88
|
+
getStrategy(): string;
|
|
89
|
+
/**
|
|
90
|
+
* Gets cache configuration summary for debugging
|
|
91
|
+
* @llm-rule WHEN: Health checks or debugging cache configuration
|
|
92
|
+
* @llm-rule AVOID: Exposing sensitive details - this only shows safe info
|
|
93
|
+
*/
|
|
94
|
+
getConfig(): {
|
|
95
|
+
strategy: string;
|
|
96
|
+
keyPrefix: string;
|
|
97
|
+
namespace: string;
|
|
98
|
+
defaultTTL: number;
|
|
99
|
+
connected: boolean;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Ensures cache is connected before operations
|
|
103
|
+
*/
|
|
104
|
+
private ensureConnected;
|
|
105
|
+
/**
|
|
106
|
+
* Builds full cache key with prefix and namespace
|
|
107
|
+
*/
|
|
108
|
+
private buildKey;
|
|
109
|
+
/**
|
|
110
|
+
* Validates cache key format and length
|
|
111
|
+
*/
|
|
112
|
+
private validateKey;
|
|
113
|
+
/**
|
|
114
|
+
* Validates cache value
|
|
115
|
+
*/
|
|
116
|
+
private validateValue;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,qBAAa,UAAU;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM;IAMlD;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAWtB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB9B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC;;;;;OAKG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAapC;;;;;OAKG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAelE;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa3C;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB/B;;;;;OAKG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAkBpF;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACH,SAAS,IAAI;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,OAAO,CAAC;KACpB;IAYD;;OAEG;YACW,eAAe;IAM7B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,WAAW;IAkBnB;;OAEG;IACH,OAAO,CAAC,aAAa;CAYtB"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core cache class with Redis and Memory strategies and simplified API
|
|
3
|
+
* @module @bloomneo/appkit/cache
|
|
4
|
+
* @file src/cache/cache.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: Building apps that need caching with automatic strategy selection
|
|
7
|
+
* @llm-rule AVOID: Using directly - always get instance via cacheClass.get()
|
|
8
|
+
* @llm-rule NOTE: Auto-detects Redis vs Memory from environment, namespace passed to get() function
|
|
9
|
+
*/
|
|
10
|
+
import { RedisStrategy } from './strategies/redis.js';
|
|
11
|
+
import { MemoryStrategy } from './strategies/memory.js';
|
|
12
|
+
/**
|
|
13
|
+
* Cache class with automatic strategy selection and ultra-simple API
|
|
14
|
+
*/
|
|
15
|
+
export class CacheClass {
|
|
16
|
+
config;
|
|
17
|
+
namespace;
|
|
18
|
+
strategy;
|
|
19
|
+
connected = false;
|
|
20
|
+
constructor(config, namespace) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
this.namespace = namespace;
|
|
23
|
+
this.strategy = this.createStrategy();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Creates appropriate strategy based on configuration
|
|
27
|
+
* @llm-rule WHEN: Cache initialization - selects Redis or Memory based on environment
|
|
28
|
+
* @llm-rule AVOID: Manual strategy creation - configuration handles strategy selection
|
|
29
|
+
*/
|
|
30
|
+
createStrategy() {
|
|
31
|
+
switch (this.config.strategy) {
|
|
32
|
+
case 'redis':
|
|
33
|
+
return new RedisStrategy(this.config);
|
|
34
|
+
case 'memory':
|
|
35
|
+
return new MemoryStrategy(this.config);
|
|
36
|
+
default:
|
|
37
|
+
throw new Error(`Unknown cache strategy: ${this.config.strategy}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Connects to cache backend with automatic retry logic
|
|
42
|
+
* @llm-rule WHEN: Cache initialization or reconnection after failure
|
|
43
|
+
* @llm-rule AVOID: Manual connection management - this handles connection state
|
|
44
|
+
*/
|
|
45
|
+
async connect() {
|
|
46
|
+
if (this.connected)
|
|
47
|
+
return;
|
|
48
|
+
try {
|
|
49
|
+
await this.strategy.connect();
|
|
50
|
+
this.connected = true;
|
|
51
|
+
if (this.config.environment.isDevelopment) {
|
|
52
|
+
console.log(`✅ [AppKit] Cache connected using ${this.config.strategy} strategy`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error(`❌ [AppKit] Cache connection failed:`, error.message);
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Disconnects from cache backend gracefully
|
|
62
|
+
* @llm-rule WHEN: App shutdown or cache cleanup
|
|
63
|
+
* @llm-rule AVOID: Abrupt disconnection - graceful shutdown prevents data loss
|
|
64
|
+
*/
|
|
65
|
+
async disconnect() {
|
|
66
|
+
if (!this.connected)
|
|
67
|
+
return;
|
|
68
|
+
try {
|
|
69
|
+
await this.strategy.disconnect();
|
|
70
|
+
this.connected = false;
|
|
71
|
+
if (this.config.environment.isDevelopment) {
|
|
72
|
+
console.log(`👋 [AppKit] Cache disconnected`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error(`⚠️ [AppKit] Cache disconnect error:`, error.message);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Gets a value from cache with automatic key prefixing
|
|
81
|
+
* @llm-rule WHEN: Retrieving cached data by key
|
|
82
|
+
* @llm-rule AVOID: Manual key management - automatic prefixing handles namespacing
|
|
83
|
+
* @llm-rule NOTE: Returns null if key not found or expired
|
|
84
|
+
*/
|
|
85
|
+
async get(key) {
|
|
86
|
+
this.validateKey(key);
|
|
87
|
+
await this.ensureConnected();
|
|
88
|
+
try {
|
|
89
|
+
const prefixedKey = this.buildKey(key);
|
|
90
|
+
return await this.strategy.get(prefixedKey);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error(`[AppKit] Cache get error for key "${key}":`, error.message);
|
|
94
|
+
return null; // Graceful degradation
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Sets a value in cache with TTL and automatic key prefixing
|
|
99
|
+
* @llm-rule WHEN: Storing data in cache with optional expiration
|
|
100
|
+
* @llm-rule AVOID: Storing large objects without TTL - can cause memory issues
|
|
101
|
+
* @llm-rule NOTE: Uses default TTL from config if not specified
|
|
102
|
+
*/
|
|
103
|
+
async set(key, value, ttl) {
|
|
104
|
+
this.validateKey(key);
|
|
105
|
+
this.validateValue(value);
|
|
106
|
+
await this.ensureConnected();
|
|
107
|
+
try {
|
|
108
|
+
const prefixedKey = this.buildKey(key);
|
|
109
|
+
const cacheTTL = ttl ?? this.config.defaultTTL;
|
|
110
|
+
return await this.strategy.set(prefixedKey, value, cacheTTL);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error(`[AppKit] Cache set error for key "${key}":`, error.message);
|
|
114
|
+
return false; // Graceful degradation
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Deletes a key from cache
|
|
119
|
+
* @llm-rule WHEN: Removing specific cached data or cache invalidation
|
|
120
|
+
* @llm-rule AVOID: Mass deletion without consideration - use clear() for full cache clear
|
|
121
|
+
*/
|
|
122
|
+
async delete(key) {
|
|
123
|
+
this.validateKey(key);
|
|
124
|
+
await this.ensureConnected();
|
|
125
|
+
try {
|
|
126
|
+
const prefixedKey = this.buildKey(key);
|
|
127
|
+
return await this.strategy.delete(prefixedKey);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error(`[AppKit] Cache delete error for key "${key}":`, error.message);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Clears entire namespace in cache
|
|
136
|
+
* @llm-rule WHEN: Cache invalidation or cleanup operations for this namespace
|
|
137
|
+
* @llm-rule AVOID: Using in production without careful consideration - affects all namespace data
|
|
138
|
+
* @llm-rule NOTE: Only clears keys within current namespace, not entire cache
|
|
139
|
+
*/
|
|
140
|
+
async clear() {
|
|
141
|
+
await this.ensureConnected();
|
|
142
|
+
try {
|
|
143
|
+
// Get all keys in this namespace and delete them
|
|
144
|
+
const pattern = this.buildKey('*');
|
|
145
|
+
const keys = await this.strategy.keys(pattern);
|
|
146
|
+
if (keys.length === 0)
|
|
147
|
+
return true;
|
|
148
|
+
const deleted = await this.strategy.deleteMany(keys);
|
|
149
|
+
return deleted === keys.length;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
console.error(`[AppKit] Cache clear error:`, error.message);
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Gets a value from cache or sets it using a factory function
|
|
158
|
+
* @llm-rule WHEN: Cache-aside pattern - get cached value or compute and cache
|
|
159
|
+
* @llm-rule AVOID: Manual get/set logic - this handles race conditions properly
|
|
160
|
+
* @llm-rule NOTE: Factory function only called on cache miss
|
|
161
|
+
*/
|
|
162
|
+
async getOrSet(key, factory, ttl) {
|
|
163
|
+
// Try to get existing value first
|
|
164
|
+
const existing = await this.get(key);
|
|
165
|
+
if (existing !== null) {
|
|
166
|
+
return existing;
|
|
167
|
+
}
|
|
168
|
+
// Generate new value and cache it
|
|
169
|
+
try {
|
|
170
|
+
const value = await factory();
|
|
171
|
+
await this.set(key, value, ttl);
|
|
172
|
+
return value;
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error(`[AppKit] Cache getOrSet factory error for key "${key}":`, error.message);
|
|
176
|
+
throw error; // Re-throw factory errors
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Gets current cache strategy name for debugging
|
|
181
|
+
* @llm-rule WHEN: Debugging or health checks to see which strategy is active
|
|
182
|
+
* @llm-rule AVOID: Using for application logic - cache should be transparent
|
|
183
|
+
*/
|
|
184
|
+
getStrategy() {
|
|
185
|
+
return this.config.strategy;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Gets cache configuration summary for debugging
|
|
189
|
+
* @llm-rule WHEN: Health checks or debugging cache configuration
|
|
190
|
+
* @llm-rule AVOID: Exposing sensitive details - this only shows safe info
|
|
191
|
+
*/
|
|
192
|
+
getConfig() {
|
|
193
|
+
return {
|
|
194
|
+
strategy: this.config.strategy,
|
|
195
|
+
keyPrefix: this.config.keyPrefix,
|
|
196
|
+
namespace: this.namespace,
|
|
197
|
+
defaultTTL: this.config.defaultTTL,
|
|
198
|
+
connected: this.connected,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
// Private helper methods
|
|
202
|
+
/**
|
|
203
|
+
* Ensures cache is connected before operations
|
|
204
|
+
*/
|
|
205
|
+
async ensureConnected() {
|
|
206
|
+
if (!this.connected) {
|
|
207
|
+
await this.connect();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Builds full cache key with prefix and namespace
|
|
212
|
+
*/
|
|
213
|
+
buildKey(key) {
|
|
214
|
+
return `${this.config.keyPrefix}:${this.namespace}:${key}`;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Validates cache key format and length
|
|
218
|
+
*/
|
|
219
|
+
validateKey(key) {
|
|
220
|
+
if (!key || typeof key !== 'string') {
|
|
221
|
+
throw new Error('Cache key must be a non-empty string');
|
|
222
|
+
}
|
|
223
|
+
if (key.length > 250) {
|
|
224
|
+
throw new Error('Cache key too long (max 250 characters)');
|
|
225
|
+
}
|
|
226
|
+
if (key.includes('\n') || key.includes('\r')) {
|
|
227
|
+
throw new Error('Cache key cannot contain newline characters');
|
|
228
|
+
}
|
|
229
|
+
if (key.includes(':')) {
|
|
230
|
+
throw new Error('Cache key cannot contain colon characters (reserved for namespacing)');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Validates cache value
|
|
235
|
+
*/
|
|
236
|
+
validateValue(value) {
|
|
237
|
+
if (value === undefined) {
|
|
238
|
+
throw new Error('Cannot cache undefined values');
|
|
239
|
+
}
|
|
240
|
+
// Check if value can be serialized
|
|
241
|
+
try {
|
|
242
|
+
JSON.stringify(value);
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
throw new Error('Value must be JSON serializable');
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart defaults and environment validation for caching
|
|
3
|
+
* @module @bloomneo/appkit/cache
|
|
4
|
+
* @file src/cache/defaults.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: App startup - need to configure cache behavior and connection strategy
|
|
7
|
+
* @llm-rule AVOID: Calling multiple times - expensive environment parsing, use lazy loading in get()
|
|
8
|
+
* @llm-rule NOTE: Called once at startup, cached globally for performance
|
|
9
|
+
*/
|
|
10
|
+
export interface RedisConfig {
|
|
11
|
+
url: string;
|
|
12
|
+
password?: string;
|
|
13
|
+
maxRetries: number;
|
|
14
|
+
retryDelay: number;
|
|
15
|
+
connectTimeout: number;
|
|
16
|
+
commandTimeout: number;
|
|
17
|
+
}
|
|
18
|
+
export interface MemoryConfig {
|
|
19
|
+
maxItems: number;
|
|
20
|
+
maxSizeBytes: number;
|
|
21
|
+
checkInterval: number;
|
|
22
|
+
}
|
|
23
|
+
export interface CacheConfig {
|
|
24
|
+
strategy: 'redis' | 'memory';
|
|
25
|
+
keyPrefix: string;
|
|
26
|
+
defaultTTL: number;
|
|
27
|
+
namespace: string;
|
|
28
|
+
redis?: RedisConfig;
|
|
29
|
+
memory?: MemoryConfig;
|
|
30
|
+
environment: {
|
|
31
|
+
isDevelopment: boolean;
|
|
32
|
+
isProduction: boolean;
|
|
33
|
+
isTest: boolean;
|
|
34
|
+
nodeEnv: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Gets smart defaults using environment variables with auto-strategy detection
|
|
39
|
+
* @llm-rule WHEN: App startup to get production-ready cache configuration
|
|
40
|
+
* @llm-rule AVOID: Calling repeatedly - expensive validation, cache the result
|
|
41
|
+
* @llm-rule NOTE: Auto-detects Redis vs Memory based on REDIS_URL environment variable
|
|
42
|
+
*/
|
|
43
|
+
export declare function getSmartDefaults(): CacheConfig;
|
|
44
|
+
/**
|
|
45
|
+
* Gets cache configuration summary for debugging and health checks
|
|
46
|
+
* @llm-rule WHEN: Debugging cache configuration or building health check endpoints
|
|
47
|
+
* @llm-rule AVOID: Exposing sensitive connection details - this only shows safe info
|
|
48
|
+
*/
|
|
49
|
+
export declare function getConfigSummary(): {
|
|
50
|
+
strategy: string;
|
|
51
|
+
keyPrefix: string;
|
|
52
|
+
namespace: string;
|
|
53
|
+
defaultTTL: number;
|
|
54
|
+
redisConnected: boolean;
|
|
55
|
+
environment: string;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Validates that required cache configuration is present for production
|
|
59
|
+
* @llm-rule WHEN: App startup validation for production deployments
|
|
60
|
+
* @llm-rule AVOID: Skipping validation - missing cache config causes runtime issues
|
|
61
|
+
*/
|
|
62
|
+
export declare function validateProductionRequirements(): void;
|
|
63
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/cache/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE;QACX,aAAa,EAAE,OAAO,CAAC;QACvB,YAAY,EAAE,OAAO,CAAC;QACtB,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CA+C9C;AAkID;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAWA;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAmBrD"}
|