@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.
Files changed (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +902 -0
  3. package/bin/appkit.js +71 -0
  4. package/bin/commands/generate.js +1050 -0
  5. package/bin/templates/backend/README.md.template +39 -0
  6. package/bin/templates/backend/api.http.template +0 -0
  7. package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
  8. package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
  9. package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
  10. package/bin/templates/backend/package.json.template +34 -0
  11. package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
  12. package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
  13. package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
  14. package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
  15. package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
  16. package/bin/templates/backend/src/api/server.ts.template +188 -0
  17. package/bin/templates/backend/tsconfig.api.json.template +24 -0
  18. package/bin/templates/backend/tsconfig.json.template +40 -0
  19. package/bin/templates/feature/feature.http.template +63 -0
  20. package/bin/templates/feature/feature.route.ts.template +36 -0
  21. package/bin/templates/feature/feature.service.ts.template +81 -0
  22. package/bin/templates/feature/feature.types.ts.template +23 -0
  23. package/bin/templates/feature-db/feature.http.template +63 -0
  24. package/bin/templates/feature-db/feature.model.ts.template +74 -0
  25. package/bin/templates/feature-db/feature.route.ts.template +58 -0
  26. package/bin/templates/feature-db/feature.service.ts.template +231 -0
  27. package/bin/templates/feature-db/feature.types.ts.template +25 -0
  28. package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
  29. package/bin/templates/feature-db/seeding/README.md.template +57 -0
  30. package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
  31. package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
  32. package/bin/templates/feature-user/user.http.template +157 -0
  33. package/bin/templates/feature-user/user.model.ts.template +244 -0
  34. package/bin/templates/feature-user/user.route.ts.template +379 -0
  35. package/bin/templates/feature-user/user.seed.js.template +182 -0
  36. package/bin/templates/feature-user/user.service.ts.template +426 -0
  37. package/bin/templates/feature-user/user.types.ts.template +127 -0
  38. package/dist/auth/auth.d.ts +182 -0
  39. package/dist/auth/auth.d.ts.map +1 -0
  40. package/dist/auth/auth.js +477 -0
  41. package/dist/auth/auth.js.map +1 -0
  42. package/dist/auth/defaults.d.ts +104 -0
  43. package/dist/auth/defaults.d.ts.map +1 -0
  44. package/dist/auth/defaults.js +374 -0
  45. package/dist/auth/defaults.js.map +1 -0
  46. package/dist/auth/index.d.ts +70 -0
  47. package/dist/auth/index.d.ts.map +1 -0
  48. package/dist/auth/index.js +94 -0
  49. package/dist/auth/index.js.map +1 -0
  50. package/dist/cache/cache.d.ts +118 -0
  51. package/dist/cache/cache.d.ts.map +1 -0
  52. package/dist/cache/cache.js +249 -0
  53. package/dist/cache/cache.js.map +1 -0
  54. package/dist/cache/defaults.d.ts +63 -0
  55. package/dist/cache/defaults.d.ts.map +1 -0
  56. package/dist/cache/defaults.js +193 -0
  57. package/dist/cache/defaults.js.map +1 -0
  58. package/dist/cache/index.d.ts +101 -0
  59. package/dist/cache/index.d.ts.map +1 -0
  60. package/dist/cache/index.js +203 -0
  61. package/dist/cache/index.js.map +1 -0
  62. package/dist/cache/strategies/memory.d.ts +138 -0
  63. package/dist/cache/strategies/memory.d.ts.map +1 -0
  64. package/dist/cache/strategies/memory.js +348 -0
  65. package/dist/cache/strategies/memory.js.map +1 -0
  66. package/dist/cache/strategies/redis.d.ts +105 -0
  67. package/dist/cache/strategies/redis.d.ts.map +1 -0
  68. package/dist/cache/strategies/redis.js +318 -0
  69. package/dist/cache/strategies/redis.js.map +1 -0
  70. package/dist/config/config.d.ts +62 -0
  71. package/dist/config/config.d.ts.map +1 -0
  72. package/dist/config/config.js +107 -0
  73. package/dist/config/config.js.map +1 -0
  74. package/dist/config/defaults.d.ts +44 -0
  75. package/dist/config/defaults.d.ts.map +1 -0
  76. package/dist/config/defaults.js +217 -0
  77. package/dist/config/defaults.js.map +1 -0
  78. package/dist/config/index.d.ts +105 -0
  79. package/dist/config/index.d.ts.map +1 -0
  80. package/dist/config/index.js +163 -0
  81. package/dist/config/index.js.map +1 -0
  82. package/dist/database/adapters/mongoose.d.ts +106 -0
  83. package/dist/database/adapters/mongoose.d.ts.map +1 -0
  84. package/dist/database/adapters/mongoose.js +480 -0
  85. package/dist/database/adapters/mongoose.js.map +1 -0
  86. package/dist/database/adapters/prisma.d.ts +106 -0
  87. package/dist/database/adapters/prisma.d.ts.map +1 -0
  88. package/dist/database/adapters/prisma.js +494 -0
  89. package/dist/database/adapters/prisma.js.map +1 -0
  90. package/dist/database/defaults.d.ts +87 -0
  91. package/dist/database/defaults.d.ts.map +1 -0
  92. package/dist/database/defaults.js +271 -0
  93. package/dist/database/defaults.js.map +1 -0
  94. package/dist/database/index.d.ts +137 -0
  95. package/dist/database/index.d.ts.map +1 -0
  96. package/dist/database/index.js +490 -0
  97. package/dist/database/index.js.map +1 -0
  98. package/dist/email/defaults.d.ts +100 -0
  99. package/dist/email/defaults.d.ts.map +1 -0
  100. package/dist/email/defaults.js +400 -0
  101. package/dist/email/defaults.js.map +1 -0
  102. package/dist/email/email.d.ts +139 -0
  103. package/dist/email/email.d.ts.map +1 -0
  104. package/dist/email/email.js +316 -0
  105. package/dist/email/email.js.map +1 -0
  106. package/dist/email/index.d.ts +176 -0
  107. package/dist/email/index.d.ts.map +1 -0
  108. package/dist/email/index.js +251 -0
  109. package/dist/email/index.js.map +1 -0
  110. package/dist/email/strategies/console.d.ts +90 -0
  111. package/dist/email/strategies/console.d.ts.map +1 -0
  112. package/dist/email/strategies/console.js +268 -0
  113. package/dist/email/strategies/console.js.map +1 -0
  114. package/dist/email/strategies/resend.d.ts +84 -0
  115. package/dist/email/strategies/resend.d.ts.map +1 -0
  116. package/dist/email/strategies/resend.js +266 -0
  117. package/dist/email/strategies/resend.js.map +1 -0
  118. package/dist/email/strategies/smtp.d.ts +77 -0
  119. package/dist/email/strategies/smtp.d.ts.map +1 -0
  120. package/dist/email/strategies/smtp.js +286 -0
  121. package/dist/email/strategies/smtp.js.map +1 -0
  122. package/dist/error/defaults.d.ts +40 -0
  123. package/dist/error/defaults.d.ts.map +1 -0
  124. package/dist/error/defaults.js +75 -0
  125. package/dist/error/defaults.js.map +1 -0
  126. package/dist/error/error.d.ts +140 -0
  127. package/dist/error/error.d.ts.map +1 -0
  128. package/dist/error/error.js +200 -0
  129. package/dist/error/error.js.map +1 -0
  130. package/dist/error/index.d.ts +145 -0
  131. package/dist/error/index.d.ts.map +1 -0
  132. package/dist/error/index.js +145 -0
  133. package/dist/error/index.js.map +1 -0
  134. package/dist/event/defaults.d.ts +111 -0
  135. package/dist/event/defaults.d.ts.map +1 -0
  136. package/dist/event/defaults.js +378 -0
  137. package/dist/event/defaults.js.map +1 -0
  138. package/dist/event/event.d.ts +171 -0
  139. package/dist/event/event.d.ts.map +1 -0
  140. package/dist/event/event.js +391 -0
  141. package/dist/event/event.js.map +1 -0
  142. package/dist/event/index.d.ts +173 -0
  143. package/dist/event/index.d.ts.map +1 -0
  144. package/dist/event/index.js +302 -0
  145. package/dist/event/index.js.map +1 -0
  146. package/dist/event/strategies/memory.d.ts +122 -0
  147. package/dist/event/strategies/memory.d.ts.map +1 -0
  148. package/dist/event/strategies/memory.js +331 -0
  149. package/dist/event/strategies/memory.js.map +1 -0
  150. package/dist/event/strategies/redis.d.ts +115 -0
  151. package/dist/event/strategies/redis.d.ts.map +1 -0
  152. package/dist/event/strategies/redis.js +434 -0
  153. package/dist/event/strategies/redis.js.map +1 -0
  154. package/dist/index.d.ts +58 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +72 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/logger/defaults.d.ts +67 -0
  159. package/dist/logger/defaults.d.ts.map +1 -0
  160. package/dist/logger/defaults.js +213 -0
  161. package/dist/logger/defaults.js.map +1 -0
  162. package/dist/logger/index.d.ts +84 -0
  163. package/dist/logger/index.d.ts.map +1 -0
  164. package/dist/logger/index.js +101 -0
  165. package/dist/logger/index.js.map +1 -0
  166. package/dist/logger/logger.d.ts +165 -0
  167. package/dist/logger/logger.d.ts.map +1 -0
  168. package/dist/logger/logger.js +843 -0
  169. package/dist/logger/logger.js.map +1 -0
  170. package/dist/logger/transports/console.d.ts +102 -0
  171. package/dist/logger/transports/console.d.ts.map +1 -0
  172. package/dist/logger/transports/console.js +276 -0
  173. package/dist/logger/transports/console.js.map +1 -0
  174. package/dist/logger/transports/database.d.ts +153 -0
  175. package/dist/logger/transports/database.d.ts.map +1 -0
  176. package/dist/logger/transports/database.js +539 -0
  177. package/dist/logger/transports/database.js.map +1 -0
  178. package/dist/logger/transports/file.d.ts +146 -0
  179. package/dist/logger/transports/file.d.ts.map +1 -0
  180. package/dist/logger/transports/file.js +464 -0
  181. package/dist/logger/transports/file.js.map +1 -0
  182. package/dist/logger/transports/http.d.ts +128 -0
  183. package/dist/logger/transports/http.d.ts.map +1 -0
  184. package/dist/logger/transports/http.js +401 -0
  185. package/dist/logger/transports/http.js.map +1 -0
  186. package/dist/logger/transports/webhook.d.ts +152 -0
  187. package/dist/logger/transports/webhook.d.ts.map +1 -0
  188. package/dist/logger/transports/webhook.js +485 -0
  189. package/dist/logger/transports/webhook.js.map +1 -0
  190. package/dist/queue/defaults.d.ts +66 -0
  191. package/dist/queue/defaults.d.ts.map +1 -0
  192. package/dist/queue/defaults.js +205 -0
  193. package/dist/queue/defaults.js.map +1 -0
  194. package/dist/queue/index.d.ts +124 -0
  195. package/dist/queue/index.d.ts.map +1 -0
  196. package/dist/queue/index.js +116 -0
  197. package/dist/queue/index.js.map +1 -0
  198. package/dist/queue/queue.d.ts +156 -0
  199. package/dist/queue/queue.d.ts.map +1 -0
  200. package/dist/queue/queue.js +387 -0
  201. package/dist/queue/queue.js.map +1 -0
  202. package/dist/queue/transports/database.d.ts +165 -0
  203. package/dist/queue/transports/database.d.ts.map +1 -0
  204. package/dist/queue/transports/database.js +595 -0
  205. package/dist/queue/transports/database.js.map +1 -0
  206. package/dist/queue/transports/memory.d.ts +143 -0
  207. package/dist/queue/transports/memory.d.ts.map +1 -0
  208. package/dist/queue/transports/memory.js +415 -0
  209. package/dist/queue/transports/memory.js.map +1 -0
  210. package/dist/queue/transports/redis.d.ts +203 -0
  211. package/dist/queue/transports/redis.d.ts.map +1 -0
  212. package/dist/queue/transports/redis.js +744 -0
  213. package/dist/queue/transports/redis.js.map +1 -0
  214. package/dist/security/defaults.d.ts +64 -0
  215. package/dist/security/defaults.d.ts.map +1 -0
  216. package/dist/security/defaults.js +159 -0
  217. package/dist/security/defaults.js.map +1 -0
  218. package/dist/security/index.d.ts +110 -0
  219. package/dist/security/index.d.ts.map +1 -0
  220. package/dist/security/index.js +160 -0
  221. package/dist/security/index.js.map +1 -0
  222. package/dist/security/security.d.ts +138 -0
  223. package/dist/security/security.d.ts.map +1 -0
  224. package/dist/security/security.js +419 -0
  225. package/dist/security/security.js.map +1 -0
  226. package/dist/storage/defaults.d.ts +79 -0
  227. package/dist/storage/defaults.d.ts.map +1 -0
  228. package/dist/storage/defaults.js +358 -0
  229. package/dist/storage/defaults.js.map +1 -0
  230. package/dist/storage/index.d.ts +153 -0
  231. package/dist/storage/index.d.ts.map +1 -0
  232. package/dist/storage/index.js +242 -0
  233. package/dist/storage/index.js.map +1 -0
  234. package/dist/storage/storage.d.ts +151 -0
  235. package/dist/storage/storage.d.ts.map +1 -0
  236. package/dist/storage/storage.js +439 -0
  237. package/dist/storage/storage.js.map +1 -0
  238. package/dist/storage/strategies/local.d.ts +117 -0
  239. package/dist/storage/strategies/local.d.ts.map +1 -0
  240. package/dist/storage/strategies/local.js +368 -0
  241. package/dist/storage/strategies/local.js.map +1 -0
  242. package/dist/storage/strategies/r2.d.ts +130 -0
  243. package/dist/storage/strategies/r2.d.ts.map +1 -0
  244. package/dist/storage/strategies/r2.js +470 -0
  245. package/dist/storage/strategies/r2.js.map +1 -0
  246. package/dist/storage/strategies/s3.d.ts +121 -0
  247. package/dist/storage/strategies/s3.d.ts.map +1 -0
  248. package/dist/storage/strategies/s3.js +461 -0
  249. package/dist/storage/strategies/s3.js.map +1 -0
  250. package/dist/util/defaults.d.ts +77 -0
  251. package/dist/util/defaults.d.ts.map +1 -0
  252. package/dist/util/defaults.js +193 -0
  253. package/dist/util/defaults.js.map +1 -0
  254. package/dist/util/index.d.ts +97 -0
  255. package/dist/util/index.d.ts.map +1 -0
  256. package/dist/util/index.js +165 -0
  257. package/dist/util/index.js.map +1 -0
  258. package/dist/util/util.d.ts +145 -0
  259. package/dist/util/util.d.ts.map +1 -0
  260. package/dist/util/util.js +481 -0
  261. package/dist/util/util.js.map +1 -0
  262. 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"}