@cinnabun/core 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/dist/__tests__/autowired.test.d.ts +1 -0
  2. package/dist/__tests__/autowired.test.js +109 -0
  3. package/dist/__tests__/autowired.test.js.map +1 -0
  4. package/dist/__tests__/cinnabun-application.test.d.ts +1 -0
  5. package/dist/__tests__/cinnabun-application.test.js +96 -0
  6. package/dist/__tests__/cinnabun-application.test.js.map +1 -0
  7. package/dist/__tests__/cinnabun-factory.test.d.ts +1 -0
  8. package/dist/__tests__/cinnabun-factory.test.js +269 -0
  9. package/dist/__tests__/cinnabun-factory.test.js.map +1 -0
  10. package/dist/__tests__/circular-dependency.test.d.ts +1 -0
  11. package/dist/__tests__/circular-dependency.test.js +318 -0
  12. package/dist/__tests__/circular-dependency.test.js.map +1 -0
  13. package/dist/__tests__/compression.test.d.ts +1 -0
  14. package/dist/__tests__/compression.test.js +459 -0
  15. package/dist/__tests__/compression.test.js.map +1 -0
  16. package/dist/__tests__/config.test.d.ts +1 -0
  17. package/dist/__tests__/config.test.js +86 -0
  18. package/dist/__tests__/config.test.js.map +1 -0
  19. package/dist/__tests__/cors.test.d.ts +1 -0
  20. package/dist/__tests__/cors.test.js +575 -0
  21. package/dist/__tests__/cors.test.js.map +1 -0
  22. package/dist/__tests__/env-config.test.d.ts +1 -0
  23. package/dist/__tests__/env-config.test.js +367 -0
  24. package/dist/__tests__/env-config.test.js.map +1 -0
  25. package/dist/__tests__/exception.test.d.ts +1 -0
  26. package/dist/__tests__/exception.test.js +207 -0
  27. package/dist/__tests__/exception.test.js.map +1 -0
  28. package/dist/__tests__/guards-interceptors.test.d.ts +1 -0
  29. package/dist/__tests__/guards-interceptors.test.js +660 -0
  30. package/dist/__tests__/guards-interceptors.test.js.map +1 -0
  31. package/dist/__tests__/health-check.test.d.ts +1 -0
  32. package/dist/__tests__/health-check.test.js +240 -0
  33. package/dist/__tests__/health-check.test.js.map +1 -0
  34. package/dist/__tests__/http.test.d.ts +1 -0
  35. package/dist/__tests__/http.test.js +629 -0
  36. package/dist/__tests__/http.test.js.map +1 -0
  37. package/dist/__tests__/integration/e2e.test.d.ts +1 -0
  38. package/dist/__tests__/integration/e2e.test.js +192 -0
  39. package/dist/__tests__/integration/e2e.test.js.map +1 -0
  40. package/dist/__tests__/integration/performance.bench.d.ts +1 -0
  41. package/dist/__tests__/integration/performance.bench.js +129 -0
  42. package/dist/__tests__/integration/performance.bench.js.map +1 -0
  43. package/dist/__tests__/integration/validation.test.d.ts +1 -0
  44. package/dist/__tests__/integration/validation.test.js +133 -0
  45. package/dist/__tests__/integration/validation.test.js.map +1 -0
  46. package/dist/__tests__/lifecycle-management.test.d.ts +1 -0
  47. package/dist/__tests__/lifecycle-management.test.js +688 -0
  48. package/dist/__tests__/lifecycle-management.test.js.map +1 -0
  49. package/dist/__tests__/lifecycle.test.d.ts +1 -0
  50. package/dist/__tests__/lifecycle.test.js +196 -0
  51. package/dist/__tests__/lifecycle.test.js.map +1 -0
  52. package/dist/__tests__/logger.test.d.ts +1 -0
  53. package/dist/__tests__/logger.test.js +109 -0
  54. package/dist/__tests__/logger.test.js.map +1 -0
  55. package/dist/__tests__/middleware.test.d.ts +1 -0
  56. package/dist/__tests__/middleware.test.js +329 -0
  57. package/dist/__tests__/middleware.test.js.map +1 -0
  58. package/dist/__tests__/module.test.d.ts +1 -0
  59. package/dist/__tests__/module.test.js +280 -0
  60. package/dist/__tests__/module.test.js.map +1 -0
  61. package/dist/__tests__/plugin.test.d.ts +1 -0
  62. package/dist/__tests__/plugin.test.js +283 -0
  63. package/dist/__tests__/plugin.test.js.map +1 -0
  64. package/dist/__tests__/request-logger.test.d.ts +1 -0
  65. package/dist/__tests__/request-logger.test.js +342 -0
  66. package/dist/__tests__/request-logger.test.js.map +1 -0
  67. package/dist/__tests__/request-mapping.test.d.ts +1 -0
  68. package/dist/__tests__/request-mapping.test.js +201 -0
  69. package/dist/__tests__/request-mapping.test.js.map +1 -0
  70. package/dist/__tests__/routes.test.d.ts +1 -0
  71. package/dist/__tests__/routes.test.js +119 -0
  72. package/dist/__tests__/routes.test.js.map +1 -0
  73. package/dist/__tests__/scan-fixtures/controllers/hello.controller.d.ts +4 -0
  74. package/dist/__tests__/scan-fixtures/controllers/hello.controller.js +28 -0
  75. package/dist/__tests__/scan-fixtures/controllers/hello.controller.js.map +1 -0
  76. package/dist/__tests__/scan-fixtures/modules/feature.module.d.ts +6 -0
  77. package/dist/__tests__/scan-fixtures/modules/feature.module.js +28 -0
  78. package/dist/__tests__/scan-fixtures/modules/feature.module.js.map +1 -0
  79. package/dist/__tests__/scan-fixtures/services/greeting.service.d.ts +4 -0
  80. package/dist/__tests__/scan-fixtures/services/greeting.service.js +18 -0
  81. package/dist/__tests__/scan-fixtures/services/greeting.service.js.map +1 -0
  82. package/dist/__tests__/scanner.test.d.ts +1 -0
  83. package/dist/__tests__/scanner.test.js +49 -0
  84. package/dist/__tests__/scanner.test.js.map +1 -0
  85. package/dist/__tests__/validation.test.d.ts +1 -0
  86. package/dist/__tests__/validation.test.js +561 -0
  87. package/dist/__tests__/validation.test.js.map +1 -0
  88. package/dist/__tests__/websocket-auth.test.d.ts +1 -0
  89. package/dist/__tests__/websocket-auth.test.js +431 -0
  90. package/dist/__tests__/websocket-auth.test.js.map +1 -0
  91. package/dist/__tests__/websocket-decorators.test.d.ts +1 -0
  92. package/dist/__tests__/websocket-decorators.test.js +173 -0
  93. package/dist/__tests__/websocket-decorators.test.js.map +1 -0
  94. package/dist/__tests__/websocket-validation.test.d.ts +1 -0
  95. package/dist/__tests__/websocket-validation.test.js +827 -0
  96. package/dist/__tests__/websocket-validation.test.js.map +1 -0
  97. package/dist/__tests__/websocket.test.d.ts +1 -0
  98. package/dist/__tests__/websocket.test.js +415 -0
  99. package/dist/__tests__/websocket.test.js.map +1 -0
  100. package/dist/config/config.module.d.ts +2 -0
  101. package/dist/config/config.module.js +18 -0
  102. package/dist/config/config.module.js.map +1 -0
  103. package/dist/config/config.service.d.ts +15 -0
  104. package/dist/config/config.service.js +58 -0
  105. package/dist/config/config.service.js.map +1 -0
  106. package/dist/config/schemas.d.ts +107 -0
  107. package/dist/config/schemas.js +87 -0
  108. package/dist/config/schemas.js.map +1 -0
  109. package/dist/core/app.d.ts +44 -0
  110. package/dist/core/app.js +178 -0
  111. package/dist/core/app.js.map +1 -0
  112. package/dist/core/cinnabun-factory.d.ts +5 -0
  113. package/dist/core/cinnabun-factory.js +130 -0
  114. package/dist/core/cinnabun-factory.js.map +1 -0
  115. package/dist/core/config-loader.d.ts +2 -0
  116. package/dist/core/config-loader.js +76 -0
  117. package/dist/core/config-loader.js.map +1 -0
  118. package/dist/core/config.d.ts +12 -0
  119. package/dist/core/config.js +27 -0
  120. package/dist/core/config.js.map +1 -0
  121. package/dist/core/container.d.ts +10 -0
  122. package/dist/core/container.js +82 -0
  123. package/dist/core/container.js.map +1 -0
  124. package/dist/core/dependency-validator.d.ts +12 -0
  125. package/dist/core/dependency-validator.js +76 -0
  126. package/dist/core/dependency-validator.js.map +1 -0
  127. package/dist/core/guard.d.ts +3 -0
  128. package/dist/core/guard.js +2 -0
  129. package/dist/core/guard.js.map +1 -0
  130. package/dist/core/interceptor.d.ts +4 -0
  131. package/dist/core/interceptor.js +2 -0
  132. package/dist/core/interceptor.js.map +1 -0
  133. package/dist/core/logger.d.ts +15 -0
  134. package/dist/core/logger.js +71 -0
  135. package/dist/core/logger.js.map +1 -0
  136. package/dist/core/module-resolver.d.ts +6 -0
  137. package/dist/core/module-resolver.js +67 -0
  138. package/dist/core/module-resolver.js.map +1 -0
  139. package/dist/core/plugin.d.ts +12 -0
  140. package/dist/core/plugin.js +2 -0
  141. package/dist/core/plugin.js.map +1 -0
  142. package/dist/core/router.d.ts +38 -0
  143. package/dist/core/router.js +406 -0
  144. package/dist/core/router.js.map +1 -0
  145. package/dist/core/scanner.d.ts +7 -0
  146. package/dist/core/scanner.js +83 -0
  147. package/dist/core/scanner.js.map +1 -0
  148. package/dist/core/shutdown-manager.d.ts +15 -0
  149. package/dist/core/shutdown-manager.js +68 -0
  150. package/dist/core/shutdown-manager.js.map +1 -0
  151. package/dist/core/websocket-handler.d.ts +41 -0
  152. package/dist/core/websocket-handler.js +242 -0
  153. package/dist/core/websocket-handler.js.map +1 -0
  154. package/dist/decorators/autowired.d.ts +3 -0
  155. package/dist/decorators/autowired.js +11 -0
  156. package/dist/decorators/autowired.js.map +1 -0
  157. package/dist/decorators/cinnabun-application.d.ts +14 -0
  158. package/dist/decorators/cinnabun-application.js +17 -0
  159. package/dist/decorators/cinnabun-application.js.map +1 -0
  160. package/dist/decorators/lifecycle.d.ts +2 -0
  161. package/dist/decorators/lifecycle.js +12 -0
  162. package/dist/decorators/lifecycle.js.map +1 -0
  163. package/dist/decorators/middleware.d.ts +2 -0
  164. package/dist/decorators/middleware.js +12 -0
  165. package/dist/decorators/middleware.js.map +1 -0
  166. package/dist/decorators/module.d.ts +10 -0
  167. package/dist/decorators/module.js +13 -0
  168. package/dist/decorators/module.js.map +1 -0
  169. package/dist/decorators/on-shutdown.d.ts +1 -0
  170. package/dist/decorators/on-shutdown.js +10 -0
  171. package/dist/decorators/on-shutdown.js.map +1 -0
  172. package/dist/decorators/params.d.ts +6 -0
  173. package/dist/decorators/params.js +31 -0
  174. package/dist/decorators/params.js.map +1 -0
  175. package/dist/decorators/request-mapping.d.ts +7 -0
  176. package/dist/decorators/request-mapping.js +34 -0
  177. package/dist/decorators/request-mapping.js.map +1 -0
  178. package/dist/decorators/response.d.ts +2 -0
  179. package/dist/decorators/response.js +17 -0
  180. package/dist/decorators/response.js.map +1 -0
  181. package/dist/decorators/rest-controller.d.ts +1 -0
  182. package/dist/decorators/rest-controller.js +19 -0
  183. package/dist/decorators/rest-controller.js.map +1 -0
  184. package/dist/decorators/routes.d.ts +5 -0
  185. package/dist/decorators/routes.js +19 -0
  186. package/dist/decorators/routes.js.map +1 -0
  187. package/dist/decorators/service.d.ts +1 -0
  188. package/dist/decorators/service.js +7 -0
  189. package/dist/decorators/service.js.map +1 -0
  190. package/dist/decorators/use-guard.d.ts +2 -0
  191. package/dist/decorators/use-guard.js +12 -0
  192. package/dist/decorators/use-guard.js.map +1 -0
  193. package/dist/decorators/use-interceptor.d.ts +2 -0
  194. package/dist/decorators/use-interceptor.js +12 -0
  195. package/dist/decorators/use-interceptor.js.map +1 -0
  196. package/dist/decorators/validate.d.ts +12 -0
  197. package/dist/decorators/validate.js +7 -0
  198. package/dist/decorators/validate.js.map +1 -0
  199. package/dist/decorators/websocket.d.ts +9 -0
  200. package/dist/decorators/websocket.js +38 -0
  201. package/dist/decorators/websocket.js.map +1 -0
  202. package/dist/decorators/ws-event.d.ts +28 -0
  203. package/dist/decorators/ws-event.js +37 -0
  204. package/dist/decorators/ws-event.js.map +1 -0
  205. package/dist/decorators/ws-gateway.d.ts +18 -0
  206. package/dist/decorators/ws-gateway.js +24 -0
  207. package/dist/decorators/ws-gateway.js.map +1 -0
  208. package/dist/dev/index.d.ts +6 -0
  209. package/dist/dev/index.js +28 -0
  210. package/dist/dev/index.js.map +1 -0
  211. package/dist/exceptions/circular-dependency-error.d.ts +5 -0
  212. package/dist/exceptions/circular-dependency-error.js +16 -0
  213. package/dist/exceptions/circular-dependency-error.js.map +1 -0
  214. package/dist/exceptions/http-exception.d.ts +41 -0
  215. package/dist/exceptions/http-exception.js +96 -0
  216. package/dist/exceptions/http-exception.js.map +1 -0
  217. package/dist/guards/jwt-websocket.guard.d.ts +11 -0
  218. package/dist/guards/jwt-websocket.guard.js +37 -0
  219. package/dist/guards/jwt-websocket.guard.js.map +1 -0
  220. package/dist/guards/websocket-auth.guard.d.ts +16 -0
  221. package/dist/guards/websocket-auth.guard.js +43 -0
  222. package/dist/guards/websocket-auth.guard.js.map +1 -0
  223. package/dist/health/health-check.service.d.ts +45 -0
  224. package/dist/health/health-check.service.js +95 -0
  225. package/dist/health/health-check.service.js.map +1 -0
  226. package/dist/health/health.controller.d.ts +15 -0
  227. package/dist/health/health.controller.js +63 -0
  228. package/dist/health/health.controller.js.map +1 -0
  229. package/dist/health/health.module.d.ts +2 -0
  230. package/dist/health/health.module.js +20 -0
  231. package/dist/health/health.module.js.map +1 -0
  232. package/dist/index.d.ts +74 -11
  233. package/dist/index.js +54 -0
  234. package/dist/index.js.map +1 -0
  235. package/dist/metadata/storage.d.ts +171 -0
  236. package/dist/metadata/storage.js +257 -0
  237. package/dist/metadata/storage.js.map +1 -0
  238. package/dist/middleware/compression.middleware.d.ts +32 -0
  239. package/dist/middleware/compression.middleware.js +113 -0
  240. package/dist/middleware/compression.middleware.js.map +1 -0
  241. package/dist/middleware/cors.middleware.d.ts +18 -0
  242. package/dist/middleware/cors.middleware.js +79 -0
  243. package/dist/middleware/cors.middleware.js.map +1 -0
  244. package/dist/middleware/performance-tracker.middleware.d.ts +35 -0
  245. package/dist/middleware/performance-tracker.middleware.js +79 -0
  246. package/dist/middleware/performance-tracker.middleware.js.map +1 -0
  247. package/dist/middleware/request-logger.middleware.d.ts +32 -0
  248. package/dist/middleware/request-logger.middleware.js +125 -0
  249. package/dist/middleware/request-logger.middleware.js.map +1 -0
  250. package/dist/types/index.d.ts +14 -0
  251. package/dist/types/index.js +5 -0
  252. package/dist/types/index.js.map +1 -0
  253. package/dist/validation/helpers.d.ts +36 -0
  254. package/dist/validation/helpers.js +27 -0
  255. package/dist/validation/helpers.js.map +1 -0
  256. package/dist/websocket/error.d.ts +27 -0
  257. package/dist/websocket/error.js +38 -0
  258. package/dist/websocket/error.js.map +1 -0
  259. package/package.json +38 -5
  260. package/LICENSE +0 -9
