zibri 1.0.0 → 1.1.0

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 (156) hide show
  1. package/README.md +2 -1
  2. package/dist/index.d.mts +490 -0
  3. package/dist/index.d.ts +490 -0
  4. package/dist/index.js +2814 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.mjs +2735 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +5 -2
  9. package/cspell.words.txt +0 -4
  10. package/eslint.config.mjs +0 -5
  11. package/jest.config.mjs +0 -25
  12. package/sandbox/assets/assets.svg +0 -1
  13. package/sandbox/assets/favicon.ico +0 -0
  14. package/sandbox/assets/favicon.png +0 -0
  15. package/sandbox/assets/logo.jpg +0 -0
  16. package/sandbox/assets/open-api/custom.css +0 -65
  17. package/sandbox/assets/open-api/swagger-ui-bundle.js +0 -2
  18. package/sandbox/assets/open-api/swagger-ui-standalone-preset.js +0 -2
  19. package/sandbox/assets/open-api/swagger-ui.css +0 -3
  20. package/sandbox/assets/swagger.png +0 -0
  21. package/sandbox/assets/template/assets.hbs +0 -51
  22. package/sandbox/assets/template/error.hbs +0 -41
  23. package/sandbox/assets/template/index.hbs +0 -34
  24. package/sandbox/assets/template/style.css +0 -76
  25. package/sandbox/package-lock.json +0 -1923
  26. package/sandbox/package.json +0 -26
  27. package/sandbox/src/controllers/test.controller.ts +0 -77
  28. package/sandbox/src/index.ts +0 -11
  29. package/sandbox/src/services/dep.service.ts +0 -9
  30. package/sandbox/src/services/test.service.ts +0 -12
  31. package/sandbox/tsconfig.json +0 -16
  32. package/sandbox/webpack.config.js +0 -71
  33. package/src/application-options.model.ts +0 -10
  34. package/src/application.ts +0 -73
  35. package/src/assets/asset-service.interface.ts +0 -9
  36. package/src/assets/asset.service.ts +0 -171
  37. package/src/assets/index.ts +0 -2
  38. package/src/di/decorators/index.ts +0 -2
  39. package/src/di/decorators/inject.decorator.ts +0 -13
  40. package/src/di/decorators/injectable.decorator.ts +0 -17
  41. package/src/di/default/index.ts +0 -1
  42. package/src/di/default/zibri-di-providers.default.ts +0 -37
  43. package/src/di/default/zibri-di-tokens.default.ts +0 -12
  44. package/src/di/di-container.ts +0 -81
  45. package/src/di/errors/get-dependency-stack-trace.function.ts +0 -11
  46. package/src/di/errors/index.ts +0 -2
  47. package/src/di/errors/no-provider.error.ts +0 -36
  48. package/src/di/index.ts +0 -4
  49. package/src/di/inject.function.ts +0 -7
  50. package/src/di/models/di-provider.model.ts +0 -8
  51. package/src/di/models/di-token.model.ts +0 -3
  52. package/src/di/models/index.ts +0 -2
  53. package/src/di/register.function.ts +0 -11
  54. package/src/encapsulation/index.ts +0 -4
  55. package/src/encapsulation/is-date.function.ts +0 -10
  56. package/src/encapsulation/is-numeric.function.ts +0 -9
  57. package/src/encapsulation/metadata-injection-keys.enum.ts +0 -14
  58. package/src/encapsulation/metadata.utilities.ts +0 -96
  59. package/src/encapsulation/reflect.utilities.ts +0 -51
  60. package/src/entity/decorators/index.ts +0 -1
  61. package/src/entity/decorators/property.decorator.ts +0 -48
  62. package/src/entity/index.ts +0 -1
  63. package/src/error-handling/error-handler.model.ts +0 -3
  64. package/src/error-handling/error-handler.ts +0 -72
  65. package/src/error-handling/errors/bad-request.error.ts +0 -9
  66. package/src/error-handling/errors/http.error.ts +0 -20
  67. package/src/error-handling/errors/index.ts +0 -6
  68. package/src/error-handling/errors/internal-server.error.ts +0 -9
  69. package/src/error-handling/errors/not-found.error.ts +0 -9
  70. package/src/error-handling/errors/unmatched-route.error.ts +0 -14
  71. package/src/error-handling/errors/validation.error.ts +0 -24
  72. package/src/error-handling/index.ts +0 -3
  73. package/src/error-handling/is-error.function.ts +0 -3
  74. package/src/global/global-registry.ts +0 -85
  75. package/src/global/index.ts +0 -1
  76. package/src/http/http-method.enum.ts +0 -8
  77. package/src/http/http-status.enum.ts +0 -6
  78. package/src/http/index.ts +0 -4
  79. package/src/http/known-header.type.ts +0 -25
  80. package/src/http/mime-type.enum.ts +0 -8
  81. package/src/index.ts +0 -16
  82. package/src/jest.setup.ts +0 -2
  83. package/src/logging/index.ts +0 -2
  84. package/src/logging/logger.interface.ts +0 -8
  85. package/src/logging/logger.ts +0 -87
  86. package/src/open-api/index.ts +0 -3
  87. package/src/open-api/open-api-service.interface.ts +0 -10
  88. package/src/open-api/open-api.model.ts +0 -13
  89. package/src/open-api/open-api.service.ts +0 -334
  90. package/src/parsing/body-parser.interface.ts +0 -8
  91. package/src/parsing/decorators/body-parser.decorator.ts +0 -17
  92. package/src/parsing/decorators/index.ts +0 -1
  93. package/src/parsing/functions/index.ts +0 -12
  94. package/src/parsing/functions/parse-array-query-param.function.ts +0 -15
  95. package/src/parsing/functions/parse-array-query-param.test.ts +0 -46
  96. package/src/parsing/functions/parse-boolean-header-param.function.ts +0 -15
  97. package/src/parsing/functions/parse-boolean-header-param.test.ts +0 -33
  98. package/src/parsing/functions/parse-boolean-query-param.function.ts +0 -15
  99. package/src/parsing/functions/parse-boolean-query-param.test.ts +0 -33
  100. package/src/parsing/functions/parse-date-header-param.function.ts +0 -8
  101. package/src/parsing/functions/parse-date-header-param.test.ts +0 -32
  102. package/src/parsing/functions/parse-date-query-param.function.ts +0 -8
  103. package/src/parsing/functions/parse-date-query-param.test.ts +0 -32
  104. package/src/parsing/functions/parse-number-header-param.function.ts +0 -8
  105. package/src/parsing/functions/parse-number-header-param.test.ts +0 -30
  106. package/src/parsing/functions/parse-number-path-param.function.ts +0 -8
  107. package/src/parsing/functions/parse-number-path-param.test.ts +0 -30
  108. package/src/parsing/functions/parse-number-query-param.function.ts +0 -8
  109. package/src/parsing/functions/parse-number-query-param.test.ts +0 -34
  110. package/src/parsing/functions/parse-object-query-param.function.ts +0 -15
  111. package/src/parsing/functions/parse-object-query-param.test.ts +0 -69
  112. package/src/parsing/functions/parse-string-header-param.function.ts +0 -4
  113. package/src/parsing/functions/parse-string-path-param.function.ts +0 -4
  114. package/src/parsing/functions/parse-string-query-param.function.ts +0 -4
  115. package/src/parsing/index.ts +0 -5
  116. package/src/parsing/json.body-parser.ts +0 -34
  117. package/src/parsing/parser.interface.ts +0 -12
  118. package/src/parsing/parser.ts +0 -85
  119. package/src/routing/controller-route-configuration.model.ts +0 -9
  120. package/src/routing/decorators/body.decorator.ts +0 -28
  121. package/src/routing/decorators/controller.decorator.ts +0 -18
  122. package/src/routing/decorators/create-http-decorator.function.ts +0 -15
  123. package/src/routing/decorators/delete.decorator.ts +0 -7
  124. package/src/routing/decorators/get.decorator.ts +0 -7
  125. package/src/routing/decorators/index.ts +0 -7
  126. package/src/routing/decorators/param.decorator.ts +0 -112
  127. package/src/routing/decorators/patch.decorator.ts +0 -7
  128. package/src/routing/decorators/post.decorator.ts +0 -7
  129. package/src/routing/index.ts +0 -5
  130. package/src/routing/missing-base-route.error.ts +0 -9
  131. package/src/routing/route-configuration.model.ts +0 -10
  132. package/src/routing/router.interface.ts +0 -12
  133. package/src/routing/router.ts +0 -164
  134. package/src/types/deep-partial.type.ts +0 -10
  135. package/src/types/index.ts +0 -3
  136. package/src/types/newable.model.ts +0 -2
  137. package/src/types/omit-strict.type.ts +0 -4
  138. package/src/validation/functions/index.ts +0 -11
  139. package/src/validation/functions/validate-boolean-header-param.function.ts +0 -16
  140. package/src/validation/functions/validate-boolean-query-param.function.ts +0 -16
  141. package/src/validation/functions/validate-date-header-param.function.ts +0 -16
  142. package/src/validation/functions/validate-date-query-param.function.ts +0 -16
  143. package/src/validation/functions/validate-number-header-param.function.ts +0 -16
  144. package/src/validation/functions/validate-number-path-param.function.ts +0 -16
  145. package/src/validation/functions/validate-number-property.function.ts +0 -21
  146. package/src/validation/functions/validate-number-query-param.function.ts +0 -16
  147. package/src/validation/functions/validate-string-header-param.function.ts +0 -17
  148. package/src/validation/functions/validate-string-path-param.function.ts +0 -17
  149. package/src/validation/functions/validate-string-property.function.ts +0 -21
  150. package/src/validation/functions/validate-string-query-param.function.ts +0 -17
  151. package/src/validation/index.ts +0 -3
  152. package/src/validation/validation-problem.model.ts +0 -9
  153. package/src/validation/validation-service.interface.ts +0 -9
  154. package/src/validation/validation.service.ts +0 -295
  155. package/tsconfig.json +0 -17
  156. package/tsup.config.ts +0 -13
