@zintrust/core 0.1.19 → 0.1.21

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 (528) hide show
  1. package/README.md +10 -10
  2. package/bin/zintrust-main.d.ts.map +1 -1
  3. package/bin/zintrust-main.js +9 -0
  4. package/package.json +3 -2
  5. package/public/error-pages/404.html +145 -0
  6. package/public/error-pages/500.html +266 -0
  7. package/public/error-pages/error.css +628 -0
  8. package/public/error-pages/error.js +428 -0
  9. package/public/zintrust.svg +30 -0
  10. package/routes/api.d.ts.map +1 -1
  11. package/routes/api.js +41 -17
  12. package/routes/metrics.d.ts +9 -0
  13. package/routes/metrics.d.ts.map +1 -0
  14. package/routes/metrics.js +20 -0
  15. package/routes/openapi.d.ts +9 -0
  16. package/routes/openapi.d.ts.map +1 -0
  17. package/routes/openapi.js +76 -0
  18. package/src/boot/Application.d.ts +2 -2
  19. package/src/boot/Application.d.ts.map +1 -1
  20. package/src/boot/Application.js +66 -13
  21. package/src/boot/Server.d.ts +3 -2
  22. package/src/boot/Server.d.ts.map +1 -1
  23. package/src/boot/Server.js +39 -165
  24. package/src/boot/bootstrap.js +2 -0
  25. package/src/cache/Cache.d.ts +1 -1
  26. package/src/cache/Cache.d.ts.map +1 -1
  27. package/src/cache/CacheDriver.d.ts +4 -0
  28. package/src/cache/CacheDriver.d.ts.map +1 -1
  29. package/src/cache/drivers/KVDriver.d.ts +1 -1
  30. package/src/cache/drivers/KVDriver.d.ts.map +1 -1
  31. package/src/cache/drivers/MemoryDriver.d.ts +1 -1
  32. package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
  33. package/src/cache/drivers/MemoryDriver.js +16 -0
  34. package/src/cache/drivers/MongoDriver.d.ts +1 -1
  35. package/src/cache/drivers/MongoDriver.d.ts.map +1 -1
  36. package/src/cache/drivers/RedisDriver.d.ts +1 -1
  37. package/src/cache/drivers/RedisDriver.d.ts.map +1 -1
  38. package/src/cli/CLI.d.ts.map +1 -1
  39. package/src/cli/CLI.js +10 -4
  40. package/src/cli/commands/AddCommand.d.ts +2 -2
  41. package/src/cli/commands/AddCommand.d.ts.map +1 -1
  42. package/src/cli/commands/AddCommand.js +135 -58
  43. package/src/cli/commands/ConfigCommand.d.ts +1 -1
  44. package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
  45. package/src/cli/commands/CreateCommand.d.ts +15 -0
  46. package/src/cli/commands/CreateCommand.d.ts.map +1 -0
  47. package/src/cli/commands/CreateCommand.js +143 -0
  48. package/src/cli/commands/D1MigrateCommand.d.ts +1 -1
  49. package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
  50. package/src/cli/commands/D1MigrateCommand.js +16 -20
  51. package/src/cli/commands/DbSeedCommand.d.ts +9 -0
  52. package/src/cli/commands/DbSeedCommand.d.ts.map +1 -0
  53. package/src/cli/commands/DbSeedCommand.js +171 -0
  54. package/src/cli/commands/DebugCommand.d.ts +1 -1
  55. package/src/cli/commands/DebugCommand.d.ts.map +1 -1
  56. package/src/cli/commands/FixCommand.d.ts +1 -1
  57. package/src/cli/commands/FixCommand.d.ts.map +1 -1
  58. package/src/cli/commands/JwtDevCommand.d.ts +8 -0
  59. package/src/cli/commands/JwtDevCommand.d.ts.map +1 -0
  60. package/src/cli/commands/JwtDevCommand.js +114 -0
  61. package/src/cli/commands/KeyGenerateCommand.d.ts +1 -1
  62. package/src/cli/commands/KeyGenerateCommand.d.ts.map +1 -1
  63. package/src/cli/commands/LogsCommand.d.ts +2 -2
  64. package/src/cli/commands/LogsCommand.d.ts.map +1 -1
  65. package/src/cli/commands/LogsCommand.js +36 -2
  66. package/src/cli/commands/MakeMailTemplateCommand.d.ts +1 -1
  67. package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -1
  68. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +1 -1
  69. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -1
  70. package/src/cli/commands/MigrateCommand.d.ts +1 -1
  71. package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
  72. package/src/cli/commands/MigrateCommand.js +324 -35
  73. package/src/cli/commands/NewCommand.d.ts +1 -1
  74. package/src/cli/commands/NewCommand.d.ts.map +1 -1
  75. package/src/cli/commands/NewCommand.js +12 -4
  76. package/src/cli/commands/PluginCommand.d.ts +1 -1
  77. package/src/cli/commands/PluginCommand.d.ts.map +1 -1
  78. package/src/cli/commands/PrepareCommand.d.ts +1 -1
  79. package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
  80. package/src/cli/commands/QACommand.d.ts +2 -2
  81. package/src/cli/commands/QACommand.d.ts.map +1 -1
  82. package/src/cli/commands/RoutesCommand.d.ts +10 -0
  83. package/src/cli/commands/RoutesCommand.d.ts.map +1 -0
  84. package/src/cli/commands/RoutesCommand.js +242 -0
  85. package/src/cli/commands/SimulateCommand.d.ts +1 -1
  86. package/src/cli/commands/SimulateCommand.d.ts.map +1 -1
  87. package/src/cli/commands/index.d.ts +3 -0
  88. package/src/cli/commands/index.d.ts.map +1 -1
  89. package/src/cli/commands/index.js +3 -0
  90. package/src/cli/config/ConfigManager.d.ts +1 -1
  91. package/src/cli/config/ConfigManager.d.ts.map +1 -1
  92. package/src/cli/config/ConfigValidator.d.ts +1 -1
  93. package/src/cli/config/ConfigValidator.d.ts.map +1 -1
  94. package/src/cli/config/ConfigValidator.js +1 -1
  95. package/src/cli/d1/D1SqlMigrations.d.ts +20 -0
  96. package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -0
  97. package/src/cli/d1/D1SqlMigrations.js +229 -0
  98. package/src/cli/d1/WranglerConfig.d.ts +4 -0
  99. package/src/cli/d1/WranglerConfig.d.ts.map +1 -0
  100. package/src/cli/d1/WranglerConfig.js +122 -0
  101. package/src/cli/d1/WranglerD1.d.ts +11 -0
  102. package/src/cli/d1/WranglerD1.d.ts.map +1 -0
  103. package/src/cli/d1/WranglerD1.js +16 -0
  104. package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
  105. package/src/cli/scaffolding/ControllerGenerator.js +76 -26
  106. package/src/cli/scaffolding/FactoryGenerator.d.ts.map +1 -1
  107. package/src/cli/scaffolding/FactoryGenerator.js +3 -1
  108. package/src/cli/scaffolding/GovernanceScaffolder.d.ts +23 -0
  109. package/src/cli/scaffolding/GovernanceScaffolder.d.ts.map +1 -0
  110. package/src/cli/scaffolding/GovernanceScaffolder.js +327 -0
  111. package/src/cli/scaffolding/MigrationGenerator.d.ts +10 -0
  112. package/src/cli/scaffolding/MigrationGenerator.d.ts.map +1 -1
  113. package/src/cli/scaffolding/MigrationGenerator.js +137 -51
  114. package/src/cli/scaffolding/ModelGenerator.js +1 -1
  115. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  116. package/src/cli/scaffolding/ProjectScaffolder.js +36 -4
  117. package/src/cli/scaffolding/RouteGenerator.d.ts.map +1 -1
  118. package/src/cli/scaffolding/RouteGenerator.js +79 -43
  119. package/src/cli/scaffolding/SeederGenerator.d.ts +5 -0
  120. package/src/cli/scaffolding/SeederGenerator.d.ts.map +1 -1
  121. package/src/cli/scaffolding/SeederGenerator.js +63 -15
  122. package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
  123. package/src/cli/scaffolding/ServiceScaffolder.js +28 -7
  124. package/src/cli/scaffolding/index.d.ts +2 -0
  125. package/src/cli/scaffolding/index.d.ts.map +1 -1
  126. package/src/cli/scaffolding/index.js +1 -0
  127. package/src/common/index.d.ts +8 -0
  128. package/src/common/index.d.ts.map +1 -1
  129. package/src/common/index.js +28 -0
  130. package/src/common/utility.d.ts +38 -0
  131. package/src/common/utility.d.ts.map +1 -0
  132. package/src/common/utility.js +101 -0
  133. package/src/config/FileLogWriter.d.ts +2 -1
  134. package/src/config/FileLogWriter.d.ts.map +1 -1
  135. package/src/config/FileLogWriter.js +83 -2
  136. package/src/config/app.d.ts.map +1 -1
  137. package/src/config/app.js +3 -1
  138. package/src/config/broadcast.d.ts +14 -28
  139. package/src/config/broadcast.d.ts.map +1 -1
  140. package/src/config/broadcast.js +69 -35
  141. package/src/config/cache.d.ts +13 -45
  142. package/src/config/cache.d.ts.map +1 -1
  143. package/src/config/cache.js +69 -25
  144. package/src/config/cloudflare.d.ts +1 -1
  145. package/src/config/cloudflare.d.ts.map +1 -1
  146. package/src/config/database.d.ts +22 -64
  147. package/src/config/database.d.ts.map +1 -1
  148. package/src/config/database.js +191 -37
  149. package/src/config/env.d.ts +12 -0
  150. package/src/config/env.d.ts.map +1 -1
  151. package/src/config/env.js +14 -0
  152. package/src/config/index.d.ts +33 -137
  153. package/src/config/index.d.ts.map +1 -1
  154. package/src/config/logging/KvLogger.js +1 -1
  155. package/src/config/logging/SlackLogger.js +2 -2
  156. package/src/config/mail.d.ts +19 -55
  157. package/src/config/mail.d.ts.map +1 -1
  158. package/src/config/mail.js +63 -21
  159. package/src/config/middleware.d.ts +44 -1
  160. package/src/config/middleware.d.ts.map +1 -1
  161. package/src/config/middleware.js +157 -5
  162. package/src/config/notification.d.ts +14 -27
  163. package/src/config/notification.d.ts.map +1 -1
  164. package/src/config/notification.js +82 -36
  165. package/src/config/queue.d.ts +21 -51
  166. package/src/config/queue.d.ts.map +1 -1
  167. package/src/config/queue.js +72 -27
  168. package/src/config/security.d.ts +1 -1
  169. package/src/config/security.js +1 -1
  170. package/src/config/storage.d.ts +27 -34
  171. package/src/config/storage.d.ts.map +1 -1
  172. package/src/config/storage.js +97 -56
  173. package/src/config/type.d.ts +13 -2
  174. package/src/config/type.d.ts.map +1 -1
  175. package/src/events/EventDispatcher.d.ts.map +1 -1
  176. package/src/events/EventDispatcher.js +6 -4
  177. package/src/exceptions/ZintrustError.d.ts +7 -0
  178. package/src/exceptions/ZintrustError.d.ts.map +1 -1
  179. package/src/exceptions/ZintrustError.js +56 -0
  180. package/src/features/Auth.d.ts +1 -1
  181. package/src/features/Auth.d.ts.map +1 -1
  182. package/src/features/Auth.js +3 -3
  183. package/src/features/Queue.js +1 -1
  184. package/src/functions/cloudflare.d.ts.map +1 -1
  185. package/src/functions/cloudflare.js +3 -14
  186. package/src/functions/deno.d.ts.map +1 -1
  187. package/src/functions/deno.js +3 -14
  188. package/src/functions/lambda.d.ts.map +1 -1
  189. package/src/functions/lambda.js +3 -14
  190. package/src/health/StartupHealthChecks.js +1 -1
  191. package/src/http/Controller.d.ts +2 -2
  192. package/src/http/Controller.d.ts.map +1 -1
  193. package/src/http/FileUpload.d.ts +68 -0
  194. package/src/http/FileUpload.d.ts.map +1 -0
  195. package/src/http/FileUpload.js +120 -0
  196. package/src/http/Kernel.d.ts +5 -5
  197. package/src/http/Kernel.d.ts.map +1 -1
  198. package/src/http/Kernel.js +139 -23
  199. package/src/http/Request.d.ts +20 -1
  200. package/src/http/Request.d.ts.map +1 -1
  201. package/src/http/Request.js +23 -0
  202. package/src/http/RequestContext.d.ts +6 -0
  203. package/src/http/RequestContext.d.ts.map +1 -1
  204. package/src/http/RequestContext.js +77 -1
  205. package/src/http/Response.d.ts +1 -1
  206. package/src/http/Response.d.ts.map +1 -1
  207. package/src/http/ValidationHelper.d.ts +78 -0
  208. package/src/http/ValidationHelper.d.ts.map +1 -0
  209. package/src/http/ValidationHelper.js +121 -0
  210. package/src/http/error-pages/ErrorPageRenderer.d.ts +17 -0
  211. package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -0
  212. package/src/http/error-pages/ErrorPageRenderer.js +88 -0
  213. package/src/http/middleware/BodyParsingMiddleware.d.ts +12 -0
  214. package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -0
  215. package/src/http/middleware/BodyParsingMiddleware.js +251 -0
  216. package/src/http/middleware/FileUploadMiddleware.d.ts +12 -0
  217. package/src/http/middleware/FileUploadMiddleware.d.ts.map +1 -0
  218. package/src/http/middleware/FileUploadMiddleware.js +74 -0
  219. package/src/http/parsers/BodyParsers.d.ts +32 -0
  220. package/src/http/parsers/BodyParsers.d.ts.map +1 -0
  221. package/src/http/parsers/BodyParsers.js +159 -0
  222. package/src/http/parsers/MultipartParser.d.ts +33 -0
  223. package/src/http/parsers/MultipartParser.d.ts.map +1 -0
  224. package/src/http/parsers/MultipartParser.js +156 -0
  225. package/src/http/parsers/MultipartParserRegistry.d.ts +34 -0
  226. package/src/http/parsers/MultipartParserRegistry.d.ts.map +1 -0
  227. package/src/http/parsers/MultipartParserRegistry.js +20 -0
  228. package/src/http/validated.d.ts +12 -0
  229. package/src/http/validated.d.ts.map +1 -0
  230. package/src/http/validated.js +41 -0
  231. package/src/index.d.ts +73 -12
  232. package/src/index.d.ts.map +1 -1
  233. package/src/index.js +60 -5
  234. package/src/microservices/PostgresAdapter.d.ts.map +1 -1
  235. package/src/microservices/PostgresAdapter.js +0 -1
  236. package/src/microservices/RequestTracingMiddleware.d.ts +2 -2
  237. package/src/microservices/RequestTracingMiddleware.d.ts.map +1 -1
  238. package/src/microservices/RequestTracingMiddleware.js +3 -0
  239. package/src/microservices/ServiceAuthMiddleware.d.ts +2 -2
  240. package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
  241. package/src/middleware/AuthMiddleware.d.ts +10 -0
  242. package/src/middleware/AuthMiddleware.d.ts.map +1 -0
  243. package/src/middleware/AuthMiddleware.js +16 -0
  244. package/src/middleware/CsrfMiddleware.d.ts +11 -1
  245. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  246. package/src/middleware/CsrfMiddleware.js +33 -0
  247. package/src/middleware/JwtAuthMiddleware.d.ts +11 -0
  248. package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -0
  249. package/src/middleware/JwtAuthMiddleware.js +73 -0
  250. package/src/middleware/LoggingMiddleware.d.ts.map +1 -1
  251. package/src/middleware/LoggingMiddleware.js +8 -3
  252. package/src/middleware/MiddlewareStack.d.ts +2 -2
  253. package/src/middleware/MiddlewareStack.d.ts.map +1 -1
  254. package/src/middleware/RateLimiter.d.ts +2 -2
  255. package/src/middleware/RateLimiter.d.ts.map +1 -1
  256. package/src/middleware/SanitizeBodyMiddleware.d.ts +12 -0
  257. package/src/middleware/SanitizeBodyMiddleware.d.ts.map +1 -0
  258. package/src/middleware/SanitizeBodyMiddleware.js +31 -0
  259. package/src/middleware/SecurityMiddleware.d.ts +1 -1
  260. package/src/middleware/SecurityMiddleware.d.ts.map +1 -1
  261. package/src/middleware/SessionMiddleware.d.ts +1 -1
  262. package/src/middleware/SessionMiddleware.d.ts.map +1 -1
  263. package/src/middleware/ValidationMiddleware.d.ts +25 -0
  264. package/src/middleware/ValidationMiddleware.d.ts.map +1 -0
  265. package/src/middleware/ValidationMiddleware.js +251 -0
  266. package/src/migrations/MigrationDiscovery.d.ts +5 -0
  267. package/src/migrations/MigrationDiscovery.d.ts.map +1 -0
  268. package/src/migrations/MigrationDiscovery.js +16 -0
  269. package/src/migrations/MigrationLoader.d.ts +5 -0
  270. package/src/migrations/MigrationLoader.d.ts.map +1 -0
  271. package/src/migrations/MigrationLoader.js +43 -0
  272. package/src/migrations/MigrationLock.d.ts +4 -0
  273. package/src/migrations/MigrationLock.d.ts.map +1 -0
  274. package/src/migrations/MigrationLock.js +33 -0
  275. package/src/migrations/Migrator.d.ts +23 -0
  276. package/src/migrations/Migrator.d.ts.map +1 -0
  277. package/src/migrations/Migrator.js +4 -0
  278. package/src/migrations/MigratorFactory.d.ts +25 -0
  279. package/src/migrations/MigratorFactory.d.ts.map +1 -0
  280. package/src/migrations/MigratorFactory.js +339 -0
  281. package/src/migrations/schema/Blueprint.d.ts +5 -0
  282. package/src/migrations/schema/Blueprint.d.ts.map +1 -0
  283. package/src/migrations/schema/Blueprint.js +189 -0
  284. package/src/migrations/schema/Schema.d.ts +8 -0
  285. package/src/migrations/schema/Schema.d.ts.map +1 -0
  286. package/src/migrations/schema/Schema.js +141 -0
  287. package/src/migrations/schema/SchemaCompiler.d.ts +20 -0
  288. package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -0
  289. package/src/migrations/schema/SchemaCompiler.js +262 -0
  290. package/src/migrations/schema/index.d.ts +5 -0
  291. package/src/migrations/schema/index.d.ts.map +1 -0
  292. package/src/migrations/schema/index.js +3 -0
  293. package/src/migrations/schema/types.d.ts +86 -0
  294. package/src/migrations/schema/types.d.ts.map +1 -0
  295. package/src/migrations/schema/types.js +1 -0
  296. package/src/migrations/types.d.ts +45 -0
  297. package/src/migrations/types.d.ts.map +1 -0
  298. package/src/migrations/types.js +1 -0
  299. package/src/node-singletons/crypto.d.ts +1 -1
  300. package/src/node-singletons/crypto.d.ts.map +1 -1
  301. package/src/node-singletons/crypto.js +1 -1
  302. package/src/node-singletons/fs.d.ts +2 -2
  303. package/src/node-singletons/fs.d.ts.map +1 -1
  304. package/src/node-singletons/fs.js +1 -1
  305. package/src/node-singletons/util.d.ts +6 -0
  306. package/src/node-singletons/util.d.ts.map +1 -0
  307. package/src/node-singletons/util.js +5 -0
  308. package/src/node.d.ts +3 -1
  309. package/src/node.d.ts.map +1 -1
  310. package/src/node.js +6 -2
  311. package/src/observability/OpenTelemetry.d.ts +62 -0
  312. package/src/observability/OpenTelemetry.d.ts.map +1 -0
  313. package/src/observability/OpenTelemetry.js +167 -0
  314. package/src/observability/PrometheusMetrics.d.ts +25 -0
  315. package/src/observability/PrometheusMetrics.d.ts.map +1 -0
  316. package/src/observability/PrometheusMetrics.js +114 -0
  317. package/src/openapi/OpenApiGenerator.d.ts +68 -0
  318. package/src/openapi/OpenApiGenerator.d.ts.map +1 -0
  319. package/src/openapi/OpenApiGenerator.js +287 -0
  320. package/src/orm/Database.d.ts +5 -2
  321. package/src/orm/Database.d.ts.map +1 -1
  322. package/src/orm/Database.js +219 -63
  323. package/src/orm/DatabaseAdapter.d.ts +14 -0
  324. package/src/orm/DatabaseAdapter.d.ts.map +1 -1
  325. package/src/orm/DatabaseAdapterRegistry.d.ts.map +1 -1
  326. package/src/orm/DatabaseAdapterRegistry.js +3 -1
  327. package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
  328. package/src/orm/DatabaseRuntimeRegistration.js +12 -0
  329. package/src/orm/Model.d.ts +30 -2
  330. package/src/orm/Model.d.ts.map +1 -1
  331. package/src/orm/Model.js +255 -62
  332. package/src/orm/QueryBuilder.d.ts +22 -1
  333. package/src/orm/QueryBuilder.d.ts.map +1 -1
  334. package/src/orm/QueryBuilder.js +406 -99
  335. package/src/orm/Relationships.d.ts +7 -1
  336. package/src/orm/Relationships.d.ts.map +1 -1
  337. package/src/orm/Relationships.js +18 -0
  338. package/src/orm/SchemaCompiler.d.ts +9 -0
  339. package/src/orm/SchemaCompiler.d.ts.map +1 -0
  340. package/src/orm/SchemaCompiler.js +145 -0
  341. package/src/orm/adapters/D1Adapter.d.ts +1 -1
  342. package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
  343. package/src/orm/adapters/MySQLAdapter.d.ts +1 -1
  344. package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
  345. package/src/orm/adapters/MySQLAdapter.js +88 -69
  346. package/src/orm/adapters/PostgreSQLAdapter.d.ts +1 -1
  347. package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  348. package/src/orm/adapters/PostgreSQLAdapter.js +88 -69
  349. package/src/orm/adapters/SQLServerAdapter.d.ts +1 -1
  350. package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
  351. package/src/orm/adapters/SQLiteAdapter.d.ts +1 -1
  352. package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
  353. package/src/orm/adapters/SQLiteAdapter.js +59 -3
  354. package/src/orm/maintenance/SqliteMaintenance.d.ts +5 -0
  355. package/src/orm/maintenance/SqliteMaintenance.d.ts.map +1 -0
  356. package/src/orm/maintenance/SqliteMaintenance.js +14 -0
  357. package/src/orm/migrations/MigrationStore.d.ts +38 -0
  358. package/src/orm/migrations/MigrationStore.d.ts.map +1 -0
  359. package/src/orm/migrations/MigrationStore.js +157 -0
  360. package/src/performance/CodeGenerationBenchmark.d.ts.map +1 -1
  361. package/src/performance/Optimizer.d.ts +7 -6
  362. package/src/performance/Optimizer.d.ts.map +1 -1
  363. package/src/performance/Optimizer.js +170 -55
  364. package/src/profiling/MemoryProfiler.d.ts +1 -1
  365. package/src/profiling/MemoryProfiler.d.ts.map +1 -1
  366. package/src/profiling/N1Detector.d.ts +1 -1
  367. package/src/profiling/N1Detector.d.ts.map +1 -1
  368. package/src/profiling/QueryLogger.d.ts +1 -1
  369. package/src/profiling/QueryLogger.d.ts.map +1 -1
  370. package/src/profiling/RequestProfiler.d.ts +3 -3
  371. package/src/profiling/RequestProfiler.d.ts.map +1 -1
  372. package/src/routes/metrics.d.ts +2 -0
  373. package/src/routes/metrics.d.ts.map +1 -0
  374. package/src/routes/metrics.js +1 -0
  375. package/src/routing/CoreRoutes.d.ts +12 -0
  376. package/src/routing/CoreRoutes.d.ts.map +1 -0
  377. package/src/routing/CoreRoutes.js +151 -0
  378. package/src/routing/RouteRegistry.d.ts +39 -0
  379. package/src/routing/RouteRegistry.d.ts.map +1 -0
  380. package/src/routing/RouteRegistry.js +44 -0
  381. package/src/routing/Router.d.ts +26 -9
  382. package/src/routing/Router.d.ts.map +1 -1
  383. package/src/routing/Router.js +79 -35
  384. package/src/routing/common.d.ts +15 -0
  385. package/src/routing/common.d.ts.map +1 -0
  386. package/src/routing/common.js +47 -0
  387. package/src/routing/doc.d.ts +27 -0
  388. package/src/routing/doc.d.ts.map +1 -0
  389. package/src/routing/doc.js +110 -0
  390. package/src/routing/error.d.ts +21 -0
  391. package/src/routing/error.d.ts.map +1 -0
  392. package/src/routing/error.js +126 -0
  393. package/src/routing/errorPages.d.ts +14 -0
  394. package/src/routing/errorPages.d.ts.map +1 -0
  395. package/src/routing/errorPages.js +103 -0
  396. package/src/routing/publicRoot.d.ts +27 -0
  397. package/src/routing/publicRoot.d.ts.map +1 -0
  398. package/src/routing/publicRoot.js +110 -0
  399. package/src/runtime/PluginAutoImports.d.ts +21 -0
  400. package/src/runtime/PluginAutoImports.d.ts.map +1 -0
  401. package/src/runtime/PluginAutoImports.js +59 -0
  402. package/src/runtime/PluginManager.d.ts +1 -5
  403. package/src/runtime/PluginManager.d.ts.map +1 -1
  404. package/src/runtime/PluginManager.js +25 -18
  405. package/src/runtime/RuntimeDetector.d.ts +1 -1
  406. package/src/runtime/RuntimeDetector.d.ts.map +1 -1
  407. package/src/runtime/StartupConfigFileRegistry.d.ts +20 -0
  408. package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -0
  409. package/src/runtime/StartupConfigFileRegistry.js +44 -0
  410. package/src/runtime/adapters/CloudflareAdapter.d.ts +1 -1
  411. package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
  412. package/src/runtime/adapters/CloudflareAdapter.js +1 -1
  413. package/src/runtime/adapters/DenoAdapter.d.ts +1 -1
  414. package/src/runtime/adapters/DenoAdapter.d.ts.map +1 -1
  415. package/src/runtime/adapters/DenoAdapter.js +1 -1
  416. package/src/runtime/adapters/LambdaAdapter.d.ts +1 -1
  417. package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
  418. package/src/runtime/adapters/LambdaAdapter.js +1 -1
  419. package/src/runtime/adapters/NodeServerAdapter.d.ts +1 -1
  420. package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
  421. package/src/runtime/getKernel.d.ts +9 -0
  422. package/src/runtime/getKernel.d.ts.map +1 -0
  423. package/src/runtime/getKernel.js +27 -0
  424. package/src/runtime/useFileLoader.d.ts +26 -0
  425. package/src/runtime/useFileLoader.d.ts.map +1 -0
  426. package/src/runtime/useFileLoader.js +188 -0
  427. package/src/scripts/TemplateImportsCheck.js +40 -0
  428. package/src/scripts/TemplateSync.js +90 -24
  429. package/src/security/Encryptor.d.ts.map +1 -1
  430. package/src/security/Encryptor.js +64 -7
  431. package/src/security/JwtManager.d.ts +1 -0
  432. package/src/security/JwtManager.d.ts.map +1 -1
  433. package/src/security/JwtManager.js +33 -0
  434. package/src/security/Sanitizer.d.ts +76 -0
  435. package/src/security/Sanitizer.d.ts.map +1 -0
  436. package/src/security/Sanitizer.js +412 -0
  437. package/src/security/TokenRevocation.d.ts +7 -0
  438. package/src/security/TokenRevocation.d.ts.map +1 -0
  439. package/src/security/TokenRevocation.js +57 -0
  440. package/src/security/XssProtection.d.ts.map +1 -1
  441. package/src/security/XssProtection.js +62 -14
  442. package/src/seeders/SeederDiscovery.d.ts +5 -0
  443. package/src/seeders/SeederDiscovery.d.ts.map +1 -0
  444. package/src/seeders/SeederDiscovery.js +21 -0
  445. package/src/seeders/SeederLoader.d.ts +5 -0
  446. package/src/seeders/SeederLoader.d.ts.map +1 -0
  447. package/src/seeders/SeederLoader.js +60 -0
  448. package/src/seeders/types.d.ts +18 -0
  449. package/src/seeders/types.d.ts.map +1 -0
  450. package/src/seeders/types.js +1 -0
  451. package/src/session/SessionManager.js +1 -1
  452. package/src/templates/adapters/MySQLAdapter.ts.tpl +109 -85
  453. package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +129 -88
  454. package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -9
  455. package/src/templates/adapters/SQLiteAdapter.ts.tpl +78 -11
  456. package/src/templates/features/Queue.ts.tpl +3 -2
  457. package/src/templates/project/basic/app/Controllers/AuthController.ts.tpl +217 -0
  458. package/src/templates/project/basic/app/Controllers/UserController.ts.tpl +1 -12
  459. package/src/templates/project/basic/app/Types/controller.ts.tpl +46 -0
  460. package/src/templates/project/basic/config/FileLogWriter.ts.tpl +5 -236
  461. package/src/templates/project/basic/config/SecretsManager.ts.tpl +10 -447
  462. package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +9 -268
  463. package/src/templates/project/basic/config/app.ts.tpl +13 -153
  464. package/src/templates/project/basic/config/broadcast.ts.tpl +29 -126
  465. package/src/templates/project/basic/config/cache.ts.tpl +12 -70
  466. package/src/templates/project/basic/config/cloudflare.ts.tpl +4 -39
  467. package/src/templates/project/basic/config/constants.ts.tpl +9 -65
  468. package/src/templates/project/basic/config/database.ts.tpl +66 -123
  469. package/src/templates/project/basic/config/env.ts.tpl +5 -169
  470. package/src/templates/project/basic/config/features.ts.tpl +6 -54
  471. package/src/templates/project/basic/config/index.ts.tpl +8 -23
  472. package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +7 -114
  473. package/src/templates/project/basic/config/mail.ts.tpl +9 -62
  474. package/src/templates/project/basic/config/microservices.ts.tpl +11 -97
  475. package/src/templates/project/basic/config/middleware.ts.tpl +25 -43
  476. package/src/templates/project/basic/config/notification.ts.tpl +13 -114
  477. package/src/templates/project/basic/config/queue.ts.tpl +9 -40
  478. package/src/templates/project/basic/config/security.ts.tpl +11 -163
  479. package/src/templates/project/basic/config/startup.ts.tpl +10 -21
  480. package/src/templates/project/basic/config/storage.ts.tpl +57 -137
  481. package/src/templates/project/basic/config/type.ts.tpl +32 -451
  482. package/src/templates/project/basic/database/factories/UserFactory.ts.tpl +80 -0
  483. package/src/templates/project/basic/database/migrations/create_tasks_table.ts.tpl +28 -0
  484. package/src/templates/project/basic/database/migrations/create_users_table.ts.tpl +29 -0
  485. package/src/templates/project/basic/database/seeders/DatabaseSeeder.ts.tpl +19 -0
  486. package/src/templates/project/basic/database/seeders/UserSeeder.ts.tpl +18 -0
  487. package/src/templates/project/basic/database/seeders/index.ts.tpl +2 -0
  488. package/src/templates/project/basic/routes/api.ts.tpl +71 -33
  489. package/src/templates/project/basic/routes/metrics.ts.tpl +22 -0
  490. package/src/templates/project/basic/src/index.ts.tpl +3 -0
  491. package/src/templates/project/basic/tsconfig.json.tpl +12 -11
  492. package/src/testing/TestEnvironment.d.ts +40 -0
  493. package/src/testing/TestEnvironment.d.ts.map +1 -0
  494. package/src/testing/TestEnvironment.js +141 -0
  495. package/src/testing/TestHttp.d.ts +29 -0
  496. package/src/testing/TestHttp.d.ts.map +1 -0
  497. package/src/testing/TestHttp.js +96 -0
  498. package/src/testing/index.d.ts +5 -0
  499. package/src/testing/index.d.ts.map +1 -0
  500. package/src/testing/index.js +2 -0
  501. package/src/time/DateTime.d.ts +181 -0
  502. package/src/time/DateTime.d.ts.map +1 -0
  503. package/src/time/DateTime.js +300 -0
  504. package/src/time/index.d.ts +7 -0
  505. package/src/time/index.d.ts.map +1 -0
  506. package/src/time/index.js +5 -0
  507. package/src/tools/http/Http.d.ts.map +1 -1
  508. package/src/tools/http/Http.js +4 -0
  509. package/src/tools/mail/drivers/Smtp.js +1 -1
  510. package/src/tools/queue/drivers/InMemory.d.ts +1 -1
  511. package/src/tools/queue/drivers/InMemory.d.ts.map +1 -1
  512. package/src/tools/queue/drivers/InMemory.js +1 -1
  513. package/src/tools/queue/drivers/Redis.d.ts +1 -1
  514. package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
  515. package/src/tools/queue/drivers/Redis.js +1 -1
  516. package/src/validation/ValidationError.d.ts.map +1 -1
  517. package/src/validation/ValidationError.js +4 -2
  518. package/src/validation/Validator.d.ts +49 -16
  519. package/src/validation/Validator.d.ts.map +1 -1
  520. package/src/validation/Validator.js +307 -5
  521. package/src/common/uuid.d.ts +0 -3
  522. package/src/common/uuid.d.ts.map +0 -1
  523. package/src/common/uuid.js +0 -30
  524. package/src/templates/project/basic/.env.example.tpl +0 -74
  525. package/src/templates/project/basic/.env.tpl +0 -166
  526. package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +0 -181
  527. package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +0 -156
  528. package/src/templates/project/basic/database/migrations/index.ts.tpl +0 -2
