{"version":3,"sources":["../../../../src/lib/A-ServerRouter/A-ServerRouter.component.ts"],"names":[],"mappings":"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","file":"A-ServerRouter.component.mjs","sourcesContent":["import {\n    A_Component,\n    A_Concept,\n    A_Context,\n    A_Feature,\n    A_Inject,\n    A_Meta,\n    A_Scope,\n    A_TypeGuards,\n    A_TYPES__Required\n} from \"@adaas/a-concept\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_ServerLogger } from \"../A-ServerLogger/A-ServerLogger.component\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_ServerRouteHttpMethodNames } from \"@adaas/a-server/route/A-ServerRoute.types\";\nimport { A_ServerRouteHttpMethods } from \"@adaas/a-server/route/A-ServerRoute.constants\";\nimport { A_ServerRouterMeta } from \"./A-ServerRouter.meta\";\nimport { A_ServerRouterDefineDecorator } from \"./A-ServerRouterDefine.decorator\";\nimport { A_ServerRouterRouteConfig } from \"./A-ServerRouter.types\";\n\n\n\n@A_Meta.Define(A_ServerRouterMeta)\nexport class A_ServerRouter extends A_Component {\n\n    // =======================================================\n    // ================ Method Definition=====================\n    // =======================================================\n\n    /**\n     * Allows to define a custom route for POST requests\n     * \n     * @param path \n     * @returns \n     */\n    static Post(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.POST,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for GET requests\n     * \n     * @param path \n     * @returns \n     */\n    static Get(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.GET,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for PUT requests\n     * \n     * @param path \n     * @returns \n     */\n    static Put(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.PUT,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for DELETE requests\n     * \n     * @param path \n     * @returns \n     */\n    static Delete(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.DELETE,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for PATCH requests\n     * \n     * @param path \n     * @returns \n     */\n    static Patch(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.PATCH,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for DEFAULT requests\n     * \n     * @param path \n     * @returns \n     */\n    static Default(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.DEFAULT,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n\n    // static routes: Array<A_ServerRoute> = [];\n\n    /**\n     * Private method to have the same signature for all route methods\n     * \n     * @param method \n     * @param path \n     * @returns \n     */\n    private static defineRoute(\n        config: A_ServerRouterRouteConfig & { method: A_ServerRouteHttpMethodNames }\n    ) {\n        const route = typeof config.path === 'string' || config.path instanceof RegExp\n            ? new A_ServerRoute(\n                `/${config.prefix}/${config.version}${config.path instanceof RegExp ? config.path.source : config.path.startsWith('/') ? config.path : `/${config.path}`}`,\n                config.method)\n            : config.path;\n\n        return A_ServerRouterDefineDecorator(route);\n    }\n\n\n    // =====================================================\n    // ================ Concept Lifecycle ========================\n    // =====================================================\n\n    @A_Concept.Load()\n    protected async load(\n        @A_Inject(A_ServerLogger) logger: A_ServerLogger\n    ): Promise<void> {\n        const meta = A_Context.meta<A_ServerRouterMeta>(this.constructor as any);\n\n        const routes = meta.routes;\n\n        if (!routes || !routes.length) {\n            logger.warning('yellow', `No routes defined for ${this.constructor.name}`);\n            return;\n        }\n\n\n        logger.info('cyan',\n            `Registered Routes:`,\n            `------------------------------------\\n`,\n            ...routes\n                .map(route => `[${route.method.toUpperCase()}]${' '.repeat(7 - route.method.length)} ${route.path}`)\n\n        );\n    }\n\n\n\n    // =======================================================\n    // ================ Feature Definition=====================\n    // =======================================================\n    // @A_Feature.Define({\n    //     invoke: false\n    // })\n    @A_Feature.Extend({\n        name: A_HttpServerFeatures.onRequest,\n    })\n    async identifyRoute(\n        @A_Inject(A_Request) request: A_Request,\n        @A_Inject(A_Response) response: A_Response,\n        @A_Inject(A_Scope) scope: A_Scope,\n        @A_Inject(A_Config) config: A_Config,\n        @A_Inject(A_Logger) logger: A_Logger,\n        @A_Inject(A_ServerRoute) route: A_ServerRoute,\n    ) {\n        if (route.method === 'OPTIONS') {\n            // Ignore OPTIONS requests\n            return;\n        }\n        /**\n         * just execute all listeners on the Route\n         * url example: /api/v1/users/123\n         * OR\n         * url example: /api/v1/users\n         * => Then The feature will be \"GET::/api/v1/users\"\n         * And it will return all stages that are similar to the feature name \n         */\n\n        const feature = new A_Feature({ name: route.toString(), component: this, })\n\n        if (!feature.size)\n            throw new A_HttpServerError({\n                status: 404,\n                title: 'Route Not Found',\n                description: `No route found for ${request.method} ${request.url}`,\n            })\n\n\n        for (const stage of feature) {\n\n            const targetConstructor = stage.definition.dependency.target;\n\n            if (A_TypeGuards.isComponentConstructor(targetConstructor)) {\n\n                const meta: A_ServerRouterMeta = A_Context.meta<A_ServerRouterMeta>(this.constructor as any);\n\n                const routeDefinitions = meta.definitions;\n\n                const routeDefinition = routeDefinitions?.get(stage.definition.name || '');\n\n\n\n\n                if (routeDefinition) {\n                    request.useRoute(routeDefinition.route);\n                }\n            }\n\n            const stageScope = new A_Scope({\n                name: `a-route--${request.id}--${stage.definition.name}`,\n            }, {\n                parent: scope\n            });\n\n\n            await stage.process(stageScope);\n        }\n\n    }\n}"]}