@avleon/core 0.0.45 → 0.0.48
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.
- package/README.md +355 -369
- package/dist/chunk-9hOWP6kD.cjs +64 -0
- package/dist/chunk-DORXReHP.js +37 -0
- package/dist/index-BxIMWhgy.d.ts +1284 -0
- package/dist/index-DPn7qtzq.d.cts +1283 -0
- package/dist/index.cjs +3194 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +3022 -83
- package/dist/index.js.map +1 -0
- package/dist/lib-Bk8hUm06.cjs +7847 -0
- package/dist/lib-Bk8hUm06.cjs.map +1 -0
- package/dist/lib-CvDxBMkR.js +7843 -0
- package/dist/lib-CvDxBMkR.js.map +1 -0
- package/package.json +67 -116
- package/dist/application.d.ts +0 -47
- package/dist/application.js +0 -50
- package/dist/authentication.d.ts +0 -13
- package/dist/authentication.js +0 -16
- package/dist/cache.d.ts +0 -12
- package/dist/cache.js +0 -78
- package/dist/cache.test.d.ts +0 -1
- package/dist/cache.test.js +0 -36
- package/dist/collection.d.ts +0 -43
- package/dist/collection.js +0 -231
- package/dist/collection.test.d.ts +0 -1
- package/dist/collection.test.js +0 -59
- package/dist/config.d.ts +0 -18
- package/dist/config.js +0 -58
- package/dist/config.test.d.ts +0 -1
- package/dist/config.test.js +0 -40
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +0 -4
- package/dist/container.d.ts +0 -30
- package/dist/container.js +0 -55
- package/dist/controller.d.ts +0 -50
- package/dist/controller.js +0 -71
- package/dist/controller.test.d.ts +0 -1
- package/dist/controller.test.js +0 -111
- package/dist/decorators.d.ts +0 -15
- package/dist/decorators.js +0 -41
- package/dist/environment-variables.d.ts +0 -49
- package/dist/environment-variables.js +0 -130
- package/dist/environment-variables.test.d.ts +0 -1
- package/dist/environment-variables.test.js +0 -70
- package/dist/event-dispatcher.d.ts +0 -23
- package/dist/event-dispatcher.js +0 -100
- package/dist/event-subscriber.d.ts +0 -14
- package/dist/event-subscriber.js +0 -87
- package/dist/exceptions/http-exceptions.d.ts +0 -50
- package/dist/exceptions/http-exceptions.js +0 -85
- package/dist/exceptions/index.d.ts +0 -1
- package/dist/exceptions/index.js +0 -17
- package/dist/exceptions/system-exception.d.ts +0 -22
- package/dist/exceptions/system-exception.js +0 -26
- package/dist/file-storage.d.ts +0 -69
- package/dist/file-storage.js +0 -323
- package/dist/file-storage.test.d.ts +0 -1
- package/dist/file-storage.test.js +0 -104
- package/dist/helpers.d.ts +0 -44
- package/dist/helpers.js +0 -419
- package/dist/helpers.test.d.ts +0 -1
- package/dist/helpers.test.js +0 -95
- package/dist/icore.d.ts +0 -226
- package/dist/icore.js +0 -968
- package/dist/icore.test.d.ts +0 -1
- package/dist/icore.test.js +0 -14
- package/dist/index.d.ts +0 -55
- package/dist/interfaces/avleon-application.d.ts +0 -27
- package/dist/interfaces/avleon-application.js +0 -1
- package/dist/kenx-provider.d.ts +0 -7
- package/dist/kenx-provider.js +0 -44
- package/dist/kenx-provider.test.d.ts +0 -1
- package/dist/kenx-provider.test.js +0 -36
- package/dist/logger.d.ts +0 -12
- package/dist/logger.js +0 -87
- package/dist/logger.test.d.ts +0 -1
- package/dist/logger.test.js +0 -42
- package/dist/map-types.d.ts +0 -17
- package/dist/map-types.js +0 -89
- package/dist/middleware.d.ts +0 -27
- package/dist/middleware.js +0 -64
- package/dist/middleware.test.d.ts +0 -1
- package/dist/middleware.test.js +0 -121
- package/dist/multipart.d.ts +0 -17
- package/dist/multipart.js +0 -70
- package/dist/multipart.test.d.ts +0 -1
- package/dist/multipart.test.js +0 -87
- package/dist/openapi.d.ts +0 -343
- package/dist/openapi.js +0 -27
- package/dist/openapi.test.d.ts +0 -1
- package/dist/openapi.test.js +0 -111
- package/dist/params.d.ts +0 -17
- package/dist/params.js +0 -64
- package/dist/params.test.d.ts +0 -1
- package/dist/params.test.js +0 -83
- package/dist/queue.d.ts +0 -29
- package/dist/queue.js +0 -84
- package/dist/response.d.ts +0 -16
- package/dist/response.js +0 -56
- package/dist/results.d.ts +0 -20
- package/dist/results.js +0 -32
- package/dist/route-methods.d.ts +0 -25
- package/dist/route-methods.js +0 -49
- package/dist/route-methods.test.d.ts +0 -1
- package/dist/route-methods.test.js +0 -129
- package/dist/swagger-schema.d.ts +0 -43
- package/dist/swagger-schema.js +0 -452
- package/dist/swagger-schema.test.d.ts +0 -1
- package/dist/swagger-schema.test.js +0 -105
- package/dist/testing.d.ts +0 -55
- package/dist/testing.js +0 -196
- package/dist/types/app-builder.interface.d.ts +0 -15
- package/dist/types/app-builder.interface.js +0 -8
- package/dist/types/application.interface.d.ts +0 -8
- package/dist/types/application.interface.js +0 -2
- package/dist/utils/hash.d.ts +0 -4
- package/dist/utils/hash.js +0 -15
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.js +0 -18
- package/dist/utils/optional-require.d.ts +0 -8
- package/dist/utils/optional-require.js +0 -70
- package/dist/validation.d.ts +0 -39
- package/dist/validation.js +0 -111
- package/dist/validation.test.d.ts +0 -1
- package/dist/validation.test.js +0 -61
- package/dist/validator-extend.d.ts +0 -7
- package/dist/validator-extend.js +0 -28
- package/dist/websocket.d.ts +0 -7
- package/dist/websocket.js +0 -20
- package/dist/websocket.test.d.ts +0 -1
- package/dist/websocket.test.js +0 -27
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["TypediContainer","OpenApiProperty","OpenApiResponse","container","_service","normalizeParamsToJsonSchema","Container","container","Container","Container","Container","Container","Container","Container","Container","sw.generateSwaggerSchema","sw.CreateSwaggerObjectSchema","sw.OpenApiResponse","sw.OpenApiProperty"],"sources":["../src/container.ts","../src/swagger-schema.ts","../src/controller.ts","../src/route-methods.ts","../src/openapi.ts","../src/utils/common-utils.ts","../src/utils/object-utils.ts","../src/exceptions/http-exceptions.ts","../src/exceptions/index.ts","../src/utils/validation-utils.ts","../src/exceptions/system-exception.ts","../src/utils/di-utils.ts","../src/validation.ts","../src/helpers.ts","../src/params.ts","../src/decorators.ts","../src/core/router.ts","../src/kenx-provider.ts","../src/websocket.ts","../src/event-dispatcher.ts","../src/event-subscriber.ts","../src/core/application.ts","../src/core/testing.ts","../src/response.ts","../src/middleware.ts","../src/collection.ts","../src/queue.ts","../src/file-storage.ts","../src/environment-variables.ts","../src/config.ts","../src/logger.ts","../src/cache.ts","../src/results.ts","../src/index.ts"],"sourcesContent":["/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport { Knex } from \"knex\";\nimport TypediContainer, { ContainerInstance, Token } from \"typedi\";\nimport { DataSource } from \"typeorm\";\n\nexport const FEATURE_KEY = Symbol.for(\"features\");\nexport const ROUTE_META_KEY = Symbol(\"iroute:options\");\nexport const CONTROLLER_META_KEY = Symbol(\"icontroller:options\");\nexport const PARAM_META_KEY = Symbol(\"iparam:options\");\nexport const QUERY_META_KEY = Symbol(\"iparam:options\");\nexport const REQUEST_BODY_META_KEY = Symbol(\"iparam:options\");\nexport const REQUEST_BODY_FILE_KEY = Symbol(\"iparam:options\");\nexport const REQUEST_BODY_FILES_KEY = Symbol(\"iparam:options\");\nexport const REQUEST_USER_META_KEY = Symbol(\"iparam:options\");\nexport const REQUEST_HEADER_META_KEY = Symbol(\"iheader:options\");\nexport const DATASOURCE_META_KEY = Symbol(\"idatasource:options\");\nexport const AUTHORIZATION_META_KEY = Symbol(\"idatasource:authorization\");\n\nconst controllerRegistry = new Set<Function>();\nconst serviceRegistry = new Set<Function>();\nconst optionsRegistry = new Map<string, any>();\n\nconst Container = TypediContainer;\n\nexport function registerController(controller: Function) {\n controllerRegistry.add(controller);\n}\nexport function registerService(service: Function) {\n Container.set(service, service);\n serviceRegistry.add(service);\n}\n\nexport function getRegisteredServices(): Function[] {\n return Array.from(serviceRegistry);\n}\nexport function getRegisteredControllers(): Function[] {\n return Array.from(controllerRegistry);\n}\n\n\n\nexport const API_CONTROLLER_METADATA_KEY = Symbol(\"apiController\");\n\nexport function isApiController(target: Function): boolean {\n return Reflect.getMetadata(API_CONTROLLER_METADATA_KEY, target) === true;\n}\nContainer.set<string>(\"appName\", \"Iqra\");\n\nexport function registerDataSource(dataSource: any) {\n Container.set<DataSource>(\"idatasource\", dataSource);\n}\n\nexport function registerKnex(dataSource: Knex.Config) {\n Container.set<Knex>(\"KnexConnection\", dataSource);\n}\n\n\n\nexport default Container;\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport { getMetadataStorage } from \"class-validator\";\nimport { CONTROLLER_META_KEY } from \"./container\";\nimport { ParamSchema } from \"./openapi\";\n\n// Decorator to add OpenAPI metadata to properties\nexport function OpenApiProperty(options?: ParamSchema & {\n exclude?: boolean;\n isArray?: boolean;\n items?: Record<string, any>;\n oneOf?: any[];\n allOf?: any[];\n anyOf?: any[];\n readOnly?: boolean;\n writeOnly?: boolean;\n nullable?: boolean;\n title?: string;\n}) {\n return function (target: any, propertyKey: string) {\n let meta = options ? { ...options } : {};\n if ((meta as any).format === \"binary\") {\n if ((meta as any).isArray) {\n meta = {\n ...meta,\n type: \"array\",\n items: (meta as any).items ?? { type: \"string\", format: \"binary\" },\n description: (meta as any).description || \"Array of files\",\n };\n } else {\n meta = {\n ...meta,\n type: \"string\",\n format: \"binary\",\n description: (meta as any).description || \"File upload\",\n };\n }\n }\n\n Reflect.defineMetadata(\"property:openapi\", meta, target, propertyKey);\n };\n}\n\nfunction extractOpenApiFields(meta: any): any {\n const result: any = {};\n\n // ✅ Complete list — was missing required, title, readOnly, writeOnly, nullable\n const jsonSchemaFields = [\n \"description\",\n \"deprecated\",\n \"example\",\n \"enum\",\n \"format\",\n \"default\",\n \"minimum\",\n \"maximum\",\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"oneOf\",\n \"allOf\",\n \"anyOf\",\n \"title\",\n \"readOnly\",\n \"writeOnly\",\n \"nullable\"\n ];\n\n // Valid JSON Schema formats\n const validFormats = [\n \"date-time\", \"date\", \"time\", \"duration\",\n \"email\", \"idn-email\", \"hostname\", \"idn-hostname\",\n \"ipv4\", \"ipv6\", \"uri\", \"uri-reference\",\n \"iri\", \"iri-reference\", \"uuid\", \"uri-template\",\n \"json-pointer\", \"relative-json-pointer\", \"regex\",\n \"int32\", \"int64\", \"float\", \"double\",\n \"byte\", \"binary\", \"password\",\n ];\n\n jsonSchemaFields.forEach((field) => {\n if (meta[field] !== undefined) {\n if (field === \"format\") {\n const formatValue = meta[field];\n if (validFormats.includes(formatValue)) {\n result[field] = formatValue;\n }\n } else {\n result[field] = meta[field];\n }\n }\n });\n\n return result;\n}\n\nexport function CreateSwaggerObjectSchema(classType: any): any {\n const metadataStorage = getMetadataStorage();\n const validationMetadata = metadataStorage.getTargetValidationMetadatas(\n classType, \"\", true, false,\n );\n\n const schema: any = { type: \"object\", properties: {}, required: [] };\n const prototype = classType.prototype;\n const propertyKeys = new Set<string>();\n\n Object.getOwnPropertyNames(prototype).forEach((k) => propertyKeys.add(k));\n Object.keys(prototype).forEach((k) => propertyKeys.add(k));\n validationMetadata.forEach((m: any) => propertyKeys.add(m.propertyName));\n\n // ✅ Discover instance-level properties (class fields with !)\n try {\n const instance = new classType();\n Reflect.ownKeys(instance).forEach((k) => {\n if (typeof k === \"string\") propertyKeys.add(k);\n });\n } catch (_) {}\n\n propertyKeys.forEach((propertyName) => {\n if (!propertyName || propertyName === \"constructor\") return;\n\n const openApiMeta: any = Reflect.getMetadata(\"property:openapi\", prototype, propertyName);\n if (openApiMeta?.exclude) return;\n\n const propertyType = Reflect.getMetadata(\"design:type\", prototype, propertyName);\n let swaggerProperty: any = {};\n\n switch (propertyType) {\n case String: swaggerProperty.type = \"string\"; break;\n case Number: swaggerProperty.type = \"number\"; break;\n case Boolean: swaggerProperty.type = \"boolean\"; break;\n case Date:\n swaggerProperty.type = \"string\";\n swaggerProperty.format = \"date-time\";\n break;\n case Array:\n swaggerProperty.type = \"array\";\n swaggerProperty.items = { type: \"string\" };\n break;\n case Object:\n swaggerProperty = CreateSwaggerObjectSchema(propertyType);\n break;\n default:\n if (propertyType && typeof propertyType === \"function\") {\n swaggerProperty.$ref = `#/components/schemas/${propertyType.name}`;\n } else {\n swaggerProperty.type = propertyType?.name?.toLowerCase() || \"string\";\n }\n }\n\n if (openApiMeta) {\n swaggerProperty = {\n ...swaggerProperty,\n ...openApiMeta,\n ...extractOpenApiFields(openApiMeta),\n };\n\n if (openApiMeta.format === \"binary\") {\n if (openApiMeta.isArray || propertyType === Array) {\n swaggerProperty = {\n type: \"array\",\n items: { type: \"string\", format: \"binary\" },\n description: openApiMeta.description || \"Array of files\",\n };\n } else {\n swaggerProperty = {\n type: \"string\",\n format: \"binary\",\n description: openApiMeta.description || \"File upload\",\n };\n }\n }\n }\n\n schema.properties[propertyName] = swaggerProperty;\n });\n\n validationMetadata.forEach((meta: any) => {\n const propertyName = meta.propertyName;\n const property = schema.properties[propertyName];\n if (!property) return;\n\n switch (meta.name) {\n case \"isNotEmpty\":\n case \"isDefined\":\n if (!schema.required.includes(propertyName)) schema.required.push(propertyName);\n break;\n case \"isOptional\":\n schema.required = schema.required.filter((item: any) => item !== propertyName);\n break;\n case \"minLength\": property.minLength = meta.constraints[0]; break;\n case \"maxLength\": property.maxLength = meta.constraints[0]; break;\n case \"min\": property.minimum = meta.constraints[0]; break;\n case \"max\": property.maximum = meta.constraints[0]; break;\n case \"isEmail\": property.format = \"email\"; break;\n case \"isDate\": property.format = \"date-time\"; break;\n case \"isIn\": property.enum = meta.constraints[0]; break;\n case \"isNumber\": property.type = \"number\"; break;\n case \"isInt\": property.type = \"integer\"; break;\n case \"isBoolean\": property.type = \"boolean\"; break;\n case \"isString\": property.type = \"string\"; break;\n }\n });\n\n if (schema.required.length === 0) delete schema.required;\n return schema;\n}\n\nexport function generateClassSchema(classType: any): any {\n const schema: any = { type: \"object\", properties: {}, required: [] };\n\n // ✅ Guard against null/undefined\n if (!classType || !classType.prototype) return schema;\n\n const metadataStorage = getMetadataStorage();\n const validationMetadata = metadataStorage.getTargetValidationMetadatas(\n classType, \"\", true, false,\n );\n\n const prototype = classType.prototype;\n const propertyKeys = new Set<string>([\n ...Object.getOwnPropertyNames(prototype),\n ...validationMetadata.map((m: any) => m.propertyName),\n ]);\n\n // ✅ Discover instance-level class fields (e.g. `search!: string`)\n // These don't appear on prototype — only on instantiated objects\n try {\n const instance = new classType();\n Reflect.ownKeys(instance).forEach((k) => {\n if (typeof k === \"string\") propertyKeys.add(k);\n });\n } catch (_) {}\n\n propertyKeys.forEach((propertyName) => {\n if (!propertyName || propertyName === \"constructor\") return;\n\n const openApiMeta: any = Reflect.getMetadata(\"property:openapi\", prototype, propertyName);\n if (openApiMeta?.exclude) return;\n\n const propertyType = Reflect.getMetadata(\"design:type\", prototype, propertyName);\n let swaggerProperty: any = {};\n\n switch (propertyType) {\n case String: swaggerProperty.type = \"string\"; break;\n case Number: swaggerProperty.type = \"number\"; break;\n case Boolean: swaggerProperty.type = \"boolean\"; break;\n case Date:\n swaggerProperty.type = \"string\";\n swaggerProperty.format = \"date-time\";\n break;\n case Array:\n swaggerProperty.type = \"array\";\n swaggerProperty.items = { type: \"string\" };\n break;\n case Object:\n swaggerProperty = generateClassSchema(propertyType);\n break;\n default:\n if (propertyType && typeof propertyType === \"function\") {\n swaggerProperty.$ref = `#/components/schemas/${propertyType.name}`;\n } else {\n swaggerProperty.type = propertyType?.name?.toLowerCase() || \"string\";\n }\n }\n\n // ✅ Apply OpenApi metadata — extractOpenApiFields now includes all fields\nif (openApiMeta) {\n const { required: _required, exclude: _exclude, isArray: _isArray, ...safeOpenApiMeta } = openApiMeta;\n swaggerProperty = {\n ...swaggerProperty,\n ...extractOpenApiFields(safeOpenApiMeta),\n };\n}\n\n schema.properties[propertyName] = swaggerProperty;\n });\n\n validationMetadata.forEach((meta: any) => {\n const propertyName = meta.propertyName;\n\n // Guard: property might not be in schema if it had no type info\n if (!schema.properties[propertyName]) {\n schema.properties[propertyName] = { type: \"string\" }; // ✅ safe fallback\n }\n\n switch (meta.name) {\n case \"isNotEmpty\":\n case \"isDefined\":\n if (!schema.required.includes(propertyName)) schema.required.push(propertyName);\n break;\n case \"isOptional\":\n schema.required = schema.required.filter((item: any) => item !== propertyName);\n break;\n case \"minLength\": schema.properties[propertyName].minLength = meta.constraints[0]; break;\n case \"maxLength\": schema.properties[propertyName].maxLength = meta.constraints[0]; break;\n case \"min\": schema.properties[propertyName].minimum = meta.constraints[0]; break;\n case \"max\": schema.properties[propertyName].maximum = meta.constraints[0]; break;\n case \"isEmail\": schema.properties[propertyName].format = \"email\"; break;\n case \"isDate\": schema.properties[propertyName].format = \"date-time\"; break;\n case \"isIn\": schema.properties[propertyName].enum = meta.constraints[0]; break;\n case \"isNumber\": schema.properties[propertyName].type = \"number\"; break;\n case \"isInt\": schema.properties[propertyName].type = \"integer\"; break;\n case \"isBoolean\": schema.properties[propertyName].type = \"boolean\"; break;\n case \"isString\": schema.properties[propertyName].type = \"string\"; break;\n }\n });\n\n if (schema.required.length === 0) delete schema.required;\n return schema;\n}\n\n// Build OpenAPI components.schemas from an array of controller/DTO classes\nexport function generateSwaggerSchema(controllers: any[]): any {\n if (!Array.isArray(controllers)) {\n return generateClassSchema(controllers);\n }\n\n const components: Record<string, any> = {};\n\n for (const controller of controllers) {\n if (!controller || typeof controller !== \"function\") continue;\n if (!controller.prototype) continue;\n\n // Skip @ApiController classes\n const isController = Reflect.getMetadata(CONTROLLER_META_KEY, controller);\n if (isController) continue;\n\n // Only include classes explicitly marked with @ApiSchema\n const isSchema = Reflect.getMetadata(\"openapi:schema\", controller);\n if (!isSchema) continue;\n\n components[controller.name] = generateClassSchema(controller);\n }\n\n return {\n components: Object.keys(components).length > 0\n ? { schemas: components }\n : undefined,\n };\n}\n\nexport function OpenApiResponse(code: number = 200, model: any, description = \"Successful response\") {\n let dataSchema: any;\n\n if (typeof model === \"function\") {\n dataSchema = generateClassSchema(model);\n } else if (model && typeof model === \"object\") {\n dataSchema = inferSchemaFromExample(model);\n } else {\n dataSchema = { type: \"string\" };\n }\n\n let message = \"OK\";\n switch (code) {\n case 400: message = \"Error\"; description = \"Error: Bad Request\"; break;\n case 401: message = \"Error\"; description = \"Error: Unauthorized\"; break;\n case 403: message = \"Error\"; description = \"Error: Forbidden\"; break;\n case 201: message = \"Created\"; description = \"Success: Created\"; break;\n case 500: message = \"Error\"; description = \"Error: InternalError\"; break;\n }\n\n return {\n description,\n content: {\n \"application/json\": {\n schema: {\n type: \"object\",\n properties: {\n code: { type: \"number\", example: code },\n status: { type: \"string\", example: message },\n data: dataSchema,\n },\n },\n },\n },\n };\n}\n\nfunction inferSchemaFromExample(obj: any): any {\n if (Array.isArray(obj)) {\n return { type: \"array\", items: inferSchemaFromExample(obj[0] ?? {}) };\n }\n if (obj && typeof obj === \"object\") {\n const properties: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n properties[key] = inferType(value);\n }\n return { type: \"object\", properties };\n }\n return inferType(obj);\n}\n\nfunction inferType(value: any): any {\n const type = typeof value;\n switch (type) {\n case \"string\": return { type: \"string\", example: value };\n case \"number\": return { type: \"number\", example: value };\n case \"boolean\": return { type: \"boolean\", example: value };\n case \"object\":\n if (Array.isArray(value)) return inferSchemaFromExample(value);\n if (value === null) return { type: \"null\" };\n return inferSchemaFromExample(value);\n default:\n return { type: \"string\" };\n }\n}","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\n\nimport Container, { Service } from \"typedi\";\nimport container, {\n API_CONTROLLER_METADATA_KEY,\n CONTROLLER_META_KEY,\n registerController,\n} from \"./container\";\n\n\nexport const REQUEST_METADATA_KEY = Symbol('avleon:request');\n\nexport function AvleonRequest(): ParameterDecorator {\n return (target, propertyKey:any, parameterIndex) => {\n const existingParams =\n Reflect.getMetadata(REQUEST_METADATA_KEY, target, propertyKey) || [];\n\n existingParams.push({\n index: parameterIndex,\n type: 'request',\n });\n\n Reflect.defineMetadata(\n REQUEST_METADATA_KEY,\n existingParams,\n target,\n propertyKey\n );\n };\n}\n\n\n\n/**\n * Options for configuring a controller.\n * @remarks\n * Controller default options\n * @type {Object} ControllerOptions\n * @property {string} [name] - The name of the controller.\n * @property {string} [path] - The base path for the controller's routes.\n * @property {string} [version] - The version of the controller. If not provided, it will default to the version from `package.json`.\n * @property {string} [since] - The date or version since the controller was introduced.\n * @property {any} [meta] - Additional metadata associated with the controller.\n */\nexport type ControllerOptions = {\n /**\n *@property {string} name\n *@description Name of the controller. If specified it'll used as swagger tags\n *@default Contorller class name\n * */\n name?: string;\n path?: string;\n version?: string; // Will look at package.json if not set\n since?: string;\n meta?: any;\n};\n\nexport function createControllerDecorator(\n type: \"api\" | \"web\" = \"web\",\n): (\n pathOrOptions?: string | ControllerOptions,\n maybeOptions?: ControllerOptions,\n) => ClassDecorator {\n return function (\n pathOrOptions?: string | ControllerOptions,\n maybeOptions?: ControllerOptions,\n ): ClassDecorator {\n return function (target: Function) {\n let path = \"/\";\n let options: ControllerOptions = {};\n\n if (typeof pathOrOptions === \"string\") {\n path = pathOrOptions;\n options = maybeOptions || {};\n } else if (typeof pathOrOptions === \"object\") {\n options = pathOrOptions;\n path = options.path || \"/\";\n }\n Reflect.defineMetadata(API_CONTROLLER_METADATA_KEY, true, target);\n // Ensure Service is applied as a ClassDecorator\n if (typeof Service === \"function\") {\n registerController(target); // Add to custom registry\n Service()(target); // Apply DI decorator\n Reflect.defineMetadata(\n CONTROLLER_META_KEY,\n { type, path, options },\n target,\n );\n } else {\n throw new Error(\"Service decorator is not a function\");\n }\n };\n };\n}\n\n/**\n *@description Api controller's are used for rest . It will populate\n * json on return and all it http methods {get} {post} etc must return\n *Results.*\n * @param path {string} this will used as route prefix\n *\n **/\n\nexport function ApiController(target: Function): void;\nexport function ApiController(path: string): ClassDecorator;\n/**\n *@description Api controller's are used for rest . It will populate\n * json on return and all it http methods {get} {post} etc must return\n * Results.*\n * @param {ControllerOptions} options this will used as route prefix\n *\n **/\nexport function ApiController(options: ControllerOptions): ClassDecorator;\nexport function ApiController(\n path: string,\n options?: ControllerOptions,\n): ClassDecorator;\nexport function ApiController(\n pathOrOptions: Function | string | ControllerOptions = \"/\",\n mayBeOptions?: ControllerOptions,\n): any {\n if (typeof pathOrOptions == \"function\") {\n Reflect.defineMetadata(API_CONTROLLER_METADATA_KEY, true, pathOrOptions);\n // Ensure Service is applied as a ClassDecorator\n if (typeof Service === \"function\") {\n registerController(pathOrOptions); // Add to custom registry\n Service()(pathOrOptions); // Apply DI decorator\n Reflect.defineMetadata(\n CONTROLLER_META_KEY,\n { type: \"api\", path: \"/\", options: {} },\n pathOrOptions,\n );\n } else {\n throw new Error(\"Service decorator is not a function\");\n }\n } else {\n if (mayBeOptions) {\n return createControllerDecorator(\"api\")(pathOrOptions, mayBeOptions);\n }\n return createControllerDecorator(\"api\")(pathOrOptions);\n }\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\n\nimport { CONTROLLER_META_KEY, ROUTE_META_KEY } from \"./container\";\nimport { OpenApiOptions } from \"./openapi\";\n\nexport type RouteMethods =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"PATCH\"\n | \"DELETE\"\n | \"OPTIONS\"\n | \"ALL\";\n\nexport type RouteMethodOptions = {\n method?: RouteMethods;\n path?: string;\n openapi?: OpenApiOptions;\n name?: string;\n};\n\n/**\n * Generic Route decorator factory\n */\nexport function Route(\n method: RouteMethods,\n pathOrOptions?: string | RouteMethodOptions,\n maybeOptions?: RouteMethodOptions\n): MethodDecorator {\n return function (target, propertyKey, descriptor) {\n let path = \"/\";\n let options: RouteMethodOptions = {};\n\n if (typeof pathOrOptions === \"string\") {\n path = pathOrOptions || \"/\";\n options = maybeOptions || {};\n } else if (typeof pathOrOptions === \"object\" && pathOrOptions !== null) {\n options = pathOrOptions;\n path = options.path || options.name || \"/\";\n } else {\n // @Get() called with no args\n options = maybeOptions || {};\n path = \"/\";\n }\n\n //Ensure path is always a string\n path = typeof path === \"string\" ? path : \"/\";\n\n Reflect.defineMetadata(\"route:path\", path, target, propertyKey);\n Reflect.defineMetadata(\"route:method\", method, target, propertyKey);\n Reflect.defineMetadata(\n ROUTE_META_KEY,\n {\n ...options,\n method,\n path, \n controller: target.constructor.name,\n },\n target,\n propertyKey\n );\n\n if (options) {\n Reflect.defineMetadata(\"route:options\", options, target, propertyKey);\n }\n };\n}\n\nexport const Get = (pathOrOptions?: string | RouteMethodOptions, maybeOptions?: RouteMethodOptions) =>\n Route(\"GET\", pathOrOptions, maybeOptions);\n\nexport const Post = (pathOrOptions?: string | RouteMethodOptions, maybeOptions?: RouteMethodOptions) =>\n Route(\"POST\", pathOrOptions, maybeOptions);\n\nexport const Put = (pathOrOptions?: string | RouteMethodOptions, maybeOptions?: RouteMethodOptions) =>\n Route(\"PUT\", pathOrOptions, maybeOptions);\n\nexport const Delete = (pathOrOptions?: string | RouteMethodOptions, maybeOptions?: RouteMethodOptions) =>\n Route(\"DELETE\", pathOrOptions, maybeOptions);\n\nexport const Patch = (pathOrOptions?: string | RouteMethodOptions, maybeOptions?: RouteMethodOptions) =>\n Route(\"PATCH\", pathOrOptions, maybeOptions);\n\nexport const Options = (pathOrOptions?: string | RouteMethodOptions, maybeOptions?: RouteMethodOptions) =>\n Route(\"OPTIONS\", pathOrOptions, maybeOptions);\n\nexport const All = (pathOrOptions?: string | RouteMethodOptions, maybeOptions?: RouteMethodOptions) =>\n Route(\"ALL\", pathOrOptions, maybeOptions);\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nexport interface InfoObject {\n title: string;\n description?: string;\n termsOfService?: string;\n contact?: ContactObject;\n license?: LicenseObject;\n version: string;\n}\nexport interface ContactObject {\n name?: string;\n url?: string;\n email?: string;\n}\nexport interface LicenseObject {\n name: string;\n url?: string;\n}\nexport interface ServerObject {\n url: string;\n description?: string;\n variables?: {\n [variable: string]: ServerVariableObject;\n };\n}\nexport interface ServerVariableObject {\n enum?: string[];\n default: string;\n description?: string;\n}\n\nexport type OpenApiUiOptions = {\n logo?: any;\n theme?: any;\n provider?: \"default\" | \"scalar\";\n ui?: \"default\" | \"scalar\";\n openapi?: string;\n uiConfig?: any;\n configuration?: any;\n routePrefix?: string;\n info?: InfoObject;\n servers?: ServerObject[];\n paths?: PathsObject<any>;\n components?: ComponentsObject;\n security?: SecurityRequirementObject[];\n tags?: TagObject[];\n externalDocs?: any;\n \"x-express-openapi-additional-middleware\"?: (\n | ((request: any, response: any, next: any) => Promise<void>)\n | ((request: any, response: any, next: any) => void)\n )[];\n \"x-express-openapi-validation-strict\"?: boolean;\n};\nexport interface PathsObject<T extends {} = {}, P extends {} = {}> {\n [pattern: string]: (PathItemObject<T> & P) | undefined;\n}\nenum HttpMethods {\n GET = \"get\",\n PUT = \"put\",\n POST = \"post\",\n DELETE = \"delete\",\n OPTIONS = \"options\",\n HEAD = \"head\",\n PATCH = \"patch\",\n TRACE = \"trace\",\n}\nexport type PathItemObject<T extends {} = {}> = {\n $ref?: string;\n summary?: string;\n description?: string;\n servers?: ServerObject[];\n parameters?: (ReferenceObject | ParameterObject)[];\n} & {\n [method in HttpMethods]?: OperationObject<T>;\n};\nexport type OperationObject<T extends {} = {}> = {\n tags?: string[];\n summary?: string;\n description?: string;\n externalDocs?: ExternalDocumentationObject;\n operationId?: string;\n parameters?: (ReferenceObject | ParameterObject)[];\n requestBody?: ReferenceObject | RequestBodyObject;\n responses: ResponsesObject;\n callbacks?: {\n [callback: string]: ReferenceObject | CallbackObject;\n };\n deprecated?: boolean;\n security?: SecurityRequirementObject[];\n servers?: ServerObject[];\n} & T;\nexport interface ExternalDocumentationObject {\n description?: string;\n url: string;\n}\nexport interface ParameterObject extends ParameterBaseObject {\n name: string;\n in: string;\n}\nexport interface HeaderObject extends ParameterBaseObject { }\nexport interface ParameterBaseObject {\n description?: string;\n required?: boolean;\n deprecated?: boolean;\n allowEmptyValue?: boolean;\n style?: string;\n explode?: boolean;\n allowReserved?: boolean;\n schema?: ReferenceObject | SchemaObject;\n example?: any;\n examples?: {\n [media: string]: ReferenceObject | ExampleObject;\n };\n content?: {\n [media: string]: MediaTypeObject;\n };\n}\nexport type NonArraySchemaObjectType =\n | \"boolean\"\n | \"object\"\n | \"number\"\n | \"string\"\n | \"integer\";\nexport type ArraySchemaObjectType = \"array\";\nexport type SchemaObject = ArraySchemaObject | NonArraySchemaObject;\nexport interface ArraySchemaObject extends BaseSchemaObject {\n type: ArraySchemaObjectType;\n items: ReferenceObject | SchemaObject;\n}\nexport interface NonArraySchemaObject extends BaseSchemaObject {\n type?: NonArraySchemaObjectType;\n}\nexport interface BaseSchemaObject {\n title?: string;\n description?: string;\n format?: string;\n default?: any;\n multipleOf?: number;\n maximum?: number;\n exclusiveMaximum?: boolean;\n minimum?: number;\n exclusiveMinimum?: boolean;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n additionalProperties?: boolean | ReferenceObject | SchemaObject;\n maxItems?: number;\n minItems?: number;\n uniqueItems?: boolean;\n maxProperties?: number;\n minProperties?: number;\n required?: string[];\n enum?: any[];\n properties?: {\n [name: string]: ReferenceObject | SchemaObject;\n };\n allOf?: (ReferenceObject | SchemaObject)[];\n oneOf?: (ReferenceObject | SchemaObject)[];\n anyOf?: (ReferenceObject | SchemaObject)[];\n not?: ReferenceObject | SchemaObject;\n nullable?: boolean;\n discriminator?: DiscriminatorObject;\n readOnly?: boolean;\n writeOnly?: boolean;\n xml?: XMLObject;\n externalDocs?: ExternalDocumentationObject;\n example?: any;\n deprecated?: boolean;\n}\nexport interface DiscriminatorObject {\n propertyName: string;\n mapping?: {\n [value: string]: string;\n };\n}\nexport interface XMLObject {\n name?: string;\n namespace?: string;\n prefix?: string;\n attribute?: boolean;\n wrapped?: boolean;\n}\nexport interface ReferenceObject {\n $ref: string;\n}\nexport interface ExampleObject {\n summary?: string;\n description?: string;\n value?: any;\n externalValue?: string;\n}\nexport interface MediaTypeObject {\n schema?: ReferenceObject | SchemaObject;\n example?: any;\n examples?: {\n [media: string]: ReferenceObject | ExampleObject;\n };\n encoding?: {\n [media: string]: EncodingObject;\n };\n}\nexport interface EncodingObject {\n contentType?: string;\n headers?: {\n [header: string]: ReferenceObject | HeaderObject;\n };\n style?: string;\n explode?: boolean;\n allowReserved?: boolean;\n}\nexport interface RequestBodyObject {\n description?: string;\n content: {\n [media: string]: MediaTypeObject;\n };\n required?: boolean;\n}\nexport interface ResponsesObject {\n [code: string]: ReferenceObject | ResponseObject;\n}\nexport interface ResponseObject {\n description: string;\n headers?: {\n [header: string]: ReferenceObject | HeaderObject;\n };\n content?: {\n [media: string]: MediaTypeObject;\n };\n links?: {\n [link: string]: ReferenceObject | LinkObject;\n };\n}\nexport interface LinkObject {\n operationRef?: string;\n operationId?: string;\n parameters?: {\n [parameter: string]: any;\n };\n requestBody?: any;\n description?: string;\n server?: ServerObject;\n}\nexport interface CallbackObject {\n [url: string]: PathItemObject;\n}\nexport interface SecurityRequirementObject {\n [name: string]: string[];\n}\nexport interface ComponentsObject {\n schemas?: {\n [key: string]: ReferenceObject | SchemaObject;\n };\n responses?: {\n [key: string]: ReferenceObject | ResponseObject;\n };\n parameters?: {\n [key: string]: ReferenceObject | ParameterObject;\n };\n examples?: {\n [key: string]: ReferenceObject | ExampleObject;\n };\n requestBodies?: {\n [key: string]: ReferenceObject | RequestBodyObject;\n };\n headers?: {\n [key: string]: ReferenceObject | HeaderObject;\n };\n securitySchemes?: {\n [key: string]: ReferenceObject | SecuritySchemeObject;\n };\n links?: {\n [key: string]: ReferenceObject | LinkObject;\n };\n callbacks?: {\n [key: string]: ReferenceObject | CallbackObject;\n };\n}\nexport type SecuritySchemeObject =\n | HttpSecurityScheme\n | ApiKeySecurityScheme\n | OAuth2SecurityScheme\n | OpenIdSecurityScheme;\nexport interface HttpSecurityScheme {\n type: \"http\";\n description?: string;\n scheme: string;\n bearerFormat?: string;\n}\nexport interface ApiKeySecurityScheme {\n type: \"apiKey\";\n description?: string;\n name: string;\n in: string;\n}\nexport interface OAuth2SecurityScheme {\n type: \"oauth2\";\n description?: string;\n flows: {\n implicit?: {\n authorizationUrl: string;\n refreshUrl?: string;\n scopes: {\n [scope: string]: string;\n };\n };\n password?: {\n tokenUrl: string;\n refreshUrl?: string;\n scopes: {\n [scope: string]: string;\n };\n };\n clientCredentials?: {\n tokenUrl: string;\n refreshUrl?: string;\n scopes: {\n [scope: string]: string;\n };\n };\n authorizationCode?: {\n authorizationUrl: string;\n tokenUrl: string;\n refreshUrl?: string;\n scopes: {\n [scope: string]: string;\n };\n };\n };\n}\nexport interface OpenIdSecurityScheme {\n type: \"openIdConnect\";\n description?: string;\n openIdConnectUrl: string;\n}\nexport interface TagObject {\n name: string;\n description?: string;\n externalDocs?: ExternalDocumentationObject;\n}\n\nexport type ParamSchema = {\n type?: \"string\" | \"number\" | \"integer\" | \"boolean\"|\"array\";\n description?: string;\n example?: any;\n required?: boolean;\n deprecated?: boolean;\n enum?: any[];\n format?: string;\n default?: any;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n};\n\nexport type ParamsSchemaMap = Record<string, ParamSchema>;\n\nexport type RequestBodyOptions = {\n description?: string;\n required?: boolean;\n content?: {\n [media: string]: MediaTypeObject;\n };\n schema?: SchemaObject | ReferenceObject;\n example?: any;\n examples?: Record<string, ExampleObject>;\n};\n\nexport type ResponseBodyOptions = {\n description?: string;\n type?: NonArraySchemaObjectType | ArraySchemaObjectType;\n properties?: {\n [name: string]: ReferenceObject | SchemaObject;\n };\n items?: ReferenceObject | SchemaObject;\n required?: string[];\n schema?: SchemaObject | ReferenceObject;\n example?: any;\n examples?: Record<string, ExampleObject>;\n content?: {\n [media: string]: MediaTypeObject;\n };\n} & Partial<BaseSchemaObject>; // ✅ inherits all schema fields (format, enum, minimum, etc.)\n\nexport type ResponsesOptions = {\n [statusCode: number]: ResponseBodyOptions | ResponseObject;\n};\n\nexport type OpenApiOptions = {\n exclude?: boolean;\n deprecated?: boolean;\n tags?: readonly string[];\n description?: string;\n summary?: string;\n operationId?: string;\n security?: SecurityRequirementObject[];\n externalDocs?: ExternalDocumentationObject;\n components?: ComponentsObject;\n\n /** Path parameters e.g. /:id → { id: { type: \"string\", example: \"abc-123\" } } */\n params?: ParamsSchemaMap;\n\n /** Query string parameters e.g. ?page=1 → { page: { type: \"integer\", example: 1 } } */\n query?: ParamsSchemaMap;\n\n /** Request headers */\n headers?: ParamsSchemaMap;\n\n /** Request body */\n requestBody?: RequestBodyOptions;\n\n /** Responses keyed by HTTP status code */\n response?: ResponsesOptions;\n\n /** @deprecated use requestBody instead */\n responseBody?: any;\n};\n\n/**\n * Normalize a flat ParamsSchemaMap into a valid JSON Schema object\n * that Fastify/AJV can validate against.\n *\n * Input: { id: { type: \"string\", example: \"abc-123\" } }\n * Output: { type: \"object\", properties: { id: { type: \"string\", example: \"abc-123\" } } }\n */\nexport function normalizeParamsToJsonSchema(\n params: ParamsSchemaMap,\n requiredKeys: string[] = [],\n): SchemaObject {\n const properties: Record<string, any> = {};\n\n for (const [key, val] of Object.entries(params)) {\n properties[key] = {\n type: \"string\", // sensible default\n ...val,\n };\n }\n\n const schema: any = {\n type: \"object\",\n properties,\n };\n\n if (requiredKeys.length > 0) {\n schema.required = requiredKeys;\n }\n\n return schema;\n}\nexport function OpenApiSchema(): ClassDecorator {\n return function (target) {\n Reflect.defineMetadata(\"openapi:schema\", true, target);\n };\n}\nexport function OpenApi(\n options: OpenApiOptions,\n): MethodDecorator & ClassDecorator & PropertyDecorator {\n return function (\n target: Object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor,\n ) {\n if (typeof target === \"function\" && !propertyKey) {\n Reflect.defineMetadata(\"controller:openapi\", options, target);\n } else if (descriptor) {\n // ✅ Store options as-is — router's buildRouteSchema handles normalization\n Reflect.defineMetadata(\"route:openapi\", options, target, propertyKey!);\n } else if (propertyKey) {\n Reflect.defineMetadata(\"property:openapi\", options, target, propertyKey);\n }\n };\n}\n\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport fs from \"fs\";\nimport crypto from \"crypto\";\n\nexport const uuid = crypto.randomUUID();\n\nexport type Constructor<T = any> = new (...args: any[]) => T;\n\nexport function isConstructor(func: any): boolean {\n if (typeof func !== \"function\") {\n return false;\n }\n\n if (func === Function.prototype.bind || func instanceof RegExp) {\n return false;\n }\n\n if (func.prototype && typeof func.prototype === \"object\") {\n return true;\n }\n\n try {\n const instance = new (func as any)();\n return typeof instance === \"object\";\n } catch (e) {\n return false;\n }\n}\n\nexport function formatUrl(path: string): string {\n if (typeof path !== \"string\") {\n throw new Error(\"The path must be a string\");\n }\n path = path.trim();\n\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n path = path.replace(/\\/\\/+/g, \"/\");\n if (path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n return path;\n}\n\nexport function parsedPath(ipath: string): string {\n return !ipath.startsWith(\"/\") ? \"/\" + ipath : ipath;\n}\n\nexport interface MatchLocation {\n line: number;\n column: number;\n}\nexport const getLineNumber = (\n filePath: string,\n rpath: string | RegExp,\n): MatchLocation[] | null => {\n let numbers = [];\n try {\n const fileContent = fs.readFileSync(filePath, \"utf8\");\n const lines = fileContent.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(rpath);\n\n if (match) {\n console.log(match);\n numbers.push({\n line: i + 1,\n column: match.index ?? 0,\n });\n }\n }\n\n return numbers;\n } catch (error) {\n return numbers;\n }\n};\n\nexport function normalizePath(base: string = \"/\", subPath: string = \"/\") {\n return `/${base}/${subPath}`.replace(/\\/+/g, \"/\").replace(/\\/$/, \"\");\n}\n\nexport function extrctParamFromUrl(url: string) {\n const splitPart = url\n .split(\"/\")\n .filter((x) => x.startsWith(\":\") || x.startsWith(\"?:\"));\n return splitPart.map((f) => ({\n key: f.replace(/(\\?|:)/g, \"\"),\n required: !f.startsWith(\"?:\"),\n }));\n}\n\nexport function findDuplicates(arr: string[]): string[] {\n const seen = new Set();\n const duplicates = new Set();\n\n for (const str of arr) {\n if (seen.has(str)) {\n duplicates.add(str);\n } else {\n seen.add(str);\n }\n }\n\n return Array.from(duplicates) as string[];\n}\n\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport { instanceToPlain, plainToInstance } from \"class-transformer\";\nimport { Constructor } from \"./common-utils\";\n\nexport function pick<T extends object>(obj: T, paths: string[]): Partial<T> {\n const result: any = {};\n\n for (const path of paths) {\n const keys = path.split(\".\");\n let source: any = obj;\n let target: any = result;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n\n if (!(key in source)) break;\n\n if (i === keys.length - 1) {\n target[key] = source[key];\n } else {\n source = source[key];\n target[key] = target[key] || {};\n target = target[key];\n }\n }\n }\n\n return result;\n}\n\nexport function exclude<T extends object>(\n obj: T | T[],\n paths: string[],\n): Partial<T> | Partial<T>[] {\n if (Array.isArray(obj)) {\n return obj.map((item) => exclude(item, paths) as Partial<T>);\n }\n\n const clone = structuredClone(obj); // Or use lodash.cloneDeep\n for (const path of paths) {\n const keys = path.split(\".\");\n let target: any = clone;\n\n for (let i = 0; i < keys.length - 1; i++) {\n if (!(keys[i] in target)) break;\n target = target[keys[i]];\n }\n\n delete target?.[keys[keys.length - 1]];\n }\n\n return clone;\n}\n\nexport function autoCast(value: any, typeHint?: any, schema?: any): any {\n if (value === null || value === undefined) return value;\n if (Array.isArray(value)) {\n const elementType = Array.isArray(typeHint) ? typeHint[0] : undefined;\n return value.map((v) => autoCast(v, elementType));\n }\n if (typeof value === \"object\" && !(value instanceof Date)) {\n const result: Record<string, any> = {};\n for (const [key, val] of Object.entries(value)) {\n let fieldType: any = undefined;\n\n if (schema?.properties?.[key]?.type) {\n const t = schema.properties[key].type;\n fieldType =\n t === \"integer\" || t === \"number\"\n ? Number\n : t === \"boolean\"\n ? Boolean\n : t === \"array\"\n ? Array\n : t === \"object\"\n ? Object\n : String;\n }\n\n result[key] = autoCast(val, fieldType);\n }\n return result;\n }\n\n\n if (typeof value !== \"string\") return value;\n\n const trimmed = value.trim();\n\n\n if (typeHint === Boolean || trimmed.toLowerCase() === \"true\") return true;\n if (trimmed.toLowerCase() === \"false\") return false;\n\n\n if (typeHint === Number || (!isNaN(Number(trimmed)) && trimmed !== \"\")) {\n const n = Number(trimmed);\n if (!isNaN(n)) return n;\n }\n\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n const parsed = JSON.parse(trimmed);\n return autoCast(parsed, typeHint, schema);\n } catch {\n return trimmed;\n }\n }\n\n if (\n typeHint === Date ||\n /^\\d{4}-\\d{2}-\\d{2}([Tt]\\d{2}:\\d{2})?/.test(trimmed)\n ) {\n const d = new Date(trimmed);\n if (!isNaN(d.getTime())) return d;\n }\n\n return trimmed;\n}\n\n/**\n * Deeply normalizes query strings into nested JS objects.\n */\nexport function normalizeQueryDeep(query: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n\n const setDeep = (obj: any, path: string[], value: any) => {\n let current = obj;\n\n for (let i = 0; i < path.length; i++) {\n const key = path[i];\n const nextKey = path[i + 1];\n\n if (i === path.length - 1) {\n if (key === \"\") {\n if (!Array.isArray(current)) current = [];\n current.push(value);\n } else if (Array.isArray(current[key])) {\n current[key].push(value);\n } else if (current[key] !== undefined) {\n current[key] = [current[key], value];\n } else {\n current[key] = value;\n }\n } else {\n if (!current[key]) {\n current[key] = nextKey === \"\" || /^\\d+$/.test(nextKey) ? [] : {};\n }\n current = current[key];\n }\n }\n };\n\n for (const [rawKey, rawValue] of Object.entries(query)) {\n const path = [];\n const regex = /([^\\[\\]]+)|(\\[\\])/g;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(rawKey)) !== null) {\n if (match[1]) path.push(match[1]);\n else if (match[2]) path.push(\"\");\n }\n\n if (path.length === 0) {\n if (result[rawKey]) {\n if (Array.isArray(result[rawKey])) result[rawKey].push(rawValue);\n else result[rawKey] = [result[rawKey], rawValue];\n } else {\n result[rawKey] = rawValue;\n }\n } else {\n setDeep(result, path, rawValue);\n }\n }\n\n return result;\n}\n\nexport function transformObjectByInstanceToObject(\n instance: Constructor,\n value: object,\n) {\n return instanceToPlain(plainToInstance(instance, value), {\n excludeExtraneousValues: true,\n exposeUnsetFields: true,\n });\n}\n\nexport function jsonToJs(value: string) {\n try {\n return JSON.parse(value);\n } catch (err: any) {\n return false;\n }\n}\n\nexport function jsonToInstance(value: string, instance: Constructor) {\n try {\n const parsedValue = JSON.parse(value);\n return plainToInstance(instance, parsedValue);\n } catch (err: any) {\n return false;\n }\n}\n","import { isValidJsonString } from \"../helpers\";\n\n/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nexport abstract class BaseHttpException extends Error {\n code: number = 500;\n name: string = \"HttpException\";\n payload: any; \n constructor(message: any) {\n const stringMessage = typeof message === \"string\" ? message : JSON.stringify(message);\n super(stringMessage);\n this.payload = typeof message === \"string\" ? { message } : message;\n }\n isCustomException() {\n return true;\n }\n}\n\nexport class BadRequestException extends BaseHttpException {\n name: string = \"BadRequest\";\n code: number = 400;\n\n constructor(message: any) {\n super(message);\n }\n}\n\nexport class ValidationErrorException extends BadRequestException {\n name: string = \"ValidationError\";\n}\n\nexport class InternalErrorException extends BaseHttpException {\n name: string = \"InternalError\";\n code: number = 500;\n\n constructor(message: any = \"Something going wrong\") {\n super(message);\n }\n}\n\nexport class NotFoundException extends BaseHttpException {\n name: string = \"NotFound\";\n code: number = 404;\n constructor(message: any) {\n super(message);\n }\n}\n\nexport class UnauthorizedException extends BaseHttpException {\n name: string = \"Unauthorized\";\n code: number = 401;\n constructor(message: any) {\n super(message);\n }\n}\n\nexport class ForbiddenException extends BaseHttpException {\n name: string = \"Forbidden\";\n code: number = 403;\n constructor(message: any) {\n super(message);\n }\n}\n\nexport type HttpExceptionTypes =\n | NotFoundException\n | BadRequestException\n | UnauthorizedException\n | InternalErrorException\n | ForbiddenException;\n\n// export type HttpExceptions = {\n// NotFound: (message: any) => NotFoundException,\n// ValidationError: (message: any) =>ValidationErrorException,\n// BadRequest: (message: any) => BadRequestException,\n// Unauthorized: (message: any) => UnauthorizedException,\n// Forbidden: (message: any) => ForbiddenException,\n// InternalError: (message: any) => InternalErrorException\n// }\nexport const HttpExceptions = {\n notFound: (message: any = \"\") => new NotFoundException(message),\n validationError: (message: any = \"\") => new ValidationErrorException(message),\n badRequest: (message: any = \"\") => new BadRequestException(message),\n unauthorized: (message: any = \"\") => new UnauthorizedException(message),\n forbidden: (message: any = \"\") => new ForbiddenException(message),\n internalError: (message: any = \"\") => new InternalErrorException(message),\n};\n","export * from \"./http-exceptions\";\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport { getMetadataStorage, validateSync } from \"class-validator\";\nimport { Constructor } from \"./common-utils\";\nimport { InternalErrorException } from \"../exceptions\"; // Need to check path relative to utils\nimport { plainToInstance } from \"class-transformer\";\n\nexport const isClassValidator = (target: Constructor) => {\n try {\n const clsval = require(\"class-validator\");\n const result = getMetadataStorage().getTargetValidationMetadatas(\n target,\n \"\",\n false,\n false,\n );\n return result.length > 0;\n } catch (err: any) {\n console.log(err);\n return false;\n }\n};\n\nexport function getDataType(expectedType: any) {\n switch (expectedType.name) {\n case \"Object\":\n if (Array.isArray(expectedType)) {\n return \"array\";\n }\n return \"object\";\n case \"String\":\n return \"string\";\n case \"Number\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n default:\n return expectedType;\n }\n}\n\nexport function isValidType(value: any, expectedType: any): boolean {\n if (value === undefined || value === null) return true;\n\n switch (expectedType.name) {\n case \"String\":\n return typeof value === \"string\";\n case \"Number\":\n return typeof value === \"number\" || !isNaN(Number(value));\n case \"Boolean\":\n return typeof value === \"boolean\";\n default:\n return value instanceof expectedType;\n }\n}\n\nexport function isValidJsonString(value: string): object | boolean {\n try {\n return JSON.parse(value);\n } catch (err: any) {\n return false;\n }\n}\n\nexport const isClassValidatorClass = (target: Constructor) => {\n try {\n const clsval = require(\"class-validator\");\n const result = clsval\n .getMetadataStorage()\n .getTargetValidationMetadatas(target, undefined, false, false);\n return result.length > 0;\n } catch (err: any) {\n return false;\n }\n};\n\nexport async function validateObjectByInstance(\n target: Constructor,\n value: object = {},\n options: \"object\" | \"array\" = \"array\",\n) {\n try {\n const { validateOrReject } = require(\"class-validator\");\n const { plainToInstance } = require(\"class-transformer\");\n await validateOrReject(plainToInstance(target, value));\n } catch (error: any) {\n if (typeof error == \"object\" && Array.isArray(error)) {\n const errors =\n options == \"object\"\n ? error.reduce((acc: any, x: any) => {\n //acc[x.property] = Object.values(x.constraints);\n acc[x.property] = x.constraints;\n return acc;\n }, {})\n : error.map((x) => ({\n path: x.property,\n constraints: x.constraints,\n }));\n return errors;\n } else {\n throw new InternalErrorException(\"Can't validate object\");\n }\n }\n}\n\ntype ValidationError = {\n count: number;\n errors: any;\n};\n\nexport function validateRequestBody(\n target: Constructor,\n value: object,\n options: \"object\" | \"array\" = \"array\",\n): ValidationError {\n if (!isClassValidatorClass(target)) return { count: 0, errors: {} };\n const error = validateSync(plainToInstance(target, value ? value : {}));\n const errors =\n options == \"object\"\n ? error.reduce((acc: any, x: any) => {\n //acc[x.property] = Object.values(x.constraints);\n acc[x.property] = x.constraints;\n return acc;\n }, {})\n : error.map((x) => ({ path: x.property, constraints: x.constraints }));\n return { count: error.length, errors } as ValidationError;\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nexport interface IRouteDuplicateErr {\n path: string;\n mpath: string;\n method: string;\n controller: string;\n inverseController?: string;\n}\n\nexport class SystemUseError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\nexport class DuplicateRouteException extends Error {\n constructor(params: IRouteDuplicateErr) {\n let sameController = params.controller == params.inverseController;\n let message = `Duplicate route found for method ${params.method.toUpperCase()}:${params.path == \"\" ? \"'/'\" : params.path} `;\n message += sameController\n ? `in ${params.controller}`\n : `both in ${params.controller} and ${params.inverseController}`;\n super(message);\n }\n}\n\nexport class EnvironmentVariableNotFound extends Error {\n constructor(key: string) {\n super(`${key} not found in environment variables.`);\n }\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport container from \"../container\";\nimport { SystemUseError } from \"../exceptions/system-exception\";\n\nexport function inject<T>(cls: new (...args: any[]) => T): T {\n try {\n return container.get(cls);\n } catch (error) {\n throw new SystemUseError(\n \"Not a project class. Maybe you wanna register it first.\",\n );\n }\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\n\nimport { BadRequestException } from \"./exceptions\";\n\nclass PValidationRule<T> {\n name: string;\n type: T;\n message?: string;\n\n constructor(name: string, type: T, message?: string) {\n this.name = name;\n this.type = type;\n this.message = message;\n }\n}\n\ntype BaseRule = {\n required?: boolean;\n optional?: boolean;\n message?: string;\n};\n\ntype StringRule = BaseRule & {\n type: \"string\";\n};\n\ntype NumberRule = BaseRule & {\n type: \"number\";\n min?: number;\n max?: number;\n exact?: number;\n};\n\ntype BooleanRule = BaseRule & {\n type: \"boolean\";\n};\n\nexport type ValidationRule = StringRule | NumberRule | BooleanRule;\n\nexport type ValidationProps = {\n [key: string]: ValidationRule;\n};\n\nexport type ValidateOptons = {\n location?: \"header\" | \"queryparam\" | \"param\" | \"body\" | \"custom\";\n};\n\nexport class Validator {\n private rules: PValidationRule<any>[] = [];\n private options: ValidateOptons = {};\n\n constructor(obj: ValidationProps, options?: ValidateOptons) {\n this.init(obj);\n if (options) {\n this.options = options;\n }\n }\n\n private init(obj: ValidationProps) {\n Object.keys(obj).forEach((key) => {\n const rule = obj[key];\n this.rules.push(\n new PValidationRule<typeof rule.type>(key, rule.type, rule.message),\n );\n });\n }\n\n validate(obj: any | Array<any>, options?: ValidateOptons) {\n const erors: any[] = [];\n\n this.rules.forEach((k) => {\n const r = Object.keys(obj).find((key) => key == k.name);\n let messages: any = [];\n if (!r || obj[r] == undefined || obj[r] == \"\") {\n messages.push({\n constraint: \"required\",\n message: k.name + \" is required\",\n });\n }\n\n if (k.type == \"string\" && typeof obj[k.name] != \"string\") {\n messages.push({\n constraint: \"type\",\n message: `${k.name} must be type ${k.type}`,\n });\n }\n if (k.type == \"number\" && !parseInt(obj[k.name])) {\n messages.push({\n constraint: \"type\",\n message: `${k.name} must be type ${k.type}`,\n });\n }\n\n if (k.type == \"number\") {\n obj[k.name] = parseInt(obj[k.name]);\n }\n if (k.type == \"boolean\" && !isBool(obj[k.name])) {\n messages.push({\n constraint: \"type\",\n message: `${k.name} must be type ${k.type}`,\n });\n }\n if (k.type == \"boolean\") {\n obj[k.name] = parseBoolean(obj[k.name]);\n }\n if (messages.length > 0) {\n erors.push({\n path: k.name,\n ...(this.options.location ? { location: this.options.location } : {}),\n constraints: messages,\n });\n }\n });\n\n return [erors, obj];\n }\n}\n\nconst isBool = (val: any) => {\n if (typeof val == \"boolean\") return true;\n if (parseInt(val) == 0 || parseInt(val) == 1) return true;\n if (val == \"true\" || val == \"false\") return true;\n\n return false;\n};\n\nconst parseBoolean = (val: any): boolean => {\n if (typeof val === \"boolean\") return val;\n\n if (parseInt(val) == 1) return true;\n if (typeof val === \"string\") {\n const normalized = val.trim().toLowerCase();\n return normalized === \"true\";\n }\n return false; \n};\n\nexport function validateOrThrow<T extends {}>(\n obj: T,\n rules: ValidationProps,\n options?: ValidateOptons,\n) {\n const valid = new Validator(rules, options);\n const errors = valid.validate(obj);\n\n if (errors[0].length > 0) {\n throw new BadRequestException(errors[0]);\n }\n\n return errors[1];\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\n\nexport * from \"./utils/common-utils\";\nexport * from \"./utils/object-utils\";\nexport * from \"./utils/validation-utils\";\nexport * from \"./utils/di-utils\";\nexport * from \"./validation\";\n\n\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\n\nimport {\n PARAM_META_KEY,\n QUERY_META_KEY,\n REQUEST_BODY_META_KEY,\n REQUEST_HEADER_META_KEY,\n REQUEST_USER_META_KEY,\n ROUTE_META_KEY,\n} from \"./container\";\nimport { getDataType, isClassValidatorClass, isValidType } from \"./helpers\";\nimport { generateClassSchema, generateSwaggerSchema } from \"./swagger-schema\";\n\ntype ParameterOptions = {\n required?: boolean;\n validate?: boolean;\n type?: any;\n};\n\nfunction createParamDecorator(\n type: string | symbol,\n): (\n key?: string | ParameterOptions,\n options?: ParameterOptions,\n) => ParameterDecorator {\n return function (\n key?: string | ParameterOptions,\n options: ParameterOptions = {},\n ): ParameterDecorator {\n return function (target: any, propertyKey: any, parameterIndex: number) {\n let metaKey: string | symbol;\n switch (type) {\n case \"route:param\":\n metaKey = PARAM_META_KEY;\n break;\n case \"route:query\":\n metaKey = QUERY_META_KEY;\n break;\n case \"route:body\":\n metaKey = REQUEST_BODY_META_KEY;\n break;\n case \"route:user\":\n metaKey = REQUEST_USER_META_KEY;\n break;\n case \"route:header\":\n metaKey = REQUEST_HEADER_META_KEY;\n break;\n default:\n throw new Error(`Unknown param decorator type: ${String(type)}`);\n }\n\n const existingParams =\n Reflect.getMetadata(metaKey, target, propertyKey) || [];\n\n // Get parameter names (fallback safe)\n const functionSource: string = target[propertyKey].toString();\n const paramNames =\n functionSource.match(/\\(([^)]*)\\)/)?.[1]?.split(\",\").map((n) => n.trim()) || [];\n const parameterTypes =\n Reflect.getMetadata(\"design:paramtypes\", target, propertyKey) || [];\n const paramDataType = parameterTypes[parameterIndex];\n existingParams.push({\n index: parameterIndex,\n key: typeof key === \"string\" ? key : \"all\",\n name: paramNames[parameterIndex],\n required: options.required ?? true,\n validate: options.validate ?? true,\n dataType: getDataType(paramDataType),\n validatorClass: isClassValidatorClass(paramDataType),\n schema: isClassValidatorClass(paramDataType)\n ? generateClassSchema(paramDataType)\n : null,\n type,\n });\n Reflect.defineMetadata(metaKey, existingParams, target, propertyKey);\n };\n };\n}\n\nexport const Param = createParamDecorator(\"route:param\");\nexport const Query = createParamDecorator(\"route:query\");\nexport const Body = createParamDecorator(\"route:body\");\nexport const Header = createParamDecorator(\"route:header\");\nexport const AuthUser = createParamDecorator(\"route:user\");\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\n\nimport { Service as _service } from \"typedi\";\nimport container, { registerService } from \"./container\";\nexport function AppService(target: any): void;\nexport function AppService(): any;\nexport function AppService(target?: any) {\n if (target) {\n _service()(target);\n } else {\n return function (tg: any) {\n _service()(tg);\n };\n }\n}\n\nexport * from \"./controller\";\nexport * from \"./route-methods\";\nexport * from \"./openapi\";\nexport const Utility = _service;\nexport const Helper = _service;\nexport * from \"./params\";\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport {\n Constructor,\n formatUrl,\n autoCast,\n normalizeQueryDeep,\n validateOrThrow,\n validateObjectByInstance,\n} from \"../helpers\";\nimport Container from \"typedi\";\nimport container, {\n CONTROLLER_META_KEY,\n ROUTE_META_KEY,\n PARAM_META_KEY,\n QUERY_META_KEY,\n REQUEST_BODY_META_KEY,\n REQUEST_HEADER_META_KEY,\n REQUEST_USER_META_KEY,\n AUTHORIZATION_META_KEY,\n REQUEST_BODY_FILE_KEY,\n REQUEST_BODY_FILES_KEY,\n} from \"../container\";\nimport {\n MethodParamMeta,\n IRequest,\n FuncRoute,\n ParamMetaOptions,\n} from \"./types\";\nimport {\n BadRequestException,\n ValidationErrorException,\n} from \"../exceptions\";\nimport { AvleonMiddleware } from \"../middleware\";\nimport { REQUEST_METADATA_KEY } from \"../controller\";\nimport { OpenApiOptions } from \"../openapi\";\nimport mime from \"mime\";\nimport Stream from \"stream\";\nimport { HTTPMethods, FastifyInstance } from \"fastify\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Normalize a flat params/query map like:\n * { id: { type: \"string\", example: \"abc-123\" } }\n * into a valid AJV/JSON Schema object:\n * { type: \"object\", properties: { id: { type: \"string\", example: \"abc-123\" } } }\n */\nfunction normalizeParamsToJsonSchema(\n map: Record<string, any>,\n requiredKeys: string[] = [],\n): any {\n const properties: Record<string, any> = {};\n for (const [key, val] of Object.entries(map)) {\n const { required, ...rest } = val; \n properties[key] = { type: \"string\", ...rest };\n }\n const schema: any = { type: \"object\", properties };\n if (requiredKeys.length > 0) schema.required = requiredKeys;\n return schema;\n}\n\n/**\n * Take a raw @OpenApi schema object and return a Fastify-compatible\n * route schema — normalizing params, query → querystring, and headers.\n */\nfunction buildRouteSchema(raw: any): any {\n const schema: any = { ...raw };\n\n // ✅ Normalize path params\n if (raw.params && typeof raw.params === \"object\" && !raw.params.type) {\n const required = Object.entries(raw.params)\n .filter(([, v]: [string, any]) => v.required !== false)\n .map(([k]) => k);\n schema.params = normalizeParamsToJsonSchema(raw.params, required);\n }\n\n // ✅ Normalize query → Fastify uses \"querystring\", not \"query\"\n if (raw.query && typeof raw.query === \"object\" && !raw.query.type) {\n const required = Object.entries(raw.query)\n .filter(([, v]: [string, any]) => v.required === true)\n .map(([k]) => k);\n schema.querystring = normalizeParamsToJsonSchema(raw.query, required);\n delete schema.query;\n }\n\n // ✅ Normalize headers\n if (raw.headers && typeof raw.headers === \"object\" && !raw.headers.type) {\n schema.headers = normalizeParamsToJsonSchema(raw.headers);\n }\n\n return schema;\n}\n\n// ---------------------------------------------------------------------------\n// Router\n// ---------------------------------------------------------------------------\n\nexport class AvleonRouter {\n private routeSet = new Set<string>();\n private metaCache = new Map<string, MethodParamMeta>();\n private middlewares: Map<string, AvleonMiddleware> = new Map();\n private rMap = new Map<string, FuncRoute>();\n private app: FastifyInstance;\n private authorizeMiddleware?: Constructor<any>;\n\n constructor(app: FastifyInstance) {\n this.app = app;\n }\n\n setAuthorizeMiddleware(middleware: Constructor<any>) {\n this.authorizeMiddleware = middleware;\n }\n\n registerMiddleware(name: string, instance: AvleonMiddleware) {\n this.middlewares.set(name, instance);\n }\n\n private _processMeta(prototype: any, method: string): MethodParamMeta {\n const cacheKey = `${prototype.constructor.name}_${method}`;\n if (this.metaCache.has(cacheKey)) {\n return this.metaCache.get(cacheKey)!;\n }\n\n const meta: MethodParamMeta = {\n request:\n Reflect.getMetadata(REQUEST_METADATA_KEY, prototype, method) || [],\n params: Reflect.getMetadata(PARAM_META_KEY, prototype, method) || [],\n query: Reflect.getMetadata(QUERY_META_KEY, prototype, method) || [],\n body: Reflect.getMetadata(REQUEST_BODY_META_KEY, prototype, method) || [],\n file: Reflect.getMetadata(REQUEST_BODY_FILE_KEY, prototype, method) || [],\n files:\n Reflect.getMetadata(REQUEST_BODY_FILES_KEY, prototype, method) || [],\n headers:\n Reflect.getMetadata(REQUEST_HEADER_META_KEY, prototype, method) || [],\n currentUser:\n Reflect.getMetadata(REQUEST_USER_META_KEY, prototype, method) || [],\n };\n\n this.metaCache.set(cacheKey, meta);\n return meta;\n }\n\n private executeMiddlewares(target: any, propertyKey?: string) {\n const classMiddlewares =\n Reflect.getMetadata(\"controller:middleware\", target.constructor) || [];\n const methodMiddlewares = propertyKey\n ? Reflect.getMetadata(\"route:middleware\", target, propertyKey) || []\n : [];\n return [...classMiddlewares, ...methodMiddlewares];\n }\n\n async buildController(controller: any) {\n const ctrl: any = Container.get(controller);\n const controllerMeta = Reflect.getMetadata(\n CONTROLLER_META_KEY,\n ctrl.constructor,\n );\n if (!controllerMeta) return;\n\n const prototype = Object.getPrototypeOf(ctrl);\n const methods = Object.getOwnPropertyNames(prototype).filter(\n (name) => name !== \"constructor\",\n );\n const tag = ctrl.constructor.name.replace(\"Controller\", \"\");\n const swaggerControllerMeta =\n Reflect.getMetadata(\"controller:openapi\", ctrl.constructor) || {};\n const authClsMeata = Reflect.getMetadata(\n AUTHORIZATION_META_KEY,\n ctrl.constructor,\n ) || { authorize: false, options: undefined };\n\n for await (const method of methods) {\n const methodMeta = Reflect.getMetadata(ROUTE_META_KEY, prototype, method);\n if (!methodMeta) continue;\n\n const methodmetaOptions = {\n method: methodMeta.method.toLowerCase(),\n path: formatUrl(controllerMeta.path + methodMeta.path),\n };\n const routeKey = `${methodmetaOptions.method}:${methodmetaOptions.path}`;\n if (!this.routeSet.has(routeKey)) {\n this.routeSet.add(routeKey);\n }\n\n const classMiddlewares = this.executeMiddlewares(ctrl, method);\n const swaggerMeta =\n Reflect.getMetadata(\"route:openapi\", prototype, method) || {};\n const authClsMethodMeata = Reflect.getMetadata(\n AUTHORIZATION_META_KEY,\n ctrl.constructor,\n method,\n ) || { authorize: false, options: undefined };\n\n const allMeta = this._processMeta(prototype, method);\n\n // --- Build body schema from @Body() decorator ---\n let bodySchema: any = null;\n allMeta.body.forEach((r) => {\n if (r.schema) {\n bodySchema = { ...r.schema };\n }\n });\n\n // --- Build base schema (single declaration) ---\n let schema: any = { ...swaggerControllerMeta, ...swaggerMeta, tags: [tag] };\n\n // Apply body schema if not manually set in @OpenApi\n if (!swaggerMeta.body && bodySchema) {\n schema = { ...schema, body: bodySchema };\n }\n\n // ✅ Auto-detect querystring from @Query() DTO if not manually set in @OpenApi\n if (!swaggerMeta.query && !schema.querystring) {\n for (const queryMeta of allMeta.query) {\n if (queryMeta.validatorClass && queryMeta.schema) {\n schema.querystring = queryMeta.schema;\n break;\n }\n }\n }\n\n // ✅ Auto-detect body from @Body() DTO if still not set\n if (!swaggerMeta.body && !bodySchema) {\n for (const bodyMeta of allMeta.body) {\n if (bodyMeta.validatorClass && bodyMeta.schema) {\n schema = { ...schema, body: bodyMeta.schema };\n break;\n }\n }\n }\n\n const routePath =\n methodmetaOptions.path === \"\" ? \"/\" : methodmetaOptions.path;\n\n // --- Handle multipart ---\n const isMultipart =\n schema?.consumes?.includes(\"multipart/form-data\") ||\n Object.values(schema?.body?.properties || {}).some(\n (p: any) => p.format === \"binary\",\n );\n\n if (isMultipart) {\n schema.consumes = [\"multipart/form-data\"];\n if (!schema.body) {\n schema.body = { type: \"object\", properties: {} };\n }\n for (const param of allMeta.body) {\n if (param.type === \"route:file\") {\n schema.body.properties[param.key] = {\n type: \"string\",\n format: \"binary\",\n };\n } else {\n schema.body.properties[param.key] = { type: param.dataType };\n }\n }\n }\n\n // ✅ Normalize params/query/headers into valid JSON Schema\n const routeSchema = buildRouteSchema(schema);\n\n this.app.route({\n url: routePath,\n method: methodmetaOptions.method.toUpperCase() as HTTPMethods,\n schema: routeSchema,\n attachValidation: isMultipart,\n handler: async (req, res) => {\n let reqClone = req as unknown as IRequest;\n\n if (authClsMeata.authorize && this.authorizeMiddleware) {\n const cls = container.get(this.authorizeMiddleware) as any;\n await cls.authorize(reqClone, authClsMeata.options);\n if (res.sent) return;\n }\n\n if (authClsMethodMeata.authorize && this.authorizeMiddleware) {\n const cls = container.get(this.authorizeMiddleware) as any;\n await cls.authorize(reqClone, authClsMethodMeata.options);\n if (res.sent) return;\n }\n\n if (classMiddlewares.length > 0) {\n for (let m of classMiddlewares) {\n const cls = Container.get<AvleonMiddleware>(m.constructor);\n reqClone = (await cls.invoke(reqClone, res)) as IRequest;\n if (res.sent) return;\n }\n }\n\n const args = await this._mapArgs(reqClone, allMeta);\n\n for (let paramMeta of allMeta.params) {\n if (paramMeta.required) {\n validateOrThrow(\n { [paramMeta.key]: args[paramMeta.index] },\n { [paramMeta.key]: { type: paramMeta.dataType } },\n { location: \"param\" },\n );\n }\n }\n\n for (let queryMeta of allMeta.query) {\n if (queryMeta.validatorClass) {\n const err = await validateObjectByInstance(\n queryMeta.dataType,\n args[queryMeta.index],\n );\n if (err) {\n return await res.code(400).send({\n code: 400,\n error: \"ValidationError\",\n errors: err,\n message: err.message,\n });\n }\n }\n if (queryMeta.required) {\n validateOrThrow(\n { [queryMeta.key]: args[queryMeta.index] },\n { [queryMeta.key]: { type: queryMeta.dataType } },\n { location: \"queryparam\" },\n );\n }\n }\n\n if (!isMultipart) {\n for (let bodyMeta of allMeta.body) {\n if (bodyMeta.validatorClass) {\n const err = await validateObjectByInstance(\n bodyMeta.dataType,\n args[bodyMeta.index],\n );\n if (err) {\n return await res.code(400).send({\n code: 400,\n error: \"ValidationError\",\n errors: err,\n message: err.message,\n });\n }\n }\n }\n }\n\n const result = await prototype[method].apply(ctrl, args);\n\n if (result?.download) {\n const { stream, filename } = result;\n if (!stream || typeof stream.pipe !== \"function\") {\n return res.code(500).send({\n code: 500,\n error: \"INTERNAL_ERROR\",\n message: \"Invalid stream object\",\n });\n }\n const contentType =\n result.contentType ||\n mime.getType(filename) ||\n \"application/octet-stream\";\n res.header(\"Content-Type\", contentType);\n res.header(\n \"Content-Disposition\",\n `attachment; filename=\"${filename}\"`,\n );\n stream.on(\"error\", (err: any) => {\n console.error(\"Stream error:\", err);\n if (!res.sent) {\n res.code(500).send({\n code: 500,\n error: \"StreamError\",\n message: \"Error while streaming file.\",\n });\n }\n });\n return res.send(stream);\n }\n\n if (result instanceof Stream || typeof result?.pipe === \"function\") {\n result.on(\"error\", (err: any) => {\n console.error(\"Stream error:\", err);\n if (!res.sent) {\n res.code(500).send({\n code: 500,\n error: \"StreamError\",\n message: \"Error while streaming file.\",\n });\n }\n });\n res.header(\"Content-Type\", \"application/octet-stream\");\n return res.send(result);\n }\n\n return res.send(result);\n },\n });\n }\n }\n\n private async _mapArgs(req: IRequest, meta: MethodParamMeta): Promise<any[]> {\n if (!req.hasOwnProperty(\"_argsCache\")) {\n Object.defineProperty(req, \"_argsCache\", {\n value: new Map<string, any[]>(),\n enumerable: false,\n writable: false,\n configurable: false,\n });\n }\n\n const cache: Map<string, any[]> = (req as any)._argsCache;\n const cacheKey = JSON.stringify(meta);\n\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey)!;\n }\n\n const maxIndex =\n Math.max(\n ...meta.params.map((p) => p.index || 0),\n ...meta.query.map((q) => q.index),\n ...meta.body.map((b) => b.index),\n ...meta.currentUser.map((u) => u.index),\n ...meta.headers.map((h) => h.index),\n ...(meta.request?.map((r) => r.index) || []),\n ...(meta.file?.map((f) => f.index) || []),\n ...(meta.files?.map((f) => f.index) || []),\n -1,\n ) + 1;\n\n const args: any[] = new Array(maxIndex).fill(undefined);\n\n meta.params.forEach((p) => {\n const raw =\n p.key === \"all\" ? { ...req.params } : (req.params[p.key] ?? null);\n args[p.index] = autoCast(raw, p.dataType, p.schema);\n });\n\n meta.query.forEach((q) => {\n const raw =\n q.key === \"all\"\n ? normalizeQueryDeep({ ...req.query })\n : req.query[q.key];\n args[q.index] = autoCast(raw, q.dataType, q.schema);\n });\n\n meta.body.forEach((body) => {\n args[body.index] = { ...req.body, ...(req as any).formData };\n });\n\n meta.currentUser.forEach((user) => {\n args[user.index] = (req as any).user;\n });\n\n meta.headers.forEach((header) => {\n args[header.index] =\n header.key === \"all\"\n ? { ...req.headers }\n : req.headers[header.key];\n });\n\n if (meta.request && meta.request.length > 0) {\n meta.request.forEach((r) => {\n args[r.index] = req;\n });\n }\n\n const needsFiles =\n (meta.file && meta.file.length > 0) ||\n (meta.files && meta.files.length > 0);\n\n if (\n needsFiles &&\n req.headers[\"content-type\"]?.startsWith(\"multipart/form-data\") &&\n (req as any).saveRequestFiles\n ) {\n const files = await (req as any).saveRequestFiles();\n\n if (!files || files.length === 0) {\n if (meta.files && meta.files.length > 0) {\n throw new BadRequestException({ error: \"No files uploaded\" });\n }\n if (meta.file && meta.file.length > 0) {\n meta.file.forEach((f) => {\n args[f.index] = null;\n });\n }\n } else {\n const fileInfo = files.map((file: any) => ({\n type: file.type,\n filepath: file.filepath,\n fieldname: file.fieldname,\n filename: file.filename,\n encoding: file.encoding,\n mimetype: file.mimetype,\n fields: file.fields,\n toBuffer: file.toBuffer,\n }));\n\n if (meta.file && meta.file.length > 0) {\n meta.file.forEach((f) => {\n if (f.fieldName === \"all\") {\n args[f.index] = fileInfo[0] || null;\n } else {\n const file = fileInfo.find((x: any) => x.fieldname === f.fieldName);\n if (!file) {\n throw new BadRequestException(\n `File field \"${f.fieldName}\" not found in uploaded files`,\n );\n }\n args[f.index] = file;\n }\n });\n }\n\n if (meta.files && meta.files.length > 0) {\n meta.files.forEach((f) => {\n if (f.fieldName === \"all\") {\n args[f.index] = fileInfo;\n } else {\n const matchingFiles = fileInfo.filter(\n (x: any) => x.fieldname === f.fieldName,\n );\n if (matchingFiles.length === 0) {\n throw new BadRequestException(\n `No files found for field \"${f.fieldName}\"`,\n );\n }\n args[f.index] = matchingFiles;\n }\n });\n }\n }\n } else if (needsFiles) {\n throw new BadRequestException({\n error: \"Invalid content type. Expected multipart/form-data for file uploads\",\n });\n }\n\n cache.set(cacheKey, args);\n return args;\n }\n\n private _routeHandler<T extends (...args: any[]) => any>(\n routePath: string,\n method: string,\n fn: T,\n ) {\n const routeKey = method + \":\" + routePath;\n this.rMap.set(routeKey, {\n handler: fn,\n middlewares: [],\n schema: {},\n });\n\n const route = {\n useMiddleware: <M extends AvleonMiddleware>(\n middlewares: Constructor<AvleonMiddleware>[],\n ) => {\n const midds = Array.isArray(middlewares) ? middlewares : [middlewares];\n const ms: any[] = (midds as unknown as any[]).map((mclass) => {\n const cls = Container.get<AvleonMiddleware>(mclass);\n this.middlewares.set(mclass.name, cls);\n return cls.invoke;\n });\n const r = this.rMap.get(routeKey);\n if (r) r.middlewares = ms;\n return route;\n },\n\n useOpenApi: (options: OpenApiOptions) => {\n const r = this.rMap.get(routeKey);\n if (r) r.schema = options;\n return route;\n },\n };\n\n return route;\n }\n\n mapGet<T extends (...args: any[]) => any>(path: string = \"\", fn: T) {\n return this._routeHandler(path, \"GET\", fn);\n }\n\n mapPost<T extends (...args: any[]) => any>(path: string = \"\", fn: T) {\n return this._routeHandler(path, \"POST\", fn);\n }\n\n mapPut<T extends (...args: any[]) => any>(path: string = \"\", fn: T) {\n return this._routeHandler(path, \"PUT\", fn);\n }\n\n mapDelete<T extends (...args: any[]) => any>(path: string = \"\", fn: T) {\n return this._routeHandler(path, \"DELETE\", fn);\n }\n\n async mapRoute<T extends (...args: any[]) => any>(\n method: \"get\" | \"post\" | \"put\" | \"delete\",\n path: string = \"\",\n fn: T,\n ) {\n this.app[method](path, async (req: any, res: any) => {\n try {\n const result = await fn(req, res);\n if (typeof result === \"object\" && result !== null) {\n res.json(result);\n } else {\n res.send(result);\n }\n } catch (error) {\n console.error(`Error in ${method} route handler:`, error);\n res.status(500).send({ error: \"Internal Server Error\" });\n }\n });\n }\n\n processFunctionalRoutes() {\n this.rMap.forEach((value, key) => {\n const colonIdx = key.indexOf(\":\");\n const m = key.slice(0, colonIdx);\n const r = key.slice(colonIdx + 1); // ✅ handles paths containing \":\"\n\n const routeSchema = buildRouteSchema(value.schema || {});\n\n this.app.route({\n method: m.toUpperCase() as HTTPMethods,\n url: r,\n schema: routeSchema,\n preHandler: value.middlewares ?? [],\n handler: async (req, res) => {\n return value.handler(req, res);\n },\n });\n });\n }\n}","import { Service } from \"typedi\";\nimport type { Knex } from \"knex\";\nimport { Container } from \"typedi\";\n\n\n@Service()\nexport class DB {\n private connection: Knex;\n\n constructor() {\n const existing = Container.has(\"KnexConnection\")\n ? Container.get<Knex>(\"KnexConnection\")\n : null;\n\n if (existing) {\n this.connection = existing;\n }\n }\n\n // Initialize manually (call this in main if you want)\n public init(config: Knex.Config) {\n if (!this.connection) {\n const knex = require(\"knex\");\n this.connection = knex(config);\n Container.set(\"KnexConnection\", this.connection);\n }\n return this.connection;\n }\n\n public get client(): Knex {\n if (!this.connection) {\n throw new Error(\"Knex is not initialized. Call DB.init(config) first.\");\n }\n return this.connection;\n }\n}\n","import { PathLike } from \"node:fs\";\nimport { Server } from \"socket.io\";\nimport { Service, Token } from \"typedi\";\n\nexport const SocketIoServer = new Token<Server>(\"SocketIoServer\");\n\ntype FileAdapter = {\n type: \"file\";\n url?: PathLike;\n};\n\ntype RedisAdapter = {\n type: \"redis\";\n url?: string;\n username?: string;\n password?: string;\n};\n\ntype AdapterType = FileAdapter | RedisAdapter;\n\ninterface BrodcastAble {\n channel: string;\n broadstTo: () => void;\n}\n\n@Service()\nexport class AvleonSocketIo {\n private io?: Server;\n\n sendToAll() { }\n\n sendOnly() { }\n\n sendRoom() { }\n\n receive(channel: string) { }\n}\n","import { Service, Container } from \"typedi\";\nimport { Socket, ServerOptions, Server } from \"socket.io\";\nimport { SocketIoServer } from \"./websocket\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { sleep } from \"./helpers\";\n\n@Service()\nexport class SocketContextService {\n private readonly storage = new AsyncLocalStorage<{ socket: Socket }>();\n\n run(socket: Socket, fn: () => void | Promise<void>) {\n this.storage.run({ socket }, fn);\n }\n\n getSocket(): Socket | undefined {\n return this.storage.getStore()?.socket;\n }\n}\n\nexport type DispatchOptions = {\n room?: string;\n broadcast?: boolean;\n transports?: (\"socket\" | \"kafka\" | \"rabbitmq\")[];\n retry?: number;\n retryDelay?: number;\n};\n\n\n\n@Service()\nexport class EventDispatcher {\n constructor(private readonly _context: SocketContextService) { }\n\n async dispatch<T = any>(\n event: string,\n data: T,\n options: DispatchOptions = {},\n ) {\n const retryCount = options.retry ?? 0;\n const delay = options.retryDelay ?? 300;\n\n for (let attempt = 0; attempt <= retryCount; attempt++) {\n try {\n await this.dispatchToTransports(event, data, options);\n break;\n } catch (err) {\n if (attempt === retryCount) throw err;\n await sleep(delay * (attempt + 1));\n }\n }\n }\n\n private async dispatchToTransports(\n event: string,\n data: any,\n options: DispatchOptions,\n ) {\n const transports = options.transports ?? [\"socket\"];\n\n for (const transport of transports) {\n if (transport === \"socket\") {\n const io = Container.get(SocketIoServer);\n const context = Container.get(SocketContextService);\n const socket = context.getSocket();\n\n if (options.broadcast && socket) {\n if (options.room) {\n socket.broadcast.to(options.room).emit(event, data);\n } else {\n socket.broadcast.emit(event, data);\n }\n } else {\n if (options.room) {\n io.to(options.room).emit(event, data);\n } else {\n io.emit(event, data);\n }\n }\n }\n }\n }\n}\n\n\n\n\nexport function Dispatch(\n event: string,\n options?: Omit<DispatchOptions, \"transports\"> & {\n transports?: DispatchOptions[\"transports\"];\n },\n) {\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor,\n ) {\n const original = descriptor.value;\n\n descriptor.value = async function (...args: any[]) {\n const result = await original.apply(this, args);\n\n const dispatcher = Container.get(EventDispatcher);\n await dispatcher.dispatch(event, result, options);\n\n return result;\n };\n };\n}\n\n\n\n\n\n\n\n","import { Container, Service } from \"typedi\";\nimport { Socket, Server } from \"socket.io\";\nimport { SocketContextService } from \"./event-dispatcher\";\nimport { SocketIoServer } from \"./websocket\";\nimport \"reflect-metadata\";\n\nconst PRIVATE_META_KEY = \"avleon:private\";\n\nexport function Private(channelResolver?: (socket: any) => string) {\n return function (target: any, propertyKey: string) {\n Reflect.defineMetadata(PRIVATE_META_KEY, true, target, propertyKey);\n Reflect.defineMetadata(\n `private:channel:${propertyKey}`,\n channelResolver,\n target,\n );\n };\n}\n\nexport function isPrivate(target: any, propertyKey: string): boolean {\n return Reflect.getMetadata(PRIVATE_META_KEY, target, propertyKey) || false;\n}\n\nexport function getPrivateChannelResolver(\n target: any,\n propertyKey: string,\n): ((socket: any) => string) | undefined {\n return Reflect.getMetadata(`private:channel:${propertyKey}`, target);\n}\n\nconst socketSubscriberClasses = new Set<Function>();\n\nexport function registerSocketSubscriber(target: Function) {\n socketSubscriberClasses.add(target);\n}\n\nexport function getSocketSubscribers(): Function[] {\n return Array.from(socketSubscriberClasses);\n}\n\nexport function Subscribe(event: string): MethodDecorator {\n return (target, propertyKey) => {\n Reflect.defineMetadata(\"socket:event\", event, target, propertyKey);\n registerSocketSubscriber(target.constructor);\n };\n}\n\n@Service()\nexport class EventSubscriberRegistry {\n constructor(private readonly socketContext: SocketContextService) { }\n\n register(socket: Socket) {\n const subscriberClasses = getSocketSubscribers();\n\n for (const SubscriberClass of subscriberClasses) {\n const instance: any = Container.get(SubscriberClass);\n const prototype = Object.getPrototypeOf(instance);\n\n const methodNames = Object.getOwnPropertyNames(prototype).filter(\n (name) => typeof prototype[name] === \"function\",\n );\n\n for (const methodName of methodNames) {\n const event = Reflect.getMetadata(\n \"socket:event\",\n prototype,\n methodName,\n );\n const isPrivateListener = isPrivate(instance, methodName);\n const channelResolver = getPrivateChannelResolver(instance, methodName);\n\n if (event) {\n const channel =\n isPrivateListener && channelResolver\n ? channelResolver(socket)\n : event;\n console.log(\"Channel\", channel);\n socket.on(channel, (payload: any) => {\n this.socketContext.run(socket, async () => {\n if (isPrivateListener) {\n const user = socket.data.user;\n if (!user) return; // unauthorized\n // optionally add more validation here\n }\n await instance[methodName](payload, socket.data);\n });\n });\n }\n }\n }\n }\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport Fastify, { FastifyInstance, HTTPMethods } from \"fastify\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { AvleonRouter } from \"./router\";\nimport Container from \"typedi\";\nimport {\n IAvleonApplication,\n AvleonApplicationOptions,\n CorsOptions,\n GlobalOptions,\n} from \"../interfaces/avleon-application\";\nimport { BaseHttpException } from \"../exceptions\";\nimport { SystemUseError } from \"../exceptions/system-exception\";\nimport { Constructor } from \"../helpers\";\nimport { generateSwaggerSchema } from \"../swagger-schema\";\nimport { OpenApiUiOptions } from \"../openapi\";\nimport { AvleonMiddleware } from \"../middleware\";\nimport { isApiController } from \"../container\";\nimport { AutoControllerOptions, IResponse, TestApplication } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Lazy loaders for optional peer dependencies\n// ---------------------------------------------------------------------------\n\nfunction requireTypeorm() {\n try {\n return require(\"typeorm\");\n } catch {\n throw new Error(\n \"[Avleon] typeorm is not installed.\\n\" +\n \"Run: npm install typeorm\\n\" +\n \"Then install a driver: npm install pg (or mysql2, sqlite3, etc.)\",\n );\n }\n}\n\nfunction requireSocketIo() {\n try {\n return require(\"fastify-socket.io\");\n } catch {\n throw new Error(\n \"[Avleon] fastify-socket.io is not installed.\\n\" +\n \"Run: npm install fastify-socket.io socket.io\",\n );\n }\n}\n\nfunction requireKnex() {\n try {\n return require(\"knex\");\n } catch {\n throw new Error(\n \"[Avleon] knex is not installed.\\n\" +\n \"Run: npm install knex\\n\" +\n \"Then install a driver: npm install pg (or mysql2, sqlite3, etc.)\",\n );\n }\n}\n\nfunction requireSwagger() {\n try {\n return require(\"@fastify/swagger\");\n } catch {\n throw new Error(\n \"[Avleon] @fastify/swagger is not installed.\\n\" +\n \"Run: npm install @fastify/swagger @fastify/swagger-ui\",\n );\n }\n}\n\nfunction requireSwaggerUi() {\n try {\n return require(\"@fastify/swagger-ui\");\n } catch {\n throw new Error(\n \"[Avleon] @fastify/swagger-ui is not installed.\\n\" +\n \"Run: npm install @fastify/swagger-ui\",\n );\n }\n}\n\nfunction requireScalar() {\n try {\n return require(\"@scalar/fastify-api-reference\");\n } catch {\n throw new Error(\n \"[Avleon] @scalar/fastify-api-reference is not installed.\\n\" +\n \"Run: npm install @scalar/fastify-api-reference\",\n );\n }\n}\n\nfunction requireCors() {\n try {\n return require(\"@fastify/cors\");\n } catch {\n throw new Error(\n \"[Avleon] @fastify/cors is not installed.\\n\" +\n \"Run: npm install @fastify/cors\",\n );\n }\n}\n\nfunction requireMultipart() {\n try {\n return require(\"@fastify/multipart\");\n } catch {\n throw new Error(\n \"[Avleon] @fastify/multipart is not installed.\\n\" +\n \"Run: npm install @fastify/multipart\",\n );\n }\n}\n\nfunction requireStatic() {\n try {\n return require(\"@fastify/static\");\n } catch {\n throw new Error(\n \"[Avleon] @fastify/static is not installed.\\n\" +\n \"Run: npm install @fastify/static\",\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Application\n// ---------------------------------------------------------------------------\n\nexport class AvleonApplication implements IAvleonApplication {\n public app: FastifyInstance;\n private router: AvleonRouter;\n private static instance: AvleonApplication;\n private alreadyRun = false;\n private hasSwagger = false;\n private globalSwaggerOptions: OpenApiUiOptions | undefined;\n private dataSourceOptions: any | null = null; // ✅ no longer typed as DataSourceOptions\n private dataSource: any | null = null; // ✅ no longer typed as DataSource\n private isMapFeatures = false;\n private registerControllerAuto = false;\n private registerControllerPath = \"src/controllers\";\n private controllers: any[] = [];\n private _hasWebsocket = false;\n private io: any;\n\n private constructor(options?: AvleonApplicationOptions) {\n this.app = Fastify({\n ...options?.server,\n ajv: {\n customOptions: {\n strict: false,\n ...options?.server?.ajv?.customOptions,\n },\n },\n }) as FastifyInstance;\n this.router = new AvleonRouter(this.app);\n\n // ✅ Only load typeorm if dataSourceOptions provided\n if (options?.dataSourceOptions) {\n this.dataSourceOptions = options.dataSourceOptions;\n if (this.dataSourceOptions) {\n const { DataSource } = requireTypeorm();\n this.dataSource = new DataSource(this.dataSourceOptions);\n Container.set(DataSource, this.dataSource);\n }\n }\n }\n\n public static getApp(options?: AvleonApplicationOptions) {\n if (!AvleonApplication.instance) {\n AvleonApplication.instance = new AvleonApplication(options);\n }\n return AvleonApplication.instance;\n }\n\n /** @deprecated Use `getApp` instead. This is internal. */\n public static getInternalApp(options?: AvleonApplicationOptions) {\n return new AvleonApplication(options);\n }\n\n // ── Feature methods ──────────────────────────────────────────────────────\n\n useCors(options: CorsOptions) {\n this.app.register(requireCors(), options); // ✅ lazy\n return this;\n }\n\n useDatasource(dataSource: any) {\n // ✅ lazy — only resolve DataSource token when actually used\n const { DataSource } = requireTypeorm();\n this.dataSource = dataSource;\n Container.set(DataSource, this.dataSource);\n return this;\n }\n\n useMultipart(options?: any) {\n this.app.register(requireMultipart(), {\n // ✅ lazy\n attachFieldsToBody: true,\n limits: {\n fileSize: 10 * 1024 * 1024,\n },\n ...options,\n });\n return this;\n }\n\n useOpenApi(options: OpenApiUiOptions) {\n this.hasSwagger = true;\n this.globalSwaggerOptions = options;\n return this;\n }\n\n private async initSwagger(options?: OpenApiUiOptions) {\n const safeControllers = (this.controllers ?? []).filter(\n (c) => c != null && typeof c === \"function\",\n );\n const baseSchema = generateSwaggerSchema(safeControllers);\n\n await this.app.register(requireSwagger(), {\n // ✅ lazy\n openapi: {\n ...baseSchema,\n info: options?.info || { title: \"API\", version: \"1.0.0\" },\n servers: options?.servers,\n tags: options?.tags,\n components: {\n ...baseSchema?.components,\n ...options?.components,\n schemas: {\n ...baseSchema?.components?.schemas,\n ...options?.components?.schemas,\n },\n },\n security: options?.security,\n externalDocs: options?.externalDocs,\n },\n });\n\n const routePrefix = options?.routePrefix || \"/swagger\";\n\n if (options?.provider === \"scalar\") {\n await this.app.register(requireScalar(), {\n // ✅ lazy\n routePrefix,\n configuration: {\n spec: {\n content: () => requireSwagger(),\n },\n ...options?.uiConfig,\n },\n });\n } else {\n await this.app.register(requireSwaggerUi(), {\n // ✅ lazy\n routePrefix,\n uiConfig: {\n docExpansion: \"full\",\n deepLinking: false,\n ...options?.uiConfig,\n },\n uiHooks: {\n onRequest: function (request: any, reply: any, next: any) {\n next();\n },\n preHandler: function (request: any, reply: any, next: any) {\n next();\n },\n },\n staticCSP: true,\n transformSpecificationClone: true,\n });\n }\n }\n\n useMiddlewares(middlewares: Constructor<AvleonMiddleware>[]) {\n middlewares.forEach((m) => {\n const cls = Container.get<AvleonMiddleware>(m);\n this.app.addHook(\"preHandler\", async (req, res) => {\n await cls.invoke(req as any, res as IResponse);\n });\n });\n return this;\n }\n\n useAuthorization(authorization: Constructor<any>) {\n this.router.setAuthorizeMiddleware(authorization);\n return this;\n }\n\n useSerialization() {\n return this;\n }\n\n useControllers(controllers: Constructor[] | AutoControllerOptions) {\n if (Array.isArray(controllers)) {\n this.controllers = controllers;\n controllers.forEach((controller) => {\n if (!this.controllers.includes(controller)) {\n this.controllers.push(controller);\n }\n });\n } else {\n this.registerControllerAuto = true;\n if (controllers.path) {\n this.registerControllerPath = controllers.path;\n }\n }\n return this;\n }\n\n useStaticFiles(options?: any) {\n this.app.register(requireStatic(), options); // ✅ lazy\n return this;\n }\n\n useHttps(options?: any) {\n return this;\n }\n\n useGlobal(options: GlobalOptions) {\n if (options.cors) this.useCors(options.cors);\n if (options.openApi) this.useOpenApi(options.openApi);\n if (options.controllers) this.useControllers(options.controllers);\n if (options.middlewares) this.useMiddlewares(options.middlewares);\n if (options.authorization) this.useAuthorization(options.authorization);\n if (options.multipart) this.useMultipart(options.multipart);\n if (options.staticFiles) this.useStaticFiles(options.staticFiles);\n return this;\n }\n\n useSocketIo(options?: any) {\n this._hasWebsocket = true;\n this.app.register(requireSocketIo(), options); // ✅ lazy\n return this;\n }\n\n useKnex(options: any) {\n // ✅ lazy — only load DB + knex when explicitly called\n try {\n const { DB } = require(\"../kenx-provider\");\n const db = Container.get(DB) as any;\n db.init(options.config ?? options);\n } catch (e: any) {\n if (e.message?.includes(\"knex\")) throw e;\n throw new Error(\n \"[Avleon] Failed to initialize Knex. Make sure knex and a database driver are installed.\\n\" +\n \"Run: npm install knex pg (or mysql2, sqlite3, etc.)\",\n );\n }\n return this;\n }\n\n mapFeatures() {\n this.isMapFeatures = true;\n return this;\n }\n\n isDevelopment() {\n return process.env.NODE_ENV === \"development\" || !process.env.NODE_ENV;\n }\n\n private async _mapControllers() {\n const safeControllers = (this.controllers ?? []).filter(\n (c) => c != null && typeof c === \"function\",\n );\n if (safeControllers.length > 0) {\n for (const controller of safeControllers) {\n if (isApiController(controller)) {\n await this.router.buildController(controller);\n } else {\n throw new SystemUseError(\"Not an API controller.\");\n }\n }\n }\n }\n\n private _resolveControllerDir(dir?: string) {\n const isTsNode =\n process.env.TS_NODE_DEV ||\n process.env.TS_NODE_PROJECT ||\n (process as any)[Symbol.for(\"ts-node.register.instance\")];\n const controllerDir = path.join(process.cwd(), this.registerControllerPath);\n return isTsNode ? controllerDir : controllerDir.replace(\"src\", \"dist\");\n }\n\n private async autoControllers(controllersPath?: string) {\n const conDir = this._resolveControllerDir(controllersPath);\n const isTsNode =\n process.env.TS_NODE_DEV ||\n process.env.TS_NODE_PROJECT ||\n (process as any)[Symbol.for(\"ts-node.register.instance\")];\n\n try {\n const files = fs.readdirSync(conDir, {\n recursive: true,\n encoding: \"utf-8\",\n }) as string[];\n\n for (const file of files) {\n const isTestFile = /\\.(test|spec|e2e-spec)\\.(ts|js)$/.test(file);\n if (isTestFile) continue;\n if (isTsNode ? file.endsWith(\".ts\") : file.endsWith(\".js\")) {\n const filePath = path.join(conDir, file);\n const module = await import(filePath);\n for (const exported of Object.values(module)) {\n if (typeof exported === \"function\" && isApiController(exported)) {\n if (!this.controllers.some((con) => exported.name === con.name)) {\n this.controllers.push(exported);\n }\n }\n }\n }\n }\n } catch (e) {\n console.warn(\"Could not auto-register controllers from \" + conDir, e);\n }\n }\n\n private _mapFeatures() {\n try {\n Container.get(\"features\");\n } catch {\n // features token not registered — safe to ignore\n }\n }\n\n async initializeDatabase() {\n if (this.dataSourceOptions && this.dataSource) {\n await this.dataSource.initialize();\n }\n }\n\n handleSocket(socket: any) {\n // ✅ lazy — only resolve socket services when socket actually connects\n try {\n const { SocketContextService } = require(\"../event-dispatcher\");\n const { EventSubscriberRegistry } = require(\"../event-subscriber\");\n const { SocketIoServer } = require(\"../websocket\");\n\n const contextService = Container.get(SocketContextService) as any;\n const subscriberRegistry = Container.get(EventSubscriberRegistry) as any;\n\n subscriberRegistry.register(socket);\n\n const originalOn = socket.on.bind(socket);\n socket.on = (event: string, handler: Function) => {\n return originalOn(event, (...args: any[]) => {\n contextService.run(socket, () => handler(...args));\n });\n };\n } catch (e) {\n console.warn(\"[Avleon] Socket handler error:\", e);\n }\n }\n\n // ── Functional routing proxies ───────────────────────────────────────────\n\n mapGet<T extends (...args: any[]) => any>(path: string = \"\", fn: T) {\n return this.router.mapGet(path, fn);\n }\n mapPost<T extends (...args: any[]) => any>(path: string = \"\", fn: T) {\n return this.router.mapPost(path, fn);\n }\n mapPut<T extends (...args: any[]) => any>(path: string = \"\", fn: T) {\n return this.router.mapPut(path, fn);\n }\n mapDelete<T extends (...args: any[]) => any>(path: string = \"\", fn: T) {\n return this.router.mapDelete(path, fn);\n }\n\n // ── Run ──────────────────────────────────────────────────────────────────\n\n async run(port: number = 4000, fn?: CallableFunction): Promise<void> {\n if (this.alreadyRun) throw new SystemUseError(\"App already running\");\n this.alreadyRun = true;\n\n if (this.hasSwagger) {\n await this.initSwagger(this.globalSwaggerOptions);\n }\n\n await this.initializeDatabase();\n\n if (this.isMapFeatures) {\n this._mapFeatures();\n }\n\n if (this.registerControllerAuto) {\n await this.autoControllers();\n }\n\n await this._mapControllers();\n this.router.processFunctionalRoutes();\n\n this.app.setErrorHandler((error: any, request, reply) => {\n const isDev = process.env.NODE_ENV === \"development\";\n const timestamp = new Date().toISOString();\n const requestInfo = `${request.method} ${request.url}`;\n\n // ✅ Handle Fastify AJV validation errors — these come with statusCode 400\n if ((error as any).statusCode === 400 || (error as any).validation) {\n console.warn(\n `[${timestamp}] HTTP 400 ${requestInfo} — ${error.message}`,\n );\n return reply.status(400).send({\n code: 400,\n status: \"Error\",\n message: error.message,\n errors: (error as any).validation ?? undefined,\n });\n }\n\n if (error instanceof BaseHttpException) {\n console.warn(\n `[${timestamp}] HTTP ${error.code} ${requestInfo} — ${error.message}`,\n );\n return reply\n .status(error.code || 500)\n .type(\"application/json\")\n .serializer((payload: any) => JSON.stringify(payload))\n .send({\n code: error.code,\n status: \"Error\",\n message: error.message,\n data: error.payload,\n });\n }\n\n // Unexpected errors\n console.error(`\\n❌ UNHANDLED ERROR @ ${timestamp}`);\n console.error(` ${requestInfo}`);\n console.error(` ${error.name}: ${error.message}`);\n if (error.stack) {\n console.error(\n ` Stack:\\n${error.stack\n .split(\"\\n\")\n .slice(1)\n .map((l: any) => ` ${l.trim()}`)\n .join(\"\\n\")}`,\n );\n }\n if (isDev) {\n console.error(` Params:`, JSON.stringify(request.params));\n console.error(` Query: `, JSON.stringify(request.query));\n console.error(` Body: `, JSON.stringify(request.body));\n }\n console.error(\"\");\n\n return reply.status(500).send({\n code: 500,\n status: \"Error\",\n message: isDev ? error.message : \"Internal Server Error\",\n ...(isDev && {\n error: error.name,\n stack: error.stack?.split(\"\\n\").slice(0, 5),\n }),\n });\n });\n\n await this.app.ready();\n\n if (this._hasWebsocket) {\n // @ts-ignore\n if (!this.app.io) {\n throw new Error(\n \"Socket.IO not initialized. Make sure fastify-socket.io is registered correctly.\",\n );\n }\n // ✅ lazy — resolve SocketIoServer token only when websocket is ready\n try {\n const { SocketIoServer } = require(\"../websocket\");\n // @ts-ignore\n Container.set(SocketIoServer, this.app.io);\n // @ts-ignore\n await this.app.io.on(\"connection\", this.handleSocket.bind(this));\n } catch (e) {\n console.warn(\"[Avleon] WebSocket setup error:\", e);\n }\n }\n\n await this.app.listen({ port });\n console.log(`Application running on http://127.0.0.1:${port}`);\n if (fn) fn();\n }\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport { AvleonApplication } from \"./application\";\nimport Container from \"typedi\";\nimport { Constructor } from \"../helpers\";\nimport { TestApplication, TestAppOptions } from \"../interfaces/avleon-application\";\nimport { InjectOptions } from \"fastify\";\nimport { ValidationErrorException } from \"../exceptions\";\nimport { SystemUseError } from \"../exceptions/system-exception\";\n\nexport class AvleonTest {\n private constructor() {\n process.env.NODE_ENV = \"test\";\n }\n\n static getController<T>(controller: Constructor<T>, deps: any[] = []) {\n const paramTypes =\n Reflect.getMetadata(\"design:paramtypes\", controller) || [];\n\n deps.forEach((dep, i) => {\n Container.set(paramTypes[i], dep);\n });\n\n return Container.get(controller);\n }\n\n static getProvider<T>(service: Constructor<T>, deps: any[] = []) {\n const paramTypes = Reflect.getMetadata(\"design:paramtypes\", service) || [];\n\n deps.forEach((dep, i) => {\n Container.set(paramTypes[i], dep);\n });\n\n return Container.get(service);\n }\n\n static createTestApplication(options: TestAppOptions) {\n const app = AvleonApplication.getInternalApp({\n dataSourceOptions: options.dataSource ? options.dataSource : undefined,\n });\n // We need to cast options.controllers to any or Constructor[] for compatibility\n if (options.controllers) {\n app.useControllers(options.controllers as Constructor[]);\n }\n return AvleonTest.from(app);\n }\n\n static from(app: AvleonApplication): TestApplication {\n // Logic to return a TestApplication wrapper around the running app\n // This effectively manually builds the routes map if it wasn't run?\n // In icore.ts getTestApp() logic was doing a lot of things manually.\n // We need to replicate that behavior via the `app` instance.\n // BUT, since we split, logic might need access to internals.\n\n // For now, let's implement the wrapper using app.app (fastify instance)\n\n try {\n // Note: In original code, getTestApp did _mapControllers().\n // We should access private methods or expose public init method.\n // Since we are in separate file, we can't access private easily.\n // Best approach: add `initForTest()` on AvleonApplication\n\n // Assuming we added public method or we just cast to any to call private methods (naughty but works)\n (app as any)._mapControllers().catch((e: any) => console.error(e));\n\n // In icore.ts, it was mapping routes to app.route explicitly. \n // In our refactor, _mapControllers calls router.buildController -> which adds routes to app.\n // So fastify app should be ready.\n\n app.app.setErrorHandler(async (error, req, res) => {\n // Reuse error handler logic or simplified version\n if (error instanceof ValidationErrorException) {\n return res.status(400).send({\n code: 400,\n error: \"ValidationError\",\n errors: error.message,\n });\n }\n return res.status(500).send(error);\n });\n\n return {\n get: async (url: string, options?: InjectOptions) =>\n app.app.inject({ method: \"GET\", url, ...options }),\n post: async (url: string, options?: InjectOptions) =>\n app.app.inject({ method: \"POST\", url, ...options }),\n put: async (url: string, options?: InjectOptions) =>\n app.app.inject({ method: \"PUT\", url, ...options }),\n patch: async (url: string, options?: InjectOptions) =>\n app.app.inject({ method: \"PATCH\", url, ...options }),\n delete: async (url: string, options?: InjectOptions) =>\n app.app.inject({ method: \"DELETE\", url, ...options }),\n options: async (url: string, options?: InjectOptions) =>\n app.app.inject({ method: \"OPTIONS\", url, ...options }),\n getController: <T>(controller: Constructor<T>, deps: any[] = []) => {\n return AvleonTest.getController(controller, deps);\n },\n };\n } catch (error) {\n throw new SystemUseError(\"Can't get test appliction\");\n }\n }\n\n static clean() {\n Container.reset();\n }\n}\n\nexport class Avleon {\n static createApplication() {\n const app = AvleonApplication.getApp();\n return app;\n }\n static createTestApplication(options: TestAppOptions) {\n const app = AvleonTest.createTestApplication(options);\n return app;\n }\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport {\n instanceToPlain,\n plainToInstance,\n ClassConstructor,\n ClassTransformer,\n} from \"class-transformer\";\n\nexport interface IHttpResponse<T extends any> {\n message: string;\n data: T | null;\n}\n\nfunction isClassTransformerClass(target: any): boolean {\n const prototype = target.prototype;\n const keys = Reflect.getMetadataKeys(prototype);\n\n // Check for class-transformer metadata\n return keys.some((key) => key.startsWith(\"class_transformer:\"));\n}\n\nfunction isClassTransformerType<T>(target: new () => T): boolean {\n return isClassTransformerClass(target);\n}\n\nexport class HttpResponse {\n static Ok<T>(obj: any, s?: ClassConstructor<T>): IHttpResponse<T> {\n if (s) {\n const isPaginated = obj?.hasOwnProperty(\"total\");\n const dataToTransform = isPaginated ? obj.data : obj;\n\n const transformedData = plainToInstance(s, dataToTransform, {\n enableImplicitConversion: true,\n excludeExtraneousValues: true,\n });\n\n const transformedResult = isPaginated\n ? { ...obj, data: instanceToPlain(transformedData) }\n : { data: instanceToPlain(transformedData) };\n\n return {\n message: \"success\",\n ...transformedResult,\n };\n }\n\n return { message: \"success\", data: obj };\n }\n\n static Created<T>(obj: any, s?: ClassConstructor<T>): IHttpResponse<T> {\n if (s) {\n const transformedData = plainToInstance(s, obj, {\n enableImplicitConversion: true,\n excludeExtraneousValues: true,\n });\n\n return {\n message: \"created\",\n data: instanceToPlain(transformedData) as T,\n };\n }\n\n return { message: \"created\", data: obj };\n }\n\n static NoContent(): IHttpResponse<null> {\n return { message: \"no content\", data: null };\n }\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport { Service } from \"typedi\";\nimport { IRequest, IResponse } from \"./core/types\";\nimport {\n HttpExceptionTypes as HttpException,\n UnauthorizedException,\n} from \"./exceptions\";\nimport Container, { AUTHORIZATION_META_KEY } from \"./container\";\nimport { Constructor } from \"./helpers\";\n\nexport abstract class AvleonMiddleware {\n abstract invoke(\n req: IRequest,\n res?: IResponse,\n ): Promise<IRequest | HttpException>;\n}\nexport type AuthHandler = (\n req: IRequest,\n roles?: string[],\n) => Promise<IRequest | HttpException>;\n\n\n\nexport abstract class AuthorizeMiddleware {\n abstract authorize(\n roles: string[],\n ): (req: IRequest, res?: IResponse) => IRequest | Promise<IRequest>;\n}\n\nexport type AuthReturnTypes = IRequest | Promise<IRequest>;\n\ninterface AuthorizeClass {\n authorize(req: IRequest, options?: any): AuthReturnTypes;\n}\n\n\nexport function CanAuthorize(target: {\n new(...args: any[]): AuthorizeClass;\n}) {\n if (typeof target.prototype.authorize !== \"function\") {\n throw new Error(\n `Class \"${target.name}\" must implement an \"authorize\" method.`,\n );\n }\n Service()(target);\n}\n\n\nexport function AppAuthorization(target: {\n new(...args: any[]): AuthorizeClass;\n}) {\n if (typeof target.prototype.authorize !== \"function\") {\n throw new Error(\n `Class \"${target.name}\" must implement an \"authorize\" method.`,\n );\n }\n Service()(target);\n}\n\n// export function Authorized(target: Function): void;\nexport function Authorized(): ClassDecorator & MethodDecorator;\nexport function Authorized(options?: any): ClassDecorator & MethodDecorator;\nexport function Authorized(\n options: any = {},\n): MethodDecorator | ClassDecorator {\n return function (\n target: any,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor,\n ) {\n if (propertyKey && descriptor) {\n Reflect.defineMetadata(\n AUTHORIZATION_META_KEY,\n { authorize: true, options },\n target.constructor,\n propertyKey,\n );\n } else {\n Reflect.defineMetadata(\n AUTHORIZATION_META_KEY,\n { authorize: true, options },\n target,\n );\n }\n };\n}\n\nexport function AppMiddleware(target: Constructor<AvleonMiddleware>) {\n if (typeof target.prototype.invoke !== \"function\") {\n throw new Error(\n `Class \"${target.name}\" must implement an \"invoke\" method.`,\n );\n }\n\n Service()(target);\n}\n\n\n\n\n/**\n * A decorator function that applies one or more middleware to a class or a method.\n *\n * When applied to a class, the middleware are registered for the entire controller.\n * When applied to a method, the middleware are registered for that specific route.\n *\n * @param options - A single middleware instance/class or an array of middleware instances/classes to be applied.\n * @returns A decorator that registers the middleware metadata.\n */\nexport function UseMiddleware<\n T extends AvleonMiddleware | (new (...args: any[]) => AvleonMiddleware),\n>(options: T | T[]): MethodDecorator & ClassDecorator {\n return function (\n target: Object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor,\n ) {\n const normalizeMiddleware = (middleware: any) =>\n typeof middleware === \"function\" ? new middleware() : middleware;\n const middlewareList = (Array.isArray(options) ? options : [options]).map(\n normalizeMiddleware,\n );\n if (typeof target === \"function\" && !propertyKey) {\n const existingMiddlewares =\n Reflect.getMetadata(\"controller:middleware\", target) || [];\n Reflect.defineMetadata(\n \"controller:middleware\",\n [...existingMiddlewares, ...middlewareList],\n target,\n );\n } else if (descriptor) {\n const existingMiddlewares =\n Reflect.getMetadata(\"route:middleware\", target, propertyKey!) || [];\n Reflect.defineMetadata(\n \"route:middleware\",\n [...existingMiddlewares, ...middlewareList],\n target,\n propertyKey!,\n );\n }\n };\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport Container from \"typedi\";\nimport { NotFoundException } from \"./exceptions\";\nimport {\n DataSource,\n EntityTarget,\n FindOneOptions,\n ObjectLiteral,\n Repository,\n} from \"typeorm\";\n\ntype ObjKey<T> = keyof T;\ntype ObjKeys<T> = ObjKey<T>[];\ntype PaginationOptions = {\n take: number;\n skip?: number;\n};\n\ntype Predicate<T> = (item: T) => boolean;\ninterface TypeormEnitity extends ObjectLiteral {}\ntype Primitive = string | number | boolean | null;\n\ntype ValueOperator<T> = {\n $in?: T[];\n};\n\ntype FieldCondition<T> = T | ValueOperator<T>;\n\ntype WhereCondition<T> = {\n [K in keyof T]?: FieldCondition<T[K]>;\n};\n\ntype LogicalOperators<T> =\n | { $and: Where<T>[] }\n | { $or: Where<T>[] }\n | { $not: Where<T> };\n\ntype Where<T> = WhereCondition<T> | LogicalOperators<T>;\n\nexport interface IFindOneOptions<T = any> {\n where: Where<T>;\n}\n\nexport type PaginationResult<T> = {\n total: number;\n data: T[];\n next?: number | null;\n prev?: number | null;\n first?: number | null;\n last?: number | null;\n totalPage?: number;\n};\n\ntype ICollection<T> = {\n findAll(): T[] | Promise<T[]>;\n};\n\ntype EntityCollection<T extends ObjectLiteral> = {};\n\nexport interface BasicCollection<T> {\n clear(): void;\n find(predicate?: Predicate<T>): T[];\n findAsync(predicate?: Predicate<T>): Promise<T[]>;\n findOne(predicate: Predicate<T> | IFindOneOptions<T>): T | undefined;\n findOneAsync(\n predicate: Predicate<T> | IFindOneOptions<T>,\n ): Promise<T | undefined>;\n}\nclass BasicCollectionImpl<T> implements BasicCollection<T> {\n private items: T[];\n\n private constructor(items: T[]) {\n this.items = items;\n }\n\n static from<T>(items: T[]): BasicCollectionImpl<T> {\n return new BasicCollectionImpl(items);\n }\n\n clear() {\n this.items = [];\n }\n\n find(predicate?: Predicate<T>) {\n if (this.isFunction(predicate)) {\n return this.items.filter(predicate as Predicate<T>) as T[];\n }\n const results = Array.from(this.items);\n return results;\n }\n\n async findAsync(predicate?: Predicate<T>): Promise<T[]> {\n const results = Array.from(this.items);\n return results;\n }\n\n private _matches<T>(item: T, where: Where<T>): boolean {\n if (\"$or\" in where) {\n return where.$or.some((cond) => this._matches(item, cond));\n }\n\n if (\"$and\" in where) {\n return where.$and.every((cond) => this._matches(item, cond));\n }\n\n if (\"$not\" in where) {\n return !this._matches(item, where.$not);\n }\n\n // Field-based matching\n return Object.entries(where).every(([key, condition]) => {\n const itemValue = item[key as keyof T];\n if (\n condition &&\n typeof condition === \"object\" &&\n !Array.isArray(condition)\n ) {\n const op = condition as ValueOperator<any>;\n\n if (\"$in\" in op && Array.isArray(op.$in)) {\n return op.$in.includes(itemValue);\n }\n }\n\n return itemValue === condition;\n });\n }\n\n findOne(predicate: Predicate<T> | IFindOneOptions<T>): T | undefined {\n if (this.isFunction(predicate)) {\n return this.items.find(predicate as Predicate<T>) as T;\n }\n const result = this.items.filter((item) =>\n this._matches(item, predicate.where),\n );\n if (result.length > 0) {\n return result[0];\n }\n return undefined;\n }\n\n async findOneAsync(\n predicate: Predicate<T> | IFindOneOptions<T>,\n ): Promise<T | undefined> {\n if (this.isFunction(predicate)) {\n return this.items.find(predicate as Predicate<T>) as T;\n }\n return this.items.find((item) => this._matches(item, predicate.where));\n }\n\n // Utility function to check if a value is a function\n private isFunction(value: unknown): value is Function {\n return typeof value === \"function\";\n }\n\n add(item: Partial<T>): T;\n add(item: Partial<T>): T | Promise<T> {\n this.items.push(item as T);\n return this.items[this.items.length - 1];\n }\n\n addAll(items: T[]): void {\n this.items.push(...items);\n }\n update(predicate: (item: T) => boolean, updater: Partial<T>): void {\n const item = this.items.find(predicate);\n if (item) {\n const index = this.items.indexOf(item)!;\n this.items[index] = { ...item, ...updater };\n } else {\n throw new NotFoundException(\"Item not found\");\n }\n }\n\n updateAll(predicate: (item: T) => boolean, updater: (item: T) => T): void {\n for (let i = 0; i < this.items.length; i++) {\n if (predicate(this.items[i])) {\n this.items[i] = updater(this.items[i]);\n }\n }\n }\n delete(predicate: (item: T) => boolean): void {\n const index = this.items.findIndex(predicate);\n if (index !== -1) {\n this.items.splice(index, 1);\n }\n }\n deleteAll(predicate: (item: T) => boolean): void {\n this.items = this.items.filter((item) => !predicate(item));\n }\n max<K extends keyof T>(key: K & string): number {\n return Math.max(...this.items.map((item) => item[key] as number));\n }\n\n min<K extends keyof T>(key: K & string): number {\n return Math.max(...this.items.map((item) => item[key] as number));\n }\n\n sum<K extends keyof T>(key: K & string): number {\n const nums = this.items.flatMap((x) => x[key]) as number[];\n return nums.reduce((sum, num) => sum + num, 0);\n }\n\n avg<K extends keyof T>(key: K & string): number {\n const nums = this.items.flatMap((x) => x[key]) as number[];\n return nums.reduce((sum, num) => sum + num, 0) / nums.length;\n }\n\n paginate(options?: PaginationOptions) {\n const take = options?.take || 10;\n const skip = options?.skip || 0;\n const total = this.items.length;\n const data = this.items.slice(skip, take);\n return {\n total,\n totalPage: Math.ceil(total / take),\n next: skip + take < total ? skip + take : null,\n data,\n };\n }\n\n private getDeepValue(item: any, path: string | keyof T): any {\n if (typeof path !== \"string\") return item[path];\n return path.split(\".\").reduce((acc, key) => acc?.[key], item);\n }\n}\n\nclass AsynchronousCollection<T extends ObjectLiteral> {\n private model: EntityTarget<T>;\n private repo?: Repository<T>;\n\n private constructor(model: EntityTarget<T>) {\n this.model = model;\n }\n\n static fromRepository<T extends ObjectLiteral>(\n model: EntityTarget<T>,\n ): AsynchronousCollection<T> {\n return new AsynchronousCollection(model);\n }\n\n getRepository() {\n if (!this.repo) {\n const dataSourceKey = \"idatasource\";\n const dataSource = Container.get(dataSourceKey) as DataSource;\n console.log(\"datasource\", dataSource);\n const repository = dataSource.getRepository<T>(this.model);\n this.repo = repository;\n return repository;\n }\n return this.repo;\n }\n\n // Pagination with query builder\n async paginate(options?: PaginationOptions): Promise<PaginationResult<T>> {\n const take = options?.take || 10;\n const skip = options?.skip || 0;\n\n const [data, total] = await this.getRepository().findAndCount({\n take,\n skip,\n });\n\n return {\n total,\n totalPage: Math.ceil(total / take),\n next: skip + take < total ? skip + take : null,\n prev: skip + take < total ? skip + take : null,\n data,\n };\n }\n}\n\nexport class Collection {\n private constructor() {}\n\n static from<T>(items: T[]): BasicCollection<T> {\n return BasicCollectionImpl.from(items);\n }\n // Example refactoring of Collection.fromRepository for better type safety\n static fromRepository<T extends ObjectLiteral>(\n entity: EntityTarget<T>,\n ): Repository<T> {\n const asyncCollection = AsynchronousCollection.fromRepository(entity);\n // Assuming AsynchronousCollection has a method to get the Repository<T>\n return asyncCollection.getRepository();\n }\n}\n\nexport function InjectRepository<T extends Repository<T>>(\n model: EntityTarget<T>,\n) {\n return function (\n object: any,\n propertyName: string | undefined,\n index?: number,\n ) {\n let repo!: any | Repository<T>;\n try {\n Container.registerHandler({\n object,\n propertyName,\n index,\n value: (containerInstance) => {\n const dataSource = containerInstance.get<DataSource>(\"idatasource\");\n repo = dataSource\n .getRepository<T>(model)\n .extend({ paginate: () => {} });\n repo.paginate = async function (\n options: PaginationOptions = { take: 10, skip: 0 },\n ): Promise<PaginationResult<T>> {\n const [data, total] = await this.findAndCount({\n take: options.take || 10,\n skip: options.skip || 0,\n });\n\n return {\n total,\n totalPage: Math.ceil(total / (options.take || 10)),\n next:\n options.skip! + options.take! < total\n ? options.skip! + options.take!\n : null,\n data,\n };\n };\n return repo;\n },\n });\n } catch (error: any) {\n if (error.name && error.name == \"ServiceNotFoundError\") {\n console.log(\"Database didn't initialized.\");\n }\n }\n };\n}\n","import Bull, { Queue as BullQueue, Job, JobOptions } from 'bull';\nimport { Container, Service } from 'typedi';\nexport interface QueueConfig {\n name: string;\n adapter?: any;\n handler?: (job: Job) => Promise<any>;\n options?: Bull.QueueOptions;\n}\n\n\nexport class AvleonQueue<T = any> {\n protected queue: BullQueue<T>;\n protected handlerFn?: (job: Job<T>) => Promise<any>;\n\n constructor(\n protected name?: string,\n protected adapter?: any,\n handler?: (job: Job<T>) => Promise<any>\n ) {\n // Initialize queue with adapter or default Redis connection\n this.queue = new Bull(name || 'default', adapter);\n this.handlerFn = handler;\n\n // Check if the instance has a handler method defined\n // This allows subclasses to define handler as a method\n if (typeof (this as any).handler === 'function' && !this.handlerFn) {\n this.handlerFn = (job: Job<T>) => (this as any).handler(job);\n }\n\n // If handler is provided (from decorator or class method), set up processing\n if (this.handlerFn) {\n this.queue.process(this.handlerFn);\n }\n }\n\n // Optional handler method that subclasses can override\n handler?(job: Job<T>): Promise<any> | any;\n\n // Add job to queue\n add(data: T, options?: JobOptions): Promise<Bull.Job<T>> {\n return this.queue.add(data, options);\n }\n\n // Add job with delay\n delay(data: T, delayMs: number, options?: JobOptions): Promise<Bull.Job<T>> {\n return this.queue.add(data, { ...options, delay: delayMs });\n }\n\n // Process jobs (can be called manually if not using handler)\n process(handler: (job: Job<T>) => Promise<any>): void {\n this.handlerFn = handler;\n this.queue.process(handler);\n }\n\n // Process with concurrency\n processConcurrent(concurrency: number, handler: (job: Job<T>) => Promise<any>): void {\n this.handlerFn = handler;\n this.queue.process(concurrency, handler);\n }\n\n // Get the underlying Bull queue\n getQueue(): BullQueue<T> {\n return this.queue;\n }\n\n\n async clean(grace: number, status?: 'completed' | 'wait' | 'active' | 'delayed' | 'failed'): Promise<Job[]> {\n return this.queue.clean(grace, status);\n }\n\n\n async close(): Promise<void> {\n await this.queue.close();\n }\n\n\n async pause(): Promise<void> {\n await this.queue.pause();\n }\n\n \n async resume(): Promise<void> {\n await this.queue.resume();\n }\n\n\n async getJob(jobId: string): Promise<Job<T> | null> {\n return this.queue.getJob(jobId);\n }\n\n async getJobs(\n types: Array<'completed' | 'waiting' | 'active' | 'delayed' | 'failed' | 'paused'>,\n start?: number,\n end?: number\n ): Promise<Job<T>[]> {\n return this.queue.getJobs(types, start, end);\n }\n}\n\n\nexport function Queue(config: QueueConfig) {\n return function <T extends { new (...args: any[]): AvleonQueue }>(target: T) {\n // Create a new class that extends the target\n const DecoratedClass = class extends target {\n constructor(...args: any[]) {\n super(config.name, config.adapter, config.handler);\n }\n };\n\n\n Object.defineProperty(DecoratedClass, 'name', {\n value: target.name,\n writable: false\n });\n\n Service()(DecoratedClass);\n\n return DecoratedClass as T;\n };\n}","import fs, { createReadStream, PathLike } from \"fs\";\nimport path from \"path\";\nimport { pipeline } from \"stream/promises\";\nimport { MultipartFile } from \"./multipart\";\nimport { AppService } from \"./decorators\";\nimport { SystemUseError } from \"./exceptions/system-exception\";\nimport { SavedMultipartFile } from \"@fastify/multipart\";\nimport { InternalErrorException } from \"./exceptions/http-exceptions\";\nimport mime from \"mime\";\ninterface TransformOptions {\n resize?: { width: number; height: number };\n format?: \"jpeg\" | \"png\" | \"webp\" | \"avif\";\n quality?: number;\n}\n\nexport interface FileStorageInterface {\n transform(options: TransformOptions): FileStorage;\n save(\n file: MultipartFile,\n options?: SaveOptionsSingle,\n ): Promise<MultipartFile>;\n saveAll(\n files: MultipartFile[],\n options?: SaveOptions,\n ): Promise<MultipartFile[]>;\n remove(filepath: string): Promise<void>;\n}\n\nexport interface SaveOptions {\n overwrite?: boolean;\n to?: string;\n}\n\nexport interface SaveOptionsSingle extends SaveOptions {\n saveAs?: string;\n}\n\n@AppService\nexport class FileStorage implements FileStorageInterface {\n private transformOptions: TransformOptions | null = null;\n private readonly baseDir: string;\n private readonly maxFileSize: number = 50 * 1024 * 1024; // 50MB default\n\n constructor() {\n this.baseDir = path.join(process.cwd(), \"public\");\n this.ensureDirectoryExists(this.baseDir);\n }\n\n /**\n * Set transformation options for the next save operation\n */\n transform(options: TransformOptions): FileStorage {\n this.transformOptions = options;\n return this;\n }\n\n async getUploadFile(fliePath: string) {\n const f = await fs.promises.readFile(path.join(this.baseDir, fliePath));\n return f;\n }\n\n async download(filepath: PathLike) {\n const filename =\n filepath\n .toString()\n .split(/[\\/\\\\]/)\n .pop() || \"file\";\n\n const s = createReadStream(filepath);\n return {\n download: true,\n stream: s,\n filename,\n };\n }\n async downloadAs(filepath: PathLike, filename: string) {\n const s = createReadStream(filepath);\n return {\n download: true,\n stream: s,\n filename,\n };\n }\n\n /**\n * Save a single file with optional transformations\n */\n async save(f: MultipartFile, options?: SaveOptionsSingle): Promise<any> {\n const opts: SaveOptionsSingle = {\n overwrite: options?.overwrite ?? true,\n to: options?.to,\n saveAs: options?.saveAs,\n };\n\n if (f.type !== \"file\") {\n throw new SystemUseError(\"Invalid file type\");\n }\n\n try {\n \n const filename = opts.saveAs || f.filename;\n this.validateFilename(filename);\n const uploadDir = opts.to\n ? path.join(this.baseDir, opts.to)\n : this.baseDir;\n const fullPath = path.join(uploadDir, filename);\n\n\n if (!fullPath.startsWith(this.baseDir)) {\n throw new SystemUseError(\"Invalid file path\");\n }\n\n // Check if file exists\n if (!opts.overwrite && this.isFileExists(fullPath)) {\n throw new SystemUseError(\"File already exists\");\n }\n await this.ensureDirectoryExists(uploadDir);\n\n\n let sourceStream: NodeJS.ReadableStream;\n const savedFile = f as SavedMultipartFile;\n if (savedFile.filepath && !f.file) {\n sourceStream = fs.createReadStream(savedFile.filepath);\n } else if (f.file) {\n sourceStream = f.file;\n } else {\n throw new SystemUseError(\"No file stream or filepath available\");\n }\n if (this.transformOptions && this.isImageFile(filename)) {\n await this.processImage(sourceStream, fullPath);\n } else {\n await pipeline(sourceStream, fs.createWriteStream(fullPath));\n }\n if (savedFile.filepath && fs.existsSync(savedFile.filepath)) {\n this.removeFileSync(savedFile.filepath);\n }\n if (opts.saveAs) {\n f.filename = opts.saveAs;\n }\n\n return { \n uploadPath: options?.to ?'/uploads/'+ options.to+\"/\"+ f.filename: '/uploads/'+ f.filename,\n staticPath: options?.to ? '/static/'+options.to+\"/\"+ f.filename: '/static/'+ f.filename\n };\n } catch (err) {\n if (\n err instanceof SystemUseError ||\n err instanceof InternalErrorException\n ) {\n throw err;\n }\n console.error(\"File save error:\", err);\n throw new SystemUseError(\"Failed to upload file\");\n }\n }\n\n /**\n * Save multiple files\n */\n async saveAll(files: MultipartFile[], options?: SaveOptions): Promise<any[]> {\n if (!files || files.length === 0) {\n return [];\n }\n\n const opts: SaveOptions = {\n overwrite: options?.overwrite ?? true,\n to: options?.to,\n };\n\n const uploadDir = opts.to ? path.join(this.baseDir, opts.to) : this.baseDir;\n await this.ensureDirectoryExists(uploadDir);\n\n const results: any[] = [];\n\n for (const f of files) {\n try {\n this.validateFilename(f.filename);\n const fullPath = path.join(uploadDir, f.filename);\n if (!fullPath.startsWith(this.baseDir)) {\n throw new SystemUseError(`Invalid file path for ${f.filename}`);\n }\n\n\n if (!opts.overwrite && this.isFileExists(fullPath)) {\n throw new SystemUseError(`File ${f.filename} already exists`);\n }\n\n\n if (f.file) {\n if (this.transformOptions && this.isImageFile(f.filename)) {\n await this.processImage(f.file, fullPath);\n } else {\n await pipeline(f.file, fs.createWriteStream(fullPath));\n }\n } else {\n const fp = f as SavedMultipartFile;\n if (!fp.filepath) {\n throw new SystemUseError(`No filepath for ${f.filename}`);\n }\n\n if (this.transformOptions && this.isImageFile(f.filename)) {\n await this.processImage(fs.createReadStream(fp.filepath), fullPath);\n } else {\n await pipeline(\n fs.createReadStream(fp.filepath),\n fs.createWriteStream(fullPath),\n );\n }\n\n this.removeFileSync(fp.filepath);\n }\n\n results.push({ \n uploadPath: options?.to ?'/uploads/'+ options.to+\"/\"+f.filename: '/uploads/'+f.filename,\n staticPath: options?.to ? '/static/'+options.to+\"/\"+f.filename: '/static/'+f.filename\n });\n } catch (error) {\n console.error(`Failed to save file ${f.filename}:`, error);\n throw new SystemUseError(`Failed to upload file ${f.filename}`);\n }\n }\n\n return results;\n }\n\n /**\n * Remove a file from storage\n */\n async remove(filepath: string): Promise<void> {\n const fullPath = path.join(this.baseDir, filepath);\n\n // Security check\n if (!fullPath.startsWith(this.baseDir)) {\n throw new SystemUseError(\"Invalid file path\");\n }\n\n if (!this.isFileExists(fullPath)) {\n throw new SystemUseError(\"File doesn't exist\");\n }\n\n try {\n fs.unlinkSync(fullPath);\n } catch (error) {\n console.error(\"File removal error:\", error);\n throw new SystemUseError(\"Failed to remove file\");\n }\n }\n\n /**\n * Process image with transformations using sharp\n */\n private async processImage(\n fileStream: NodeJS.ReadableStream,\n outputPath: string,\n ): Promise<void> {\n try {\n const sharp = await import(\"sharp\");\n let sharpPipeline = sharp.default();\n\n if (this.transformOptions?.resize) {\n sharpPipeline = sharpPipeline.resize(\n this.transformOptions.resize.width,\n this.transformOptions.resize.height,\n { fit: \"inside\", withoutEnlargement: true },\n );\n }\n\n if (this.transformOptions?.format) {\n const quality = this.transformOptions.quality || 80;\n switch (this.transformOptions.format) {\n case \"jpeg\":\n sharpPipeline = sharpPipeline.jpeg({ quality });\n break;\n case \"png\":\n sharpPipeline = sharpPipeline.png({ quality });\n break;\n case \"webp\":\n sharpPipeline = sharpPipeline.webp({ quality });\n break;\n case \"avif\":\n sharpPipeline = sharpPipeline.avif({ quality });\n break;\n }\n }\n\n await pipeline(\n fileStream,\n sharpPipeline,\n fs.createWriteStream(outputPath),\n );\n } catch (error: any) {\n if (\n error.code === \"MODULE_NOT_FOUND\" &&\n error.message.includes(\"sharp\")\n ) {\n throw new InternalErrorException(\n \"sharp module not found. Please install sharp to use image transformations.\",\n );\n }\n console.error(\"Image processing failed:\", error);\n throw new InternalErrorException(\"Image processing failed\");\n } finally {\n this.transformOptions = null;\n }\n }\n\n /**\n * Helper methods\n */\n private isFileExists(fpath: string): boolean {\n return fs.existsSync(fpath);\n }\n\n private async ensureDirectoryExists(dirPath: string): Promise<void> {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n }\n\n private removeFileSync(filepath: string): void {\n try {\n if (fs.existsSync(filepath)) {\n fs.unlinkSync(filepath);\n }\n } catch (error) {\n console.error(\"Failed to remove temp file:\", error);\n }\n }\n\n private isImageFile(filename: string): boolean {\n const ext = path.extname(filename).toLowerCase();\n return [\".jpg\", \".jpeg\", \".png\", \".webp\", \".avif\", \".gif\", \".bmp\"].includes(\n ext,\n );\n }\n\n private validateFilename(filename: string): void {\n if (!filename || filename.trim() === \"\") {\n throw new SystemUseError(\"Invalid filename\");\n }\n\n // Check for path traversal attempts\n if (\n filename.includes(\"..\") ||\n filename.includes(\"/\") ||\n filename.includes(\"\\\\\")\n ) {\n throw new SystemUseError(\"Invalid filename: path traversal detected\");\n }\n\n // Check for null bytes\n if (filename.includes(\"\\0\")) {\n throw new SystemUseError(\"Invalid filename: null byte detected\");\n }\n }\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\n\nimport dotenv from \"dotenv\";\nimport path from \"path\";\nimport fs, { existsSync } from \"fs\";\nimport { Service } from \"typedi\";\nimport {\n EnvironmentVariableNotFound,\n SystemUseError,\n} from \"./exceptions/system-exception\";\n\ndotenv.config({ path: path.join(process.cwd(), \".env\"), quiet: true});\n/**\n * @class Environment\n * @description A service class to manage access to environment variables.\n * It loads variables from `.env` file and merges them with `process.env`,\n * giving precedence to `process.env` values.\n */\n@Service()\nexport class Environment {\n\n /**\n * Parses the given `.env` file and merges it with `process.env`.\n * Values from `process.env` take precedence.\n *\n * @private\n * @param filePath - Absolute path to the `.env` file.\n * @returns A dictionary of merged environment variables.\n */\n private parseEnvFile(filePath: string): any {\n try {\n const isExis = existsSync(filePath);\n if (!isExis) {\n return { ...process.env };\n }\n const fileContent = fs.readFileSync(filePath, \"utf8\");\n const parsedEnv = dotenv.parse(fileContent);\n return { ...parsedEnv, ...process.env };\n } catch (error) {\n console.error(`Error parsing .env file: ${error}`);\n return {};\n }\n }\n\n /**\n * Retrieves the value of the specified environment variable.\n *\n * @template T\n * @param key - The name of the environment variable.\n * @returns The value of the variable, or `undefined` if not found.\n */\n get<T = any>(key: string): T {\n const parsedEnv = this.parseEnvFile(path.join(process.cwd(), \".env\"));\n return parsedEnv[key] as T;\n }\n\n /**\n * Retrieves the value of the specified environment variable.\n * Throws an error if the variable is not found.\n *\n * @template T\n * @param key - The name of the environment variable.\n * @throws {EnvironmentVariableNotFound} If the variable does not exist.\n * @returns The value of the variable.\n */\n getOrThrow<T = any>(key: string): T {\n const parsedEnv = this.parseEnvFile(path.join(process.cwd(), \".env\"));\n if (!Object(parsedEnv).hasOwnProperty(key)) {\n throw new EnvironmentVariableNotFound(key);\n }\n return parsedEnv[key] as T;\n }\n\n /**\n * Retrieves all available environment variables,\n * with `process.env` values taking precedence over `.env` values.\n *\n * @template T\n * @returns An object containing all environment variables.\n */\n getAll<T = any>(): T {\n const parsedEnv = this.parseEnvFile(path.join(process.cwd(), \".env\"));\n return parsedEnv as T;\n }\n}\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport { Container, Service, Constructable, Token } from \"typedi\";\nimport { Environment } from \"./environment-variables\";\nimport { inject } from \"./helpers\";\n\n\n\nexport interface IConfig<T = any> {\n config(env: Environment): T;\n}\n\nexport function AppConfig<T extends IConfig>(target: Constructable<T>) {\n Container.set({ id: target, type: target });\n}\n\nexport class AvleonConfig {\n get<T extends IConfig<R>, R>(configClass: Constructable<T>): R {\n const instance = Container.get(configClass);\n if (!instance) {\n throw new Error(`Configuration for ${configClass.name} not found.`);\n }\n return instance.config(new Environment());\n }\n}\n\n// export function GetConfig<\n// T extends IConfig<R>,\n// R = ReturnType<InstanceType<Constructable<T>>[\"config\"]>,\n// >(ConfigClass: Constructable<T>): R {\n// const instance = Container.get(ConfigClass);\n// if (!instance) {\n// throw new Error(\n// `Class \"${ConfigClass.name}\" is not registered as a config.`,\n// );\n// }\n// return instance.config(new Environment());\n// }\n\nexport function GetConfig<\n T extends IConfig<R>,\n R = ReturnType<InstanceType<Constructable<T>>[\"config\"]>,\n>(ConfigClass: Constructable<T>): R;\n\nexport function GetConfig<T = any>(config: string | symbol): T;\n\n// Implementation\nexport function GetConfig<R>(token: any): R {\n // 1. Class‐based: token.prototype.config is a function\n if (\n typeof token === \"function\" &&\n token.prototype != null &&\n typeof token.prototype.config === \"function\"\n ) {\n const instance = Container.get(token as Constructable<any>);\n if (!instance) {\n throw new Error(`Class \"${token.name}\" is not registered as a config.`);\n }\n return instance.config(inject(Environment));\n }\n\n // 2. Functional: token is the callback itself\n const stored = Container.get(token);\n if (!stored) {\n throw new Error(\"Config object is not registered.\");\n }\n return stored as R;\n}\n\nexport function CreateConfig<T>(\n token: string | symbol,\n callback: (env: Environment) => T,\n) {\n let env!: Environment;\n try {\n env = Container.get(Environment);\n } catch (error) {\n env = new Environment();\n }\n\n let config: T = callback(env);\n Container.set<T>(token as Token<T>, config);\n}\n","import pino from \"pino\";\nimport { AppService } from \"./decorators\";\n\n@AppService\nexport class LoggerService {\n private logger: pino.Logger;\n\n constructor() {\n this.logger = pino({\n level: process.env.LOG_LEVEL || \"info\",\n transport: {\n target: \"pino-pretty\",\n options: {\n translateTime: \"SYS:standard\",\n ignore: \"pid,hostname\",\n },\n },\n });\n }\n\n getLogger(): pino.Logger {\n return this.logger;\n }\n\n info(message: string, obj?: any): void {\n if (obj) {\n this.logger.info(obj, message);\n } else {\n this.logger.info(message);\n }\n }\n\n error(message: string, obj?: any): void {\n if (obj) {\n this.logger.error(obj, message);\n } else {\n this.logger.error(message);\n }\n }\n\n warn(message: string, obj?: any): void {\n if (obj) {\n this.logger.warn(obj, message);\n } else {\n this.logger.warn(message);\n }\n }\n\n debug(message: string, obj?: any): void {\n if (obj) {\n this.logger.debug(obj, message);\n } else {\n this.logger.debug(message);\n }\n }\n\n fatal(message: string, obj?: any): void {\n if (obj) {\n this.logger.fatal(obj, message);\n } else {\n this.logger.fatal(message);\n }\n }\n\n trace(message: string, obj?: any): void {\n if (obj) {\n this.logger.trace(obj, message);\n } else {\n this.logger.trace(message);\n }\n }\n}\n","import type { Redis } from \"ioredis\";\n\ntype CacheEntry<T = any> = {\n data: T;\n timestamp: number;\n};\n\nexport class CacheManager {\n private store = new Map<string, CacheEntry>();\n private tagsMap = new Map<string, Set<string>>();\n private redis: Redis | null = null;\n\n constructor(redisInstance?: Redis) {\n this.redis = redisInstance || null;\n }\n\n private redisTagKey(tag: string) {\n return `cache-tags:${tag}`;\n }\n\n async get<T>(key: string): Promise<T | null> {\n if (this.redis) {\n const val = await this.redis.get(key);\n return val ? JSON.parse(val) : null;\n }\n\n const cached = this.store.get(key);\n return cached ? cached.data : null;\n }\n\n async set<T>(\n key: string,\n value: T,\n tags: string[] = [],\n ttl: number = 3600,\n ): Promise<void> {\n const entry: CacheEntry<T> = {\n data: value,\n timestamp: Date.now(),\n };\n\n if (this.redis) {\n await this.redis.set(key, JSON.stringify(entry.data), \"EX\", ttl);\n for (const tag of tags) {\n await this.redis.sadd(this.redisTagKey(tag), key);\n }\n } else {\n this.store.set(key, entry);\n for (const tag of tags) {\n if (!this.tagsMap.has(tag)) this.tagsMap.set(tag, new Set());\n this.tagsMap.get(tag)!.add(key);\n }\n }\n }\n\n async delete(key: string): Promise<void> {\n if (this.redis) {\n await this.redis.del(key);\n\n // Also clean up from any tag sets\n const tagKeys = await this.redis.keys(\"cache-tags:*\");\n for (const tagKey of tagKeys) {\n await this.redis.srem(tagKey, key);\n }\n } else {\n this.store.delete(key);\n for (const keys of this.tagsMap.values()) {\n keys.delete(key);\n }\n }\n }\n\n async invalidateTag(tag: string): Promise<void> {\n if (this.redis) {\n const tagKey = this.redisTagKey(tag);\n const keys = await this.redis.smembers(tagKey);\n if (keys.length) {\n await this.redis.del(...keys); // delete all cached keys\n await this.redis.del(tagKey); // delete the tag set\n }\n } else {\n const keys = this.tagsMap.get(tag);\n if (keys) {\n for (const key of keys) {\n this.store.delete(key);\n }\n this.tagsMap.delete(tag);\n }\n }\n }\n}\n","export type OkOptions = {\n streamable: boolean;\n};\n\nexport class Results {\n static code = 500;\n message: string = \"Something going wrong\";\n\n static Ok<T>(data: T): Ok<T> {\n return new Ok<T>(data);\n }\n static NoContent() {\n this.code = 204;\n }\n static OkStream() {}\n static NotFound<T>(message: T) {\n return new NotFound<T>(message);\n }\n}\n\nexport class Ok<T> {\n constructor(public data: T) {}\n}\n\nexport class NotFound<T> {\n constructor(public message: T) {}\n}\n\n// This type ensures methods must return Results.Ok\nexport type RouteResult<T = any> = typeof Results.Ok<T>;\n","/**\n * @copyright 2024\n * @author Tareq Hossain\n * @email xtrinsic96@gmail.com\n * @url https://github.com/xtareq\n */\nimport * as sw from \"./swagger-schema\";\nimport \"reflect-metadata\";\nexport * from \"./decorators\";\nexport * from \"./interfaces/avleon-application\";\nexport * from \"./core/application\";\nexport * from \"./core/testing\";\nexport * from \"./core/types\";\nexport * from \"./helpers\";\nexport * from \"./response\";\nexport * from \"./exceptions\";\nexport * from \"./openapi\";\nexport * from \"./swagger-schema\";\nexport * from \"./container\";\nexport * from \"./middleware\";\nexport * from \"./kenx-provider\";\nexport * from \"./collection\";\nexport * from \"./event-dispatcher\";\nexport * from \"./event-subscriber\";\nexport * from \"./queue\";\nexport * from \"./file-storage\";\nexport * from \"./config\";\nexport * from \"./logger\";\nexport * from \"./cache\";\nexport * from \"./results\";\nexport * from \"./environment-variables\";\n\nexport const GetSchema = sw.generateSwaggerSchema;\nexport const GetObjectSchema = sw.CreateSwaggerObjectSchema;\nexport const OpenApiOk = (args1: any) => {\n return sw.OpenApiResponse(200, args1, \"Success\");\n}\nexport const OpenApiResponse = sw.OpenApiResponse;\nexport const OpenApiProperty = sw.OpenApiProperty;\n\nexport { default as AvleonContainer } from \"./container\";\n"],"mappings":"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"}
|