@@ -1,268 +1,9 @@
1
- import { appConfig } from '@zintrust/core';
2
- import type { StartupConfigValidationError, StartupConfigValidationResult } from '@zintrust/core';
3
- import { ErrorFactory } from '@zintrust/core';
4
-
5
- const isSensitiveKey = (key: string): boolean => {
6
- const normalized = key.toLowerCase();
7
- return (
8
- normalized.includes('password') ||
9
- normalized.includes('secret') ||
10
- normalized.includes('token') ||
11
- normalized.includes('key') ||
12
- normalized.includes('authorization')
13
- );
14
- };
15
-
16
- const redactValue = (key: string, value: unknown): unknown => {
17
- return isSensitiveKey(key) ? '<redacted>' : value;
18
- };
19
-
20
- const pushError = (
21
- errors: StartupConfigValidationError[],
22
- key: string,
23
- value: unknown,
24
- message: string
25
- ): void => {
26
- errors.push({ key, value: redactValue(key, value), message });
27
- };
28
-
29
- const validateEnum = (
30
- errors: StartupConfigValidationError[],
31
- key: string,
32
- value: string,
33
- allowed: readonly string[]
34
- ): void => {
35
- if (!allowed.includes(value)) {
36
- pushError(errors, key, value, `${key} must be one of: ${allowed.join(', ')}`);
37
- }
38
- };
39
-
40
- const validateIntRange = (
41
- errors: StartupConfigValidationError[],
42
- key: string,
43
- value: number,
44
- min: number,
45
- max: number
46
- ): void => {
47
- if (Number.isNaN(value)) {
48
- pushError(errors, key, value, `${key} must be a valid integer`);
49
- return;
50
- }
51
-
52
- if (value < min || value > max) {
53
- pushError(errors, key, value, `${key} must be between ${min} and ${max}`);
54
- }
55
- };
56
-
57
- const validatePositiveInt = (
58
- errors: StartupConfigValidationError[],
59
- key: string,
60
- value: number
61
- ): void => {
62
- if (Number.isNaN(value)) {
63
- pushError(errors, key, value, `${key} must be a valid integer`);
64
- return;
65
- }
66
-
67
- if (value <= 0) {
68
- pushError(errors, key, value, `${key} must be greater than 0`);
69
- }
70
- };
71
-
72
- type ProcessLike = {
73
- env?: Record<string, string | undefined>;
74
- };
75
-
76
- const getProcessLike = (): ProcessLike | undefined => {
77
- return typeof process === 'undefined' ? undefined : (process as unknown as ProcessLike);
78
- };
79
-
80
- const getEnvString = (key: string, defaultValue: string): string => {
81
- const proc = getProcessLike();
82
- const env = proc?.env ?? {};
83
- return env[key] ?? defaultValue;
84
- };
85
-
86
- const getEnvOptionalString = (key: string): string | undefined => {
87
- const proc = getProcessLike();
88
- const env = proc?.env ?? {};
89
- const value = env[key];
90
- if (typeof value !== 'string') return undefined;
91
- const trimmed = value.trim();
92
- return trimmed === '' ? undefined : trimmed;
93
- };
94
-
95
- const getEnvBoolLoose = (key: string, defaultValue: boolean): boolean => {
96
- const raw = getEnvOptionalString(key);
97
- if (raw === undefined) return defaultValue;
98
- const normalized = raw.toLowerCase();
99
- return normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on';
100
- };
101
-
102
- const getEnvInt = (key: string, defaultValue: number): number => {
103
- const raw = getEnvString(key, String(defaultValue));
104
- return Number.parseInt(raw, 10);
105
- };
106
-
107
- type RequireEnvStringOptions = {
108
- aliases?: readonly string[];
109
- requiredMessage?: string;
110
- minLength?: number;
111
- minLengthMessage?: string;
112
- };
113
-
114
- const requireEnvString = (
115
- errors: StartupConfigValidationError[],
116
- key: string,
117
- options: RequireEnvStringOptions = {}
118
- ): string | undefined => {
119
- const value =
120
- getEnvOptionalString(key) ??
121
- (options.aliases ?? []).reduce<string | undefined>((found, alias) => {
122
- if (found !== undefined) return found;
123
- return getEnvOptionalString(alias);
124
- }, undefined);
125
-
126
- if (value === undefined) {
127
- pushError(errors, key, value, options.requiredMessage ?? `${key} is required`);
128
- return undefined;
129
- }
130
-
131
- if (options.minLength !== undefined && value.length < options.minLength) {
132
- pushError(
133
- errors,
134
- key,
135
- value,
136
- options.minLengthMessage ?? `${key} must be at least ${options.minLength} characters`
137
- );
138
- }
139
-
140
- return value;
141
- };
142
-
143
- const validateSqliteDbFileRequired = (
144
- errors: StartupConfigValidationError[],
145
- dbConnection: string | undefined
146
- ): void => {
147
- // sqlite convenience: accept DB_DATABASE or DB_PATH
148
- if ((dbConnection ?? '').toLowerCase() !== 'sqlite') return;
149
-
150
- const dbFile = getEnvOptionalString('DB_DATABASE') ?? getEnvOptionalString('DB_PATH');
151
- if (dbFile === undefined) {
152
- pushError(errors, 'DB_DATABASE', dbFile, 'DB_DATABASE (or DB_PATH) is required for sqlite');
153
- }
154
- };
155
-
156
- const validateStrictRequiredEnv = (errors: StartupConfigValidationError[]): void => {
157
- const requireEnv = getEnvBoolLoose('STARTUP_REQUIRE_ENV', false);
158
- if (!requireEnv) return;
159
-
160
- requireEnvString(errors, 'NODE_ENV');
161
- requireEnvString(errors, 'APP_NAME');
162
- requireEnvString(errors, 'HOST');
163
-
164
- const portRaw = requireEnvString(errors, 'PORT', {
165
- aliases: ['APP_PORT'],
166
- requiredMessage: 'PORT (or APP_PORT) is required',
167
- });
168
- if (portRaw !== undefined) {
169
- const port = Number.parseInt(portRaw, 10);
170
- validateIntRange(errors, 'PORT', port, 1, 65535);
171
- }
172
-
173
- const dbConnection = requireEnvString(errors, 'DB_CONNECTION');
174
-
175
- requireEnvString(errors, 'APP_KEY', { minLength: 16 });
176
- requireEnvString(errors, 'LOG_LEVEL');
177
- requireEnvString(errors, 'LOG_CHANNEL');
178
-
179
- validateSqliteDbFileRequired(errors, dbConnection);
180
- };
181
-
182
- const validateNodeEnv = (errors: StartupConfigValidationError[]): void => {
183
- const nodeEnv = getEnvString('NODE_ENV', 'development');
184
- validateEnum(errors, 'NODE_ENV', nodeEnv, ['development', 'production', 'testing', 'test']);
185
- };
186
-
187
- const validatePort = (errors: StartupConfigValidationError[]): void => {
188
- // Port can be provided as PORT or APP_PORT. In non-strict mode we keep defaults.
189
- const portFromPort = getEnvOptionalString('PORT');
190
- const portFromAppPort = getEnvOptionalString('APP_PORT');
191
- const portRaw = portFromPort ?? portFromAppPort;
192
-
193
- if (portRaw === undefined) {
194
- const appPort = getEnvInt('APP_PORT', 3000);
195
- validateIntRange(errors, 'APP_PORT', appPort, 1, 65535);
196
- return;
197
- }
198
-
199
- const parsed = Number.parseInt(portRaw, 10);
200
- const key = portFromPort === undefined ? 'APP_PORT' : 'PORT';
201
- validateIntRange(errors, key, parsed, 1, 65535);
202
- };
203
-
204
- const validateLogging = (errors: StartupConfigValidationError[]): void => {
205
- const logFormat = getEnvString('LOG_FORMAT', 'text');
206
- validateEnum(errors, 'LOG_FORMAT', logFormat, ['text', 'json']);
207
-
208
- const logLevel = getEnvString('LOG_LEVEL', 'debug');
209
- validateEnum(errors, 'LOG_LEVEL', logLevel, ['debug', 'info', 'warn', 'error']);
210
-
211
- // Optional (but validated when provided): LOG_CHANNEL (starter apps often use this)
212
- const logChannel = getEnvOptionalString('LOG_CHANNEL');
213
- if (logChannel !== undefined) {
214
- validateEnum(errors, 'LOG_CHANNEL', logChannel, ['console', 'file', 'all']);
215
- }
216
- };
217
-
218
- const validateRotationAndTimeout = (errors: StartupConfigValidationError[]): void => {
219
- const logRotationSize = getEnvInt('LOG_ROTATION_SIZE', 10485760);
220
- validatePositiveInt(errors, 'LOG_ROTATION_SIZE', logRotationSize);
221
-
222
- const logRotationDays = getEnvInt('LOG_ROTATION_DAYS', 7);
223
- validatePositiveInt(errors, 'LOG_ROTATION_DAYS', logRotationDays);
224
-
225
- const startupHealthTimeoutMs = getEnvInt('STARTUP_HEALTH_TIMEOUT_MS', 2500);
226
- validatePositiveInt(errors, 'STARTUP_HEALTH_TIMEOUT_MS', startupHealthTimeoutMs);
227
- };
228
-
229
- const validateProductionAppKey = (errors: StartupConfigValidationError[]): void => {
230
- if (!appConfig.isProduction()) return;
231
-
232
- const appKey = getEnvString('APP_KEY', '');
233
- if (appKey.trim().length < 16) {
234
- pushError(
235
- errors,
236
- 'APP_KEY',
237
- appKey,
238
- 'APP_KEY must be set and at least 16 characters in production'
239
- );
240
- }
241
- };
242
-
243
- export const StartupConfigValidator = Object.freeze({
244
- validate(): StartupConfigValidationResult {
245
- const errors: StartupConfigValidationError[] = [];
246
-
247
- validateStrictRequiredEnv(errors);
248
-
249
- validateNodeEnv(errors);
250
- validatePort(errors);
251
- validateLogging(errors);
252
- validateRotationAndTimeout(errors);
253
- validateProductionAppKey(errors);
254
-
255
- return { valid: errors.length === 0, errors };
256
- },
257
-
258
- assertValid(): void {
259
- const result = StartupConfigValidator.validate();
260
- if (result.valid) return;
261
-
262
- throw ErrorFactory.createConfigError('Invalid startup configuration', {
263
- errors: result.errors,
264
- });
265
- },
266
- });
267
-
268
- export default StartupConfigValidator;
1
+ /**
2
+ * Startup Config Validator (template)
3
+ *
4
+ * Keep this file declarative:
5
+ * - Core owns validation logic.
6
+ */
7
+
8
+ export { StartupConfigValidator } from '@zintrust/core';
9
+ export { StartupConfigValidator as default } from '@zintrust/core';
@@ -1,162 +1,22 @@
1
1
  /**
2
- * Application Configuration
3
- * Core application settings
4
- * Sealed namespace for immutability
2
+ * Application Configuration (template)
3
+ *
4
+ * Keep this file declarative:
5
+ * - Core owns env parsing/default logic.
6
+ * - Projects can override values by editing `appConfigObj`.
5
7
  */
