{"version":3,"sources":["../../src/Controller.mts"],"sourcesContent":["import type { ControllerDecoratorOptions, HttpMethod, MiddlewareProvider } from './types.mjs';\n\nexport class BaseController {\n  declare static routes: {\n    methods: HttpMethod[];\n    path: string;\n    handler: string;\n    middlewares: MiddlewareProvider[];\n  }[];\n  static basePath: string = '';\n  static baseMiddlewares: MiddlewareProvider[];\n\n  constructor() {\n    // base constructor logic if needed\n  }\n\n  static getInstance() {\n    return new this();\n  }\n}\n\nexport function Controller(path: string, options: ControllerDecoratorOptions = {}): ClassDecorator {\n  return (target: any) => {\n    (target as any).routes = (target as any).routes || [];\n    (target as any).basePath = path;\n    (target as any).baseMiddlewares = options.middlewares || [];\n  };\n}\n\nfunction createHttpDecorator(data: {\n  methods: HttpMethod[];\n  path: string;\n  middlewares: MiddlewareProvider[];\n}): MethodDecorator {\n  return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n    const ctor = target.constructor;\n    if (!ctor.routes) ctor.routes = [];\n    ctor.routes.push({\n      methods: data.methods,\n      path: data.path,\n      handler: propertyKey,\n      middlewares: data.middlewares || [],\n    });\n\n    const originalMethod = descriptor.value!;\n    const paramKeys = Reflect.ownKeys(target.constructor);\n    const methodName = propertyKey.toString();\n\n    descriptor.value = async function (...args: any[]) {\n      const paramCustomKeys = paramKeys.filter(\n        (key) =>\n          typeof key === 'string' && key.startsWith(`${methodName}:`) && key.endsWith(':custom')\n      );\n      for (const paramKey of paramCustomKeys) {\n        const paramIndex = parseInt((paramKey as string).split(':')[1]);\n        const method = Reflect.get(target.constructor, paramKey.toString());\n        if (typeof paramIndex === 'number' && typeof method === 'function') {\n          args[paramIndex] = await method();\n        }\n      }\n\n      return originalMethod.apply(this, args);\n    };\n  };\n}\n\nexport function Get(\n  data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n  return createHttpDecorator({\n    methods: ['GET', 'HEAD'],\n    path: data.path || '/',\n    middlewares: data.middlewares || [],\n  });\n}\n\nexport function Post(\n  data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n  return createHttpDecorator({\n    methods: ['POST'],\n    path: data.path || '/',\n    middlewares: data.middlewares || [],\n  });\n}\n\nexport function Put(\n  data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n  return createHttpDecorator({\n    methods: ['PUT'],\n    path: data.path || '/',\n    middlewares: data.middlewares || [],\n  });\n}\n\nexport function Patch(\n  data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n  return createHttpDecorator({\n    methods: ['PATCH'],\n    path: data.path || '/',\n    middlewares: data.middlewares || [],\n  });\n}\n\nexport function Delete(\n  data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n  return createHttpDecorator({\n    methods: ['DELETE'],\n    path: data.path || '/',\n    middlewares: data.middlewares || [],\n  });\n}\n\nexport function Options(\n  data: { path?: string; middlewares?: MiddlewareProvider[] } = {}\n): MethodDecorator {\n  return createHttpDecorator({\n    methods: ['OPTIONS'],\n    path: data.path || '/',\n    middlewares: data.middlewares || [],\n  });\n}\n\nexport function createParamDecorator(func: () => Promise<any> | (() => any)): ParameterDecorator {\n  return function MyParamDecorator(\n    target: Object,\n    propertyKey: string | symbol | undefined,\n    parameterIndex: number\n  ) {\n    Reflect.set(target.constructor, `${propertyKey?.toString()}:${parameterIndex}:custom`, func);\n  };\n}\n"],"mappings":"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","names":[]}