@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,193 @@
1
+ /**
2
+ * Smart defaults and environment validation for utilities
3
+ * @module @bloomneo/appkit/util
4
+ * @file src/util/defaults.ts
5
+ *
6
+ * @llm-rule WHEN: App startup - need to configure utility behavior and performance settings
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 like other modules
9
+ */
10
+ /**
11
+ * Gets smart defaults using VOILA_UTIL_* environment variables
12
+ * @llm-rule WHEN: App startup to get production-ready utility configuration
13
+ * @llm-rule AVOID: Calling repeatedly - expensive validation, cache the result
14
+ * @llm-rule NOTE: Called once at startup, cached globally for performance
15
+ */
16
+ export function getSmartDefaults() {
17
+ validateEnvironment();
18
+ const nodeEnv = process.env.NODE_ENV || 'development';
19
+ const isDevelopment = nodeEnv === 'development';
20
+ const isProduction = nodeEnv === 'production';
21
+ const isTest = nodeEnv === 'test';
22
+ return {
23
+ version: process.env.npm_package_version || '1.0.0',
24
+ // Cache configuration with direct environment access
25
+ cache: {
26
+ enabled: process.env.VOILA_UTIL_CACHE !== 'false' && !isTest,
27
+ maxSize: parseInt(process.env.VOILA_UTIL_CACHE_SIZE || '1000'),
28
+ ttl: parseInt(process.env.VOILA_UTIL_CACHE_TTL || '300000'), // 5 minutes
29
+ },
30
+ // Performance optimization settings
31
+ performance: {
32
+ enabled: process.env.VOILA_UTIL_PERFORMANCE !== 'false',
33
+ memoization: process.env.VOILA_UTIL_MEMOIZATION !== 'false' && !isTest,
34
+ largeArrayThreshold: parseInt(process.env.VOILA_UTIL_ARRAY_THRESHOLD || '10000'),
35
+ chunkSizeLimit: parseInt(process.env.VOILA_UTIL_CHUNK_LIMIT || '100000'),
36
+ },
37
+ // Debug configuration - enabled in development
38
+ debug: {
39
+ enabled: process.env.VOILA_UTIL_DEBUG === 'true' || isDevelopment,
40
+ logOperations: process.env.VOILA_UTIL_LOG_OPS === 'true' || isDevelopment,
41
+ trackPerformance: process.env.VOILA_UTIL_TRACK_PERF === 'true' || isDevelopment,
42
+ },
43
+ // Slugify configuration with locale support
44
+ slugify: {
45
+ lowercase: process.env.VOILA_UTIL_SLUGIFY_LOWERCASE !== 'false',
46
+ strict: process.env.VOILA_UTIL_SLUGIFY_STRICT === 'true',
47
+ locale: process.env.VOILA_UTIL_LOCALE || 'en',
48
+ replacement: process.env.VOILA_UTIL_SLUGIFY_REPLACEMENT || '-',
49
+ },
50
+ // Format configuration for locale-aware formatting
51
+ format: {
52
+ locale: process.env.VOILA_UTIL_LOCALE || 'en-US',
53
+ currency: process.env.VOILA_UTIL_CURRENCY || 'USD',
54
+ dateFormat: process.env.VOILA_UTIL_DATE_FORMAT || 'YYYY-MM-DD',
55
+ numberPrecision: parseInt(process.env.VOILA_UTIL_NUMBER_PRECISION || '2'),
56
+ },
57
+ // Environment information
58
+ environment: {
59
+ isDevelopment,
60
+ isProduction,
61
+ isTest,
62
+ nodeEnv,
63
+ },
64
+ };
65
+ }
66
+ /**
67
+ * Validates environment variables for utility configuration
68
+ * @llm-rule WHEN: App startup to ensure proper utility environment configuration
69
+ * @llm-rule AVOID: Skipping validation - improper config causes performance issues
70
+ * @llm-rule NOTE: Validates cache sizes, performance thresholds, and locale settings
71
+ */
72
+ function validateEnvironment() {
73
+ const nodeEnv = process.env.NODE_ENV || 'development';
74
+ // Validate cache configuration
75
+ const cacheSize = process.env.VOILA_UTIL_CACHE_SIZE;
76
+ if (cacheSize) {
77
+ const cacheSizeNum = parseInt(cacheSize);
78
+ if (isNaN(cacheSizeNum) || cacheSizeNum <= 0) {
79
+ throw new Error(`Invalid VOILA_UTIL_CACHE_SIZE: "${cacheSize}". Must be a positive number.`);
80
+ }
81
+ if (cacheSizeNum > 100000) {
82
+ console.warn(`[VoilaJSX AppKit] Large cache size: ${cacheSizeNum}. This may impact memory usage.`);
83
+ }
84
+ }
85
+ // Validate cache TTL
86
+ const cacheTTL = process.env.VOILA_UTIL_CACHE_TTL;
87
+ if (cacheTTL) {
88
+ const cacheTTLNum = parseInt(cacheTTL);
89
+ if (isNaN(cacheTTLNum) || cacheTTLNum <= 0) {
90
+ throw new Error(`Invalid VOILA_UTIL_CACHE_TTL: "${cacheTTL}". Must be a positive number (milliseconds).`);
91
+ }
92
+ }
93
+ // Validate array threshold
94
+ const arrayThreshold = process.env.VOILA_UTIL_ARRAY_THRESHOLD;
95
+ if (arrayThreshold) {
96
+ const thresholdNum = parseInt(arrayThreshold);
97
+ if (isNaN(thresholdNum) || thresholdNum <= 0) {
98
+ throw new Error(`Invalid VOILA_UTIL_ARRAY_THRESHOLD: "${arrayThreshold}". Must be a positive number.`);
99
+ }
100
+ }
101
+ // Validate chunk size limit
102
+ const chunkLimit = process.env.VOILA_UTIL_CHUNK_LIMIT;
103
+ if (chunkLimit) {
104
+ const chunkLimitNum = parseInt(chunkLimit);
105
+ if (isNaN(chunkLimitNum) || chunkLimitNum <= 0) {
106
+ throw new Error(`Invalid VOILA_UTIL_CHUNK_LIMIT: "${chunkLimit}". Must be a positive number.`);
107
+ }
108
+ }
109
+ // Validate number precision
110
+ const numberPrecision = process.env.VOILA_UTIL_NUMBER_PRECISION;
111
+ if (numberPrecision) {
112
+ const precisionNum = parseInt(numberPrecision);
113
+ if (isNaN(precisionNum) || precisionNum < 0 || precisionNum > 20) {
114
+ throw new Error(`Invalid VOILA_UTIL_NUMBER_PRECISION: "${numberPrecision}". Must be between 0 and 20.`);
115
+ }
116
+ }
117
+ // Validate locale if provided
118
+ const locale = process.env.VOILA_UTIL_LOCALE;
119
+ if (locale && !isValidLocale(locale)) {
120
+ console.warn(`[VoilaJSX AppKit] Invalid locale: "${locale}". Using default 'en-US'.`);
121
+ }
122
+ // Validate currency if provided
123
+ const currency = process.env.VOILA_UTIL_CURRENCY;
124
+ if (currency && !isValidCurrency(currency)) {
125
+ console.warn(`[VoilaJSX AppKit] Invalid currency: "${currency}". Using default 'USD'.`);
126
+ }
127
+ // Validate slugify replacement
128
+ const replacement = process.env.VOILA_UTIL_SLUGIFY_REPLACEMENT;
129
+ if (replacement && replacement.length > 5) {
130
+ console.warn(`[VoilaJSX AppKit] Long slugify replacement: "${replacement}". Consider using shorter replacement.`);
131
+ }
132
+ // Production-specific warnings
133
+ if (nodeEnv === 'production') {
134
+ if (process.env.VOILA_UTIL_DEBUG === 'true') {
135
+ console.warn('[VoilaJSX AppKit] Debug mode enabled in production. This may impact performance.');
136
+ }
137
+ if (process.env.VOILA_UTIL_LOG_OPS === 'true') {
138
+ console.warn('[VoilaJSX AppKit] Operation logging enabled in production. This may impact performance.');
139
+ }
140
+ }
141
+ // Validate NODE_ENV
142
+ if (nodeEnv && !['development', 'production', 'test', 'staging'].includes(nodeEnv)) {
143
+ console.warn(`[VoilaJSX AppKit] Unusual NODE_ENV: "${nodeEnv}". ` +
144
+ `Expected: development, production, test, or staging`);
145
+ }
146
+ }
147
+ /**
148
+ * Validates locale format using basic pattern matching
149
+ * @llm-rule WHEN: Validating user-provided locale settings
150
+ * @llm-rule AVOID: Complex locale validation - basic pattern matching is sufficient
151
+ */
152
+ function isValidLocale(locale) {
153
+ // Basic locale pattern: language[-Country]
154
+ const localePattern = /^[a-z]{2}(-[A-Z]{2})?$/;
155
+ return localePattern.test(locale);
156
+ }
157
+ /**
158
+ * Validates currency code format (ISO 4217)
159
+ * @llm-rule WHEN: Validating user-provided currency settings
160
+ * @llm-rule AVOID: Full ISO 4217 validation - basic pattern matching is sufficient
161
+ */
162
+ function isValidCurrency(currency) {
163
+ // Basic currency pattern: 3 uppercase letters
164
+ const currencyPattern = /^[A-Z]{3}$/;
165
+ return currencyPattern.test(currency);
166
+ }
167
+ /**
168
+ * Creates utility error with helpful context
169
+ * @llm-rule WHEN: Creating errors in utility functions for better debugging
170
+ * @llm-rule AVOID: Using generic Error objects - utility errors need context
171
+ */
172
+ export function createUtilityError(message, operation, input) {
173
+ const error = new Error(message);
174
+ if (operation) {
175
+ error.operation = operation;
176
+ }
177
+ if (input !== undefined) {
178
+ error.input = input;
179
+ }
180
+ return error;
181
+ }
182
+ /**
183
+ * Default configuration constants for reference
184
+ */
185
+ export const DEFAULT_CACHE_SIZE = 1000;
186
+ export const DEFAULT_CACHE_TTL = 300000; // 5 minutes
187
+ export const DEFAULT_ARRAY_THRESHOLD = 10000;
188
+ export const DEFAULT_CHUNK_LIMIT = 100000;
189
+ export const DEFAULT_NUMBER_PRECISION = 2;
190
+ export const DEFAULT_LOCALE = 'en-US';
191
+ export const DEFAULT_CURRENCY = 'USD';
192
+ export const DEFAULT_SLUGIFY_REPLACEMENT = '-';
193
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/util/defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Ultra-simple utilities that just work
3
+ * @module @bloomneo/appkit/util
4
+ * @file src/util/index.ts
5
+ *
6
+ * @llm-rule WHEN: Building apps that need common utility functions (get, chunk, slugify, debounce, etc.)
7
+ * @llm-rule AVOID: Manual utility implementation - this provides tested, optimized functions with edge cases handled
8
+ * @llm-rule NOTE: Common pattern - utilclass.get() → util.get() → util.chunk() → util.slugify()
9
+ * @llm-rule NOTE: 12 essential utilities: get, isEmpty, slugify, chunk, debounce, pick, unique, clamp, formatBytes, truncate, sleep, uuid
10
+ */
11
+ import { UtilClass } from './util.js';
12
+ import { type UtilConfig } from './defaults.js';
13
+ /**
14
+ * Get utility instance - the only function you need to learn
15
+ * Environment variables parsed once for performance
16
+ * @llm-rule WHEN: Starting any utility operation - this is your main entry point
17
+ * @llm-rule AVOID: Calling new UtilClass() directly - always use this function
18
+ * @llm-rule NOTE: Typical flow - get() → util.get() → util.chunk() → util.slugify()
19
+ */
20
+ declare function get(overrides?: Partial<UtilConfig>): UtilClass;
21
+ /**
22
+ * Reset global instance (useful for testing or config changes)
23
+ * @llm-rule WHEN: Testing utility logic with different configurations
24
+ * @llm-rule AVOID: Using in production - only for tests and development
25
+ */
26
+ declare function reset(newConfig?: Partial<UtilConfig>): UtilClass;
27
+ /**
28
+ * Clear the cached utility instance
29
+ * @llm-rule WHEN: Testing or when you need to reload environment variables
30
+ * @llm-rule AVOID: Using in production - only for tests and development
31
+ */
32
+ declare function clearCache(): void;
33
+ /**
34
+ * Get current utility configuration for inspection
35
+ * @llm-rule WHEN: Debugging utility behavior or documenting utility configuration
36
+ * @llm-rule AVOID: Using for runtime utility decisions - use get() instead
37
+ */
38
+ declare function getConfig(): UtilConfig;
39
+ /**
40
+ * Check if running in development mode (affects utility logging)
41
+ * @llm-rule WHEN: Need to conditionally add debug information to utility operations
42
+ * @llm-rule AVOID: Manual NODE_ENV checks - use this for consistency
43
+ */
44
+ declare function isDevelopment(): boolean;
45
+ /**
46
+ * Check if running in production mode (affects utility performance optimizations)
47
+ * @llm-rule WHEN: Need to conditionally enable performance optimizations
48
+ * @llm-rule AVOID: Manual NODE_ENV checks - use this for consistency
49
+ */
50
+ declare function isProduction(): boolean;
51
+ /**
52
+ * Get utility status for health checks and monitoring
53
+ * @llm-rule WHEN: Building health check endpoints or utility monitoring
54
+ * @llm-rule AVOID: Exposing internal utility details - this only shows availability
55
+ */
56
+ declare function getStatus(): {
57
+ cacheEnabled: boolean;
58
+ performance: boolean;
59
+ environment: string;
60
+ version: string;
61
+ };
62
+ /**
63
+ * Quick utility setup helper for common patterns
64
+ * @llm-rule WHEN: Setting up utilities with custom configuration quickly
65
+ * @llm-rule AVOID: Using without understanding - review configuration for your needs
66
+ * @llm-rule NOTE: Returns utility instance with optimized settings for common use cases
67
+ */
68
+ declare function quickSetup(options?: {
69
+ performance?: boolean;
70
+ cache?: boolean;
71
+ debug?: boolean;
72
+ }): UtilClass;
73
+ /**
74
+ * Validate utility configuration at startup
75
+ * @llm-rule WHEN: App startup to ensure utility config is valid
76
+ * @llm-rule AVOID: Using in request handlers - expensive validation
77
+ * @llm-rule NOTE: Validates performance settings and cache configuration
78
+ */
79
+ declare function validateConfig(): void;
80
+ /**
81
+ * Single utility export with enhanced functionality
82
+ */
83
+ export declare const utilClass: {
84
+ readonly get: typeof get;
85
+ readonly reset: typeof reset;
86
+ readonly clearCache: typeof clearCache;
87
+ readonly getConfig: typeof getConfig;
88
+ readonly isDevelopment: typeof isDevelopment;
89
+ readonly isProduction: typeof isProduction;
90
+ readonly quickSetup: typeof quickSetup;
91
+ readonly validateConfig: typeof validateConfig;
92
+ readonly getStatus: typeof getStatus;
93
+ };
94
+ export type { UtilConfig } from './defaults.js';
95
+ export type { GetOptions, ChunkOptions, TruncateOptions, DebounceOptions, FormatBytesOptions, SlugifyOptions, } from './util.js';
96
+ export { UtilClass } from './util.js';
97
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAKlE;;;;;;GAMG;AACH,iBAAS,GAAG,CAAC,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,SAAS,CAS3D;AAED;;;;GAIG;AACH,iBAAS,KAAK,CAAC,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,SAAS,CAK7D;AAED;;;;GAIG;AACH,iBAAS,UAAU,IAAI,IAAI,CAE1B;AAED;;;;GAIG;AACH,iBAAS,SAAS,IAAI,UAAU,CAG/B;AAED;;;;GAIG;AACH,iBAAS,aAAa,IAAI,OAAO,CAGhC;AAED;;;;GAIG;AACH,iBAAS,YAAY,IAAI,OAAO,CAG/B;AAED;;;;GAIG;AACH,iBAAS,SAAS,IAAI;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CASA;AAED;;;;;GAKG;AACH,iBAAS,UAAU,CAAC,OAAO,GAAE;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACZ,GAAG,SAAS,CA6BjB;AAED;;;;;GAKG;AACH,iBAAS,cAAc,IAAI,IAAI,CAkB9B;AAED;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;CAiBZ,CAAC;AAGX,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,YAAY,EACV,UAAU,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Ultra-simple utilities that just work
3
+ * @module @bloomneo/appkit/util
4
+ * @file src/util/index.ts
5
+ *
6
+ * @llm-rule WHEN: Building apps that need common utility functions (get, chunk, slugify, debounce, etc.)
7
+ * @llm-rule AVOID: Manual utility implementation - this provides tested, optimized functions with edge cases handled
8
+ * @llm-rule NOTE: Common pattern - utilclass.get() → util.get() → util.chunk() → util.slugify()
9
+ * @llm-rule NOTE: 12 essential utilities: get, isEmpty, slugify, chunk, debounce, pick, unique, clamp, formatBytes, truncate, sleep, uuid
10
+ */
11
+ import { UtilClass } from './util.js';
12
+ import { getSmartDefaults } from './defaults.js';
13
+ // Global utility instance for performance
14
+ let globalUtility = null;
15
+ /**
16
+ * Get utility instance - the only function you need to learn
17
+ * Environment variables parsed once for performance
18
+ * @llm-rule WHEN: Starting any utility operation - this is your main entry point
19
+ * @llm-rule AVOID: Calling new UtilClass() directly - always use this function
20
+ * @llm-rule NOTE: Typical flow - get() → util.get() → util.chunk() → util.slugify()
21
+ */
22
+ function get(overrides = {}) {
23
+ // Lazy initialization - parse environment once
24
+ if (!globalUtility) {
25
+ const defaults = getSmartDefaults();
26
+ const config = { ...defaults, ...overrides };
27
+ globalUtility = new UtilClass(config);
28
+ }
29
+ return globalUtility;
30
+ }
31
+ /**
32
+ * Reset global instance (useful for testing or config changes)
33
+ * @llm-rule WHEN: Testing utility logic with different configurations
34
+ * @llm-rule AVOID: Using in production - only for tests and development
35
+ */
36
+ function reset(newConfig = {}) {
37
+ const defaults = getSmartDefaults();
38
+ const config = { ...defaults, ...newConfig };
39
+ globalUtility = new UtilClass(config);
40
+ return globalUtility;
41
+ }
42
+ /**
43
+ * Clear the cached utility instance
44
+ * @llm-rule WHEN: Testing or when you need to reload environment variables
45
+ * @llm-rule AVOID: Using in production - only for tests and development
46
+ */
47
+ function clearCache() {
48
+ globalUtility = null;
49
+ }
50
+ /**
51
+ * Get current utility configuration for inspection
52
+ * @llm-rule WHEN: Debugging utility behavior or documenting utility configuration
53
+ * @llm-rule AVOID: Using for runtime utility decisions - use get() instead
54
+ */
55
+ function getConfig() {
56
+ const util = get();
57
+ return util.config;
58
+ }
59
+ /**
60
+ * Check if running in development mode (affects utility logging)
61
+ * @llm-rule WHEN: Need to conditionally add debug information to utility operations
62
+ * @llm-rule AVOID: Manual NODE_ENV checks - use this for consistency
63
+ */
64
+ function isDevelopment() {
65
+ const config = getConfig();
66
+ return config.environment.isDevelopment;
67
+ }
68
+ /**
69
+ * Check if running in production mode (affects utility performance optimizations)
70
+ * @llm-rule WHEN: Need to conditionally enable performance optimizations
71
+ * @llm-rule AVOID: Manual NODE_ENV checks - use this for consistency
72
+ */
73
+ function isProduction() {
74
+ const config = getConfig();
75
+ return config.environment.isProduction;
76
+ }
77
+ /**
78
+ * Get utility status for health checks and monitoring
79
+ * @llm-rule WHEN: Building health check endpoints or utility monitoring
80
+ * @llm-rule AVOID: Exposing internal utility details - this only shows availability
81
+ */
82
+ function getStatus() {
83
+ const config = getConfig();
84
+ return {
85
+ cacheEnabled: config.cache.enabled,
86
+ performance: config.performance.enabled,
87
+ environment: config.environment.nodeEnv,
88
+ version: config.version,
89
+ };
90
+ }
91
+ /**
92
+ * Quick utility setup helper for common patterns
93
+ * @llm-rule WHEN: Setting up utilities with custom configuration quickly
94
+ * @llm-rule AVOID: Using without understanding - review configuration for your needs
95
+ * @llm-rule NOTE: Returns utility instance with optimized settings for common use cases
96
+ */
97
+ function quickSetup(options = {}) {
98
+ const config = {};
99
+ if (options.performance !== undefined) {
100
+ config.performance = {
101
+ enabled: options.performance,
102
+ memoization: options.performance,
103
+ largeArrayThreshold: 10000,
104
+ chunkSizeLimit: 100000
105
+ };
106
+ }
107
+ if (options.cache !== undefined) {
108
+ config.cache = {
109
+ enabled: options.cache,
110
+ maxSize: 1000,
111
+ ttl: 300000
112
+ };
113
+ }
114
+ if (options.debug !== undefined) {
115
+ config.debug = {
116
+ enabled: options.debug,
117
+ logOperations: options.debug,
118
+ trackPerformance: options.debug
119
+ };
120
+ }
121
+ return get(config);
122
+ }
123
+ /**
124
+ * Validate utility configuration at startup
125
+ * @llm-rule WHEN: App startup to ensure utility config is valid
126
+ * @llm-rule AVOID: Using in request handlers - expensive validation
127
+ * @llm-rule NOTE: Validates performance settings and cache configuration
128
+ */
129
+ function validateConfig() {
130
+ try {
131
+ const config = getConfig();
132
+ // Basic validation
133
+ if (!config.version) {
134
+ throw new Error('Utility version is required');
135
+ }
136
+ if (!config.environment.nodeEnv) {
137
+ throw new Error('NODE_ENV is required');
138
+ }
139
+ console.log('✅ Utility configuration validation passed');
140
+ }
141
+ catch (error) {
142
+ console.error('❌ Utility configuration validation failed:', error.message);
143
+ throw error;
144
+ }
145
+ }
146
+ /**
147
+ * Single utility export with enhanced functionality
148
+ */
149
+ export const utilClass = {
150
+ // Core method
151
+ get,
152
+ // Utility methods
153
+ reset,
154
+ clearCache,
155
+ getConfig,
156
+ // Environment helpers
157
+ isDevelopment,
158
+ isProduction,
159
+ // Utility helpers
160
+ quickSetup,
161
+ validateConfig,
162
+ getStatus,
163
+ };
164
+ export { UtilClass } from './util.js';
165
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Core utility class with 12 essential JavaScript functions
3
+ * @module @bloomneo/appkit/util
4
+ * @file src/util/util.ts
5
+ *
6
+ * @llm-rule WHEN: Building apps that need common utility functions (get, chunk, slugify, debounce, etc.)
7
+ * @llm-rule AVOID: Using directly - always get instance via utilClass.get()
8
+ * @llm-rule NOTE: Provides 12 essential utilities: get, isEmpty, slugify, chunk, debounce, pick, unique, clamp, formatBytes, truncate, sleep, uuid
9
+ */
10
+ import type { UtilConfig } from './defaults.js';
11
+ export interface GetOptions {
12
+ strict?: boolean;
13
+ throwOnMissing?: boolean;
14
+ }
15
+ export interface ChunkOptions {
16
+ fillIncomplete?: boolean;
17
+ fillValue?: any;
18
+ }
19
+ export interface TruncateOptions {
20
+ length: number;
21
+ suffix?: string;
22
+ separator?: string;
23
+ preserveWords?: boolean;
24
+ }
25
+ export interface DebounceOptions {
26
+ leading?: boolean;
27
+ trailing?: boolean;
28
+ maxWait?: number;
29
+ }
30
+ export interface FormatBytesOptions {
31
+ decimals?: number;
32
+ binary?: boolean;
33
+ unitSeparator?: string;
34
+ }
35
+ export interface SlugifyOptions {
36
+ replacement?: string;
37
+ lowercase?: boolean;
38
+ strict?: boolean;
39
+ locale?: string;
40
+ }
41
+ /**
42
+ * Utility class with 12 essential JavaScript functions
43
+ */
44
+ export declare class UtilClass {
45
+ config: UtilConfig;
46
+ private memoCache;
47
+ private debounceCache;
48
+ constructor(config: UtilConfig);
49
+ /**
50
+ * Safe property access with dot notation and array indexing
51
+ * @llm-rule WHEN: Accessing nested object properties safely to prevent "Cannot read property of undefined" errors
52
+ * @llm-rule AVOID: Direct property access on potentially undefined objects - always use this for nested access
53
+ * @llm-rule NOTE: Supports array indexing, optional chaining syntax, and type-safe defaults
54
+ */
55
+ get<T = any>(obj: any, path: string, defaultValue?: T, options?: GetOptions): T;
56
+ /**
57
+ * Universal empty check for all JavaScript values
58
+ * @llm-rule WHEN: Validating if any value is truly empty (null, undefined, {}, [], "", whitespace-only strings)
59
+ * @llm-rule AVOID: Manual empty checks like !value - this handles all edge cases properly
60
+ * @llm-rule NOTE: Returns true for null, undefined, {}, [], "", " ", false for 0 and false
61
+ */
62
+ isEmpty(value: any): boolean;
63
+ /**
64
+ * Convert text to URL-safe slugs
65
+ * @llm-rule WHEN: Creating URLs, filenames, or IDs from user text input
66
+ * @llm-rule AVOID: Manual string replacement - this handles unicode, special characters, and edge cases
67
+ * @llm-rule NOTE: Converts "Hello World! 123" to "hello-world-123", handles accents and special characters
68
+ */
69
+ slugify(text: string, options?: SlugifyOptions): string;
70
+ /**
71
+ * Split array into smaller chunks of specified size
72
+ * @llm-rule WHEN: Processing large arrays in batches, creating pagination, or organizing data into grids
73
+ * @llm-rule AVOID: Manual array slicing - this handles edge cases and provides consistent behavior
74
+ * @llm-rule NOTE: chunk([1,2,3,4,5], 2) returns [[1,2], [3,4], [5]], handles empty arrays safely
75
+ */
76
+ chunk<T>(array: T[], size: number, options?: ChunkOptions): T[][];
77
+ /**
78
+ * Debounce function calls to prevent excessive execution
79
+ * @llm-rule WHEN: Handling user input events (search, resize, scroll) to optimize performance
80
+ * @llm-rule AVOID: Manual setTimeout management - this handles cleanup and edge cases properly
81
+ * @llm-rule NOTE: Delays function execution until after specified wait period, cancels previous calls
82
+ */
83
+ debounce<T extends (...args: any[]) => any>(func: T, wait: number, options?: DebounceOptions): T & {
84
+ cancel: () => void;
85
+ flush: () => any;
86
+ };
87
+ /**
88
+ * Extract specific properties from an object
89
+ * @llm-rule WHEN: Cleaning API responses, extracting specific data, or creating object subsets
90
+ * @llm-rule AVOID: Manual property extraction - this handles nested keys and edge cases
91
+ * @llm-rule NOTE: pick(user, ['id', 'name', 'email']) returns object with only specified properties
92
+ */
93
+ pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
94
+ /**
95
+ * Remove duplicate values from array
96
+ * @llm-rule WHEN: Cleaning arrays with duplicate values, creating unique lists
97
+ * @llm-rule AVOID: Manual duplicate removal - this is optimized and handles all value types
98
+ * @llm-rule NOTE: Uses Set for performance, handles primitives and object references
99
+ */
100
+ unique<T>(array: T[]): T[];
101
+ /**
102
+ * Constrain number within specified bounds
103
+ * @llm-rule WHEN: Validating user input, constraining values for UI controls (volume, opacity, progress)
104
+ * @llm-rule AVOID: Manual min/max checking - this handles edge cases and type conversion
105
+ * @llm-rule NOTE: clamp(150, 0, 100) returns 100, clamp(-10, 0, 100) returns 0
106
+ */
107
+ clamp(value: number, min: number, max: number): number;
108
+ /**
109
+ * Format byte sizes in human-readable format
110
+ * @llm-rule WHEN: Displaying file sizes, memory usage, or data transfer amounts
111
+ * @llm-rule AVOID: Manual byte formatting - this handles all units and edge cases properly
112
+ * @llm-rule NOTE: formatBytes(1024) returns "1 KB", formatBytes(0) returns "0 Bytes"
113
+ */
114
+ formatBytes(bytes: number, options?: FormatBytesOptions): string;
115
+ /**
116
+ * Truncate text with intelligent word boundary detection
117
+ * @llm-rule WHEN: Displaying text previews, card descriptions, or mobile content
118
+ * @llm-rule AVOID: Simple string.slice() - this preserves words and handles edge cases
119
+ * @llm-rule NOTE: truncate("Hello World", 8) returns "Hello...", respects word boundaries
120
+ */
121
+ truncate(text: string, options: TruncateOptions): string;
122
+ /**
123
+ * Promise-based sleep function for async delays
124
+ * @llm-rule WHEN: Adding delays in async functions, rate limiting, or animation timing
125
+ * @llm-rule AVOID: setTimeout in async/await contexts - this provides clean Promise-based delays
126
+ * @llm-rule NOTE: await sleep(1000) pauses execution for 1 second without blocking the event loop
127
+ */
128
+ sleep(ms: number): Promise<void>;
129
+ /**
130
+ * Generate RFC4122 version 4 UUID
131
+ * @llm-rule WHEN: Creating unique identifiers for sessions, temporary keys, or object IDs
132
+ * @llm-rule AVOID: Manual ID generation - this provides cryptographically secure UUIDs
133
+ * @llm-rule NOTE: Returns standard UUID format: "f47ac10b-58cc-4372-a567-0e02b2c3d479"
134
+ */
135
+ uuid(): string;
136
+ /**
137
+ * Parse object path with dot notation and array indexing
138
+ */
139
+ private parsePath;
140
+ /**
141
+ * Setup automatic cache cleanup
142
+ */
143
+ private setupCacheCleanup;
144
+ }
145
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util/util.ts"],"names":[],"mappings":"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"}