6
8
 
7
- import { Env } from '@zintrust/core';
8
- import type { Environment, ProcessLike, StartMode } from '@zintrust/core';
9
+ import { appConfig as coreAppConfig } from '@zintrust/core';
9
10
 
10
- const getProcessLike = (): ProcessLike | undefined => {
11
- return typeof process === 'undefined' ? undefined : (process as unknown as ProcessLike);
12
- };
11
+ type AppConfigShape = typeof coreAppConfig;
13
12
 
14
- const readEnvString = (key: string, defaultValue: string = ''): string => {
15
- const anyEnv = Env as unknown as { get?: unknown };
16
- if (typeof anyEnv.get === 'function') {
17
- return (anyEnv.get as (k: string, d?: string) => string)(key, defaultValue);
18
- }
13
+ export const appConfigObj = {
14
+ ...coreAppConfig,
15
+ } satisfies AppConfigShape;
19
16
 
20
- const proc = getProcessLike();
21
- const raw = proc?.env?.[key];
22
- return raw ?? defaultValue;
23
- };
17
+ export const appConfig = appConfigObj;
24
18
 
25
- const readEnvInt = (key: string, defaultValue: number): number => {
26
- const anyEnv = Env as unknown as { getInt?: unknown };
27
- if (typeof anyEnv.getInt === 'function') {
28
- return (anyEnv.getInt as (k: string, d?: number) => number)(key, defaultValue);
29
- }
30
-
31
- const raw = readEnvString(key, String(defaultValue));
32
- const parsed = Number.parseInt(raw, 10);
33
- return Number.isNaN(parsed) ? defaultValue : parsed;
34
- };
35
-
36
- const readEnvBool = (key: string, defaultValue: boolean): boolean => {
37
- const anyEnv = Env as unknown as { getBool?: unknown };
38
- if (typeof anyEnv.getBool === 'function') {
39
- return (anyEnv.getBool as (k: string, d?: boolean) => boolean)(key, defaultValue);
40
- }
41
-
42
- const raw = readEnvString(key, defaultValue ? 'true' : 'false');
43
- return raw.toLowerCase() === 'true' || raw === '1';
44
- };
45
-
46
- const getSafeEnv = (): NodeJS.ProcessEnv => {
47
- const baseEnv: Partial<NodeJS.ProcessEnv> = typeof process === 'undefined' ? {} : process.env;
48
-
49
- return {
50
- ...(baseEnv as NodeJS.ProcessEnv),
51
-
52
- // Ensure required keys exist (env.d.ts augments ProcessEnv with required fields)
53
- NODE_ENV:
54
- baseEnv.NODE_ENV ??
55
- (readEnvString('NODE_ENV', 'development') as NodeJS.ProcessEnv['NODE_ENV']),
56
- USE_RAW_QRY: baseEnv.USE_RAW_QRY ?? (readEnvString('USE_RAW_QRY', '') || undefined),
57
- SERVICE_API_KEY: baseEnv.SERVICE_API_KEY ?? readEnvString('SERVICE_API_KEY', ''),
58
- SERVICE_JWT_SECRET: baseEnv.SERVICE_JWT_SECRET ?? readEnvString('SERVICE_JWT_SECRET', ''),
59
- BASE_URL: baseEnv['BASE_URL'] ?? readEnvString('BASE_URL', ''),
60
- MODE: baseEnv['MODE'] ?? readEnvString('MODE', ''),
61
-
62
- // Hardening for child-process usage
63
- PATH:
64
- typeof (Env as unknown as { SAFE_PATH?: unknown }).SAFE_PATH === 'string'
65
- ? (Env as unknown as { SAFE_PATH: string }).SAFE_PATH
66
- : (baseEnv['PATH'] ?? ''),
67
- npm_config_scripts_prepend_node_path: 'true',
68
- };
69
- };
70
-
71
- const normalizeMode = (): StartMode => {
72
- const value = (
73
- typeof (Env as unknown as { NODE_ENV?: unknown }).NODE_ENV === 'string'
74
- ? (Env as unknown as { NODE_ENV: string }).NODE_ENV
75
- : readEnvString('NODE_ENV', 'development')
76
- ) as Environment;
77
- if (value === 'production' || value === 'pro' || value === 'prod') return 'production';
78
- if (value === 'testing' || value === 'test') return 'testing';
79
- return 'development';
80
- };
81
-
82
- const appConfigObj = {
83
- /**
84
- * Application name
85
- */
86
- name:
87
- typeof (Env as unknown as { APP_NAME?: unknown }).APP_NAME === 'string'
88
- ? (Env as unknown as { APP_NAME: string }).APP_NAME
89
- : readEnvString('APP_NAME', 'ZinTrust'),
90
-
91
- /**
92
- * Application environment
93
- */
94
- environment: normalizeMode(),
95
-
96
- /**
97
- * Application port
98
- */
99
- port:
100
- typeof (Env as unknown as { PORT?: unknown }).PORT === 'number'
101
- ? (Env as unknown as { PORT: number }).PORT
102
- : readEnvInt('PORT', readEnvInt('APP_PORT', 3000)),
103
-
104
- /**
105
- * Application host
106
- */
107
- host:
108
- typeof (Env as unknown as { HOST?: unknown }).HOST === 'string'
109
- ? (Env as unknown as { HOST: string }).HOST
110
- : readEnvString('HOST', 'localhost'),
111
-
112
- /**
113
- * Is development environment
114
- */
115
- isDevelopment(): boolean {
116
- return this.environment === 'development';
117
- },
118
-
119
- /**
120
- * Is production environment
121
- */
122
- isProduction(): boolean {
123
- return this.environment === 'production';
124
- },
125
-
126
- /**
127
- * Is testing environment
128
- */
129
- isTesting(): boolean {
130
- return this.environment === 'testing';
131
- },
132
-
133
- /**
134
- * Application debug mode
135
- */
136
- debug:
137
- typeof (Env as unknown as { DEBUG?: unknown }).DEBUG === 'boolean'
138
- ? (Env as unknown as { DEBUG: boolean }).DEBUG
139
- : readEnvBool('DEBUG', false),
140
-
141
- /**
142
- * Application timezone
143
- */
144
- timezone: readEnvString('APP_TIMEZONE', 'UTC'),
145
-
146
- /**
147
- * Request timeout (milliseconds)
148
- */
149
- requestTimeout: readEnvInt('REQUEST_TIMEOUT', 30000),
150
-
151
- /**
152
- * Max request body size
153
- */
154
- maxBodySize: readEnvString('MAX_BODY_SIZE', '10mb'),
155
-
156
- getSafeEnv,
157
- } as const;
158
-
159
- export const appConfig = Object.freeze(appConfigObj);
160
- export { getSafeEnv };
19
+ // Keep the template API stable
20
+ export const getSafeEnv = appConfig.getSafeEnv;
161
21
 