@@ -0,0 +1,367 @@
1
+ import "reflect-metadata";
2
+ import { describe, it, expect } from "bun:test";
3
+ import { z } from "zod";
4
+ import { ConfigService, ConfigValidationError, } from "../config/config.service.js";
5
+ import { EnvTransforms, CommonEnvSchema, DatabaseEnvSchema, JwtEnvSchema, } from "../config/schemas.js";
6
+ describe("ConfigService", () => {
7
+ describe("valid environment", () => {
8
+ it("validates and parses valid environment variables", () => {
9
+ const schema = z.object({
10
+ NODE_ENV: z.enum(["development", "production", "test"]),
11
+ PORT: z.string().transform(Number),
12
+ API_KEY: z.string(),
13
+ });
14
+ const env = {
15
+ NODE_ENV: "development",
16
+ PORT: "3000",
17
+ API_KEY: "test-key",
18
+ };
19
+ const config = new ConfigService(schema, env);
20
+ expect(config.get("NODE_ENV")).toBe("development");
21
+ expect(config.get("PORT")).toBe(3000);
22
+ expect(config.get("API_KEY")).toBe("test-key");
23
+ });
24
+ it("returns all config values", () => {
25
+ const schema = z.object({
26
+ NODE_ENV: z.string(),
27
+ PORT: z.string(),
28
+ });
29
+ const env = {
30
+ NODE_ENV: "development",
31
+ PORT: "3000",
32
+ };
33
+ const config = new ConfigService(schema, env);
34
+ const all = config.getAll();
35
+ expect(all).toEqual({
36
+ NODE_ENV: "development",
37
+ PORT: "3000",
38
+ });
39
+ });
40
+ it("checks if key exists", () => {
41
+ const schema = z.object({
42
+ API_KEY: z.string(),
43
+ });
44
+ const config = new ConfigService(schema, { API_KEY: "test" });
45
+ expect(config.has("API_KEY")).toBe(true);
46
+ expect(config.has("OTHER_KEY")).toBe(false);
47
+ });
48
+ it("applies default values", () => {
49
+ const schema = z.object({
50
+ PORT: z.string().default("3000"),
51
+ DEBUG: z.string().default("false"),
52
+ });
53
+ const config = new ConfigService(schema, {});
54
+ expect(config.get("PORT")).toBe("3000");
55
+ expect(config.get("DEBUG")).toBe("false");
56
+ });
57
+ });
58
+ describe("validation errors", () => {
59
+ it("throws on missing required field", () => {
60
+ const schema = z.object({
61
+ API_KEY: z.string(),
62
+ DATABASE_URL: z.string(),
63
+ });
64
+ expect(() => {
65
+ new ConfigService(schema, {});
66
+ }).toThrow(ConfigValidationError);
67
+ });
68
+ it("provides helpful error messages", () => {
69
+ const schema = z.object({
70
+ API_KEY: z.string().min(10, "API key must be at least 10 characters"),
71
+ });
72
+ try {
73
+ new ConfigService(schema, { API_KEY: "short" });
74
+ expect(true).toBe(false); // Should not reach here
75
+ }
76
+ catch (error) {
77
+ expect(error).toBeInstanceOf(ConfigValidationError);
78
+ expect(error.message).toContain("API_KEY");
79
+ expect(error.message).toContain("at least 10 characters");
80
+ }
81
+ });
82
+ it("throws on invalid URL", () => {
83
+ const schema = z.object({
84
+ DATABASE_URL: z.string().url(),
85
+ });
86
+ expect(() => {
87
+ new ConfigService(schema, { DATABASE_URL: "not-a-url" });
88
+ }).toThrow(ConfigValidationError);
89
+ });
90
+ it("throws on invalid enum value", () => {
91
+ const schema = z.object({
92
+ NODE_ENV: z.enum(["development", "production", "test"]),
93
+ });
94
+ expect(() => {
95
+ new ConfigService(schema, { NODE_ENV: "invalid" });
96
+ }).toThrow(ConfigValidationError);
97
+ });
98
+ });
99
+ describe("type transformations", () => {
100
+ it("transforms string to number", () => {
101
+ const schema = z.object({
102
+ PORT: z.string().transform(Number),
103
+ });
104
+ const config = new ConfigService(schema, { PORT: "3000" });
105
+ expect(config.get("PORT")).toBe(3000);
106
+ expect(typeof config.get("PORT")).toBe("number");
107
+ });
108
+ it("transforms string to boolean", () => {
109
+ const schema = z.object({
110
+ DEBUG: z
111
+ .string()
112
+ .transform((val) => val === "true" || val === "1"),
113
+ });
114
+ const config1 = new ConfigService(schema, { DEBUG: "true" });
115
+ expect(config1.get("DEBUG")).toBe(true);
116
+ const config2 = new ConfigService(schema, { DEBUG: "false" });
117
+ expect(config2.get("DEBUG")).toBe(false);
118
+ });
119
+ it("parses JSON from string", () => {
120
+ const schema = z.object({
121
+ FEATURES: z
122
+ .string()
123
+ .transform((val) => JSON.parse(val))
124
+ .pipe(z.object({
125
+ beta: z.boolean(),
126
+ newUI: z.boolean(),
127
+ })),
128
+ });
129
+ const config = new ConfigService(schema, {
130
+ FEATURES: '{"beta":true,"newUI":false}',
131
+ });
132
+ expect(config.get("FEATURES")).toEqual({ beta: true, newUI: false });
133
+ });
134
+ it("parses comma-separated list", () => {
135
+ const schema = z.object({
136
+ ALLOWED_ORIGINS: z
137
+ .string()
138
+ .transform((val) => val.split(",").map((v) => v.trim())),
139
+ });
140
+ const config = new ConfigService(schema, {
141
+ ALLOWED_ORIGINS: "http://localhost:3000, http://localhost:5173",
142
+ });
143
+ expect(config.get("ALLOWED_ORIGINS")).toEqual([
144
+ "http://localhost:3000",
145
+ "http://localhost:5173",
146
+ ]);
147
+ });
148
+ });
149
+ });
150
+ describe("EnvTransforms", () => {
151
+ describe("port", () => {
152
+ it("validates and transforms port number", () => {
153
+ const schema = z.object({
154
+ PORT: EnvTransforms.port,
155
+ });
156
+ const config = new ConfigService(schema, { PORT: "8080" });
157
+ expect(config.get("PORT")).toBe(8080);
158
+ });
159
+ it("uses default port if not provided", () => {
160
+ const schema = z.object({
161
+ PORT: EnvTransforms.port,
162
+ });
163
+ const config = new ConfigService(schema, {});
164
+ expect(config.get("PORT")).toBe(3000);
165
+ });
166
+ it("rejects invalid port numbers", () => {
167
+ const schema = z.object({
168
+ PORT: EnvTransforms.port,
169
+ });
170
+ expect(() => {
171
+ new ConfigService(schema, { PORT: "99999" });
172
+ }).toThrow(ConfigValidationError);
173
+ expect(() => {
174
+ new ConfigService(schema, { PORT: "0" });
175
+ }).toThrow(ConfigValidationError);
176
+ });
177
+ });
178
+ describe("boolean", () => {
179
+ it("transforms string to boolean", () => {
180
+ const schema = z.object({
181
+ DEBUG: EnvTransforms.boolean,
182
+ VERBOSE: EnvTransforms.boolean,
183
+ });
184
+ const config = new ConfigService(schema, {
185
+ DEBUG: "true",
186
+ VERBOSE: "1",
187
+ });
188
+ expect(config.get("DEBUG")).toBe(true);
189
+ expect(config.get("VERBOSE")).toBe(true);
190
+ });
191
+ it("defaults to false", () => {
192
+ const schema = z.object({
193
+ DEBUG: EnvTransforms.boolean,
194
+ });
195
+ const config = new ConfigService(schema, {});
196
+ expect(config.get("DEBUG")).toBe(false);
197
+ });
198
+ it("treats any string except 'true' or '1' as false", () => {
199
+ const schema = z.object({
200
+ FLAG: EnvTransforms.boolean,
201
+ });
202
+ const config = new ConfigService(schema, { FLAG: "false" });
203
+ expect(config.get("FLAG")).toBe(false);
204
+ });
205
+ });
206
+ describe("number", () => {
207
+ it("transforms string to number", () => {
208
+ const schema = z.object({
209
+ TIMEOUT: EnvTransforms.number,
210
+ });
211
+ const config = new ConfigService(schema, { TIMEOUT: "5000" });
212
+ expect(config.get("TIMEOUT")).toBe(5000);
213
+ });
214
+ it("handles decimal numbers", () => {
215
+ const schema = z.object({
216
+ RATE: EnvTransforms.number,
217
+ });
218
+ const config = new ConfigService(schema, { RATE: "0.5" });
219
+ expect(config.get("RATE")).toBe(0.5);
220
+ });
221
+ it("rejects invalid numbers", () => {
222
+ const schema = z.object({
223
+ VALUE: EnvTransforms.number,
224
+ });
225
+ expect(() => {
226
+ new ConfigService(schema, { VALUE: "not-a-number" });
227
+ }).toThrow();
228
+ });
229
+ });
230
+ describe("list", () => {
231
+ it("splits comma-separated values", () => {
232
+ const schema = z.object({
233
+ HOSTS: EnvTransforms.list,
234
+ });
235
+ const config = new ConfigService(schema, {
236
+ HOSTS: "host1, host2, host3",
237
+ });
238
+ expect(config.get("HOSTS")).toEqual(["host1", "host2", "host3"]);
239
+ });
240
+ it("filters out empty values", () => {
241
+ const schema = z.object({
242
+ ITEMS: EnvTransforms.list,
243
+ });
244
+ const config = new ConfigService(schema, {
245
+ ITEMS: "item1,, item2, , item3",
246
+ });
247
+ expect(config.get("ITEMS")).toEqual(["item1", "item2", "item3"]);
248
+ });
249
+ });
250
+ describe("json", () => {
251
+ it("parses and validates JSON", () => {
252
+ const schema = z.object({
253
+ CONFIG: EnvTransforms.json(z.object({
254
+ timeout: z.number(),
255
+ retries: z.number(),
256
+ })),
257
+ });
258
+ const config = new ConfigService(schema, {
259
+ CONFIG: '{"timeout":5000,"retries":3}',
260
+ });
261
+ expect(config.get("CONFIG")).toEqual({ timeout: 5000, retries: 3 });
262
+ });
263
+ it("rejects invalid JSON structure", () => {
264
+ const schema = z.object({
265
+ CONFIG: EnvTransforms.json(z.object({
266
+ timeout: z.number(),
267
+ })),
268
+ });
269
+ expect(() => {
270
+ new ConfigService(schema, { CONFIG: '{"timeout":"not-a-number"}' });
271
+ }).toThrow();
272
+ });
273
+ });
274
+ });
275
+ describe("Common schemas", () => {
276
+ describe("CommonEnvSchema", () => {
277
+ it("validates common environment variables", () => {
278
+ const config = new ConfigService(CommonEnvSchema, {
279
+ NODE_ENV: "development",
280
+ PORT: "3000",
281
+ LOG_LEVEL: "info",
282
+ });
283
+ expect(config.get("NODE_ENV")).toBe("development");
284
+ expect(config.get("PORT")).toBe(3000);
285
+ expect(config.get("LOG_LEVEL")).toBe("info");
286
+ });
287
+ it("applies defaults", () => {
288
+ const config = new ConfigService(CommonEnvSchema, {});
289
+ expect(config.get("NODE_ENV")).toBe("development");
290
+ expect(config.get("PORT")).toBe(3000);
291
+ expect(config.get("LOG_LEVEL")).toBe("info");
292
+ });
293
+ });
294
+ describe("DatabaseEnvSchema", () => {
295
+ it("validates database configuration", () => {
296
+ const config = new ConfigService(DatabaseEnvSchema, {
297
+ DATABASE_URL: "postgresql://localhost:5432/mydb",
298
+ DATABASE_POOL_SIZE: "20",
299
+ DATABASE_TIMEOUT: "5000",
300
+ });
301
+ expect(config.get("DATABASE_URL")).toBe("postgresql://localhost:5432/mydb");
302
+ expect(config.get("DATABASE_POOL_SIZE")).toBe(20);
303
+ expect(config.get("DATABASE_TIMEOUT")).toBe(5000);
304
+ });
305
+ it("rejects invalid database URL", () => {
306
+ expect(() => {
307
+ new ConfigService(DatabaseEnvSchema, {
308
+ DATABASE_URL: "not-a-url",
309
+ });
310
+ }).toThrow(ConfigValidationError);
311
+ });
312
+ });
313
+ describe("JwtEnvSchema", () => {
314
+ it("validates JWT configuration", () => {
315
+ const config = new ConfigService(JwtEnvSchema, {
316
+ JWT_SECRET: "this-is-a-very-long-secret-key-at-least-32-chars",
317
+ JWT_EXPIRES_IN: "2h",
318
+ });
319
+ expect(config.get("JWT_SECRET")).toBe("this-is-a-very-long-secret-key-at-least-32-chars");
320
+ expect(config.get("JWT_EXPIRES_IN")).toBe("2h");
321
+ });
322
+ it("rejects short JWT secret", () => {
323
+ expect(() => {
324
+ new ConfigService(JwtEnvSchema, {
325
+ JWT_SECRET: "too-short",
326
+ });
327
+ }).toThrow(ConfigValidationError);
328
+ });
329
+ it("applies default expiration", () => {
330
+ const config = new ConfigService(JwtEnvSchema, {
331
+ JWT_SECRET: "this-is-a-very-long-secret-key-at-least-32-chars",
332
+ });
333
+ expect(config.get("JWT_EXPIRES_IN")).toBe("1h");
334
+ });
335
+ });
336
+ });
337
+ describe("Schema composition", () => {
338
+ it("combines multiple schemas", () => {
339
+ const CustomSchema = CommonEnvSchema.extend({
340
+ API_KEY: z.string().min(1),
341
+ MAX_REQUESTS: EnvTransforms.number,
342
+ });
343
+ const config = new ConfigService(CustomSchema, {
344
+ NODE_ENV: "production",
345
+ PORT: "8080",
346
+ LOG_LEVEL: "warn",
347
+ API_KEY: "my-api-key",
348
+ MAX_REQUESTS: "100",
349
+ });
350
+ expect(config.get("NODE_ENV")).toBe("production");
351
+ expect(config.get("PORT")).toBe(8080);
352
+ expect(config.get("API_KEY")).toBe("my-api-key");
353
+ expect(config.get("MAX_REQUESTS")).toBe(100);
354
+ });
355
+ it("merges multiple schemas", () => {
356
+ const AppEnvSchema = CommonEnvSchema.merge(JwtEnvSchema);
357
+ const config = new ConfigService(AppEnvSchema, {
358
+ NODE_ENV: "development",
359
+ PORT: "3000",
360
+ LOG_LEVEL: "debug",
361
+ JWT_SECRET: "this-is-a-very-long-secret-key-at-least-32-chars",
362
+ });
363
+ expect(config.get("NODE_ENV")).toBe("development");
364
+ expect(config.get("JWT_SECRET")).toBe("this-is-a-very-long-secret-key-at-least-32-chars");
365
+ });
366
+ });
367
+ //# sourceMappingURL=env-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-config.test.js","sourceRoot":"","sources":["../../src/__tests__/env-config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import "reflect-metadata";
@@ -0,0 +1,207 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import "reflect-metadata";
11
+ import { describe, it, expect, afterEach } from "bun:test";
12
+ import { CinnabunApplication } from "../core/app.js";
13
+ import { RestController } from "../decorators/rest-controller.js";
14
+ import { GetMapping } from "../decorators/routes.js";
15
+ import { HttpException, BadRequestException, UnauthorizedException, ForbiddenException, NotFoundException, ConflictException, InternalServerErrorException, } from "../exceptions/http-exception.js";
16
+ let app = null;
17
+ afterEach(async () => {
18
+ if (app) {
19
+ await app.close();
20
+ app = null;
21
+ }
22
+ });
23
+ function url(path) {
24
+ return `http://localhost:${app.getPort()}${path}`;
25
+ }
26
+ describe("HttpException", () => {
27
+ it("toJSON returns correct shape", () => {
28
+ const ex = new HttpException(418, "I'm a teapot");
29
+ expect(ex.toJSON()).toEqual({
30
+ statusCode: 418,
31
+ message: "I'm a teapot",
32
+ error: "Error",
33
+ });
34
+ });
35
+ it("has correct statusCode and message", () => {
36
+ const ex = new BadRequestException("missing field");
37
+ expect(ex.statusCode).toBe(400);
38
+ expect(ex.message).toBe("missing field");
39
+ });
40
+ it("uses default messages", () => {
41
+ expect(new BadRequestException().message).toBe("Bad Request");
42
+ expect(new UnauthorizedException().message).toBe("Unauthorized");
43
+ expect(new ForbiddenException().message).toBe("Forbidden");
44
+ expect(new NotFoundException().message).toBe("The requested resource was not found");
45
+ expect(new ConflictException().message).toBe("Conflict");
46
+ expect(new InternalServerErrorException().message).toBe("Internal Server Error");
47
+ });
48
+ it("is an instance of Error", () => {
49
+ const ex = new NotFoundException();
50
+ expect(ex).toBeInstanceOf(Error);
51
+ expect(ex).toBeInstanceOf(HttpException);
52
+ expect(ex).toBeInstanceOf(NotFoundException);
53
+ });
54
+ });
55
+ describe("exception handling in routes", () => {
56
+ it("returns structured error for HttpException", async () => {
57
+ let FailController = class FailController {
58
+ fail() {
59
+ throw new BadRequestException("missing field");
60
+ }
61
+ };
62
+ __decorate([
63
+ GetMapping("/"),
64
+ __metadata("design:type", Function),
65
+ __metadata("design:paramtypes", []),
66
+ __metadata("design:returntype", void 0)
67
+ ], FailController.prototype, "fail", null);
68
+ FailController = __decorate([
69
+ RestController("/fail")
70
+ ], FailController);
71
+ app = await CinnabunApplication.create({ controllers: [FailController] });
72
+ await app.listen(0);
73
+ const res = await fetch(url("/fail/"));
74
+ expect(res.status).toBe(400);
75
+ const body = await res.json();
76
+ expect(body).toEqual({
77
+ statusCode: 400,
78
+ message: "missing field",
79
+ error: "Bad Request",
80
+ });
81
+ });
82
+ it("returns 404 with structured body for unknown routes", async () => {
83
+ app = await CinnabunApplication.create({ controllers: [] });
84
+ await app.listen(0);
85
+ const res = await fetch(url("/nonexistent"));
86
+ expect(res.status).toBe(404);
87
+ const body = await res.json();
88
+ expect(body).toEqual({
89
+ statusCode: 404,
90
+ message: "The requested resource was not found",
91
+ error: "Not Found",
92
+ });
93
+ });
94
+ it("returns 500 for unexpected errors without leaking details", async () => {
95
+ let CrashController = class CrashController {
96
+ crash() {
97
+ throw new Error("database password is xyz");
98
+ }
99
+ };
100
+ __decorate([
101
+ GetMapping("/"),
102
+ __metadata("design:type", Function),
103
+ __metadata("design:paramtypes", []),
104
+ __metadata("design:returntype", void 0)
105
+ ], CrashController.prototype, "crash", null);
106
+ CrashController = __decorate([
107
+ RestController("/crash")
108
+ ], CrashController);
109
+ app = await CinnabunApplication.create({ controllers: [CrashController] });
110
+ await app.listen(0);
111
+ const res = await fetch(url("/crash/"));
112
+ expect(res.status).toBe(500);
113
+ const body = await res.json();
114
+ expect(body.statusCode).toBe(500);
115
+ expect(body.message).toBe("Internal Server Error");
116
+ expect(body.error).toBe("Internal Server Error");
117
+ expect(body.errorId).toBeDefined();
118
+ // In development mode, details may be included but sensitive data should be in logs only
119
+ if (process.env.NODE_ENV !== "production") {
120
+ expect(body.details).toBeDefined();
121
+ }
122
+ });
123
+ it("handles async controller errors", async () => {
124
+ let AsyncController = class AsyncController {
125
+ async fail() {
126
+ throw new NotFoundException("Resource");
127
+ }
128
+ };
129
+ __decorate([
130
+ GetMapping("/"),
131
+ __metadata("design:type", Function),
132
+ __metadata("design:paramtypes", []),
133
+ __metadata("design:returntype", Promise)
134
+ ], AsyncController.prototype, "fail", null);
135
+ AsyncController = __decorate([
136
+ RestController("/async-fail")
137
+ ], AsyncController);
138
+ app = await CinnabunApplication.create({ controllers: [AsyncController] });
139
+ await app.listen(0);
140
+ const res = await fetch(url("/async-fail/"));
141
+ expect(res.status).toBe(404);
142
+ const body = await res.json();
143
+ expect(body).toEqual({
144
+ statusCode: 404,
145
+ message: "Resource not found",
146
+ error: "Not Found",
147
+ });
148
+ });
149
+ it("handles all built-in exception types", async () => {
150
+ let ExController = class ExController {
151
+ unauth() {
152
+ throw new UnauthorizedException("bad token");
153
+ }
154
+ forbidden() {
155
+ throw new ForbiddenException("no access");
156
+ }
157
+ conflict() {
158
+ throw new ConflictException("duplicate");
159
+ }
160
+ };
161
+ __decorate([
162
+ GetMapping("/401"),
163
+ __metadata("design:type", Function),
164
+ __metadata("design:paramtypes", []),
165
+ __metadata("design:returntype", void 0)
166
+ ], ExController.prototype, "unauth", null);
167
+ __decorate([
168
+ GetMapping("/403"),
169
+ __metadata("design:type", Function),
170
+ __metadata("design:paramtypes", []),
171
+ __metadata("design:returntype", void 0)
172
+ ], ExController.prototype, "forbidden", null);
173
+ __decorate([
174
+ GetMapping("/409"),
175
+ __metadata("design:type", Function),
176
+ __metadata("design:paramtypes", []),
177
+ __metadata("design:returntype", void 0)
178
+ ], ExController.prototype, "conflict", null);
179
+ ExController = __decorate([
180
+ RestController("/ex")
181
+ ], ExController);
182
+ app = await CinnabunApplication.create({ controllers: [ExController] });
183
+ await app.listen(0);
184
+ const res401 = await fetch(url("/ex/401"));
185
+ expect(res401.status).toBe(401);
186
+ expect(await res401.json()).toEqual({
187
+ statusCode: 401,
188
+ message: "bad token",
189
+ error: "Unauthorized",
190
+ });
191
+ const res403 = await fetch(url("/ex/403"));
192
+ expect(res403.status).toBe(403);
193
+ expect(await res403.json()).toEqual({
194
+ statusCode: 403,
195
+ message: "no access",
196
+ error: "Forbidden",
197
+ });
198
+ const res409 = await fetch(url("/ex/409"));
199
+ expect(res409.status).toBe(409);
200
+ expect(await res409.json()).toEqual({
201
+ statusCode: 409,
202
+ message: "duplicate",
203
+ error: "Conflict",
204
+ });
205
+ });
206
+ });
207
+ //# sourceMappingURL=exception.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exception.test.js","sourceRoot":"","sources":["../../src/__tests__/exception.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import "reflect-metadata";