@carno.js/core 0.2.11 → 1.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 (314) hide show
  1. package/LICENSE +673 -673
  2. package/README.md +188 -0
  3. package/dist/Carno.js +272 -333
  4. package/dist/Carno.mjs +268 -0
  5. package/dist/DefaultRoutes.js +51 -0
  6. package/dist/DefaultRoutes.mjs +34 -0
  7. package/dist/bun/index.js +183 -0
  8. package/dist/bun/index.js.map +86 -0
  9. package/dist/cache/CacheDriver.js +13 -0
  10. package/dist/cache/CacheDriver.mjs +0 -0
  11. package/dist/cache/CacheService.js +113 -0
  12. package/dist/cache/CacheService.mjs +93 -0
  13. package/dist/cache/MemoryDriver.js +66 -0
  14. package/dist/cache/MemoryDriver.mjs +46 -0
  15. package/dist/cache/RedisDriver.js +81 -0
  16. package/dist/cache/RedisDriver.mjs +61 -0
  17. package/dist/compiler/JITCompiler.js +111 -0
  18. package/dist/compiler/JITCompiler.mjs +89 -0
  19. package/dist/container/Container.js +99 -0
  20. package/dist/container/Container.mjs +78 -0
  21. package/dist/context/Context.js +97 -0
  22. package/dist/context/Context.mjs +77 -0
  23. package/dist/cors/CorsHandler.js +90 -0
  24. package/dist/cors/CorsHandler.mjs +68 -0
  25. package/dist/decorators/Controller.js +42 -0
  26. package/dist/decorators/Controller.mjs +22 -0
  27. package/dist/decorators/Inject.js +30 -0
  28. package/dist/decorators/Inject.mjs +10 -0
  29. package/dist/decorators/Middleware.js +35 -0
  30. package/dist/decorators/Middleware.mjs +15 -0
  31. package/dist/decorators/Service.js +31 -0
  32. package/dist/decorators/Service.mjs +12 -0
  33. package/dist/decorators/methods.js +60 -0
  34. package/dist/decorators/methods.mjs +34 -0
  35. package/dist/decorators/params.js +63 -0
  36. package/dist/decorators/params.mjs +37 -0
  37. package/dist/events/Lifecycle.js +69 -0
  38. package/dist/events/Lifecycle.mjs +41 -0
  39. package/dist/exceptions/HttpException.js +112 -26
  40. package/dist/exceptions/HttpException.mjs +82 -0
  41. package/dist/index.js +129 -31
  42. package/dist/index.mjs +94 -0
  43. package/dist/metadata.js +34 -0
  44. package/dist/metadata.mjs +9 -0
  45. package/dist/middleware/CarnoMiddleware.js +13 -0
  46. package/dist/middleware/CarnoMiddleware.mjs +0 -0
  47. package/dist/router/RadixRouter.js +121 -0
  48. package/dist/router/RadixRouter.mjs +101 -0
  49. package/dist/testing/TestHarness.js +81 -0
  50. package/dist/testing/TestHarness.mjs +60 -0
  51. package/dist/utils/Metadata.js +53 -0
  52. package/dist/utils/Metadata.mjs +31 -0
  53. package/dist/validation/ValibotAdapter.js +67 -0
  54. package/dist/validation/ValibotAdapter.mjs +48 -0
  55. package/dist/validation/ValidatorAdapter.js +35 -19
  56. package/dist/validation/ValidatorAdapter.mjs +14 -0
  57. package/dist/validation/ZodAdapter.js +80 -0
  58. package/dist/validation/ZodAdapter.mjs +59 -0
  59. package/package.json +21 -63
  60. package/src/Carno.ts +605 -0
  61. package/src/DefaultRoutes.ts +34 -0
  62. package/src/cache/CacheDriver.ts +50 -0
  63. package/src/cache/CacheService.ts +139 -0
  64. package/src/cache/MemoryDriver.ts +104 -0
  65. package/src/cache/RedisDriver.ts +116 -0
  66. package/src/compiler/JITCompiler.ts +167 -0
  67. package/src/container/Container.ts +168 -0
  68. package/src/context/Context.ts +128 -0
  69. package/src/cors/CorsHandler.ts +145 -0
  70. package/src/decorators/Controller.ts +63 -0
  71. package/src/decorators/Inject.ts +16 -0
  72. package/src/decorators/Middleware.ts +22 -0
  73. package/src/decorators/Service.ts +18 -0
  74. package/src/decorators/methods.ts +58 -0
  75. package/src/decorators/params.ts +47 -0
  76. package/src/events/Lifecycle.ts +97 -0
  77. package/src/exceptions/HttpException.ts +99 -0
  78. package/src/index.ts +92 -0
  79. package/src/metadata.ts +46 -0
  80. package/src/middleware/CarnoMiddleware.ts +14 -0
  81. package/src/router/RadixRouter.ts +225 -0
  82. package/src/testing/TestHarness.ts +177 -0
  83. package/src/utils/Metadata.ts +43 -0
  84. package/src/validation/ValibotAdapter.ts +95 -0
  85. package/src/validation/ValidatorAdapter.ts +69 -0
  86. package/src/validation/ZodAdapter.ts +102 -0
  87. package/dist/Carno.d.ts +0 -75
  88. package/dist/cache/bento-cache.driver.d.ts +0 -13
  89. package/dist/cache/bento-cache.driver.js +0 -55
  90. package/dist/cache/cache.service.d.ts +0 -8
  91. package/dist/cache/cache.service.js +0 -6
  92. package/dist/commons/decorators/Injectable.decorator.d.ts +0 -20
  93. package/dist/commons/decorators/Injectable.decorator.js +0 -33
  94. package/dist/commons/decorators/controller.decorator.d.ts +0 -8
  95. package/dist/commons/decorators/controller.decorator.js +0 -22
  96. package/dist/commons/decorators/http.decorators.d.ts +0 -13
  97. package/dist/commons/decorators/http.decorators.js +0 -63
  98. package/dist/commons/decorators/index.d.ts +0 -6
  99. package/dist/commons/decorators/index.js +0 -22
  100. package/dist/commons/decorators/inject.decorator.d.ts +0 -1
  101. package/dist/commons/decorators/inject.decorator.js +0 -5
  102. package/dist/commons/decorators/middleware.decorator.d.ts +0 -2
  103. package/dist/commons/decorators/middleware.decorator.js +0 -30
  104. package/dist/commons/decorators/service.decorator.d.ts +0 -2
  105. package/dist/commons/decorators/service.decorator.js +0 -7
  106. package/dist/commons/decorators/validation.decorator.d.ts +0 -32
  107. package/dist/commons/decorators/validation.decorator.js +0 -40
  108. package/dist/commons/http-code.enum.d.ts +0 -50
  109. package/dist/commons/http-code.enum.js +0 -54
  110. package/dist/commons/index.d.ts +0 -3
  111. package/dist/commons/index.js +0 -19
  112. package/dist/commons/registries/ProviderControl.d.ts +0 -77
  113. package/dist/commons/registries/ProviderControl.js +0 -112
  114. package/dist/commons/registries/ProviderRegistry.d.ts +0 -7
  115. package/dist/commons/registries/ProviderRegistry.js +0 -20
  116. package/dist/constants.d.ts +0 -8
  117. package/dist/constants.js +0 -11
  118. package/dist/container/ContainerConfiguration.d.ts +0 -45
  119. package/dist/container/ContainerConfiguration.js +0 -121
  120. package/dist/container/DependencyResolver.d.ts +0 -20
  121. package/dist/container/DependencyResolver.js +0 -85
  122. package/dist/container/InjectorService.d.ts +0 -58
  123. package/dist/container/InjectorService.js +0 -286
  124. package/dist/container/MethodInvoker.d.ts +0 -21
  125. package/dist/container/MethodInvoker.js +0 -83
  126. package/dist/container/RouteResolver.d.ts +0 -27
  127. package/dist/container/RouteResolver.js +0 -173
  128. package/dist/container/container.d.ts +0 -41
  129. package/dist/container/container.js +0 -71
  130. package/dist/container/createContainer.d.ts +0 -3
  131. package/dist/container/createContainer.js +0 -12
  132. package/dist/container/createInjector.d.ts +0 -2
  133. package/dist/container/createInjector.js +0 -7
  134. package/dist/container/index.d.ts +0 -6
  135. package/dist/container/index.js +0 -22
  136. package/dist/container/middleware.resolver.d.ts +0 -9
  137. package/dist/container/middleware.resolver.js +0 -35
  138. package/dist/default-routes-carno.d.ts +0 -3
  139. package/dist/default-routes-carno.js +0 -29
  140. package/dist/domain/BaseContext.d.ts +0 -15
  141. package/dist/domain/BaseContext.js +0 -2
  142. package/dist/domain/CarnoClosure.d.ts +0 -1
  143. package/dist/domain/CarnoClosure.js +0 -2
  144. package/dist/domain/CarnoMiddleware.d.ts +0 -5
  145. package/dist/domain/CarnoMiddleware.js +0 -2
  146. package/dist/domain/Context.d.ts +0 -58
  147. package/dist/domain/Context.js +0 -188
  148. package/dist/domain/FastContext.d.ts +0 -34
  149. package/dist/domain/FastContext.js +0 -59
  150. package/dist/domain/LocalsContainer.d.ts +0 -4
  151. package/dist/domain/LocalsContainer.js +0 -10
  152. package/dist/domain/Metadata.d.ts +0 -449
  153. package/dist/domain/Metadata.js +0 -511
  154. package/dist/domain/cors-config.d.ts +0 -12
  155. package/dist/domain/cors-config.js +0 -18
  156. package/dist/domain/cors-headers-cache.d.ts +0 -17
  157. package/dist/domain/cors-headers-cache.js +0 -101
  158. package/dist/domain/http-method.d.ts +0 -7
  159. package/dist/domain/http-method.js +0 -11
  160. package/dist/domain/index.d.ts +0 -10
  161. package/dist/domain/index.js +0 -26
  162. package/dist/domain/provider-scope.d.ts +0 -5
  163. package/dist/domain/provider-scope.js +0 -9
  164. package/dist/domain/provider-type.d.ts +0 -6
  165. package/dist/domain/provider-type.js +0 -10
  166. package/dist/domain/provider.d.ts +0 -37
  167. package/dist/domain/provider.js +0 -70
  168. package/dist/events/hooks.decorator.d.ts +0 -3
  169. package/dist/events/hooks.decorator.js +0 -29
  170. package/dist/events/index.d.ts +0 -2
  171. package/dist/events/index.js +0 -18
  172. package/dist/events/on-event.d.ts +0 -13
  173. package/dist/events/on-event.js +0 -11
  174. package/dist/exceptions/HttpException.d.ts +0 -9
  175. package/dist/exceptions/index.d.ts +0 -1
  176. package/dist/exceptions/index.js +0 -17
  177. package/dist/index.d.ts +0 -16
  178. package/dist/route/CompiledRoute.d.ts +0 -23
  179. package/dist/route/CompiledRoute.js +0 -9
  180. package/dist/route/FastPathExecutor.d.ts +0 -12
  181. package/dist/route/FastPathExecutor.js +0 -50
  182. package/dist/route/JITCompiler.d.ts +0 -28
  183. package/dist/route/JITCompiler.js +0 -245
  184. package/dist/route/Matcher.d.ts +0 -11
  185. package/dist/route/Matcher.js +0 -48
  186. package/dist/route/ParamResolverFactory.d.ts +0 -14
  187. package/dist/route/ParamResolverFactory.js +0 -49
  188. package/dist/route/RouteCompiler.d.ts +0 -28
  189. package/dist/route/RouteCompiler.js +0 -157
  190. package/dist/route/RouteExecutor.d.ts +0 -12
  191. package/dist/route/RouteExecutor.js +0 -84
  192. package/dist/route/memoirist.d.ts +0 -31
  193. package/dist/route/memoirist.js +0 -373
  194. package/dist/services/logger.service.d.ts +0 -23
  195. package/dist/services/logger.service.js +0 -47
  196. package/dist/testing/core-testing.d.ts +0 -24
  197. package/dist/testing/core-testing.js +0 -102
  198. package/dist/testing/index.d.ts +0 -1
  199. package/dist/testing/index.js +0 -17
  200. package/dist/utils/ValidationCache.d.ts +0 -5
  201. package/dist/utils/ValidationCache.js +0 -35
  202. package/dist/utils/ancestorOf.d.ts +0 -2
  203. package/dist/utils/ancestorOf.js +0 -10
  204. package/dist/utils/ancestorsOf.d.ts +0 -6
  205. package/dist/utils/ancestorsOf.js +0 -20
  206. package/dist/utils/classOf.d.ts +0 -13
  207. package/dist/utils/classOf.js +0 -21
  208. package/dist/utils/cleanObject.d.ts +0 -6
  209. package/dist/utils/cleanObject.js +0 -22
  210. package/dist/utils/constructorOf.d.ts +0 -11
  211. package/dist/utils/constructorOf.js +0 -18
  212. package/dist/utils/createInstance.d.ts +0 -1
  213. package/dist/utils/createInstance.js +0 -7
  214. package/dist/utils/decoratorTypeOf.d.ts +0 -11
  215. package/dist/utils/decoratorTypeOf.js +0 -32
  216. package/dist/utils/deepClone.d.ts +0 -6
  217. package/dist/utils/deepClone.js +0 -63
  218. package/dist/utils/deepMerge.d.ts +0 -9
  219. package/dist/utils/deepMerge.js +0 -62
  220. package/dist/utils/descriptorOf.d.ts +0 -8
  221. package/dist/utils/descriptorOf.js +0 -16
  222. package/dist/utils/formatValidationErrors.d.ts +0 -5
  223. package/dist/utils/formatValidationErrors.js +0 -80
  224. package/dist/utils/getClassOrSymbol.d.ts +0 -1
  225. package/dist/utils/getClassOrSymbol.js +0 -8
  226. package/dist/utils/getConstructorArgNames.d.ts +0 -1
  227. package/dist/utils/getConstructorArgNames.js +0 -12
  228. package/dist/utils/getMethodArgTypes.d.ts +0 -1
  229. package/dist/utils/getMethodArgTypes.js +0 -9
  230. package/dist/utils/getValue.d.ts +0 -32
  231. package/dist/utils/getValue.js +0 -47
  232. package/dist/utils/hasJsonMethod.d.ts +0 -1
  233. package/dist/utils/hasJsonMethod.js +0 -6
  234. package/dist/utils/index.d.ts +0 -15
  235. package/dist/utils/index.js +0 -31
  236. package/dist/utils/isArray.d.ts +0 -13
  237. package/dist/utils/isArray.js +0 -21
  238. package/dist/utils/isArrowFn.d.ts +0 -1
  239. package/dist/utils/isArrowFn.js +0 -7
  240. package/dist/utils/isBoolean.d.ts +0 -7
  241. package/dist/utils/isBoolean.js +0 -15
  242. package/dist/utils/isBuffer.d.ts +0 -7
  243. package/dist/utils/isBuffer.js +0 -19
  244. package/dist/utils/isClass.d.ts +0 -1
  245. package/dist/utils/isClass.js +0 -26
  246. package/dist/utils/isCollection.d.ts +0 -6
  247. package/dist/utils/isCollection.js +0 -20
  248. package/dist/utils/isDate.d.ts +0 -6
  249. package/dist/utils/isDate.js +0 -11
  250. package/dist/utils/isEmpty.d.ts +0 -6
  251. package/dist/utils/isEmpty.js +0 -12
  252. package/dist/utils/isFunction.d.ts +0 -1
  253. package/dist/utils/isFunction.js +0 -6
  254. package/dist/utils/isInheritedFrom.d.ts +0 -1
  255. package/dist/utils/isInheritedFrom.js +0 -24
  256. package/dist/utils/isMomentObject.d.ts +0 -1
  257. package/dist/utils/isMomentObject.js +0 -6
  258. package/dist/utils/isMongooseObject.d.ts +0 -2
  259. package/dist/utils/isMongooseObject.js +0 -11
  260. package/dist/utils/isNil.d.ts +0 -1
  261. package/dist/utils/isNil.js +0 -6
  262. package/dist/utils/isNumber.d.ts +0 -7
  263. package/dist/utils/isNumber.js +0 -15
  264. package/dist/utils/isObject.d.ts +0 -1
  265. package/dist/utils/isObject.js +0 -6
  266. package/dist/utils/isObservable.d.ts +0 -1
  267. package/dist/utils/isObservable.js +0 -6
  268. package/dist/utils/isPlainObject.d.ts +0 -7
  269. package/dist/utils/isPlainObject.js +0 -16
  270. package/dist/utils/isPrimitive.d.ts +0 -14
  271. package/dist/utils/isPrimitive.js +0 -28
  272. package/dist/utils/isPrimitiveType.d.ts +0 -1
  273. package/dist/utils/isPrimitiveType.js +0 -11
  274. package/dist/utils/isPromise.d.ts +0 -7
  275. package/dist/utils/isPromise.js +0 -14
  276. package/dist/utils/isProtectedKey.d.ts +0 -5
  277. package/dist/utils/isProtectedKey.js +0 -10
  278. package/dist/utils/isRegExp.d.ts +0 -1
  279. package/dist/utils/isRegExp.js +0 -6
  280. package/dist/utils/isRequestScope.d.ts +0 -11
  281. package/dist/utils/isRequestScope.js +0 -23
  282. package/dist/utils/isSerializable.d.ts +0 -1
  283. package/dist/utils/isSerializable.js +0 -11
  284. package/dist/utils/isStream.d.ts +0 -1
  285. package/dist/utils/isStream.js +0 -6
  286. package/dist/utils/isString.d.ts +0 -6
  287. package/dist/utils/isString.js +0 -14
  288. package/dist/utils/isSymbol.d.ts +0 -6
  289. package/dist/utils/isSymbol.js +0 -14
  290. package/dist/utils/methodsOf.d.ts +0 -9
  291. package/dist/utils/methodsOf.js +0 -24
  292. package/dist/utils/nameOf.d.ts +0 -14
  293. package/dist/utils/nameOf.js +0 -31
  294. package/dist/utils/objectKeys.d.ts +0 -1
  295. package/dist/utils/objectKeys.js +0 -7
  296. package/dist/utils/primitiveOf.d.ts +0 -1
  297. package/dist/utils/primitiveOf.js +0 -18
  298. package/dist/utils/prototypeOf.d.ts +0 -6
  299. package/dist/utils/prototypeOf.js +0 -12
  300. package/dist/utils/setValue.d.ts +0 -1
  301. package/dist/utils/setValue.js +0 -32
  302. package/dist/utils/toMap.d.ts +0 -3
  303. package/dist/utils/toMap.js +0 -34
  304. package/dist/utils/toStringConstructor.d.ts +0 -1
  305. package/dist/utils/toStringConstructor.js +0 -10
  306. package/dist/validation/ValidatorAdapter.d.ts +0 -66
  307. package/dist/validation/adapters/ClassValidatorAdapter.d.ts +0 -23
  308. package/dist/validation/adapters/ClassValidatorAdapter.js +0 -47
  309. package/dist/validation/adapters/ZodAdapter.d.ts +0 -14
  310. package/dist/validation/adapters/ZodAdapter.js +0 -56
  311. package/dist/validation/adapters/index.d.ts +0 -4
  312. package/dist/validation/adapters/index.js +0 -7
  313. package/dist/validation/index.d.ts +0 -3
  314. package/dist/validation/index.js +0 -20
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Validation result type.
3
+ */
4
+ export interface ValidationResult<T = any> {
5
+ success: boolean;
6
+ data?: T;
7
+ errors?: ValidationError[];
8
+ }
9
+
10
+ export interface ValidationError {
11
+ path: string;
12
+ message: string;
13
+ }
14
+
15
+ /**
16
+ * Base interface for validation adapters.
17
+ * Adapters provide validation capabilities for different libraries.
18
+ */
19
+ export interface ValidatorAdapter {
20
+ /**
21
+ * Validator name for debugging.
22
+ */
23
+ readonly name: string;
24
+
25
+ /**
26
+ * Check if a target has validation schema.
27
+ */
28
+ hasValidation(target: any): boolean;
29
+
30
+ /**
31
+ * Validate and transform a value.
32
+ * Returns result object instead of throwing for better performance.
33
+ */
34
+ validate<T>(target: any, value: unknown): ValidationResult<T>;
35
+
36
+ /**
37
+ * Validate and transform, throwing on error.
38
+ * Used when you want to short-circuit on failure.
39
+ */
40
+ validateOrThrow<T>(target: any, value: unknown): T;
41
+ }
42
+
43
+ /**
44
+ * Validation configuration for Turbo.
45
+ */
46
+ export interface ValidationConfig {
47
+ adapter: ValidatorAdapter;
48
+ }
49
+
50
+ /**
51
+ * Symbol for storing validation schema on DTOs.
52
+ */
53
+ export const VALIDATION_SCHEMA = Symbol('turbo:validation');
54
+
55
+ /**
56
+ * Decorator to attach a validation schema to a DTO class.
57
+ */
58
+ export function Schema(schema: any): ClassDecorator {
59
+ return (target) => {
60
+ Reflect.defineMetadata(VALIDATION_SCHEMA, schema, target);
61
+ };
62
+ }
63
+
64
+ /**
65
+ * Get the validation schema from a DTO class.
66
+ */
67
+ export function getSchema(target: any): any | undefined {
68
+ return Reflect.getMetadata(VALIDATION_SCHEMA, target);
69
+ }
@@ -0,0 +1,102 @@
1
+ import type { ValidatorAdapter, ValidationResult, ValidationError } from './ValidatorAdapter';
2
+ import { VALIDATION_SCHEMA, getSchema } from './ValidatorAdapter';
3
+
4
+ /**
5
+ * Zod Adapter - Default validation adapter for Turbo.
6
+ *
7
+ * Usage:
8
+ * ```typescript
9
+ * import { z } from 'zod';
10
+ *
11
+ * @Schema(z.object({
12
+ * name: z.string().min(1),
13
+ * email: z.string().email()
14
+ * }))
15
+ * class CreateUserDto {
16
+ * name: string;
17
+ * email: string;
18
+ * }
19
+ * ```
20
+ */
21
+ export class ZodAdapter implements ValidatorAdapter {
22
+ readonly name = 'ZodAdapter';
23
+
24
+ // Cache parsed schemas for performance
25
+ private schemaCache = new Map<any, any>();
26
+
27
+ hasValidation(target: any): boolean {
28
+ return getSchema(target) !== undefined;
29
+ }
30
+
31
+ validate<T>(target: any, value: unknown): ValidationResult<T> {
32
+ const schema = this.getOrCacheSchema(target);
33
+
34
+ if (!schema) {
35
+ return { success: true, data: value as T };
36
+ }
37
+
38
+ const result = schema.safeParse(value);
39
+
40
+ if (result.success) {
41
+ return { success: true, data: result.data };
42
+ }
43
+
44
+ return {
45
+ success: false,
46
+ errors: this.formatErrors(result.error)
47
+ };
48
+ }
49
+
50
+ validateOrThrow<T>(target: any, value: unknown): T {
51
+ const schema = this.getOrCacheSchema(target);
52
+
53
+ if (!schema) {
54
+ return value as T;
55
+ }
56
+
57
+ const result = schema.safeParse(value);
58
+
59
+ if (result.success) {
60
+ return result.data;
61
+ }
62
+
63
+ const errors = this.formatErrors(result.error);
64
+ throw new ValidationException(errors);
65
+ }
66
+
67
+ private getOrCacheSchema(target: any): any {
68
+ let schema = this.schemaCache.get(target);
69
+
70
+ if (schema === undefined) {
71
+ schema = getSchema(target) ?? null;
72
+ this.schemaCache.set(target, schema);
73
+ }
74
+
75
+ return schema;
76
+ }
77
+
78
+ private formatErrors(zodError: any): ValidationError[] {
79
+ return zodError.issues.map((issue: any) => ({
80
+ path: issue.path.join('.'),
81
+ message: issue.message
82
+ }));
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Validation exception thrown when validation fails.
88
+ */
89
+ export class ValidationException extends Error {
90
+ constructor(public readonly errors: ValidationError[]) {
91
+ super(`Validation failed: ${errors.map(e => `${e.path}: ${e.message}`).join(', ')}`);
92
+ this.name = 'ValidationException';
93
+ }
94
+
95
+ toResponse(): Response {
96
+ return Response.json({
97
+ statusCode: 400,
98
+ message: 'Validation failed',
99
+ errors: this.errors
100
+ }, { status: 400 });
101
+ }
102
+ }
package/dist/Carno.d.ts DELETED
@@ -1,75 +0,0 @@
1
- import { Server } from "bun";
2
- import * as pino from "pino";
3
- import type { ValidationConfig, ValidatorAdapterConstructor } from "./validation/ValidatorAdapter";
4
- import { TokenRouteWithProvider } from "./container/ContainerConfiguration";
5
- import { CorsConfig } from "./domain/cors-config";
6
- import Memoirist from "./route/memoirist";
7
- import { type CompiledRoute } from "./route/CompiledRoute";
8
- export interface ApplicationConfig<TAdapter extends ValidatorAdapterConstructor = ValidatorAdapterConstructor> {
9
- validation?: ValidationConfig<TAdapter>;
10
- logger?: pino.LoggerOptions;
11
- exports?: any[];
12
- providers?: any[];
13
- cors?: CorsConfig;
14
- globalMiddlewares?: any[];
15
- disableStartupLog?: boolean;
16
- }
17
- export declare class Carno<TAdapter extends ValidatorAdapterConstructor = ValidatorAdapterConstructor> {
18
- config: ApplicationConfig<TAdapter>;
19
- router: Memoirist<CompiledRoute | TokenRouteWithProvider>;
20
- private injector;
21
- private corsCache?;
22
- private readonly emptyLocals;
23
- private validatorAdapter;
24
- private corsEnabled;
25
- private hasOnRequestHook;
26
- private fetch;
27
- private server;
28
- constructor(config?: ApplicationConfig<TAdapter>);
29
- private resolveValidatorAdapter;
30
- /**
31
- * Use the Carno plugin.
32
- *
33
- * @param plugin
34
- */
35
- use(plugin: Carno): this;
36
- private findProviderInConfig;
37
- private getProviderToken;
38
- private shouldCloneProvider;
39
- private cloneProvider;
40
- /**
41
- * Set the custom logger provider.
42
- * The provider must be a class with the @Service() decorator.
43
- * The provider must extend the LoggerService class.
44
- *
45
- * @param provider
46
- */
47
- useLogger(provider: any): this;
48
- private loadProvidersAndControllers;
49
- private registerControllers;
50
- private registerMetadataProviders;
51
- private registerConfigProviders;
52
- private normalizeProvider;
53
- init(): Promise<void>;
54
- listen(port?: number): Promise<void>;
55
- private registerShutdownHandlers;
56
- getHttpServer(): Server<any>;
57
- getInjector(): import("./container").InjectorService;
58
- private createHttpServer;
59
- private fetcherAsync;
60
- private catcher;
61
- private bootstrapApplication;
62
- private handleShutdownHook;
63
- private closeHttpServer;
64
- private exitProcess;
65
- private reportHookFailure;
66
- private resolveLogger;
67
- private isCorsEnabled;
68
- private errorResponse;
69
- private handlePreflightRequest;
70
- private applyCorsHeaders;
71
- close(closeActiveConnections?: boolean): void;
72
- private resolveLocalsContainer;
73
- private buildLocalsContainer;
74
- private discoverRoutePath;
75
- }
@@ -1,13 +0,0 @@
1
- import { LoggerService } from '../services/logger.service';
2
- import { CacheService } from './cache.service';
3
- export declare class BentoCacheDriver extends CacheService {
4
- private readonly logger;
5
- private cache;
6
- constructor(logger: LoggerService);
7
- set(key: string, value: any, ttl?: number): Promise<boolean>;
8
- get(key: string): Promise<any>;
9
- del(key: string): Promise<boolean>;
10
- has(key: string): Promise<boolean>;
11
- clear(): Promise<void>;
12
- getOrSet(key: string, cb: () => Promise<any>, ttl?: number): Promise<any>;
13
- }
@@ -1,55 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.BentoCacheDriver = void 0;
13
- const service_decorator_1 = require("../commons/decorators/service.decorator");
14
- const logger_service_1 = require("../services/logger.service");
15
- const cache_service_1 = require("./cache.service");
16
- const bentocache_1 = require("bentocache");
17
- // @ts-ignore
18
- const memory_1 = require("bentocache/drivers/memory");
19
- let BentoCacheDriver = class BentoCacheDriver extends cache_service_1.CacheService {
20
- constructor(logger) {
21
- super();
22
- this.logger = logger;
23
- this.cache = new bentocache_1.BentoCache({
24
- //@ts-ignore
25
- logger: this.logger.getLogger(),
26
- default: 'defaultCache',
27
- stores: {
28
- defaultCache: (0, bentocache_1.bentostore)().useL1Layer(((0, memory_1.memoryDriver)({ maxSize: 10_000 }))), // TODO: Not default, custom with properties.
29
- }
30
- });
31
- }
32
- set(key, value, ttl) {
33
- return this.cache.set({ key, value, ttl: ttl ?? '1h' });
34
- }
35
- get(key) {
36
- return this.cache.get({ key });
37
- }
38
- del(key) {
39
- return this.cache.delete({ key });
40
- }
41
- has(key) {
42
- return this.cache.has({ key });
43
- }
44
- clear() {
45
- return this.cache.clear();
46
- }
47
- getOrSet(key, cb, ttl) {
48
- return this.cache.getOrSet({ key, factory: cb, ttl: ttl ?? '1h' });
49
- }
50
- };
51
- exports.BentoCacheDriver = BentoCacheDriver;
52
- exports.BentoCacheDriver = BentoCacheDriver = __decorate([
53
- (0, service_decorator_1.Service)({ provide: cache_service_1.CacheService }),
54
- __metadata("design:paramtypes", [logger_service_1.LoggerService])
55
- ], BentoCacheDriver);
@@ -1,8 +0,0 @@
1
- export declare abstract class CacheService {
2
- abstract set(key: string, value: any, ttl?: number): Promise<boolean>;
3
- abstract get(key: string): Promise<any>;
4
- abstract del(key: string): Promise<boolean>;
5
- abstract has(key: string): Promise<boolean>;
6
- abstract clear(): Promise<void>;
7
- abstract getOrSet<T>(key: string, cb: () => Promise<T>, ttl?: number): Promise<T>;
8
- }
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CacheService = void 0;
4
- class CacheService {
5
- }
6
- exports.CacheService = CacheService;
@@ -1,20 +0,0 @@
1
- import { Provider } from "../../domain/provider";
2
- /**
3
- * The decorators `@Injectable()` declare a new service can be injected in other service, controller, interceptor, etc.. on there `constructor`.
4
- * All classes annotated with `@Injectable()` are built one time, excepted if you change the default provider configuration.
5
- *
6
- * ::: tip
7
- * `@Injectable()` use the `reflect-metadata` to collect and inject the built provided to other services.
8
- * :::
9
- *
10
- * ### Options
11
- *
12
- * - type (@@ProviderType@@ or `string`): Kind of provider. (Default: `ProviderType.PROVIDER`)
13
- * - scope (@@ProviderScope@@): Kind of provider. (Default: `ProviderScope.SINGLETON`)
14
- * - provide (@@TokenProvider@@): An injection token (Note: This option override default metadata generated by Typescript).
15
- * - deps (`Type<any>`): List of class or provider which will be injected to the constructor (Note: This options override default metadata generated by Typescript).
16
- *
17
- * @returns {Function}
18
- * @decorator
19
- */
20
- export declare function Injectable(options?: Partial<Provider>): ClassDecorator;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Injectable = Injectable;
4
- const Metadata_1 = require("../../domain/Metadata");
5
- const constants_1 = require("../../constants");
6
- /**
7
- * The decorators `@Injectable()` declare a new service can be injected in other service, controller, interceptor, etc.. on there `constructor`.
8
- * All classes annotated with `@Injectable()` are built one time, excepted if you change the default provider configuration.
9
- *
10
- * ::: tip
11
- * `@Injectable()` use the `reflect-metadata` to collect and inject the built provided to other services.
12
- * :::
13
- *
14
- * ### Options
15
- *
16
- * - type (@@ProviderType@@ or `string`): Kind of provider. (Default: `ProviderType.PROVIDER`)
17
- * - scope (@@ProviderScope@@): Kind of provider. (Default: `ProviderScope.SINGLETON`)
18
- * - provide (@@TokenProvider@@): An injection token (Note: This option override default metadata generated by Typescript).
19
- * - deps (`Type<any>`): List of class or provider which will be injected to the constructor (Note: This options override default metadata generated by Typescript).
20
- *
21
- * @returns {Function}
22
- * @decorator
23
- */
24
- function Injectable(options = {}) {
25
- return (target) => {
26
- const providers = Metadata_1.Metadata.get(constants_1.PROVIDER, Reflect) || [];
27
- providers.push({
28
- ...options,
29
- ...(options.provide ? { useClass: target } : { provide: target }),
30
- });
31
- Metadata_1.Metadata.set(constants_1.PROVIDER, providers, Reflect);
32
- };
33
- }
@@ -1,8 +0,0 @@
1
- import { ProviderScope } from "../../domain/provider-scope";
2
- type ControllerOptions = {
3
- path?: string;
4
- scope?: ProviderScope;
5
- children?: any[];
6
- };
7
- export declare function Controller(pathOrOptions?: string | ControllerOptions): ClassDecorator;
8
- export {};
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Controller = Controller;
4
- const constants_1 = require("../../constants");
5
- const Metadata_1 = require("../../domain/Metadata");
6
- function normalizeOptions(pathOrOptions) {
7
- if (!pathOrOptions) {
8
- return {};
9
- }
10
- if (typeof pathOrOptions === 'string') {
11
- return { path: pathOrOptions };
12
- }
13
- return pathOrOptions;
14
- }
15
- function Controller(pathOrOptions) {
16
- return (target) => {
17
- const options = normalizeOptions(pathOrOptions);
18
- const controllers = Metadata_1.Metadata.get(constants_1.CONTROLLER, Reflect) || [];
19
- controllers.push({ provide: target, ...options });
20
- Metadata_1.Metadata.set(constants_1.CONTROLLER, controllers, Reflect);
21
- };
22
- }
@@ -1,13 +0,0 @@
1
- import { Context } from "../../domain/Context";
2
- export declare function createParamDecorator(func: (context: Context, data?: any) => any): (data?: any) => ParameterDecorator;
3
- export declare const Body: (data?: any) => ParameterDecorator;
4
- export declare const Query: (data?: any) => ParameterDecorator;
5
- export declare const Param: (data?: any) => ParameterDecorator;
6
- export declare const Req: (data?: any) => ParameterDecorator;
7
- export declare const Headers: (data?: any) => ParameterDecorator;
8
- export declare const Locals: (data?: any) => ParameterDecorator;
9
- export declare const Get: (path?: string) => MethodDecorator;
10
- export declare const Post: (path?: string) => MethodDecorator;
11
- export declare const Put: (path?: string) => MethodDecorator;
12
- export declare const Delete: (path?: string) => MethodDecorator;
13
- export declare const Patch: (path?: string) => MethodDecorator;
@@ -1,63 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Patch = exports.Delete = exports.Put = exports.Post = exports.Get = exports.Locals = exports.Headers = exports.Req = exports.Param = exports.Query = exports.Body = void 0;
4
- exports.createParamDecorator = createParamDecorator;
5
- const Metadata_1 = require("../../domain/Metadata");
6
- const constants_1 = require("../../constants");
7
- const PARAM_TYPE_KEY = "__carnoParamType";
8
- const markParamType = (func, paramType) => {
9
- func[PARAM_TYPE_KEY] = paramType;
10
- return func;
11
- };
12
- const createMethodDecorator = (methodType) => {
13
- return (path = "") => {
14
- return (target, propertyKey) => {
15
- const routes = [];
16
- if (!path.startsWith("/")) {
17
- path = `/${path}`;
18
- }
19
- if (Metadata_1.Metadata.has(constants_1.CONTROLLER_ROUTES, target)) {
20
- routes.push(...Metadata_1.Metadata.get(constants_1.CONTROLLER_ROUTES, target));
21
- }
22
- routes.push({
23
- method: methodType,
24
- path,
25
- methodName: propertyKey.toString(),
26
- middlewares: [],
27
- });
28
- Metadata_1.Metadata.set(constants_1.CONTROLLER_ROUTES, routes, target);
29
- };
30
- };
31
- };
32
- function createParamDecorator(func) {
33
- return (data) => (target, propertyKey, parameterIndex) => {
34
- const existingArgs = Metadata_1.Metadata.get(constants_1.ROUTE_PARAM, target.constructor, propertyKey) || {};
35
- existingArgs[parameterIndex] = {
36
- fun: func,
37
- param: data,
38
- type: func[PARAM_TYPE_KEY],
39
- };
40
- Metadata_1.Metadata.set(constants_1.ROUTE_PARAM, existingArgs, target.constructor, propertyKey);
41
- };
42
- }
43
- const bodyResolver = markParamType((context, data) => data ? context.body[data] : context.body || {}, "body");
44
- const queryResolver = markParamType((context, data) => data ? context.query[data] : context.query || {}, "query");
45
- const paramResolver = markParamType((context, data) => data ? context.param[data] : null, "param");
46
- const reqResolver = markParamType((context) => context.req, "req");
47
- const headersResolver = markParamType((context, data) => data
48
- ? context.headers.has(data)
49
- ? context.headers.get(data)
50
- : undefined
51
- : context.headers || {}, "headers");
52
- const localsResolver = markParamType((context) => context.locals || {}, "locals");
53
- exports.Body = createParamDecorator(bodyResolver);
54
- exports.Query = createParamDecorator(queryResolver);
55
- exports.Param = createParamDecorator(paramResolver);
56
- exports.Req = createParamDecorator(reqResolver);
57
- exports.Headers = createParamDecorator(headersResolver);
58
- exports.Locals = createParamDecorator(localsResolver);
59
- exports.Get = createMethodDecorator("GET");
60
- exports.Post = createMethodDecorator("POST");
61
- exports.Put = createMethodDecorator("PUT");
62
- exports.Delete = createMethodDecorator("DELETE");
63
- exports.Patch = createMethodDecorator("PATCH");
@@ -1,6 +0,0 @@
1
- export * from './controller.decorator';
2
- export * from './http.decorators';
3
- export * from './service.decorator';
4
- export * from './middleware.decorator';
5
- export * from './Injectable.decorator';
6
- export * from './validation.decorator';
@@ -1,22 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./controller.decorator"), exports);
18
- __exportStar(require("./http.decorators"), exports);
19
- __exportStar(require("./service.decorator"), exports);
20
- __exportStar(require("./middleware.decorator"), exports);
21
- __exportStar(require("./Injectable.decorator"), exports);
22
- __exportStar(require("./validation.decorator"), exports);
@@ -1 +0,0 @@
1
- export declare const Inject: (data?: any) => ParameterDecorator;
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Inject = void 0;
4
- const http_decorators_1 = require("./http.decorators");
5
- exports.Inject = (0, http_decorators_1.createParamDecorator)(() => { });
@@ -1,2 +0,0 @@
1
- import { CarnoMiddleware } from "../../domain/CarnoMiddleware";
2
- export declare function Middleware(...middlewares: (new (...args: any[]) => CarnoMiddleware)[]): ClassDecorator & MethodDecorator;
@@ -1,30 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Middleware = Middleware;
4
- const constants_1 = require("../../constants");
5
- function Middleware(...middlewares) {
6
- return (target, propertyKey) => {
7
- let definedMiddlewares;
8
- if (propertyKey)
9
- definedMiddlewares = getMethodMiddlewares(target, propertyKey.toString());
10
- else
11
- definedMiddlewares = getControllerMiddlewares(target);
12
- definedMiddlewares.push(...middlewares);
13
- if (propertyKey)
14
- setMethodMiddlewares(target, propertyKey.toString(), definedMiddlewares);
15
- else
16
- setControllerMiddlewares(target, definedMiddlewares);
17
- };
18
- }
19
- function getControllerMiddlewares(target) {
20
- return Reflect.getMetadata(constants_1.CONTROLLER_MIDDLEWARES, target) || [];
21
- }
22
- function setControllerMiddlewares(target, middlewares) {
23
- Reflect.defineMetadata(constants_1.CONTROLLER_MIDDLEWARES, middlewares, target);
24
- }
25
- function getMethodMiddlewares(target, methodName) {
26
- return Reflect.getMetadata(constants_1.ROUTE_MIDDLEWARES, target.constructor, methodName) || [];
27
- }
28
- function setMethodMiddlewares(target, methodName, middlewares) {
29
- Reflect.defineMetadata(constants_1.ROUTE_MIDDLEWARES, middlewares, target.constructor, methodName);
30
- }
@@ -1,2 +0,0 @@
1
- import { Provider } from '../../domain/provider';
2
- export declare function Service(options?: Partial<Provider>): ClassDecorator;
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Service = Service;
4
- const Injectable_decorator_1 = require("./Injectable.decorator");
5
- function Service(options = {}) {
6
- return (0, Injectable_decorator_1.Injectable)(options);
7
- }
@@ -1,32 +0,0 @@
1
- import { z } from "zod";
2
- /**
3
- * Decorator to attach a Zod schema to a DTO class
4
- * The schema will be used for validation when the DTO is used in route handlers
5
- *
6
- * @example
7
- * ```typescript
8
- * const CreateUserSchema = z.object({
9
- * name: z.string().min(3),
10
- * email: z.string().email()
11
- * });
12
- *
13
- * @ZodSchema(CreateUserSchema)
14
- * class CreateUserDto {
15
- * name: string;
16
- * email: string;
17
- * }
18
- *
19
- * @Controller('/users')
20
- * class UserController {
21
- * @Post()
22
- * create(@Body() dto: CreateUserDto) {
23
- * // dto is validated and typed
24
- * return dto;
25
- * }
26
- * }
27
- * ```
28
- *
29
- * @param schema - The Zod schema to use for validation
30
- * @returns Class decorator
31
- */
32
- export declare function ZodSchema<T extends z.ZodType>(schema: T): ClassDecorator;
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ZodSchema = ZodSchema;
4
- const Metadata_1 = require("../../domain/Metadata");
5
- const constants_1 = require("../../constants");
6
- /**
7
- * Decorator to attach a Zod schema to a DTO class
8
- * The schema will be used for validation when the DTO is used in route handlers
9
- *
10
- * @example
11
- * ```typescript
12
- * const CreateUserSchema = z.object({
13
- * name: z.string().min(3),
14
- * email: z.string().email()
15
- * });
16
- *
17
- * @ZodSchema(CreateUserSchema)
18
- * class CreateUserDto {
19
- * name: string;
20
- * email: string;
21
- * }
22
- *
23
- * @Controller('/users')
24
- * class UserController {
25
- * @Post()
26
- * create(@Body() dto: CreateUserDto) {
27
- * // dto is validated and typed
28
- * return dto;
29
- * }
30
- * }
31
- * ```
32
- *
33
- * @param schema - The Zod schema to use for validation
34
- * @returns Class decorator
35
- */
36
- function ZodSchema(schema) {
37
- return (target) => {
38
- Metadata_1.Metadata.set(constants_1.VALIDATION_ZOD_SCHEMA, schema, target);
39
- };
40
- }