162
22
  export type AppConfig = typeof appConfig;
@@ -1,136 +1,39 @@
1
+ import { Env, type BroadcastConfigOverrides } from '@zintrust/core';
2
+
1
3
  /**
2
- * Broadcast Configuration
4
+ * Broadcast Configuration (default override)
3
5
  *
4
- * Centralizes broadcast driver selection and provider env mappings.
5
- * Driver selection must be dynamic (tests may mutate process.env).
6
+ * Keep this file declarative:
7
+ * - Core owns env parsing/default logic.
8
+ * - Projects can override config by editing values below.
6
9
  */
7
10
 
8
- import type{
9
- BroadcastConfigInput,
10
- BroadcastDrivers,
11
- InMemoryBroadcastDriverConfig,
12
- KnownBroadcastDriverConfig,
13
- PusherBroadcastDriverConfig,
14
- RedisBroadcastDriverConfig,
15
- RedisHttpsBroadcastDriverConfig,
16
- } from '@zintrust/core';
17
- import { ErrorFactory,Env } from '@zintrust/core';
18
-
19
- const normalizeDriverName = (value: string): string => value.trim().toLowerCase();
20
-
21
- const hasOwn = (obj: Record<string, unknown>, key: string): boolean => {
22
- return Object.hasOwn(obj, key);
23
- };
24
-
25
- const getDefaultBroadcaster = (drivers: BroadcastDrivers): string => {
26
- const envSelectedRaw = Env.get('BROADCAST_CONNECTION', Env.get('BROADCAST_DRIVER', 'inmemory'));
27
- const value = normalizeDriverName(envSelectedRaw ?? 'inmemory');
28
-
29
- if (value.length > 0 && hasOwn(drivers, value)) return value;
30
-
31
- if (envSelectedRaw.trim().length > 0) {
32
- throw ErrorFactory.createConfigError(`Broadcast driver not configured: ${value}`);
33
- }
34
-
35
- return hasOwn(drivers, 'inmemory') ? 'inmemory' : (Object.keys(drivers)[0] ?? 'inmemory');
36
- };
37
-
38
- const getPusherConfig = (): PusherBroadcastDriverConfig => ({
39
- driver: 'pusher',
40
- appId: Env.get('PUSHER_APP_ID', ''),
41
- key: Env.get('PUSHER_APP_KEY', ''),
42
- secret: Env.get('PUSHER_APP_SECRET', ''),
43
- cluster: Env.get('PUSHER_APP_CLUSTER', ''),
44
- useTLS: Env.getBool('PUSHER_USE_TLS', true),
45
- });
46
-
47
- const getRedisConfig = (): RedisBroadcastDriverConfig => ({
48
- driver: 'redis',
49
- host: Env.get('BROADCAST_REDIS_HOST', Env.get('REDIS_HOST', 'localhost')),
50
- port: Env.getInt('BROADCAST_REDIS_PORT', Env.getInt('REDIS_PORT', 6379)),
51
- password: Env.get('BROADCAST_REDIS_PASSWORD', Env.get('REDIS_PASSWORD', '')),
52
- channelPrefix: Env.get('BROADCAST_CHANNEL_PREFIX', 'broadcast:'),
53
- });
54
-
55
- const getRedisHttpsConfig = (): RedisHttpsBroadcastDriverConfig => ({
56
- driver: 'redishttps',
57
- endpoint: Env.get('REDIS_HTTPS_ENDPOINT', ''),
58
- token: Env.get('REDIS_HTTPS_TOKEN', ''),
59
- channelPrefix: Env.get('BROADCAST_CHANNEL_PREFIX', 'broadcast:'),
60
- });
61
-
62
- const getBroadcastDriver = (
63
- config: BroadcastConfigInput,
64
- name?: string
65
- ): KnownBroadcastDriverConfig => {
66
- const selected = normalizeDriverName(String(name ?? config.default));
67
- const broadcasterName = selected === 'default' ? normalizeDriverName(config.default) : selected;
68
-
69
- const isExplicitSelection =
70
- name !== undefined &&
71
- String(name).trim().length > 0 &&
72
- normalizeDriverName(String(name)) !== 'default';
73
-
74
- if (broadcasterName.length > 0 && hasOwn(config.drivers, broadcasterName)) {
75
- const resolved = (config.drivers as Record<string, KnownBroadcastDriverConfig>)[
76
- broadcasterName
77
- ];
78
- if (resolved !== undefined) return resolved;
79
- }
80
-
81
- if (isExplicitSelection) {
82
- throw ErrorFactory.createConfigError(`Broadcast driver not configured: ${broadcasterName}`);
83
- }
84
-
85
- const fallback = config.drivers['inmemory'] ?? Object.values(config.drivers)[0];
86
- if (fallback !== undefined) return fallback;
87
-
88
- throw ErrorFactory.createConfigError('No broadcast drivers are configured');
89
- };
90
-
91
- const broadcastConfigObj = {
92
- /**
93
- * Default broadcaster name (normalized).
94
- */
95
- get default(): string {
96
- return getDefaultBroadcaster(this.drivers);
97
- },
98
-
99
- /**
100
- * Broadcast drivers.
101
- *
102
- * You may add custom named broadcasters (e.g. `ops`, `billing`) that point to any
103
- * known driver config.
104
- */
11
+ export default {
12
+ default: Env.get('BROADCAST_CONNECTION', Env.get('BROADCAST_DRIVER', 'inmemory')),
105
13
  drivers: {
106
- get inmemory(): InMemoryBroadcastDriverConfig {
107
- return { driver: 'inmemory' };
14
+ inmemory: {
15
+ driver: 'inmemory' as const,
108
16
  },
109
- get pusher() {
110
- return getPusherConfig();
17
+ pusher: {
18
+ driver: 'pusher' as const,
19
+ appId: Env.get('PUSHER_APP_ID', ''),
20
+ key: Env.get('PUSHER_APP_KEY', ''),
21
+ secret: Env.get('PUSHER_APP_SECRET', ''),
22
+ cluster: Env.get('PUSHER_APP_CLUSTER', ''),
23
+ useTLS: Env.getBool('PUSHER_USE_TLS', true),
111
24
  },
112
- get redis() {
113
- return getRedisConfig();
25
+ redis: {
26
+ driver: 'redis' as const,
27
+ host: Env.get('BROADCAST_REDIS_HOST', Env.get('REDIS_HOST', 'localhost')),
28
+ port: Env.getInt('BROADCAST_REDIS_PORT', Env.getInt('REDIS_PORT', 6379)),
29
+ password: Env.get('BROADCAST_REDIS_PASSWORD', Env.get('REDIS_PASSWORD', '')),
30
+ channelPrefix: Env.get('BROADCAST_CHANNEL_PREFIX', 'broadcast:'),
114
31
  },
115
- get redishttps() {
116
- return getRedisHttpsConfig();
32
+ redishttps: {
33
+ driver: 'redishttps' as const,
34
+ endpoint: Env.get('REDIS_HTTPS_ENDPOINT', ''),
35
+ token: Env.get('REDIS_HTTPS_TOKEN', ''),
36
+ channelPrefix: Env.get('BROADCAST_CHANNEL_PREFIX', 'broadcast:'),
117
37
  },
118
- } satisfies BroadcastDrivers,
119
-
120
- /**
121
- * Normalized broadcast driver name for the default broadcaster.
122
- */
123
- getDriverName(): string {
124
- return normalizeDriverName(this.default);
125
38
  },
126
-
127
- /**
128
- * Get a config object for the currently selected driver.
129
- * Defaults to inmemory for unknown/unsupported names.
130
- */
131
- getDriverConfig(name?: string): KnownBroadcastDriverConfig {
132
- return getBroadcastDriver(this, name);
133
- },
134
- } as const;
135
-
136
- export default Object.freeze(broadcastConfigObj);
39
+ } satisfies BroadcastConfigOverrides;