package/README.md CHANGED
@@ -1 +1,2 @@
1
- # Zibri
1
+ # Zibri
2
+ An express based backend framework.
@@ -0,0 +1,490 @@
1
+ import { Request, Response, Express, NextFunction } from 'express';
2
+ import { Repository as Repository$1, FindManyOptions, FindOneOptions, ColumnType, DataSourceOptions as DataSourceOptions$1, DataSource as DataSource$1, EntitySchema, EntitySchemaColumnOptions, Transaction } from 'typeorm';
3
+ import { oas31 } from 'openapi3-ts';
4
+
5
+ interface DataSourceServiceInterface {
6
+ init: () => Promise<void>;
7
+ }
8
+
9
+ declare class DataSourceService implements DataSourceServiceInterface {
10
+ private readonly logger;
11
+ constructor();
12
+ init(): Promise<void>;
13
+ }
14
+
15
+ declare function DataSource(): ClassDecorator;
16
+
17
+ type StringPropertyMetadata = {
18
+ required: boolean;
19
+ type: 'string';
20
+ primary: boolean;
21
+ };
22
+ type StringPropertyMetadataInput = Partial<StringPropertyMetadata> & Pick<StringPropertyMetadata, 'type'>;
23
+
24
+ type NumberPropertyMetadata = {
25
+ required: boolean;
26
+ type: 'number';
27
+ primary: boolean;
28
+ };
29
+ type NumberPropertyMetadataInput = Partial<NumberPropertyMetadata> & Pick<NumberPropertyMetadata, 'type'>;
30
+
31
+ type Newable<T> = new (...args: any[]) => T;
32
+
33
+ type DeepPartial<T> = T | (T extends (infer U)[] ? DeepPartial<U>[] : T extends Map<infer K, infer V> ? Map<DeepPartial<K>, DeepPartial<V>> : T extends Set<infer M> ? Set<DeepPartial<M>> : T extends object ? {
34
+ [K in keyof T]?: DeepPartial<T[K]>;
35
+ } : T);
36
+
37
+ type OmitStrict<T extends object, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
38
+
39
+ type ObjectPropertyMetadata = {
40
+ required: boolean;
41
+ type: 'object';
42
+ cls: Newable<unknown>;
43
+ };
44
+ type ObjectPropertyMetadataInput = Partial<ObjectPropertyMetadata> & Pick<ObjectPropertyMetadata, 'type' | 'cls'>;
45
+
46
+ type ArrayPropertyMetadata = {
47
+ required: boolean;
48
+ type: 'array';
49
+ itemType: Exclude<PropertyMetadata['type'], 'object' | 'array'> | Newable<unknown>;
50
+ };
51
+ type ArrayPropertyMetadataInput = Partial<ArrayPropertyMetadata> & Pick<ArrayPropertyMetadata, 'type' | 'itemType'>;
52
+
53
+ type DatePropertyMetadata = {
54
+ required: boolean;
55
+ type: 'date';
56
+ };
57
+ type DatePropertyMetadataInput = Partial<DatePropertyMetadata> & Pick<DatePropertyMetadata, 'type'>;
58
+
59
+ type PropertyMetadata = StringPropertyMetadata | NumberPropertyMetadata | ObjectPropertyMetadata | ArrayPropertyMetadata | DatePropertyMetadata;
60
+ type PropertyMetadataInput = StringPropertyMetadataInput | NumberPropertyMetadataInput | ObjectPropertyMetadataInput | ArrayPropertyMetadataInput | DatePropertyMetadataInput;
61
+ declare function Property(data: PropertyMetadataInput): PropertyDecorator;
62
+
63
+ type EntityMetadata = {
64
+ tableName: string;
65
+ };
66
+ declare function Entity(tableName?: string): ClassDecorator;
67
+
68
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
69
+ type IntersectionInstances<T extends Newable<unknown>[]> = UnionToIntersection<InstanceType<T[number]>>;
70
+ declare function IntersectionType<Bases extends Newable<unknown>[]>(...bases: Bases): Newable<IntersectionInstances<Bases>>;
71
+
72
+ declare function PartialType<T>(Base: Newable<T>): Newable<Partial<T>>;
73
+
74
+ declare function PickType<T, K extends keyof T>(Base: Newable<T>, keys: readonly K[]): Newable<Pick<T, K>>;
75
+
76
+ declare function OmitType<T, K extends keyof T>(Base: Newable<T>, keys: readonly K[]): Newable<Omit<T, K>>;
77
+
78
+ type BaseEntity = {
79
+ id: string | number;
80
+ };
81
+ declare class Repository<T extends BaseEntity> {
82
+ private readonly entityName;
83
+ private readonly typeOrmRepository;
84
+ private readonly logger;
85
+ constructor(entityName: string, typeOrmRepository: Repository$1<T>);
86
+ create(data: DeepPartial<T>): Promise<T>;
87
+ findById(id: T['id']): Promise<T>;
88
+ findAll(options?: FindManyOptions<T>): Promise<T[]>;
89
+ findOne(options: FindOneOptions<T>): Promise<T>;
90
+ updateById(id: T['id'], data: DeepPartial<T>): Promise<T>;
91
+ deleteById(id: T['id']): Promise<void>;
92
+ }
93
+
94
+ type DataSourceOptions = DataSourceOptions$1;
95
+ declare abstract class BaseDataSource {
96
+ protected readonly columnTypeMappingOverride: Partial<Record<PropertyMetadata['type'], ColumnType>>;
97
+ private get columnTypeMapping();
98
+ abstract readonly options: OmitStrict<DataSourceOptions, 'entities'>;
99
+ abstract readonly entities: Newable<BaseEntity>[];
100
+ protected ds?: DataSource$1;
101
+ init(): Promise<void>;
102
+ protected getEntitySchemas(): EntitySchema[];
103
+ protected propertyToColumnOptions(metadata: PropertyMetadata): EntitySchemaColumnOptions;
104
+ getRepository<T extends BaseEntity>(cls: Newable<T>): Repository<T>;
105
+ startTransaction(): Transaction;
106
+ }
107
+
108
+ type DiToken<T> = Newable<T> | string;
109
+
110
+ type DiProvider<T> = {
111
+ token: DiToken<T>;
112
+ useClass?: Newable<T>;
113
+ useFactory?: (...deps: unknown[]) => T;
114
+ };
115
+
116
+ declare function Injectable<T>(token?: DiToken<T>): ClassDecorator;
117
+
118
+ declare function Inject<T>(token: DiToken<T>): ParameterDecorator;
119
+
120
+ declare function repositoryTokenFor<T extends BaseEntity>(entity: Newable<T>): string;
121
+ declare function InjectRepository<T extends BaseEntity>(entityClass: Newable<T>): ParameterDecorator;
122
+
123
+ declare const ZIBRI_DI_TOKENS: {
124
+ readonly ROUTER: "zi.router";
125
+ readonly LOG_LEVEL: "zi.log_level";
126
+ readonly LOGGER: "zi.logger";
127
+ readonly ASSET_SERVICE: "zi.asset_service";
128
+ readonly GLOBAL_ERROR_HANDLER: "zi.global_error_handler";
129
+ readonly OPEN_API_SERVICE: "zi.open_api_service";
130
+ readonly PARSER: "zi.parser_service";
131
+ readonly VALIDATION_SERVICE: "zi.validation_service";
132
+ readonly DATA_SOURCE_SERVICE: "zi.data_source_service";
133
+ };
134
+
135
+ declare function inject<T>(token: DiToken<T>): T;
136
+
137
+ declare enum HttpMethod {
138
+ GET = "get",
139
+ POST = "post",
140
+ PUT = "put",
141
+ PATCH = "patch",
142
+ DELETE = "delete"
143
+ }
144
+
145
+ declare enum HttpStatus {
146
+ INTERNAL_SERVER_ERROR = 500,
147
+ NOT_FOUND_ERROR = 404,
148
+ BAD_REQUEST = 400
149
+ }
150
+
151
+ declare enum MimeType {
152
+ JSON = "application/json",
153
+ HTML = "text/html"
154
+ }
155
+ declare function isMimeType(value: string): value is MimeType;
156
+
157
+ type KnownHeader = 'Accept' | 'Accept-Encoding' | 'Authorization' | 'Cache-Control' | 'Content-Length' | 'Content-Type' | 'Cookie' | 'Host' | 'Origin' | 'Referer' | 'User-Agent' | 'X-Requested-With' | 'X-Forwarded-For' | 'X-Forwarded-Host' | 'X-Forwarded-Proto' | 'X-Real-IP' | 'X-Correlation-ID' | 'If-None-Match' | 'If-Modified-Since' | 'Connection' | 'DNT' | 'Sec-Fetch-Mode' | 'Sec-Fetch-Site' | 'TE';
158
+
159
+ interface BodyParserInterface {
160
+ readonly contentType: MimeType;
161
+ parse: (req: Request) => Promise<unknown>;
162
+ }
163
+
164
+ declare function BodyParser(): ClassDecorator;
165
+
166
+ type Route = `/${string}`;
167
+ type ControllerRouteConfiguration = {
168
+ httpMethod: HttpMethod;
169
+ route: Route;
170
+ controllerMethod: string;
171
+ };
172
+
173
+ type RouteConfiguration = {
174
+ httpMethod: HttpMethod;
175
+ route: Route;
176
+ handler: (req: Request, res: Response) => unknown | Promise<unknown>;
177
+ };
178
+
179
+ interface RouterInterface {
180
+ registerController: <T extends Object>(controllerClass: Newable<T>, ...params: any[]) => void;
181
+ register: (route: RouteConfiguration, ...params: any[]) => void;
182
+ attachTo: (app: ZibriApplication, ...params: any[]) => void;
183
+ }
184
+
185
+ declare class Router implements RouterInterface {
186
+ private readonly router;
187
+ private readonly logger;
188
+ private readonly parser;
189
+ private readonly validationService;
190
+ constructor();
191
+ attachTo(app: ZibriApplication): void;
192
+ register(route: RouteConfiguration): void;
193
+ registerController<T extends Object>(controllerClass: Newable<T>): void;
194
+ private routeToRequestHandler;
195
+ private controllerRouteToRequestHandler;
196
+ private resolveRouteParams;
197
+ }
198
+
199
+ declare function Controller(baseRoute: Route): ClassDecorator;
200
+
201
+ declare function Get(path?: Route): MethodDecorator;
202
+
203
+ declare function Post(path?: Route): MethodDecorator;
204
+
205
+ declare function Delete(path?: Route): MethodDecorator;
206
+
207
+ declare function Patch(path?: Route): MethodDecorator;
208
+
209
+ type PathParamMetadata = {
210
+ name: string;
211
+ description?: string;
212
+ required: boolean;
213
+ type: 'string' | 'number';
214
+ };
215
+ type BaseQueryParamMetadata = {
216
+ name: string;
217
+ description?: string;
218
+ required: boolean;
219
+ };
220
+ type SimpleQueryParamMetadata = BaseQueryParamMetadata & {
221
+ type: 'string' | 'number' | 'boolean' | 'date';
222
+ };
223
+ type SimpleQueryParamMetadataInput = Partial<OmitStrict<SimpleQueryParamMetadata, 'name'>>;
224
+ type ObjectQueryParamMetadata = BaseQueryParamMetadata & {
225
+ type: 'object';
226
+ cls: Newable<unknown>;
227
+ };
228
+ type ObjectQueryParamMetadataInput = OmitStrict<ObjectQueryParamMetadata, 'name' | keyof BaseQueryParamMetadata> & Partial<OmitStrict<BaseQueryParamMetadata, 'name'>>;
229
+ type ArrayQueryParamMetadata = BaseQueryParamMetadata & {
230
+ type: 'array';
231
+ itemType: 'string' | 'number' | 'boolean' | 'date' | Newable<unknown>;
232
+ };
233
+ type ArrayQueryParamMetadataInput = OmitStrict<ArrayQueryParamMetadata, 'name' | keyof BaseQueryParamMetadata> & Partial<OmitStrict<BaseQueryParamMetadata, 'name'>>;
234
+ type QueryParamMetadata = SimpleQueryParamMetadata | ObjectQueryParamMetadata | ArrayQueryParamMetadata;
235
+ type QueryParamMetadataInput = SimpleQueryParamMetadataInput | ObjectQueryParamMetadataInput | ArrayQueryParamMetadataInput;
236
+ type HeaderParamMetadata = {
237
+ name: KnownHeader | Omit<string, KnownHeader>;
238
+ description?: string;
239
+ required: boolean;
240
+ type: 'string' | 'number' | 'boolean' | 'date';
241
+ };
242
+ declare namespace Param {
243
+ function path(name: string, options?: Partial<OmitStrict<PathParamMetadata, 'name'>>): ParameterDecorator;
244
+ function query(name: string, options?: QueryParamMetadataInput): ParameterDecorator;
245
+ function header(name: KnownHeader | Omit<string, KnownHeader>, options?: Partial<OmitStrict<HeaderParamMetadata, 'name'>>): ParameterDecorator;
246
+ }
247
+
248
+ type BodyMetadata = {
249
+ modelClass: Newable<unknown>;
250
+ index: number;
251
+ name: string;
252
+ description?: string;
253
+ required: boolean;
254
+ };
255
+ type BodyMetadataInput = Partial<OmitStrict<BodyMetadata, 'modelClass' | 'index' | 'name'>>;
256
+ declare function Body(modelClass: Newable<unknown>, options?: BodyMetadataInput): ParameterDecorator;
257
+
258
+ interface ParserInterface {
259
+ parseRequestBody: (req: Request) => Promise<unknown>;
260
+ parsePathParam: (req: Request, metadata: PathParamMetadata) => unknown;
261
+ parseQueryParam: (req: Request, metadata: QueryParamMetadata) => unknown;
262
+ parseHeaderParam: (req: Request, metadata: HeaderParamMetadata) => unknown;
263
+ attachTo: (app: ZibriApplication) => void;
264
+ }
265
+
266
+ declare class Parser implements ParserInterface {
267
+ private readonly logger;
268
+ private readonly bodyParsers;
269
+ private readonly pathParamParseFunctions;
270
+ private readonly queryParamParseFunctions;
271
+ private readonly headerParamParseFunctions;
272
+ constructor();
273
+ parseHeaderParam(req: Request, metadata: HeaderParamMetadata): unknown;
274
+ parseQueryParam(req: Request, metadata: QueryParamMetadata): unknown;
275
+ parsePathParam(req: Request, metadata: PathParamMetadata): unknown;
276
+ parseRequestBody(req: Request): Promise<unknown>;
277
+ attachTo(): void;
278
+ }
279
+
280
+ declare class JsonBodyParser implements BodyParserInterface {
281
+ readonly contentType: MimeType;
282
+ parse(req: Request): Promise<unknown>;
283
+ }
284
+
285
+ type ZibriApplicationOptions = {
286
+ name: string;
287
+ controllers: Newable<unknown>[];
288
+ dataSources?: Newable<BaseDataSource>[];
289
+ providers?: DiProvider<unknown>[];
290
+ bodyParsers?: Newable<BodyParserInterface>[];
291
+ };
292
+
293
+ /**
294
+ * A zibri application.
295
+ */
296
+ declare class ZibriApplication {
297
+ private readonly options;
298
+ readonly express: Express;
299
+ private _router;
300
+ get router(): RouterInterface;
301
+ private logger;
302
+ private assetService;
303
+ private openApiService;
304
+ private parser;
305
+ private dataSourceService;
306
+ constructor(options: ZibriApplicationOptions);
307
+ init(): Promise<void>;
308
+ /**
309
+ * Starts on the given port.
310
+ * @param port - The port to start on.
311
+ * @throws When the app has already been started.
312
+ */
313
+ start(port: number): void;
314
+ }
315
+
316
+ type GlobalErrorHandler = (err: unknown, req: Request, res: Response, next: NextFunction) => void;
317
+
318
+ declare const errorHandler: GlobalErrorHandler;
319
+
320
+ declare abstract class HttpError extends Error {
321
+ status: HttpStatus;
322
+ title: string;
323
+ paragraphs: string[];
324
+ constructor(message: string | string[], status: HttpStatus, title: string, options?: ErrorOptions);
325
+ }
326
+ declare function isHttpError(value: unknown): value is HttpError;
327
+
328
+ declare class InternalServerError extends HttpError {
329
+ constructor(message: string | string[], options?: ErrorOptions);
330
+ }
331
+
332
+ declare class NotFoundError extends HttpError {
333
+ constructor(message: string | string[], options?: ErrorOptions);
334
+ }
335
+
336
+ declare class UnmatchedRouteError extends NotFoundError {
337
+ constructor(originalUrl: string, options?: ErrorOptions);
338
+ }
339
+
340
+ declare class BadRequestError extends HttpError {
341
+ constructor(message: string | string[], options?: ErrorOptions);
342
+ }
343
+
344
+ type ValidationProblem = {
345
+ key: string;
346
+ message: string;
347
+ };
348
+ declare class IsRequiredValidationProblem implements ValidationProblem {
349
+ readonly key: string;
350
+ readonly message: string;
351
+ constructor(key: string);
352
+ }
353
+
354
+ interface ValidationServiceInterface {
355
+ validateRequestBody: (model: unknown, cls: Newable<unknown>) => void;
356
+ validateHeaderParam: (param: unknown, meta: HeaderParamMetadata) => void;
357
+ validatePathParam: (param: unknown, meta: PathParamMetadata) => void;
358
+ validateQueryParam: (param: unknown, meta: QueryParamMetadata) => void;
359
+ }
360
+
361
+ declare class ValidationService implements ValidationServiceInterface {
362
+ private readonly pathParamValidationFunctions;
363
+ private readonly queryParamValidationFunctions;
364
+ private readonly headerParamValidationFunctions;
365
+ private readonly propertyValidationFunctions;
366
+ private validateObjectQueryParam;
367
+ private validateArrayQueryParam;
368
+ validateHeaderParam(param: unknown, meta: HeaderParamMetadata): void;
369
+ validatePathParam(param: unknown, meta: PathParamMetadata): void;
370
+ validateQueryParam(param: unknown, meta: QueryParamMetadata): void;
371
+ validateRequestBody(model: unknown, cls: Newable<unknown>): void;
372
+ private validateModel;
373
+ private validateProperty;
374
+ private validateArrayProperty;
375
+ private getPropertyArrayItemMetadata;
376
+ private getQueryArrayItemMetadata;
377
+ private validateObjectProperty;
378
+ }
379
+
380
+ type ValidationErrorType = 'body' | 'path' | 'query' | 'header';
381
+ declare class ValidationError extends BadRequestError {
382
+ constructor(type: ValidationErrorType, problems: ValidationProblem[], options?: ErrorOptions);
383
+ }
384
+
385
+ interface AssetServiceInterface {
386
+ readonly assetsPath: string;
387
+ readonly assetsRoute: Route;
388
+ attachTo: (app: ZibriApplication, ...params: any[]) => void;
389
+ }
390
+
391
+ declare class AssetService implements AssetServiceInterface {
392
+ private readonly logger;
393
+ readonly assetsPath: string;
394
+ readonly assetsRoute: Route;
395
+ constructor();
396
+ attachTo(app: ZibriApplication): void;
397
+ private buildFileTree;
398
+ private mapToTree;
399
+ private walk;
400
+ }
401
+
402
+ declare enum AppState {
403
+ OFFLINE = "offline",
404
+ CREATED = "created",
405
+ INITIALIZED = "initialized",
406
+ RUNNING = "running"
407
+ }
408
+ type AppData = {
409
+ state: AppState;
410
+ name?: string;
411
+ };
412
+ declare abstract class GlobalRegistry {
413
+ private static readonly appData;
414
+ static readonly injectables: DiProvider<unknown>[];
415
+ static readonly controllerClasses: Newable<Object>[];
416
+ static readonly dataSourceClasses: Newable<BaseDataSource>[];
417
+ static readonly entityClasses: Newable<BaseEntity>[];
418
+ static readonly bodyParsers: Newable<BodyParserInterface>[];
419
+ private static readonly validateAppStateChange;
420
+ static getAppData<K extends keyof AppData>(key: K): AppData[K];
421
+ static setAppData(options: ZibriApplicationOptions): void;
422
+ static markAppAsCreated(): void;
423
+ static markAppAsInitialized(): void;
424
+ static markAppAsRunning(): void;
425
+ static isAppRunning(): boolean;
426
+ static isAppInitialized(): boolean;
427
+ static isAppCreated(): boolean;
428
+ private static changeAppState;
429
+ }
430
+
431
+ interface LoggerInterface {
432
+ debug: (...messages: (string | number)[]) => void;
433
+ info: (...messages: (string | number)[]) => void;
434
+ warn: (...messages: (string | number)[]) => void;
435
+ error: (...messages: (string | number | Error)[]) => void;
436
+ critical: (...messages: (string | number | Error)[]) => void;
437
+ }
438
+
439
+ declare const LOG_LEVEL_VALUES: {
440
+ readonly debug: 0;
441
+ readonly info: 1;
442
+ readonly warn: 2;
443
+ readonly error: 3;
444
+ readonly critical: 4;
445
+ };
446
+ type LogLevels = typeof LOG_LEVEL_VALUES;
447
+ type LogLevel = keyof LogLevels;
448
+ declare class Logger implements LoggerInterface {
449
+ debug(...messages: (string | number)[]): void;
450
+ info(...messages: (string | number)[]): void;
451
+ warn(...messages: (string | number)[]): void;
452
+ error(...messages: (string | number | Error)[]): void;
453
+ critical(...messages: (string | number | Error)[]): void;
454
+ private log;
455
+ private getTimestamp;
456
+ }
457
+
458
+ type OpenApiDefinition = oas31.OpenAPIObject;
459
+ type OpenApiPaths = oas31.PathsObject;
460
+ type OpenApiOperation = oas31.OperationObject;
461
+ type OpenApiParameter = (oas31.ParameterObject | oas31.ReferenceObject);
462
+ type OpenApiRequestBodyObject = oas31.RequestBodyObject;
463
+ type OpenApiSchemaObject = oas31.SchemaObject;
464
+
465
+ interface OpenApiServiceInterface {
466
+ readonly openApiRoute: Route;
467
+ attachTo: (app: ZibriApplication) => void;
468
+ createOpenApiDefinition: (app: ZibriApplication) => OpenApiDefinition;
469
+ }
470
+
471
+ declare class OpenApiService implements OpenApiServiceInterface {
472
+ readonly openApiRoute: Route;
473
+ private readonly logger;
474
+ private readonly assetService;
475
+ constructor();
476
+ attachTo(app: ZibriApplication): void;
477
+ createOpenApiDefinition(): OpenApiDefinition;
478
+ private resolveOpenApiPaths;
479
+ private buildOpenApiBody;
480
+ private buildOpenApiSchemaForModel;
481
+ private extractPathParamNames;
482
+ private buildPathParameters;
483
+ private buildQueryParameters;
484
+ private queryParamToSchema;
485
+ private getQueryArrayItemMetadata;
486
+ private buildHeaderParameters;
487
+ private headerParamToSchema;
488
+ }
489
+
490
+ export { type AppData, AppState, type ArrayQueryParamMetadata, AssetService, type AssetServiceInterface, BadRequestError, BaseDataSource, type BaseEntity, Body, type BodyMetadata, type BodyMetadataInput, BodyParser, type BodyParserInterface, Controller, type ControllerRouteConfiguration, DataSource, type DataSourceOptions, DataSourceService, type DataSourceServiceInterface, Delete, type DiProvider, type DiToken, Entity, type EntityMetadata, Get, type GlobalErrorHandler, GlobalRegistry, type HeaderParamMetadata, HttpError, HttpMethod, HttpStatus, Inject, InjectRepository, Injectable, InternalServerError, IntersectionType, IsRequiredValidationProblem, JsonBodyParser, type KnownHeader, type LogLevel, type LogLevels, Logger, type LoggerInterface, MimeType, type Newable, NotFoundError, type ObjectQueryParamMetadata, OmitType, type OpenApiDefinition, type OpenApiOperation, type OpenApiParameter, type OpenApiPaths, type OpenApiRequestBodyObject, type OpenApiSchemaObject, OpenApiService, type OpenApiServiceInterface, Param, Parser, type ParserInterface, PartialType, Patch, type PathParamMetadata, PickType, Post, Property, type PropertyMetadata, type PropertyMetadataInput, type QueryParamMetadata, Repository, type Route, type RouteConfiguration, Router, type RouterInterface, type SimpleQueryParamMetadata, UnmatchedRouteError, ValidationError, type ValidationProblem, ValidationService, type ValidationServiceInterface, ZIBRI_DI_TOKENS, ZibriApplication, type ZibriApplicationOptions, errorHandler, inject, isHttpError, isMimeType, repositoryTokenFor };