veloce-ts 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +55 -1
  2. package/dist/cjs/src/cli/index.js +122 -71
  3. package/dist/cjs/src/cli/index.js.map +4 -4
  4. package/dist/cjs/src/index.js +17 -17
  5. package/dist/cjs/src/index.js.map +2 -2
  6. package/dist/cjs/src/middleware/index.js +2 -2
  7. package/dist/cjs/src/middleware/index.js.map +2 -2
  8. package/dist/cjs/src/plugins/index.js +2 -2
  9. package/dist/cjs/src/plugins/index.js.map +2 -2
  10. package/dist/cjs/src/testing/index.js +2 -2
  11. package/dist/cjs/src/testing/index.js.map +2 -2
  12. package/dist/cjs/src/websocket/index.js +3 -3
  13. package/dist/cjs/src/websocket/index.js.map +1 -1
  14. package/dist/esm/src/cli/index.js +561 -22
  15. package/dist/esm/src/cli/index.js.map +8 -4
  16. package/dist/esm/src/docs/index.js +6 -6
  17. package/dist/esm/src/docs/index.js.map +10 -3
  18. package/dist/esm/src/errors/index.js +3 -2
  19. package/dist/esm/src/errors/index.js.map +7 -3
  20. package/dist/esm/src/graphql/index.js +82 -2
  21. package/dist/esm/src/graphql/index.js.map +18 -3
  22. package/dist/esm/src/index.js +161 -14
  23. package/dist/esm/src/index.js.map +178 -5
  24. package/dist/esm/src/middleware/index.js +28 -2
  25. package/dist/esm/src/middleware/index.js.map +79 -3
  26. package/dist/esm/src/plugins/index.js +113 -3
  27. package/dist/esm/src/plugins/index.js.map +129 -3
  28. package/dist/esm/src/testing/index.js +42 -2
  29. package/dist/esm/src/testing/index.js.map +93 -3
  30. package/dist/esm/src/types/index.js +2 -2
  31. package/dist/esm/src/types/index.js.map +10 -3
  32. package/dist/esm/src/validation/index.js +2 -2
  33. package/dist/esm/src/validation/index.js.map +13 -3
  34. package/dist/esm/src/websocket/index.js +15 -2
  35. package/dist/esm/src/websocket/index.js.map +9 -4
  36. package/dist/types/cli/commands/new.d.ts.map +1 -1
  37. package/dist/types/websocket/index.d.ts +1 -1
  38. package/dist/types/websocket/index.d.ts.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/esm/chunk-0st10wcn.js +0 -5
  41. package/dist/esm/chunk-0st10wcn.js.map +0 -10
  42. package/dist/esm/chunk-17vq2krv.js +0 -4
  43. package/dist/esm/chunk-17vq2krv.js.map +0 -16
  44. package/dist/esm/chunk-39f1dm0q.js +0 -60
  45. package/dist/esm/chunk-39f1dm0q.js.map +0 -10
  46. package/dist/esm/chunk-3q5xefez.js +0 -72
  47. package/dist/esm/chunk-3q5xefez.js.map +0 -13
  48. package/dist/esm/chunk-6ft6xkhc.js +0 -5
  49. package/dist/esm/chunk-6ft6xkhc.js.map +0 -10
  50. package/dist/esm/chunk-79b0bm4k.js +0 -5
  51. package/dist/esm/chunk-79b0bm4k.js.map +0 -10
  52. package/dist/esm/chunk-8kakv20e.js +0 -7
  53. package/dist/esm/chunk-8kakv20e.js.map +0 -10
  54. package/dist/esm/chunk-b2pdghf7.js +0 -5
  55. package/dist/esm/chunk-b2pdghf7.js.map +0 -11
  56. package/dist/esm/chunk-b7yr0p26.js +0 -5
  57. package/dist/esm/chunk-b7yr0p26.js.map +0 -10
  58. package/dist/esm/chunk-fzj3j2tz.js +0 -5
  59. package/dist/esm/chunk-fzj3j2tz.js.map +0 -10
  60. package/dist/esm/chunk-g0e0m30h.js +0 -6
  61. package/dist/esm/chunk-g0e0m30h.js.map +0 -10
  62. package/dist/esm/chunk-gzkpxw50.js +0 -5
  63. package/dist/esm/chunk-gzkpxw50.js.map +0 -10
  64. package/dist/esm/chunk-k4346bxd.js +0 -30
  65. package/dist/esm/chunk-k4346bxd.js.map +0 -78
  66. package/dist/esm/chunk-k9p1edmj.js +0 -5
  67. package/dist/esm/chunk-k9p1edmj.js.map +0 -10
  68. package/dist/esm/chunk-keyvhe4h.js +0 -5
  69. package/dist/esm/chunk-keyvhe4h.js.map +0 -9
  70. package/dist/esm/chunk-npcmt5ay.js +0 -430
  71. package/dist/esm/chunk-npcmt5ay.js.map +0 -10
  72. package/dist/esm/chunk-nyqav7az.js +0 -18
  73. package/dist/esm/chunk-nyqav7az.js.map +0 -10
  74. package/dist/esm/chunk-nzg49r1w.js +0 -7
  75. package/dist/esm/chunk-nzg49r1w.js.map +0 -10
  76. package/dist/esm/chunk-sk8amac2.js +0 -5
  77. package/dist/esm/chunk-sk8amac2.js.map +0 -10
  78. package/dist/esm/chunk-sz3bj4rp.js +0 -5
  79. package/dist/esm/chunk-sz3bj4rp.js.map +0 -12
  80. package/dist/esm/chunk-x1mvjab1.js +0 -5
  81. package/dist/esm/chunk-x1mvjab1.js.map +0 -12
@@ -1,60 +0,0 @@
1
- // @bun
2
- import"./chunk-keyvhe4h.js";import{writeFile as b,mkdir as U}from"fs/promises";import{join as Z}from"path";import{existsSync as k}from"fs";function j(z){let H=z.command("generate").description("Generate code and documentation").alias("g");H.command("openapi").description("Generate OpenAPI specification").option("-o, --output <file>","Output file path","openapi.json").action(async(E)=>{await A(E)}),H.command("client").description("Generate TypeScript client from OpenAPI spec").option("-i, --input <file>","OpenAPI spec file","openapi.json").option("-o, --output <dir>","Output directory","src/client").action(async(E)=>{await w(E)})}async function A(z){console.log("Generating OpenAPI specification...");try{let H=Z(process.cwd(),"src","index.ts");if(!k(H))console.error("Error: src/index.ts not found"),console.error("Make sure you are in a FastAPI-TS project directory"),process.exit(1);let E=await import(H),K=E.default||E.app;if(!K||typeof K.getMetadata!=="function")console.error("Error: Could not find VeloceTS app instance"),console.error("Make sure your src/index.ts exports the app or sets it as default"),process.exit(1);let L=K.getMetadata(),Q=J(L,K),V=Z(process.cwd(),z.output);await b(V,JSON.stringify(Q,null,2)),console.log(`\u2713 OpenAPI spec generated: ${z.output}`)}catch(H){console.error("Failed to generate OpenAPI spec:",H),process.exit(1)}}function J(z,H){let E=z.getRoutes(),K={openapi:"3.0.0",info:{title:H.config?.title||"Veloce API",version:H.config?.version||"1.0.0",description:H.config?.description||"API built with Veloce"},paths:{},components:{schemas:{}}};for(let L of E){let Q=L.path,V=L.method.toLowerCase();if(!K.paths[Q])K.paths[Q]={};K.paths[Q][V]={summary:L.docs?.summary||`${V.toUpperCase()} ${Q}`,description:L.docs?.description,tags:L.docs?.tags||[],parameters:O(L),requestBody:R(L),responses:{"200":{description:"Successful response",content:{"application/json":{schema:{type:"object"}}}}}}}return K}function O(z){let H=[];for(let E of z.parameters||[])if(E.type==="query"||E.type==="param"||E.type==="header")H.push({name:E.name||"unknown",in:E.type==="param"?"path":E.type,required:E.required||!1,schema:{type:"string"}});return H}function R(z){if(!z.parameters?.find((E)=>E.type==="body"))return;return{required:!0,content:{"application/json":{schema:{type:"object"}}}}}async function w(z){console.log("Generating TypeScript client...");try{let H=Z(process.cwd(),z.input);if(!k(H))console.error(`Error: OpenAPI spec not found at ${z.input}`),console.error('Run "veloce generate openapi" first'),process.exit(1);let E=await Bun.file(H).text(),K=JSON.parse(E),L=Z(process.cwd(),z.output);await U(L,{recursive:!0});let Q=B(K),V=Z(L,"client.ts");await b(V,Q);let W=I(K),Y=Z(L,"types.ts");await b(Y,W),console.log(`\u2713 TypeScript client generated in ${z.output}`),console.log(` - ${z.output}/client.ts`),console.log(` - ${z.output}/types.ts`)}catch(H){console.error("Failed to generate client:",H),process.exit(1)}}function B(z){let H=z.servers?.[0]?.url||"http://localhost:3000",E=`// Generated TypeScript client for ${z.info.title}
3
- // Version: ${z.info.version}
4
-
5
- import type * as Types from './types';
6
-
7
- export class APIClient {
8
- constructor(private baseUrl: string = '${H}') {}
9
-
10
- private async request<T>(
11
- method: string,
12
- path: string,
13
- options?: {
14
- params?: Record<string, any>;
15
- body?: any;
16
- headers?: Record<string, string>;
17
- }
18
- ): Promise<T> {
19
- const url = new URL(path, this.baseUrl);
20
-
21
- if (options?.params) {
22
- Object.entries(options.params).forEach(([key, value]) => {
23
- url.searchParams.append(key, String(value));
24
- });
25
- }
26
-
27
- const response = await fetch(url.toString(), {
28
- method,
29
- headers: {
30
- 'Content-Type': 'application/json',
31
- ...options?.headers,
32
- },
33
- body: options?.body ? JSON.stringify(options.body) : undefined,
34
- });
35
-
36
- if (!response.ok) {
37
- throw new Error(\`API request failed: \${response.statusText}\`);
38
- }
39
-
40
- return response.json();
41
- }
42
-
43
- `;for(let[K,L]of Object.entries(z.paths||{}))for(let[Q,V]of Object.entries(L)){let W=q(Q,K,V),Y=D(Q,K,V);E+=Y+`
44
- `}return E+=`}
45
- `,E}function q(z,H,E){if(E.operationId)return E.operationId;let K=H.replace(/\{|\}/g,"").replace(/\//g,"_").replace(/^_/,"").replace(/_([a-z])/g,(L,Q)=>Q.toUpperCase());return`${z}${K.charAt(0).toUpperCase()+K.slice(1)}`}function D(z,H,E){let K=q(z,H,E),L=z==="post"||z==="put"||z==="patch",Q=E.parameters?.some((X)=>X.in==="query"),V=E.parameters?.some((X)=>X.in==="path"),W=[],Y=[];if(V){let X=E.parameters.filter((_)=>_.in==="path");Y=X.map((_)=>_.name),W.push(...X.map((_)=>`${_.name}: string`))}if(L)W.push("body: any");if(Q)W.push("params?: Record<string, any>");let G=W.length>0?W.join(", "):"",$=H;for(let X of Y)$=$.replace(`{${X}}`,`\${${X}}`);return` async ${K}(${G}): Promise<any> {
46
- return this.request('${z.toUpperCase()}', \`${$}\`, {
47
- ${L?"body,":""}
48
- ${Q?"params,":""}
49
- });
50
- }
51
- `}function I(z){let H=`// Generated types for ${z.info.title}
52
- // Version: ${z.info.version}
53
-
54
- `;if(z.components?.schemas)for(let[E,K]of Object.entries(z.components.schemas))H+=`export interface ${E} {
55
- `,H+=T(K),H+=`}
56
-
57
- `;return H}function T(z,H=" "){let E="";if(z.properties)for(let[K,L]of Object.entries(z.properties)){let Q=L,V=!z.required?.includes(K),W=v(Q);E+=`${H}${K}${V?"?":""}: ${W};
58
- `}return E}function v(z){if(z.type==="string")return"string";if(z.type==="number"||z.type==="integer")return"number";if(z.type==="boolean")return"boolean";if(z.type==="array")return`${z.items?v(z.items):"any"}[]`;if(z.type==="object")return"Record<string, any>";return"any"}export{j as registerGenerateCommand};
59
-
60
- //# debugId=E52C16AAC593E76D64756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["..\\..\\src\\cli\\commands\\generate.ts"],
4
- "sourcesContent": [
5
- "import { Command } from 'commander';\r\nimport { writeFile, mkdir } from 'fs/promises';\r\nimport { join } from 'path';\r\nimport { existsSync } from 'fs';\r\n\r\nexport function registerGenerateCommand(program: Command): void {\r\n const generateCommand = program\r\n .command('generate')\r\n .description('Generate code and documentation')\r\n .alias('g');\r\n\r\n // Generate OpenAPI spec\r\n generateCommand\r\n .command('openapi')\r\n .description('Generate OpenAPI specification')\r\n .option('-o, --output <file>', 'Output file path', 'openapi.json')\r\n .action(async (options: { output: string }) => {\r\n await generateOpenAPI(options);\r\n });\r\n\r\n // Generate TypeScript client\r\n generateCommand\r\n .command('client')\r\n .description('Generate TypeScript client from OpenAPI spec')\r\n .option('-i, --input <file>', 'OpenAPI spec file', 'openapi.json')\r\n .option('-o, --output <dir>', 'Output directory', 'src/client')\r\n .action(async (options: { input: string; output: string }) => {\r\n await generateClient(options);\r\n });\r\n}\r\n\r\nasync function generateOpenAPI(options: { output: string }): Promise<void> {\r\n console.log('Generating OpenAPI specification...');\r\n\r\n try {\r\n // Import the application to extract metadata\r\n const appPath = join(process.cwd(), 'src', 'index.ts');\r\n\r\n if (!existsSync(appPath)) {\r\n console.error('Error: src/index.ts not found');\r\n console.error('Make sure you are in a FastAPI-TS project directory');\r\n process.exit(1);\r\n }\r\n\r\n // Dynamically import the app\r\n const appModule = await import(appPath);\r\n const app = appModule.default || appModule.app;\r\n\r\n if (!app || typeof app.getMetadata !== 'function') {\r\n console.error('Error: Could not find VeloceTS app instance');\r\n console.error('Make sure your src/index.ts exports the app or sets it as default');\r\n process.exit(1);\r\n }\r\n\r\n // Generate OpenAPI spec from metadata\r\n const metadata = app.getMetadata();\r\n const spec = generateOpenAPISpec(metadata, app);\r\n\r\n // Write to file\r\n const outputPath = join(process.cwd(), options.output);\r\n await writeFile(outputPath, JSON.stringify(spec, null, 2));\r\n\r\n console.log(`✓ OpenAPI spec generated: ${options.output}`);\r\n } catch (error) {\r\n console.error('Failed to generate OpenAPI spec:', error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction generateOpenAPISpec(metadata: any, app: any): any {\r\n const routes = metadata.getRoutes();\r\n\r\n const spec = {\r\n openapi: '3.0.0',\r\n info: {\r\n title: app.config?.title || 'Veloce API',\r\n version: app.config?.version || '1.0.0',\r\n description: app.config?.description || 'API built with Veloce',\r\n },\r\n paths: {} as Record<string, any>,\r\n components: {\r\n schemas: {},\r\n },\r\n };\r\n\r\n // Build paths from routes\r\n for (const route of routes) {\r\n const path = route.path;\r\n const method = route.method.toLowerCase();\r\n\r\n if (!spec.paths[path]) {\r\n spec.paths[path] = {};\r\n }\r\n\r\n spec.paths[path][method] = {\r\n summary: route.docs?.summary || `${method.toUpperCase()} ${path}`,\r\n description: route.docs?.description,\r\n tags: route.docs?.tags || [],\r\n parameters: extractParameters(route),\r\n requestBody: extractRequestBody(route),\r\n responses: {\r\n '200': {\r\n description: 'Successful response',\r\n content: {\r\n 'application/json': {\r\n schema: { type: 'object' },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n }\r\n\r\n return spec;\r\n}\r\n\r\nfunction extractParameters(route: any): any[] {\r\n const params: any[] = [];\r\n\r\n for (const param of route.parameters || []) {\r\n if (param.type === 'query' || param.type === 'param' || param.type === 'header') {\r\n params.push({\r\n name: param.name || 'unknown',\r\n in: param.type === 'param' ? 'path' : param.type,\r\n required: param.required || false,\r\n schema: { type: 'string' },\r\n });\r\n }\r\n }\r\n\r\n return params;\r\n}\r\n\r\nfunction extractRequestBody(route: any): any | undefined {\r\n const bodyParam = route.parameters?.find((p: any) => p.type === 'body');\r\n\r\n if (!bodyParam) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n required: true,\r\n content: {\r\n 'application/json': {\r\n schema: { type: 'object' },\r\n },\r\n },\r\n };\r\n}\r\n\r\nasync function generateClient(options: { input: string; output: string }): Promise<void> {\r\n console.log('Generating TypeScript client...');\r\n\r\n try {\r\n const specPath = join(process.cwd(), options.input);\r\n\r\n if (!existsSync(specPath)) {\r\n console.error(`Error: OpenAPI spec not found at ${options.input}`);\r\n console.error('Run \"veloce generate openapi\" first');\r\n process.exit(1);\r\n }\r\n\r\n // Read OpenAPI spec\r\n const specFile = await Bun.file(specPath).text();\r\n const spec = JSON.parse(specFile);\r\n\r\n // Create output directory\r\n const outputDir = join(process.cwd(), options.output);\r\n await mkdir(outputDir, { recursive: true });\r\n\r\n // Generate client code\r\n const clientCode = generateClientCode(spec);\r\n\r\n // Write client file\r\n const clientPath = join(outputDir, 'client.ts');\r\n await writeFile(clientPath, clientCode);\r\n\r\n // Generate types file\r\n const typesCode = generateTypesCode(spec);\r\n const typesPath = join(outputDir, 'types.ts');\r\n await writeFile(typesPath, typesCode);\r\n\r\n console.log(`✓ TypeScript client generated in ${options.output}`);\r\n console.log(` - ${options.output}/client.ts`);\r\n console.log(` - ${options.output}/types.ts`);\r\n } catch (error) {\r\n console.error('Failed to generate client:', error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction generateClientCode(spec: any): string {\r\n const baseUrl = spec.servers?.[0]?.url || 'http://localhost:3000';\r\n\r\n let code = `// Generated TypeScript client for ${spec.info.title}\r\n// Version: ${spec.info.version}\r\n\r\nimport type * as Types from './types';\r\n\r\nexport class APIClient {\r\n constructor(private baseUrl: string = '${baseUrl}') {}\r\n\r\n private async request<T>(\r\n method: string,\r\n path: string,\r\n options?: {\r\n params?: Record<string, any>;\r\n body?: any;\r\n headers?: Record<string, string>;\r\n }\r\n ): Promise<T> {\r\n const url = new URL(path, this.baseUrl);\r\n\r\n if (options?.params) {\r\n Object.entries(options.params).forEach(([key, value]) => {\r\n url.searchParams.append(key, String(value));\r\n });\r\n }\r\n\r\n const response = await fetch(url.toString(), {\r\n method,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...options?.headers,\r\n },\r\n body: options?.body ? JSON.stringify(options.body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\\`API request failed: \\${response.statusText}\\`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n`;\r\n\r\n // Generate methods for each endpoint\r\n for (const [path, methods] of Object.entries(spec.paths || {})) {\r\n for (const [method, operation] of Object.entries(methods as any)) {\r\n const methodName = generateMethodName(method, path, operation);\r\n const methodCode = generateMethodCode(method, path, operation);\r\n code += methodCode + '\\n';\r\n }\r\n }\r\n\r\n code += '}\\n';\r\n\r\n return code;\r\n}\r\n\r\nfunction generateMethodName(method: string, path: string, operation: any): string {\r\n // Use operationId if available, otherwise generate from path\r\n if (operation.operationId) {\r\n return operation.operationId;\r\n }\r\n\r\n // Convert path to camelCase method name\r\n const cleanPath = path\r\n .replace(/\\{|\\}/g, '')\r\n .replace(/\\//g, '_')\r\n .replace(/^_/, '')\r\n .replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\r\n\r\n return `${method}${cleanPath.charAt(0).toUpperCase() + cleanPath.slice(1)}`;\r\n}\r\n\r\nfunction generateMethodCode(method: string, path: string, operation: any): string {\r\n const methodName = generateMethodName(method, path, operation);\r\n const hasBody = method === 'post' || method === 'put' || method === 'patch';\r\n const hasParams = operation.parameters?.some((p: any) => p.in === 'query');\r\n const hasPathParams = operation.parameters?.some((p: any) => p.in === 'path');\r\n\r\n let params: string[] = [];\r\n let pathParamNames: string[] = [];\r\n\r\n if (hasPathParams) {\r\n const pathParams = operation.parameters.filter((p: any) => p.in === 'path');\r\n pathParamNames = pathParams.map((p: any) => p.name);\r\n params.push(...pathParams.map((p: any) => `${p.name}: string`));\r\n }\r\n\r\n if (hasBody) {\r\n params.push('body: any');\r\n }\r\n\r\n if (hasParams) {\r\n params.push('params?: Record<string, any>');\r\n }\r\n\r\n const paramsStr = params.length > 0 ? params.join(', ') : '';\r\n\r\n // Replace path parameters\r\n let finalPath = path;\r\n for (const paramName of pathParamNames) {\r\n finalPath = finalPath.replace(`{${paramName}}`, `\\${${paramName}}`);\r\n }\r\n\r\n return ` async ${methodName}(${paramsStr}): Promise<any> {\r\n return this.request('${method.toUpperCase()}', \\`${finalPath}\\`, {\r\n ${hasBody ? 'body,' : ''}\r\n ${hasParams ? 'params,' : ''}\r\n });\r\n }\r\n`;\r\n}\r\n\r\nfunction generateTypesCode(spec: any): string {\r\n let code = `// Generated types for ${spec.info.title}\r\n// Version: ${spec.info.version}\r\n\r\n`;\r\n\r\n // Generate types from schemas\r\n if (spec.components?.schemas) {\r\n for (const [name, schema] of Object.entries(spec.components.schemas)) {\r\n code += `export interface ${name} {\\n`;\r\n code += generateInterfaceProperties(schema as any);\r\n code += '}\\n\\n';\r\n }\r\n }\r\n\r\n return code;\r\n}\r\n\r\nfunction generateInterfaceProperties(schema: any, indent: string = ' '): string {\r\n let props = '';\r\n\r\n if (schema.properties) {\r\n for (const [propName, propSchema] of Object.entries(schema.properties)) {\r\n const prop = propSchema as any;\r\n const optional = !schema.required?.includes(propName);\r\n const type = mapJsonSchemaType(prop);\r\n props += `${indent}${propName}${optional ? '?' : ''}: ${type};\\n`;\r\n }\r\n }\r\n\r\n return props;\r\n}\r\n\r\nfunction mapJsonSchemaType(schema: any): string {\r\n if (schema.type === 'string') return 'string';\r\n if (schema.type === 'number' || schema.type === 'integer') return 'number';\r\n if (schema.type === 'boolean') return 'boolean';\r\n if (schema.type === 'array') {\r\n const itemType = schema.items ? mapJsonSchemaType(schema.items) : 'any';\r\n return `${itemType}[]`;\r\n }\r\n if (schema.type === 'object') return 'Record<string, any>';\r\n return 'any';\r\n}\r\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "E52C16AAC593E76D64756E2164756E21",
9
- "names": []
10
- }
@@ -1,72 +0,0 @@
1
- // @bun
2
- import{Ra as R}from"./chunk-nyqav7az.js";import{Sa as x}from"./chunk-gzkpxw50.js";import{ab as D}from"./chunk-keyvhe4h.js";var z=D(R(),1),F=Symbol("graphql:resolver"),V=Symbol("graphql:field"),M=Symbol("graphql:args");function A(w){return(J)=>{let U={target:J,name:w||J.name};Reflect.defineMetadata(F,U,J)}}function S(w,J){return H("query",w,J)}function _(w,J){return H("mutation",w,J)}function v(w,J){return H("subscription",w,J)}function H(w,J,U){return($,W)=>{let X={target:$.constructor,propertyKey:W,type:w,name:J||W,description:U?.description,deprecated:U?.deprecated,deprecationReason:U?.deprecationReason},Z=Reflect.getMetadata(V,$.constructor)||[];Z.push(X),Reflect.defineMetadata(V,Z,$.constructor),Reflect.defineMetadata(V,X,$,W)}}function Q(w,J,U){return($,W,X)=>{if(!W)return;let Z=Reflect.getMetadata(M,$,W)||[],B={index:X,name:w,schema:J,description:U?.description,defaultValue:U?.defaultValue,nullable:U?.nullable};Z[X]=B,Reflect.defineMetadata(M,Z,$,W)}}function G(){return(w,J,U)=>{if(!J)return;let $=Reflect.getMetadata(M,w,J)||[],W={index:U,name:"__context__",nullable:!1};$[U]=W,Reflect.defineMetadata(M,$,w,J)}}function K(w){return Reflect.getMetadata(F,w)}function L(w){return Reflect.getMetadata(V,w)||[]}function T(w,J){return Reflect.getMetadata(V,w,J)}function I(w,J){return Reflect.getMetadata(M,w,J)||[]}function u(w){return Reflect.hasMetadata(F,w)}function h(w,J){return Reflect.hasMetadata(V,w,J)}function j(w){let J=w._def.typeName;if(J==="ZodString")return"String";if(J==="ZodNumber"){if(w._def.checks?.some(($)=>$.kind==="int"))return"Int";return"Float"}if(J==="ZodBoolean")return"Boolean";if(J==="ZodArray")return`[${j(w._def.type)}]`;if(J==="ZodObject")return"JSON";if(J==="ZodOptional")return j(w._def.innerType);if(J==="ZodNullable")return j(w._def.innerType);if(J==="ZodDefault")return j(w._def.innerType);if(J==="ZodEnum")return"String";if(J==="ZodUnion"){let U=w._def.options;if(U&&U.length>0)return j(U[0])}if(J==="ZodLiteral"){let U=w._def.value;if(typeof U==="string")return"String";if(typeof U==="number")return"Float";if(typeof U==="boolean")return"Boolean"}if(J==="ZodDate")return"String";return"String"}function q(w){let J=w._def.typeName;if(J==="ZodOptional"||J==="ZodNullable")return!0;if(J==="ZodDefault")return q(w._def.innerType);return!1}function Y(w){let J=w._def.typeName;if(J==="ZodDefault")return w._def.defaultValue();if(J==="ZodOptional"||J==="ZodNullable"){let U=w._def.innerType;if(U)return Y(U)}return}function m(w,J){if(J._def.typeName!=="ZodObject")throw Error("Schema must be a ZodObject");let $=J._def.shape(),W=[];for(let[X,Z]of Object.entries($)){let B=Z,k=j(B),C=q(B)?k:`${k}!`;W.push(` ${X}: ${C}`)}return`type ${w} {
3
- ${W.join(`
4
- `)}
5
- }`}function g(w,J){if(J._def.typeName!=="ZodObject")throw Error("Schema must be a ZodObject");let $=J._def.shape(),W=[];for(let[X,Z]of Object.entries($)){let B=Z,k=j(B),O=q(B),C=Y(B),N=O?k:`${k}!`;if(C!==void 0){let b=JSON.stringify(C);N+=` = ${b}`}W.push(` ${X}: ${N}`)}return`input ${w} {
6
- ${W.join(`
7
- `)}
8
- }`}class P{metadata;container;validationEngine;customTypes=new Map;constructor(w,J){this.metadata=w;this.container=J;this.validationEngine=new x}build(){let w=this.metadata.getGraphQLResolvers(),J=[],U=[],$=[],W=[];for(let B of w){let k=this.metadata.getGraphQLFieldsByResolver(B.target);for(let O of k){let C=this.buildFieldDefinition(O);switch(O.type){case"query":J.push(C);break;case"mutation":U.push(C);break;case"subscription":$.push(C);break}}}let X="";if(this.customTypes.size>0)X+=Array.from(this.customTypes.values()).join(`
9
-
10
- `)+`
11
-
12
- `;if(J.length>0)X+=`type Query {
13
- `,X+=J.map((B)=>` ${B}`).join(`
14
- `),X+=`
15
- }
16
-
17
- `;if(U.length>0)X+=`type Mutation {
18
- `,X+=U.map((B)=>` ${B}`).join(`
19
- `),X+=`
20
- }
21
-
22
- `;if($.length>0)X+=`type Subscription {
23
- `,X+=$.map((B)=>` ${B}`).join(`
24
- `),X+=`
25
- }
26
- `;let Z=this.buildResolvers();return{typeDefs:X.trim(),resolvers:Z}}buildFieldDefinition(w){let J=I(w.target.prototype,w.propertyKey),U=[];for(let Z of J){if(Z.name==="__context__")continue;let B="String";if(Z.schema){if(B=j(Z.schema),!q(Z.schema)&&!Z.nullable)B+="!"}let k=`${Z.name}: ${B}`;if(Z.defaultValue!==void 0)k+=` = ${JSON.stringify(Z.defaultValue)}`;U.push(k)}let $=U.length>0?`(${U.join(", ")})`:"",W="String",X=`${w.name}${$}: ${W}`;if(w.deprecated){let Z=w.deprecationReason||"No longer supported";X+=` @deprecated(reason: "${Z}")`}return X}buildResolvers(){let w=this.metadata.getGraphQLResolvers(),J={Query:{},Mutation:{},Subscription:{}};for(let U of w){let $=this.metadata.getGraphQLFieldsByResolver(U.target);for(let W of $){let X=this.createResolverFunction(U.target,W);switch(W.type){case"query":J.Query[W.name]=X;break;case"mutation":J.Mutation[W.name]=X;break;case"subscription":J.Subscription[W.name]=X;break}}}return J}createResolverFunction(w,J){return async(U,$,W,X)=>{try{let Z=I(w.prototype,J.propertyKey),B=[];for(let C of Z)if(C.name==="__context__")B[C.index]=W;else{let N=$[C.name];if(N===void 0&&C.defaultValue!==void 0)N=C.defaultValue;if(C.schema)N=await this.validationEngine.validate(N,C.schema);B[C.index]=N}return await(await this.container.resolve(w,{scope:"request",context:W.request}))[J.propertyKey](...B)}catch(Z){throw Z}}}}class E{name="graphql";version="1.0.0";options;schema;constructor(w){this.options={path:w?.path||"/graphql",playgroundPath:w?.playgroundPath||"/graphql/playground",playground:w?.playground!==!1,context:w?.context||((J)=>({request:J}))}}async install(w){let J=w.getMetadata(),U=w.getContainer(),$=new P(J,U);if(this.schema=$.build(),w.post(this.options.path,{handler:async(W)=>{return this.handleGraphQLRequest(W)},docs:{summary:"GraphQL endpoint",description:"Execute GraphQL queries and mutations",tags:["GraphQL"]}}),w.get(this.options.path,{handler:async(W)=>{let X=W.req.query("query"),Z=W.req.query("variables"),B=W.req.query("operationName");if(!X)return W.json({error:"Query parameter is required"},400);return this.executeGraphQL(W,{query:X,variables:Z?JSON.parse(Z):void 0,operationName:B})},docs:{summary:"GraphQL endpoint (GET)",description:"Execute GraphQL queries via GET request",tags:["GraphQL"]}}),this.options.playground)w.get(this.options.playgroundPath,{handler:async(W)=>{return W.html(this.renderPlayground())},docs:{summary:"GraphQL Playground",description:"Interactive GraphQL IDE",tags:["GraphQL"]}})}async handleGraphQLRequest(w){try{let J=await w.req.json();return this.executeGraphQL(w,J)}catch(J){return w.json({errors:[{message:"Invalid JSON in request body",extensions:{code:"BAD_REQUEST"}}]},400)}}async executeGraphQL(w,J){if(!this.schema)return w.json({errors:[{message:"GraphQL schema not initialized",extensions:{code:"INTERNAL_SERVER_ERROR"}}]},500);try{let{query:U,variables:$,operationName:W}=J,X=await this.options.context(w),Z=await this.executeOperation(U,$,X,W);return w.json(Z)}catch(U){return w.json({errors:[{message:U.message||"Internal server error",extensions:{code:"INTERNAL_SERVER_ERROR",...{stack:U.stack}}}]},500)}}async executeOperation(w,J,U,$){return{data:null,errors:[{message:"GraphQL execution not fully implemented. Use a GraphQL library like graphql-js for full support.",extensions:{code:"NOT_IMPLEMENTED"}}]}}renderPlayground(){return`
27
- <!DOCTYPE html>
28
- <html lang="en">
29
- <head>
30
- <meta charset="UTF-8">
31
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
32
- <title>GraphQL Playground</title>
33
- <link rel="stylesheet" href="https://unpkg.com/graphql-playground-react/build/static/css/index.css" />
34
- <link rel="shortcut icon" href="https://unpkg.com/graphql-playground-react/build/favicon.png" />
35
- <script src="https://unpkg.com/graphql-playground-react/build/static/js/middleware.js"></script>
36
- <style>
37
- body {
38
- margin: 0;
39
- padding: 0;
40
- font-family: 'Open Sans', sans-serif;
41
- overflow: hidden;
42
- }
43
- #root {
44
- height: 100vh;
45
- }
46
- </style>
47
- </head>
48
- <body>
49
- <div id="root"></div>
50
- <script>
51
- window.addEventListener('load', function (event) {
52
- GraphQLPlayground.init(document.getElementById('root'), {
53
- endpoint: '${this.options.path}',
54
- settings: {
55
- 'editor.theme': 'light',
56
- 'editor.cursorShape': 'line',
57
- 'editor.reuseHeaders': true,
58
- 'tracing.hideTracingResponse': true,
59
- 'queryPlan.hideQueryPlanResponse': true,
60
- 'editor.fontSize': 14,
61
- 'editor.fontFamily': "'Source Code Pro', 'Consolas', 'Inconsolata', 'Droid Sans Mono', 'Monaco', monospace",
62
- 'request.credentials': 'include'
63
- }
64
- })
65
- })
66
- </script>
67
- </body>
68
- </html>
69
- `.trim()}getSchema(){return this.schema}}
70
- export{A as ya,S as za,_ as Aa,v as Ba,Q as Ca,G as Da,K as Ea,L as Fa,T as Ga,I as Ha,u as Ia,h as Ja,j as Ka,q as La,Y as Ma,m as Na,g as Oa,P as Pa,E as Qa};
71
-
72
- //# debugId=FAC478707AFD860464756E2164756E21
@@ -1,13 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["..\\..\\src\\decorators\\graphql.ts", "..\\..\\src\\graphql\\zod-to-graphql.ts", "..\\..\\src\\graphql\\schema-builder.ts", "..\\..\\src\\graphql\\plugin.ts"],
4
- "sourcesContent": [
5
- "// GraphQL decorators for Veloce-TS\r\nimport 'reflect-metadata';\r\nimport type { ZodSchema } from 'zod';\r\nimport type {\r\n GraphQLResolverMetadata,\r\n GraphQLFieldMetadata,\r\n GraphQLArgumentMetadata,\r\n GraphQLOperationType\r\n} from '../types';\r\n\r\n// Metadata keys for reflect-metadata\r\nconst GRAPHQL_RESOLVER_KEY = Symbol('graphql:resolver');\r\nconst GRAPHQL_FIELD_KEY = Symbol('graphql:field');\r\nconst GRAPHQL_ARGS_KEY = Symbol('graphql:args');\r\n\r\n/**\r\n * @Resolver decorator - Marks a class as a GraphQL resolver\r\n * \r\n * @example\r\n * ```typescript\r\n * @Resolver()\r\n * class UserResolver {\r\n * @Query()\r\n * async getUser(@Arg('id', z.string()) id: string) {\r\n * return { id, name: 'John' };\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport function Resolver(name?: string): ClassDecorator {\r\n return (target: any) => {\r\n const metadata: GraphQLResolverMetadata = {\r\n target,\r\n name: name || target.name\r\n };\r\n\r\n Reflect.defineMetadata(GRAPHQL_RESOLVER_KEY, metadata, target);\r\n };\r\n}\r\n\r\n/**\r\n * @GQLQuery decorator - Marks a method as a GraphQL query\r\n * \r\n * @example\r\n * ```typescript\r\n * @GQLQuery()\r\n * async getUser(@Arg('id', z.string()) id: string) {\r\n * return { id, name: 'John' };\r\n * }\r\n * ```\r\n */\r\nexport function GQLQuery(name?: string, options?: {\r\n description?: string;\r\n deprecated?: boolean;\r\n deprecationReason?: string;\r\n}): MethodDecorator {\r\n return createFieldDecorator('query', name, options);\r\n}\r\n\r\n// Alias for convenience\r\nexport { GQLQuery as GraphQLQuery };\r\n\r\n/**\r\n * @GQLMutation decorator - Marks a method as a GraphQL mutation\r\n * \r\n * @example\r\n * ```typescript\r\n * @GQLMutation()\r\n * async createUser(@Arg('input', CreateUserSchema) input: CreateUserInput) {\r\n * return { id: '1', ...input };\r\n * }\r\n * ```\r\n */\r\nexport function GQLMutation(name?: string, options?: {\r\n description?: string;\r\n deprecated?: boolean;\r\n deprecationReason?: string;\r\n}): MethodDecorator {\r\n return createFieldDecorator('mutation', name, options);\r\n}\r\n\r\n// Alias for convenience\r\nexport { GQLMutation as GraphQLMutation };\r\nexport { GQLMutation as Mutation };\r\n\r\n/**\r\n * @GQLSubscription decorator - Marks a method as a GraphQL subscription\r\n * \r\n * @example\r\n * ```typescript\r\n * @GQLSubscription()\r\n * async onUserCreated() {\r\n * return pubsub.asyncIterator('USER_CREATED');\r\n * }\r\n * ```\r\n */\r\nexport function GQLSubscription(name?: string, options?: {\r\n description?: string;\r\n deprecated?: boolean;\r\n deprecationReason?: string;\r\n}): MethodDecorator {\r\n return createFieldDecorator('subscription', name, options);\r\n}\r\n\r\n// Alias for convenience\r\nexport { GQLSubscription as GraphQLSubscription };\r\nexport { GQLSubscription as Subscription };\r\n\r\n/**\r\n * Helper function to create field decorators\r\n */\r\nfunction createFieldDecorator(\r\n type: GraphQLOperationType,\r\n name?: string,\r\n options?: {\r\n description?: string;\r\n deprecated?: boolean;\r\n deprecationReason?: string;\r\n }\r\n): MethodDecorator {\r\n return (target: any, propertyKey: string | symbol) => {\r\n const metadata: GraphQLFieldMetadata = {\r\n target: target.constructor,\r\n propertyKey: propertyKey as string,\r\n type,\r\n name: name || (propertyKey as string),\r\n description: options?.description,\r\n deprecated: options?.deprecated,\r\n deprecationReason: options?.deprecationReason\r\n };\r\n\r\n // Store field metadata\r\n const existingFields = Reflect.getMetadata(GRAPHQL_FIELD_KEY, target.constructor) || [];\r\n existingFields.push(metadata);\r\n Reflect.defineMetadata(GRAPHQL_FIELD_KEY, existingFields, target.constructor);\r\n\r\n // Also store on the method itself for easy access\r\n Reflect.defineMetadata(GRAPHQL_FIELD_KEY, metadata, target, propertyKey);\r\n };\r\n}\r\n\r\n/**\r\n * @Arg decorator - Marks a parameter as a GraphQL argument with validation\r\n * \r\n * @example\r\n * ```typescript\r\n * @Query()\r\n * async getUser(\r\n * @Arg('id', z.string().uuid()) id: string,\r\n * @Arg('includeProfile', z.boolean().optional()) includeProfile?: boolean\r\n * ) {\r\n * return { id, name: 'John' };\r\n * }\r\n * ```\r\n */\r\nexport function Arg<T extends ZodSchema>(\r\n name: string,\r\n schema?: T,\r\n options?: {\r\n description?: string;\r\n defaultValue?: any;\r\n nullable?: boolean;\r\n }\r\n): ParameterDecorator {\r\n return (target: any, propertyKey: string | symbol | undefined, parameterIndex: number) => {\r\n if (!propertyKey) return;\r\n \r\n const existingArgs = Reflect.getMetadata(GRAPHQL_ARGS_KEY, target, propertyKey) || [];\r\n\r\n const metadata: GraphQLArgumentMetadata = {\r\n index: parameterIndex,\r\n name,\r\n schema,\r\n description: options?.description,\r\n defaultValue: options?.defaultValue,\r\n nullable: options?.nullable\r\n };\r\n\r\n existingArgs[parameterIndex] = metadata;\r\n Reflect.defineMetadata(GRAPHQL_ARGS_KEY, existingArgs, target, propertyKey);\r\n };\r\n}\r\n\r\n/**\r\n * @GQLContext decorator - Injects GraphQL context into a parameter\r\n * \r\n * @example\r\n * ```typescript\r\n * @GQLQuery()\r\n * async getCurrentUser(@GQLContext() ctx: GraphQLContext) {\r\n * return ctx.user;\r\n * }\r\n * ```\r\n */\r\nexport function GQLContext(): ParameterDecorator {\r\n return (target: any, propertyKey: string | symbol | undefined, parameterIndex: number) => {\r\n if (!propertyKey) return;\r\n \r\n const existingArgs = Reflect.getMetadata(GRAPHQL_ARGS_KEY, target, propertyKey) || [];\r\n\r\n const metadata: GraphQLArgumentMetadata = {\r\n index: parameterIndex,\r\n name: '__context__', // Special marker for context injection\r\n nullable: false\r\n };\r\n\r\n existingArgs[parameterIndex] = metadata;\r\n Reflect.defineMetadata(GRAPHQL_ARGS_KEY, existingArgs, target, propertyKey);\r\n };\r\n}\r\n\r\n// Alias for convenience (note: GraphQLContext type is exported from graphql module)\r\nexport { GQLContext as GraphQLCtx };\r\n\r\n// ============================================================================\r\n// Helper functions to retrieve metadata\r\n// ============================================================================\r\n\r\n/**\r\n * Get resolver metadata from a class\r\n */\r\nexport function getResolverMetadata(target: any): GraphQLResolverMetadata | undefined {\r\n return Reflect.getMetadata(GRAPHQL_RESOLVER_KEY, target);\r\n}\r\n\r\n/**\r\n * Get all field metadata from a resolver class\r\n */\r\nexport function getFieldsMetadata(target: any): GraphQLFieldMetadata[] {\r\n return Reflect.getMetadata(GRAPHQL_FIELD_KEY, target) || [];\r\n}\r\n\r\n/**\r\n * Get field metadata from a specific method\r\n */\r\nexport function getFieldMetadata(target: any, propertyKey: string): GraphQLFieldMetadata | undefined {\r\n return Reflect.getMetadata(GRAPHQL_FIELD_KEY, target, propertyKey);\r\n}\r\n\r\n/**\r\n * Get argument metadata from a method\r\n */\r\nexport function getArgumentsMetadata(target: any, propertyKey: string): GraphQLArgumentMetadata[] {\r\n return Reflect.getMetadata(GRAPHQL_ARGS_KEY, target, propertyKey) || [];\r\n}\r\n\r\n/**\r\n * Check if a class has resolver metadata\r\n */\r\nexport function hasResolverMetadata(target: any): boolean {\r\n return Reflect.hasMetadata(GRAPHQL_RESOLVER_KEY, target);\r\n}\r\n\r\n/**\r\n * Check if a method has field metadata\r\n */\r\nexport function hasFieldMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(GRAPHQL_FIELD_KEY, target, propertyKey);\r\n}\r\n",
6
- "// Convert Zod schemas to GraphQL types\r\nimport type { ZodSchema, ZodTypeAny } from 'zod';\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * Convert a Zod schema to a GraphQL type string\r\n */\r\nexport function zodToGraphQLType(schema: ZodSchema): string {\r\n const zodType = (schema as any)._def.typeName;\r\n\r\n // Handle ZodString\r\n if (zodType === 'ZodString') {\r\n return 'String';\r\n }\r\n\r\n // Handle ZodNumber\r\n if (zodType === 'ZodNumber') {\r\n const def = (schema as any)._def;\r\n if (def.checks?.some((check: any) => check.kind === 'int')) {\r\n return 'Int';\r\n }\r\n return 'Float';\r\n }\r\n\r\n // Handle ZodBoolean\r\n if (zodType === 'ZodBoolean') {\r\n return 'Boolean';\r\n }\r\n\r\n // Handle ZodArray\r\n if (zodType === 'ZodArray') {\r\n const elementType = zodToGraphQLType((schema as any)._def.type);\r\n return `[${elementType}]`;\r\n }\r\n\r\n // Handle ZodObject\r\n if (zodType === 'ZodObject') {\r\n // For objects, we'll need to generate a custom type\r\n // Return a placeholder that will be replaced with the actual type name\r\n return 'JSON'; // GraphQL scalar for generic objects\r\n }\r\n\r\n // Handle ZodOptional\r\n if (zodType === 'ZodOptional') {\r\n return zodToGraphQLType((schema as any)._def.innerType);\r\n }\r\n\r\n // Handle ZodNullable\r\n if (zodType === 'ZodNullable') {\r\n return zodToGraphQLType((schema as any)._def.innerType);\r\n }\r\n\r\n // Handle ZodDefault\r\n if (zodType === 'ZodDefault') {\r\n return zodToGraphQLType((schema as any)._def.innerType);\r\n }\r\n\r\n // Handle ZodEnum\r\n if (zodType === 'ZodEnum') {\r\n // For enums, we'll need to generate a custom enum type\r\n return 'String'; // Fallback to String\r\n }\r\n\r\n // Handle ZodUnion\r\n if (zodType === 'ZodUnion') {\r\n // GraphQL doesn't support unions of scalars directly\r\n // We'll use the first option as fallback\r\n const options = (schema as any)._def.options;\r\n if (options && options.length > 0) {\r\n return zodToGraphQLType(options[0]);\r\n }\r\n }\r\n\r\n // Handle ZodLiteral\r\n if (zodType === 'ZodLiteral') {\r\n const value = (schema as any)._def.value;\r\n if (typeof value === 'string') return 'String';\r\n if (typeof value === 'number') return 'Float';\r\n if (typeof value === 'boolean') return 'Boolean';\r\n }\r\n\r\n // Handle ZodDate\r\n if (zodType === 'ZodDate') {\r\n return 'String'; // ISO date string\r\n }\r\n\r\n // Default fallback\r\n return 'String';\r\n}\r\n\r\n/**\r\n * Check if a Zod schema is nullable/optional\r\n */\r\nexport function isNullable(schema: ZodSchema): boolean {\r\n const zodType = (schema as any)._def.typeName;\r\n \r\n if (zodType === 'ZodOptional' || zodType === 'ZodNullable') {\r\n return true;\r\n }\r\n\r\n if (zodType === 'ZodDefault') {\r\n return isNullable((schema as any)._def.innerType);\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Get the default value from a Zod schema\r\n */\r\nexport function getDefaultValue(schema: ZodSchema): any {\r\n const zodType = (schema as any)._def.typeName;\r\n\r\n if (zodType === 'ZodDefault') {\r\n return (schema as any)._def.defaultValue();\r\n }\r\n\r\n if (zodType === 'ZodOptional' || zodType === 'ZodNullable') {\r\n const innerType = (schema as any)._def.innerType;\r\n if (innerType) {\r\n return getDefaultValue(innerType);\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Generate GraphQL object type definition from Zod object schema\r\n */\r\nexport function zodObjectToGraphQLType(name: string, schema: ZodSchema): string {\r\n const zodType = (schema as any)._def.typeName;\r\n\r\n if (zodType !== 'ZodObject') {\r\n throw new Error('Schema must be a ZodObject');\r\n }\r\n\r\n const shape = (schema as any)._def.shape();\r\n const fields: string[] = [];\r\n\r\n for (const [key, value] of Object.entries(shape)) {\r\n const fieldSchema = value as ZodTypeAny;\r\n const fieldType = zodToGraphQLType(fieldSchema);\r\n const nullable = isNullable(fieldSchema);\r\n const typeString = nullable ? fieldType : `${fieldType}!`;\r\n fields.push(` ${key}: ${typeString}`);\r\n }\r\n\r\n return `type ${name} {\\n${fields.join('\\n')}\\n}`;\r\n}\r\n\r\n/**\r\n * Generate GraphQL input type definition from Zod object schema\r\n */\r\nexport function zodObjectToGraphQLInput(name: string, schema: ZodSchema): string {\r\n const zodType = (schema as any)._def.typeName;\r\n\r\n if (zodType !== 'ZodObject') {\r\n throw new Error('Schema must be a ZodObject');\r\n }\r\n\r\n const shape = (schema as any)._def.shape();\r\n const fields: string[] = [];\r\n\r\n for (const [key, value] of Object.entries(shape)) {\r\n const fieldSchema = value as ZodTypeAny;\r\n const fieldType = zodToGraphQLType(fieldSchema);\r\n const nullable = isNullable(fieldSchema);\r\n const defaultValue = getDefaultValue(fieldSchema);\r\n \r\n let typeString = nullable ? fieldType : `${fieldType}!`;\r\n \r\n if (defaultValue !== undefined) {\r\n const defaultStr = JSON.stringify(defaultValue);\r\n typeString += ` = ${defaultStr}`;\r\n }\r\n \r\n fields.push(` ${key}: ${typeString}`);\r\n }\r\n\r\n return `input ${name} {\\n${fields.join('\\n')}\\n}`;\r\n}\r\n",
7
- "// GraphQL Schema Builder for Veloce-TS\r\nimport type { MetadataRegistry } from '../core/metadata';\r\nimport type { DIContainer } from '../dependencies/container';\r\nimport type { GraphQLFieldMetadata, GraphQLArgumentMetadata, Context } from '../types';\r\nimport { getArgumentsMetadata } from '../decorators/graphql';\r\nimport { zodToGraphQLType, isNullable } from './zod-to-graphql';\r\nimport { ValidationEngine } from '../validation/validator';\r\n\r\n/**\r\n * GraphQL Schema Builder\r\n * Generates GraphQL schema from decorator metadata\r\n */\r\nexport class GraphQLSchemaBuilder {\r\n private validationEngine: ValidationEngine;\r\n private customTypes: Map<string, string> = new Map();\r\n\r\n constructor(\r\n private metadata: MetadataRegistry,\r\n private container: DIContainer\r\n ) {\r\n this.validationEngine = new ValidationEngine();\r\n }\r\n\r\n /**\r\n * Build the complete GraphQL schema\r\n */\r\n build(): GraphQLSchemaDefinition {\r\n const resolvers = this.metadata.getGraphQLResolvers();\r\n \r\n const queries: string[] = [];\r\n const mutations: string[] = [];\r\n const subscriptions: string[] = [];\r\n const types: string[] = [];\r\n\r\n // Process each resolver\r\n for (const resolver of resolvers) {\r\n const fields = this.metadata.getGraphQLFieldsByResolver(resolver.target);\r\n\r\n for (const field of fields) {\r\n const fieldDef = this.buildFieldDefinition(field);\r\n\r\n switch (field.type) {\r\n case 'query':\r\n queries.push(fieldDef);\r\n break;\r\n case 'mutation':\r\n mutations.push(fieldDef);\r\n break;\r\n case 'subscription':\r\n subscriptions.push(fieldDef);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Build type definitions\r\n let typeDefs = '';\r\n\r\n // Add custom types\r\n if (this.customTypes.size > 0) {\r\n typeDefs += Array.from(this.customTypes.values()).join('\\n\\n') + '\\n\\n';\r\n }\r\n\r\n // Add Query type\r\n if (queries.length > 0) {\r\n typeDefs += 'type Query {\\n';\r\n typeDefs += queries.map(q => ` ${q}`).join('\\n');\r\n typeDefs += '\\n}\\n\\n';\r\n }\r\n\r\n // Add Mutation type\r\n if (mutations.length > 0) {\r\n typeDefs += 'type Mutation {\\n';\r\n typeDefs += mutations.map(m => ` ${m}`).join('\\n');\r\n typeDefs += '\\n}\\n\\n';\r\n }\r\n\r\n // Add Subscription type\r\n if (subscriptions.length > 0) {\r\n typeDefs += 'type Subscription {\\n';\r\n typeDefs += subscriptions.map(s => ` ${s}`).join('\\n');\r\n typeDefs += '\\n}\\n';\r\n }\r\n\r\n // Build resolvers object\r\n const resolversObj = this.buildResolvers();\r\n\r\n return {\r\n typeDefs: typeDefs.trim(),\r\n resolvers: resolversObj\r\n };\r\n }\r\n\r\n /**\r\n * Build a field definition string\r\n */\r\n private buildFieldDefinition(field: GraphQLFieldMetadata): string {\r\n const args = getArgumentsMetadata(field.target.prototype, field.propertyKey);\r\n const argStrings: string[] = [];\r\n\r\n // Build arguments\r\n for (const arg of args) {\r\n if (arg.name === '__context__') continue; // Skip context injection\r\n\r\n let argType = 'String'; // Default type\r\n \r\n if (arg.schema) {\r\n argType = zodToGraphQLType(arg.schema);\r\n const nullable = isNullable(arg.schema);\r\n if (!nullable && !arg.nullable) {\r\n argType += '!';\r\n }\r\n }\r\n\r\n let argStr = `${arg.name}: ${argType}`;\r\n \r\n if (arg.defaultValue !== undefined) {\r\n argStr += ` = ${JSON.stringify(arg.defaultValue)}`;\r\n }\r\n\r\n argStrings.push(argStr);\r\n }\r\n\r\n const argsStr = argStrings.length > 0 ? `(${argStrings.join(', ')})` : '';\r\n \r\n // For now, default return type to String (can be enhanced with type inference)\r\n const returnType = 'String';\r\n\r\n let fieldStr = `${field.name}${argsStr}: ${returnType}`;\r\n\r\n // Add deprecation\r\n if (field.deprecated) {\r\n const reason = field.deprecationReason || 'No longer supported';\r\n fieldStr += ` @deprecated(reason: \"${reason}\")`;\r\n }\r\n\r\n return fieldStr;\r\n }\r\n\r\n /**\r\n * Build resolvers object with validation and DI\r\n */\r\n private buildResolvers(): GraphQLResolvers {\r\n const resolvers = this.metadata.getGraphQLResolvers();\r\n const resolversObj: GraphQLResolvers = {\r\n Query: {},\r\n Mutation: {},\r\n Subscription: {}\r\n };\r\n\r\n for (const resolver of resolvers) {\r\n const fields = this.metadata.getGraphQLFieldsByResolver(resolver.target);\r\n\r\n for (const field of fields) {\r\n const resolverFn = this.createResolverFunction(resolver.target, field);\r\n\r\n switch (field.type) {\r\n case 'query':\r\n resolversObj.Query![field.name!] = resolverFn;\r\n break;\r\n case 'mutation':\r\n resolversObj.Mutation![field.name!] = resolverFn;\r\n break;\r\n case 'subscription':\r\n resolversObj.Subscription![field.name!] = resolverFn;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return resolversObj;\r\n }\r\n\r\n /**\r\n * Create a resolver function with validation and DI\r\n */\r\n private createResolverFunction(\r\n target: any,\r\n field: GraphQLFieldMetadata\r\n ): GraphQLResolverFn {\r\n return async (parent: any, args: any, context: GraphQLContext, info: any) => {\r\n try {\r\n // Get argument metadata\r\n const argsMetadata = getArgumentsMetadata(target.prototype, field.propertyKey);\r\n const resolvedArgs: any[] = [];\r\n\r\n // Validate and resolve arguments\r\n for (const argMeta of argsMetadata) {\r\n if (argMeta.name === '__context__') {\r\n // Inject context\r\n resolvedArgs[argMeta.index] = context;\r\n } else {\r\n let value = args[argMeta.name];\r\n\r\n // Apply default value if not provided\r\n if (value === undefined && argMeta.defaultValue !== undefined) {\r\n value = argMeta.defaultValue;\r\n }\r\n\r\n // Validate with Zod schema\r\n if (argMeta.schema) {\r\n value = await this.validationEngine.validate(value, argMeta.schema);\r\n }\r\n\r\n resolvedArgs[argMeta.index] = value;\r\n }\r\n }\r\n\r\n // Resolve the resolver instance (with DI support)\r\n const instance: any = await this.container.resolve(target, {\r\n scope: 'request',\r\n context: context.request\r\n });\r\n\r\n // Execute the resolver method\r\n const result = await instance[field.propertyKey](...resolvedArgs);\r\n\r\n return result;\r\n } catch (error) {\r\n // Re-throw for GraphQL error handling\r\n throw error;\r\n }\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface GraphQLSchemaDefinition {\r\n typeDefs: string;\r\n resolvers: GraphQLResolvers;\r\n}\r\n\r\nexport interface GraphQLResolvers {\r\n Query?: Record<string, GraphQLResolverFn>;\r\n Mutation?: Record<string, GraphQLResolverFn>;\r\n Subscription?: Record<string, GraphQLResolverFn>;\r\n}\r\n\r\nexport type GraphQLResolverFn = (\r\n parent: any,\r\n args: any,\r\n context: GraphQLContext,\r\n info: any\r\n) => any | Promise<any>;\r\n\r\nexport interface GraphQLContext {\r\n request: Context;\r\n user?: any;\r\n [key: string]: any;\r\n}\r\n",
8
- "// GraphQL Plugin - Enables GraphQL support for Veloce-TS\r\nimport type { Plugin } from '../core/plugin';\r\nimport type { VeloceTS } from '../core/application';\r\nimport { GraphQLSchemaBuilder } from './schema-builder';\r\nimport type { GraphQLContext } from './schema-builder';\r\n\r\n/**\r\n * GraphQL Plugin Options\r\n */\r\nexport interface GraphQLPluginOptions {\r\n /** Path to serve GraphQL endpoint (default: /graphql) */\r\n path?: string;\r\n \r\n /** Path to serve GraphQL Playground (default: /graphql/playground) */\r\n playgroundPath?: string;\r\n \r\n /** Enable GraphQL Playground in development (default: true) */\r\n playground?: boolean;\r\n \r\n /** Custom context factory function */\r\n context?: (request: any) => Promise<any> | any;\r\n}\r\n\r\n/**\r\n * GraphQLPlugin enables GraphQL support with decorators and Zod validation\r\n * \r\n * @example\r\n * ```typescript\r\n * const app = new VeloceTS();\r\n * app.usePlugin(new GraphQLPlugin({\r\n * path: '/graphql',\r\n * playground: true\r\n * }));\r\n * ```\r\n */\r\nexport class GraphQLPlugin implements Plugin {\r\n name = 'graphql';\r\n version = '1.0.0';\r\n\r\n private options: Required<GraphQLPluginOptions>;\r\n private schema?: { typeDefs: string; resolvers: any };\r\n\r\n constructor(options?: GraphQLPluginOptions) {\r\n this.options = {\r\n path: options?.path || '/graphql',\r\n playgroundPath: options?.playgroundPath || '/graphql/playground',\r\n playground: options?.playground !== false,\r\n context: options?.context || ((request: any) => ({ request }))\r\n };\r\n }\r\n\r\n async install(app: VeloceTS): Promise<void> {\r\n // Build GraphQL schema from metadata\r\n const metadata = app.getMetadata();\r\n const container = app.getContainer();\r\n \r\n const schemaBuilder = new GraphQLSchemaBuilder(metadata, container);\r\n this.schema = schemaBuilder.build();\r\n\r\n // Register GraphQL endpoint\r\n app.post(this.options.path, {\r\n handler: async (c) => {\r\n return this.handleGraphQLRequest(c);\r\n },\r\n docs: {\r\n summary: 'GraphQL endpoint',\r\n description: 'Execute GraphQL queries and mutations',\r\n tags: ['GraphQL']\r\n }\r\n });\r\n\r\n // Also support GET for queries (useful for GraphQL Playground)\r\n app.get(this.options.path, {\r\n handler: async (c) => {\r\n const query = c.req.query('query');\r\n const variables = c.req.query('variables');\r\n const operationName = c.req.query('operationName');\r\n\r\n if (!query) {\r\n return c.json({ error: 'Query parameter is required' }, 400);\r\n }\r\n\r\n return this.executeGraphQL(c, {\r\n query,\r\n variables: variables ? JSON.parse(variables) : undefined,\r\n operationName\r\n });\r\n },\r\n docs: {\r\n summary: 'GraphQL endpoint (GET)',\r\n description: 'Execute GraphQL queries via GET request',\r\n tags: ['GraphQL']\r\n }\r\n });\r\n\r\n // Register GraphQL Playground endpoint if enabled\r\n if (this.options.playground) {\r\n app.get(this.options.playgroundPath, {\r\n handler: async (c) => {\r\n return c.html(this.renderPlayground());\r\n },\r\n docs: {\r\n summary: 'GraphQL Playground',\r\n description: 'Interactive GraphQL IDE',\r\n tags: ['GraphQL']\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle GraphQL POST request\r\n */\r\n private async handleGraphQLRequest(c: any) {\r\n try {\r\n const body = await c.req.json();\r\n return this.executeGraphQL(c, body);\r\n } catch (error) {\r\n return c.json({\r\n errors: [{\r\n message: 'Invalid JSON in request body',\r\n extensions: { code: 'BAD_REQUEST' }\r\n }]\r\n }, 400);\r\n }\r\n }\r\n\r\n /**\r\n * Execute a GraphQL operation\r\n */\r\n private async executeGraphQL(c: any, request: GraphQLRequest) {\r\n if (!this.schema) {\r\n return c.json({\r\n errors: [{\r\n message: 'GraphQL schema not initialized',\r\n extensions: { code: 'INTERNAL_SERVER_ERROR' }\r\n }]\r\n }, 500);\r\n }\r\n\r\n try {\r\n // Parse the query (simple implementation - in production use graphql-js)\r\n const { query, variables, operationName } = request;\r\n\r\n // Create context\r\n const context: GraphQLContext = await this.options.context(c);\r\n\r\n // Execute the operation\r\n const result = await this.executeOperation(\r\n query,\r\n variables,\r\n context,\r\n operationName\r\n );\r\n\r\n return c.json(result);\r\n } catch (error: any) {\r\n return c.json({\r\n errors: [{\r\n message: error.message || 'Internal server error',\r\n extensions: {\r\n code: 'INTERNAL_SERVER_ERROR',\r\n ...(process.env.NODE_ENV === 'development' && { stack: error.stack })\r\n }\r\n }]\r\n }, 500);\r\n }\r\n }\r\n\r\n /**\r\n * Execute a GraphQL operation (simplified implementation)\r\n * In production, this should use graphql-js or similar library\r\n */\r\n private async executeOperation(\r\n query: string,\r\n variables: any,\r\n context: GraphQLContext,\r\n operationName?: string\r\n ): Promise<GraphQLResponse> {\r\n // This is a simplified implementation\r\n // In a real implementation, you would use graphql-js to parse and execute\r\n \r\n // For now, return a placeholder response\r\n // The actual execution would happen through the resolvers we built\r\n return {\r\n data: null,\r\n errors: [{\r\n message: 'GraphQL execution not fully implemented. Use a GraphQL library like graphql-js for full support.',\r\n extensions: { code: 'NOT_IMPLEMENTED' }\r\n }]\r\n };\r\n }\r\n\r\n /**\r\n * Render GraphQL Playground HTML\r\n */\r\n private renderPlayground(): string {\r\n return `\r\n<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>GraphQL Playground</title>\r\n <link rel=\"stylesheet\" href=\"https://unpkg.com/graphql-playground-react/build/static/css/index.css\" />\r\n <link rel=\"shortcut icon\" href=\"https://unpkg.com/graphql-playground-react/build/favicon.png\" />\r\n <script src=\"https://unpkg.com/graphql-playground-react/build/static/js/middleware.js\"></script>\r\n <style>\r\n body {\r\n margin: 0;\r\n padding: 0;\r\n font-family: 'Open Sans', sans-serif;\r\n overflow: hidden;\r\n }\r\n #root {\r\n height: 100vh;\r\n }\r\n </style>\r\n</head>\r\n<body>\r\n <div id=\"root\"></div>\r\n <script>\r\n window.addEventListener('load', function (event) {\r\n GraphQLPlayground.init(document.getElementById('root'), {\r\n endpoint: '${this.options.path}',\r\n settings: {\r\n 'editor.theme': 'light',\r\n 'editor.cursorShape': 'line',\r\n 'editor.reuseHeaders': true,\r\n 'tracing.hideTracingResponse': true,\r\n 'queryPlan.hideQueryPlanResponse': true,\r\n 'editor.fontSize': 14,\r\n 'editor.fontFamily': \"'Source Code Pro', 'Consolas', 'Inconsolata', 'Droid Sans Mono', 'Monaco', monospace\",\r\n 'request.credentials': 'include'\r\n }\r\n })\r\n })\r\n </script>\r\n</body>\r\n</html>\r\n `.trim();\r\n }\r\n\r\n /**\r\n * Get the generated schema (useful for testing)\r\n */\r\n getSchema() {\r\n return this.schema;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\ninterface GraphQLRequest {\r\n query: string;\r\n variables?: Record<string, any>;\r\n operationName?: string;\r\n}\r\n\r\ninterface GraphQLResponse {\r\n data?: any;\r\n errors?: Array<{\r\n message: string;\r\n locations?: Array<{ line: number; column: number }>;\r\n path?: Array<string | number>;\r\n extensions?: Record<string, any>;\r\n }>;\r\n}\r\n"
9
- ],
10
- "mappings": "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",
11
- "debugId": "FAC478707AFD860464756E2164756E21",
12
- "names": []
13
- }
@@ -1,5 +0,0 @@
1
- // @bun
2
- import{Ra as C}from"./chunk-nyqav7az.js";import{ab as W}from"./chunk-keyvhe4h.js";var U=W(C(),1),J=Symbol("route:metadata"),Q=Symbol("controller:metadata"),w=Symbol("parameter:metadata"),B=Symbol("dependency:metadata"),V=Symbol("websocket:metadata"),L=Symbol("websocket:handler:metadata"),X=Symbol("graphql:resolver"),z=Symbol("graphql:field"),Z=Symbol("auth:metadata"),$=Symbol("oauth:metadata"),f=Symbol("roles:metadata"),h=Symbol("permissions:metadata"),F=Symbol("minimum-role:metadata"),H=Symbol("resource-permission:metadata"),k=Symbol("session:metadata"),l=Symbol("csrf:metadata");class P{routes=new Map;controllers=new Map;routesByController=new Map;websockets=new Map;graphqlResolvers=new Map;graphqlFields=new Map;registerRoute(b){let c=this.getRouteKey(b.target,b.propertyKey);if(this.routes.set(c,b),!this.routesByController.has(b.target))this.routesByController.set(b.target,[]);this.routesByController.get(b.target).push(b)}registerController(b,c){this.controllers.set(b,c)}getRoutes(){return Array.from(this.routes.values())}getRoute(b,c){let j=this.getRouteKey(b,c);return this.routes.get(j)}getRoutesByController(b){return this.routesByController.get(b)||[]}getController(b){return this.controllers.get(b)}getControllers(){return new Map(this.controllers)}registerWebSocket(b){this.websockets.set(b.target,b)}getWebSockets(){return Array.from(this.websockets.values())}getWebSocket(b){return this.websockets.get(b)}registerGraphQLResolver(b){this.graphqlResolvers.set(b.target,b)}registerGraphQLField(b){let c=this.getRouteKey(b.target,b.propertyKey);this.graphqlFields.set(c,b)}getGraphQLResolvers(){return Array.from(this.graphqlResolvers.values())}getGraphQLResolver(b){return this.graphqlResolvers.get(b)}getGraphQLFields(){return Array.from(this.graphqlFields.values())}getGraphQLFieldsByResolver(b){return Array.from(this.graphqlFields.values()).filter((c)=>c.target===b)}clear(){this.routes.clear(),this.controllers.clear(),this.routesByController.clear(),this.websockets.clear(),this.graphqlResolvers.clear(),this.graphqlFields.clear()}getRouteKey(b,c){return`${b.name}:${c}`}static defineRoute(b,c,j){let q=this.getRouteMetadata(b,c),v={...q,...j,target:b.constructor,propertyKey:c,middleware:[...q?.middleware||[],...j.middleware||[]],parameters:j.parameters||q?.parameters||[],dependencies:j.dependencies||q?.dependencies||[],responses:j.responses||q?.responses||[],auth:j.auth||q?.auth,oauth:j.oauth||q?.oauth,roles:j.roles||q?.roles,permissions:j.permissions||q?.permissions,minimumRole:j.minimumRole||q?.minimumRole,resourcePermission:j.resourcePermission||q?.resourcePermission,session:j.session||q?.session,csrf:j.csrf||q?.csrf};Reflect.defineMetadata(J,v,b,c)}static defineParameter(b,c,j,q){let v=this.getParameterMetadata(b,c)||[];v[j]=q,Reflect.defineMetadata(w,v,b,c);let G=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...G,parameters:v})}static defineDependency(b,c,j,q){let v=this.getDependencyMetadata(b,c)||[];v[j]=q,Reflect.defineMetadata(B,v,b,c);let G=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...G,dependencies:v})}static defineController(b,c){Reflect.defineMetadata(Q,c,b)}static getRouteMetadata(b,c){return Reflect.getMetadata(J,b,c)}static getParameterMetadata(b,c){return Reflect.getMetadata(w,b,c)}static getDependencyMetadata(b,c){return Reflect.getMetadata(B,b,c)}static getControllerMetadata(b){return Reflect.getMetadata(Q,b)}static hasControllerMetadata(b){return Reflect.hasMetadata(Q,b)}static hasRouteMetadata(b,c){return Reflect.hasMetadata(J,b,c)}static getRouteMethods(b){let c=b.prototype,j=[],q=Object.getOwnPropertyNames(c);for(let v of q){if(v==="constructor")continue;if(this.hasRouteMetadata(c,v))j.push(v)}return j}static defineWebSocket(b,c){let q={...this.getWebSocketMetadata(b),...c,target:b};Reflect.defineMetadata(V,q,b)}static defineWebSocketHandler(b,c,j){let q=this.getWebSocketMetadata(b.constructor)||{};switch(j.type){case"connect":q.onConnect=c;break;case"message":q.onMessage=c,q.messageSchema=j.schema;break;case"disconnect":q.onDisconnect=c;break}this.defineWebSocket(b.constructor,q),Reflect.defineMetadata(L,j,b,c)}static getWebSocketMetadata(b){return Reflect.getMetadata(V,b)}static getWebSocketHandlerMetadata(b,c){return Reflect.getMetadata(L,b,c)}static hasWebSocketMetadata(b){return Reflect.hasMetadata(V,b)}static defineGraphQLResolver(b,c){Reflect.defineMetadata(X,c,b)}static defineGraphQLField(b,c,j){Reflect.defineMetadata(z,j,b,c);let q=this.getGraphQLFieldsMetadata(b.constructor)||[];q.push(j),Reflect.defineMetadata(z,q,b.constructor)}static getGraphQLResolverMetadata(b){return Reflect.getMetadata(X,b)}static getGraphQLFieldsMetadata(b){return Reflect.getMetadata(z,b)||[]}static getGraphQLFieldMetadata(b,c){return Reflect.getMetadata(z,b,c)}static hasGraphQLResolverMetadata(b){return Reflect.hasMetadata(X,b)}static hasGraphQLFieldMetadata(b,c){return Reflect.hasMetadata(z,b,c)}static defineAuth(b,c,j){Reflect.defineMetadata(Z,j,b,c);let q=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...q,auth:j})}static getAuthMetadata(b,c){return Reflect.getMetadata(Z,b,c)}static hasAuthMetadata(b,c){return Reflect.hasMetadata(Z,b,c)}static defineOAuth(b,c,j){Reflect.defineMetadata($,j,b,c);let q=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...q,oauth:j})}static getOAuthMetadata(b,c){return Reflect.getMetadata($,b,c)}static hasOAuthMetadata(b,c){return Reflect.hasMetadata($,b,c)}static defineRoles(b,c,j){Reflect.defineMetadata(f,j,b,c);let q=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...q,roles:j})}static definePermissions(b,c,j){Reflect.defineMetadata(h,j,b,c);let q=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...q,permissions:j})}static defineMinimumRole(b,c,j){Reflect.defineMetadata(F,j,b,c);let q=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...q,minimumRole:j})}static getRolesMetadata(b,c){return Reflect.getMetadata(f,b,c)}static getPermissionsMetadata(b,c){return Reflect.getMetadata(h,b,c)}static getMinimumRoleMetadata(b,c){return Reflect.getMetadata(F,b,c)}static hasRolesMetadata(b,c){return Reflect.hasMetadata(f,b,c)}static hasPermissionsMetadata(b,c){return Reflect.hasMetadata(h,b,c)}static hasMinimumRoleMetadata(b,c){return Reflect.hasMetadata(F,b,c)}static defineResourcePermission(b,c,j){Reflect.defineMetadata(H,j,b,c);let q=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...q,resourcePermission:j})}static getResourcePermissionMetadata(b,c){return Reflect.getMetadata(H,b,c)}static hasResourcePermissionMetadata(b,c){return Reflect.hasMetadata(H,b,c)}static defineSession(b,c,j){Reflect.defineMetadata(k,j,b,c);let q=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...q,session:j})}static defineCSRF(b,c,j){Reflect.defineMetadata(l,j,b,c);let q=this.getRouteMetadata(b,c);this.defineRoute(b,c,{...q,csrf:j})}static getSessionMetadata(b,c){return Reflect.getMetadata(k,b,c)}static getCSRFMetadata(b,c){return Reflect.getMetadata(l,b,c)}static hasSessionMetadata(b,c){return Reflect.hasMetadata(k,b,c)}static hasCSRFMetadata(b,c){return Reflect.hasMetadata(l,b,c)}}
3
- export{P as ka};
4
-
5
- //# debugId=C6BDE8013CBE320564756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["..\\..\\src\\core\\metadata.ts"],
4
- "sourcesContent": [
5
- "// Metadata registry for storing decorator metadata\r\nimport 'reflect-metadata';\r\nimport type {\r\n RouteMetadata,\r\n ParameterMetadata,\r\n DependencyMetadata,\r\n ControllerMetadata,\r\n Class,\r\n HTTPMethod,\r\n Middleware,\r\n RouteDocumentation,\r\n ResponseMetadata,\r\n WebSocketMetadata,\r\n WebSocketHandlerMetadata,\r\n GraphQLResolverMetadata,\r\n GraphQLFieldMetadata,\r\n AuthMetadata\r\n} from '../types';\r\n\r\n// Metadata keys for reflect-metadata\r\nconst ROUTE_METADATA_KEY = Symbol('route:metadata');\r\nconst CONTROLLER_METADATA_KEY = Symbol('controller:metadata');\r\nconst PARAMETER_METADATA_KEY = Symbol('parameter:metadata');\r\nconst DEPENDENCY_METADATA_KEY = Symbol('dependency:metadata');\r\nconst WEBSOCKET_METADATA_KEY = Symbol('websocket:metadata');\r\nconst WEBSOCKET_HANDLER_METADATA_KEY = Symbol('websocket:handler:metadata');\r\nconst GRAPHQL_RESOLVER_KEY = Symbol('graphql:resolver');\r\nconst GRAPHQL_FIELD_KEY = Symbol('graphql:field');\r\nconst AUTH_METADATA_KEY = Symbol('auth:metadata');\r\nconst OAUTH_METADATA_KEY = Symbol('oauth:metadata');\r\nconst ROLES_METADATA_KEY = Symbol('roles:metadata');\r\nconst PERMISSIONS_METADATA_KEY = Symbol('permissions:metadata');\r\nconst MINIMUM_ROLE_METADATA_KEY = Symbol('minimum-role:metadata');\r\nconst RESOURCE_PERMISSION_METADATA_KEY = Symbol('resource-permission:metadata');\r\nconst SESSION_METADATA_KEY = Symbol('session:metadata');\r\nconst CSRF_METADATA_KEY = Symbol('csrf:metadata');\r\n\r\nexport class MetadataRegistry {\r\n private routes: Map<string, RouteMetadata> = new Map();\r\n private controllers: Map<Class, ControllerMetadata> = new Map();\r\n private routesByController: Map<Class, RouteMetadata[]> = new Map();\r\n private websockets: Map<Class, WebSocketMetadata> = new Map();\r\n private graphqlResolvers: Map<Class, GraphQLResolverMetadata> = new Map();\r\n private graphqlFields: Map<string, GraphQLFieldMetadata> = new Map();\r\n\r\n /**\r\n * Register a route in the registry\r\n */\r\n registerRoute(metadata: RouteMetadata): void {\r\n const key = this.getRouteKey(metadata.target, metadata.propertyKey);\r\n this.routes.set(key, metadata);\r\n\r\n // Also track routes by controller\r\n if (!this.routesByController.has(metadata.target)) {\r\n this.routesByController.set(metadata.target, []);\r\n }\r\n this.routesByController.get(metadata.target)!.push(metadata);\r\n }\r\n\r\n /**\r\n * Register a controller in the registry\r\n */\r\n registerController(target: Class, metadata: ControllerMetadata): void {\r\n this.controllers.set(target, metadata);\r\n }\r\n\r\n /**\r\n * Get all registered routes\r\n */\r\n getRoutes(): RouteMetadata[] {\r\n return Array.from(this.routes.values());\r\n }\r\n\r\n /**\r\n * Get a specific route by target and property key\r\n */\r\n getRoute(target: Class, propertyKey: string): RouteMetadata | undefined {\r\n const key = this.getRouteKey(target, propertyKey);\r\n return this.routes.get(key);\r\n }\r\n\r\n /**\r\n * Get all routes for a specific controller\r\n */\r\n getRoutesByController(target: Class): RouteMetadata[] {\r\n return this.routesByController.get(target) || [];\r\n }\r\n\r\n /**\r\n * Get controller metadata\r\n */\r\n getController(target: Class): ControllerMetadata | undefined {\r\n return this.controllers.get(target);\r\n }\r\n\r\n /**\r\n * Get all registered controllers\r\n */\r\n getControllers(): Map<Class, ControllerMetadata> {\r\n return new Map(this.controllers);\r\n }\r\n\r\n /**\r\n * Register a WebSocket handler in the registry\r\n */\r\n registerWebSocket(metadata: WebSocketMetadata): void {\r\n this.websockets.set(metadata.target, metadata);\r\n }\r\n\r\n /**\r\n * Get all registered WebSocket handlers\r\n */\r\n getWebSockets(): WebSocketMetadata[] {\r\n return Array.from(this.websockets.values());\r\n }\r\n\r\n /**\r\n * Get WebSocket metadata for a specific target\r\n */\r\n getWebSocket(target: Class): WebSocketMetadata | undefined {\r\n return this.websockets.get(target);\r\n }\r\n\r\n /**\r\n * Register a GraphQL resolver in the registry\r\n */\r\n registerGraphQLResolver(metadata: GraphQLResolverMetadata): void {\r\n this.graphqlResolvers.set(metadata.target, metadata);\r\n }\r\n\r\n /**\r\n * Register a GraphQL field in the registry\r\n */\r\n registerGraphQLField(metadata: GraphQLFieldMetadata): void {\r\n const key = this.getRouteKey(metadata.target, metadata.propertyKey);\r\n this.graphqlFields.set(key, metadata);\r\n }\r\n\r\n /**\r\n * Get all registered GraphQL resolvers\r\n */\r\n getGraphQLResolvers(): GraphQLResolverMetadata[] {\r\n return Array.from(this.graphqlResolvers.values());\r\n }\r\n\r\n /**\r\n * Get GraphQL resolver metadata for a specific target\r\n */\r\n getGraphQLResolver(target: Class): GraphQLResolverMetadata | undefined {\r\n return this.graphqlResolvers.get(target);\r\n }\r\n\r\n /**\r\n * Get all GraphQL fields\r\n */\r\n getGraphQLFields(): GraphQLFieldMetadata[] {\r\n return Array.from(this.graphqlFields.values());\r\n }\r\n\r\n /**\r\n * Get GraphQL fields for a specific resolver\r\n */\r\n getGraphQLFieldsByResolver(target: Class): GraphQLFieldMetadata[] {\r\n return Array.from(this.graphqlFields.values()).filter(\r\n field => field.target === target\r\n );\r\n }\r\n\r\n /**\r\n * Clear all metadata (useful for testing)\r\n */\r\n clear(): void {\r\n this.routes.clear();\r\n this.controllers.clear();\r\n this.routesByController.clear();\r\n this.websockets.clear();\r\n this.graphqlResolvers.clear();\r\n this.graphqlFields.clear();\r\n }\r\n\r\n /**\r\n * Generate a unique key for a route\r\n */\r\n private getRouteKey(target: Class, propertyKey: string): string {\r\n return `${target.name}:${propertyKey}`;\r\n }\r\n\r\n // ============================================================================\r\n // Static methods for decorator usage\r\n // ============================================================================\r\n\r\n /**\r\n * Define route metadata using reflect-metadata (used by decorators)\r\n */\r\n static defineRoute(\r\n target: any,\r\n propertyKey: string,\r\n metadata: Partial<RouteMetadata>\r\n ): void {\r\n const existingMetadata = this.getRouteMetadata(target, propertyKey);\r\n \r\n const mergedMetadata: Partial<RouteMetadata> = {\r\n ...existingMetadata,\r\n ...metadata,\r\n target: target.constructor,\r\n propertyKey,\r\n // Merge arrays instead of replacing\r\n middleware: [\r\n ...(existingMetadata?.middleware || []),\r\n ...(metadata.middleware || [])\r\n ],\r\n parameters: metadata.parameters || existingMetadata?.parameters || [],\r\n dependencies: metadata.dependencies || existingMetadata?.dependencies || [],\r\n responses: metadata.responses || existingMetadata?.responses || [],\r\n // Preserve auth metadata\r\n auth: metadata.auth || existingMetadata?.auth,\r\n oauth: metadata.oauth || existingMetadata?.oauth,\r\n roles: metadata.roles || existingMetadata?.roles,\r\n permissions: metadata.permissions || existingMetadata?.permissions,\r\n minimumRole: metadata.minimumRole || existingMetadata?.minimumRole,\r\n resourcePermission: metadata.resourcePermission || existingMetadata?.resourcePermission,\r\n session: metadata.session || existingMetadata?.session,\r\n csrf: metadata.csrf || existingMetadata?.csrf\r\n };\r\n\r\n Reflect.defineMetadata(\r\n ROUTE_METADATA_KEY,\r\n mergedMetadata,\r\n target,\r\n propertyKey\r\n );\r\n }\r\n\r\n /**\r\n * Define parameter metadata (used by parameter decorators)\r\n */\r\n static defineParameter(\r\n target: any,\r\n propertyKey: string,\r\n index: number,\r\n metadata: ParameterMetadata\r\n ): void {\r\n const existingParams = this.getParameterMetadata(target, propertyKey) || [];\r\n \r\n // Update or add parameter at the specified index\r\n existingParams[index] = metadata;\r\n\r\n Reflect.defineMetadata(\r\n PARAMETER_METADATA_KEY,\r\n existingParams,\r\n target,\r\n propertyKey\r\n );\r\n\r\n // Also update the route metadata to include this parameter\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n parameters: existingParams\r\n });\r\n }\r\n\r\n /**\r\n * Define dependency metadata (used by @Depends decorator)\r\n */\r\n static defineDependency(\r\n target: any,\r\n propertyKey: string,\r\n index: number,\r\n metadata: DependencyMetadata\r\n ): void {\r\n const existingDeps = this.getDependencyMetadata(target, propertyKey) || [];\r\n \r\n // Update or add dependency at the specified index\r\n existingDeps[index] = metadata;\r\n\r\n Reflect.defineMetadata(\r\n DEPENDENCY_METADATA_KEY,\r\n existingDeps,\r\n target,\r\n propertyKey\r\n );\r\n\r\n // Also update the route metadata to include this dependency\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n dependencies: existingDeps\r\n });\r\n }\r\n\r\n /**\r\n * Define controller metadata (used by @Controller decorator)\r\n */\r\n static defineController(target: any, metadata: ControllerMetadata): void {\r\n Reflect.defineMetadata(CONTROLLER_METADATA_KEY, metadata, target);\r\n }\r\n\r\n /**\r\n * Get route metadata from reflect-metadata\r\n */\r\n static getRouteMetadata(target: any, propertyKey: string): Partial<RouteMetadata> | undefined {\r\n return Reflect.getMetadata(ROUTE_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Get parameter metadata from reflect-metadata\r\n */\r\n static getParameterMetadata(target: any, propertyKey: string): ParameterMetadata[] | undefined {\r\n return Reflect.getMetadata(PARAMETER_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Get dependency metadata from reflect-metadata\r\n */\r\n static getDependencyMetadata(target: any, propertyKey: string): DependencyMetadata[] | undefined {\r\n return Reflect.getMetadata(DEPENDENCY_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Get controller metadata from reflect-metadata\r\n */\r\n static getControllerMetadata(target: any): ControllerMetadata | undefined {\r\n return Reflect.getMetadata(CONTROLLER_METADATA_KEY, target);\r\n }\r\n\r\n /**\r\n * Check if a class has controller metadata\r\n */\r\n static hasControllerMetadata(target: any): boolean {\r\n return Reflect.hasMetadata(CONTROLLER_METADATA_KEY, target);\r\n }\r\n\r\n /**\r\n * Check if a method has route metadata\r\n */\r\n static hasRouteMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(ROUTE_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Get all route methods from a controller class\r\n */\r\n static getRouteMethods(target: Class): string[] {\r\n const prototype = target.prototype;\r\n const methods: string[] = [];\r\n\r\n // Get all property names from the prototype\r\n const propertyNames = Object.getOwnPropertyNames(prototype);\r\n\r\n for (const propertyName of propertyNames) {\r\n if (propertyName === 'constructor') continue;\r\n \r\n if (this.hasRouteMetadata(prototype, propertyName)) {\r\n methods.push(propertyName);\r\n }\r\n }\r\n\r\n return methods;\r\n }\r\n\r\n /**\r\n * Define WebSocket metadata (used by @WebSocket decorator)\r\n */\r\n static defineWebSocket(target: any, metadata: Partial<WebSocketMetadata>): void {\r\n const existingMetadata = this.getWebSocketMetadata(target);\r\n \r\n const mergedMetadata: Partial<WebSocketMetadata> = {\r\n ...existingMetadata,\r\n ...metadata,\r\n target: target\r\n };\r\n\r\n Reflect.defineMetadata(WEBSOCKET_METADATA_KEY, mergedMetadata, target);\r\n }\r\n\r\n /**\r\n * Define WebSocket handler metadata (used by @OnConnect, @OnMessage, @OnDisconnect)\r\n */\r\n static defineWebSocketHandler(\r\n target: any,\r\n propertyKey: string,\r\n metadata: WebSocketHandlerMetadata\r\n ): void {\r\n // Get existing WebSocket metadata\r\n const wsMetadata = this.getWebSocketMetadata(target.constructor) || {};\r\n\r\n // Update the appropriate handler\r\n switch (metadata.type) {\r\n case 'connect':\r\n wsMetadata.onConnect = propertyKey;\r\n break;\r\n case 'message':\r\n wsMetadata.onMessage = propertyKey;\r\n wsMetadata.messageSchema = metadata.schema;\r\n break;\r\n case 'disconnect':\r\n wsMetadata.onDisconnect = propertyKey;\r\n break;\r\n }\r\n\r\n // Save updated metadata\r\n this.defineWebSocket(target.constructor, wsMetadata);\r\n\r\n // Also store handler-specific metadata\r\n Reflect.defineMetadata(\r\n WEBSOCKET_HANDLER_METADATA_KEY,\r\n metadata,\r\n target,\r\n propertyKey\r\n );\r\n }\r\n\r\n /**\r\n * Get WebSocket metadata from reflect-metadata\r\n */\r\n static getWebSocketMetadata(target: any): Partial<WebSocketMetadata> | undefined {\r\n return Reflect.getMetadata(WEBSOCKET_METADATA_KEY, target);\r\n }\r\n\r\n /**\r\n * Get WebSocket handler metadata from reflect-metadata\r\n */\r\n static getWebSocketHandlerMetadata(target: any, propertyKey: string): WebSocketHandlerMetadata | undefined {\r\n return Reflect.getMetadata(WEBSOCKET_HANDLER_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a class has WebSocket metadata\r\n */\r\n static hasWebSocketMetadata(target: any): boolean {\r\n return Reflect.hasMetadata(WEBSOCKET_METADATA_KEY, target);\r\n }\r\n\r\n /**\r\n * Define GraphQL resolver metadata (used by @Resolver decorator)\r\n */\r\n static defineGraphQLResolver(target: any, metadata: GraphQLResolverMetadata): void {\r\n Reflect.defineMetadata(GRAPHQL_RESOLVER_KEY, metadata, target);\r\n }\r\n\r\n /**\r\n * Define GraphQL field metadata (used by @Query, @Mutation, @Subscription decorators)\r\n */\r\n static defineGraphQLField(\r\n target: any,\r\n propertyKey: string,\r\n metadata: GraphQLFieldMetadata\r\n ): void {\r\n // Store field metadata on the method\r\n Reflect.defineMetadata(GRAPHQL_FIELD_KEY, metadata, target, propertyKey);\r\n\r\n // Also maintain a list of all fields on the class\r\n const existingFields = this.getGraphQLFieldsMetadata(target.constructor) || [];\r\n existingFields.push(metadata);\r\n Reflect.defineMetadata(GRAPHQL_FIELD_KEY, existingFields, target.constructor);\r\n }\r\n\r\n /**\r\n * Get GraphQL resolver metadata from reflect-metadata\r\n */\r\n static getGraphQLResolverMetadata(target: any): GraphQLResolverMetadata | undefined {\r\n return Reflect.getMetadata(GRAPHQL_RESOLVER_KEY, target);\r\n }\r\n\r\n /**\r\n * Get all GraphQL fields metadata from a resolver class\r\n */\r\n static getGraphQLFieldsMetadata(target: any): GraphQLFieldMetadata[] {\r\n return Reflect.getMetadata(GRAPHQL_FIELD_KEY, target) || [];\r\n }\r\n\r\n /**\r\n * Get GraphQL field metadata from a specific method\r\n */\r\n static getGraphQLFieldMetadata(target: any, propertyKey: string): GraphQLFieldMetadata | undefined {\r\n return Reflect.getMetadata(GRAPHQL_FIELD_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a class has GraphQL resolver metadata\r\n */\r\n static hasGraphQLResolverMetadata(target: any): boolean {\r\n return Reflect.hasMetadata(GRAPHQL_RESOLVER_KEY, target);\r\n }\r\n\r\n /**\r\n * Check if a method has GraphQL field metadata\r\n */\r\n static hasGraphQLFieldMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(GRAPHQL_FIELD_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Define authentication metadata (used by @Auth decorator)\r\n */\r\n static defineAuth(target: any, propertyKey: string, metadata: AuthMetadata): void {\r\n Reflect.defineMetadata(AUTH_METADATA_KEY, metadata, target, propertyKey);\r\n\r\n // Also update the route metadata to include auth info\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n auth: metadata\r\n });\r\n }\r\n\r\n /**\r\n * Get authentication metadata from reflect-metadata\r\n */\r\n static getAuthMetadata(target: any, propertyKey: string): AuthMetadata | undefined {\r\n return Reflect.getMetadata(AUTH_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a method has authentication metadata\r\n */\r\n static hasAuthMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(AUTH_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Define OAuth metadata (used by @OAuth decorator)\r\n */\r\n static defineOAuth(target: any, propertyKey: string, metadata: any): void {\r\n Reflect.defineMetadata(OAUTH_METADATA_KEY, metadata, target, propertyKey);\r\n\r\n // Also update the route metadata to include OAuth info\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n oauth: metadata\r\n });\r\n }\r\n\r\n /**\r\n * Get OAuth metadata from reflect-metadata\r\n */\r\n static getOAuthMetadata(target: any, propertyKey: string): any {\r\n return Reflect.getMetadata(OAUTH_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a method has OAuth metadata\r\n */\r\n static hasOAuthMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(OAUTH_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Define roles metadata (used by @Roles decorator)\r\n */\r\n static defineRoles(target: any, propertyKey: string, metadata: any): void {\r\n Reflect.defineMetadata(ROLES_METADATA_KEY, metadata, target, propertyKey);\r\n\r\n // Also update the route metadata to include roles info\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n roles: metadata\r\n });\r\n }\r\n\r\n /**\r\n * Define permissions metadata (used by @Permissions decorator)\r\n */\r\n static definePermissions(target: any, propertyKey: string, metadata: any): void {\r\n Reflect.defineMetadata(PERMISSIONS_METADATA_KEY, metadata, target, propertyKey);\r\n\r\n // Also update the route metadata to include permissions info\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n permissions: metadata\r\n });\r\n }\r\n\r\n /**\r\n * Define minimum role metadata (used by @MinimumRole decorator)\r\n */\r\n static defineMinimumRole(target: any, propertyKey: string, metadata: any): void {\r\n Reflect.defineMetadata(MINIMUM_ROLE_METADATA_KEY, metadata, target, propertyKey);\r\n\r\n // Also update the route metadata to include minimum role info\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n minimumRole: metadata\r\n });\r\n }\r\n\r\n /**\r\n * Get roles metadata from reflect-metadata\r\n */\r\n static getRolesMetadata(target: any, propertyKey: string): any {\r\n return Reflect.getMetadata(ROLES_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Get permissions metadata from reflect-metadata\r\n */\r\n static getPermissionsMetadata(target: any, propertyKey: string): any {\r\n return Reflect.getMetadata(PERMISSIONS_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Get minimum role metadata from reflect-metadata\r\n */\r\n static getMinimumRoleMetadata(target: any, propertyKey: string): any {\r\n return Reflect.getMetadata(MINIMUM_ROLE_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a method has roles metadata\r\n */\r\n static hasRolesMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(ROLES_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a method has permissions metadata\r\n */\r\n static hasPermissionsMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(PERMISSIONS_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a method has minimum role metadata\r\n */\r\n static hasMinimumRoleMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(MINIMUM_ROLE_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Define resource permission metadata (used by @CanAccess decorator)\r\n */\r\n static defineResourcePermission(target: any, propertyKey: string, metadata: any): void {\r\n Reflect.defineMetadata(RESOURCE_PERMISSION_METADATA_KEY, metadata, target, propertyKey);\r\n\r\n // Also update the route metadata to include resource permission info\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n resourcePermission: metadata\r\n });\r\n }\r\n\r\n /**\r\n * Get resource permission metadata from reflect-metadata\r\n */\r\n static getResourcePermissionMetadata(target: any, propertyKey: string): any {\r\n return Reflect.getMetadata(RESOURCE_PERMISSION_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a method has resource permission metadata\r\n */\r\n static hasResourcePermissionMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(RESOURCE_PERMISSION_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Define session metadata (used by @Session decorator)\r\n */\r\n static defineSession(target: any, propertyKey: string, metadata: any): void {\r\n Reflect.defineMetadata(SESSION_METADATA_KEY, metadata, target, propertyKey);\r\n\r\n // Also update the route metadata to include session info\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n session: metadata\r\n });\r\n }\r\n\r\n /**\r\n * Define CSRF metadata (used by @RequireCSRF decorator)\r\n */\r\n static defineCSRF(target: any, propertyKey: string, metadata: any): void {\r\n Reflect.defineMetadata(CSRF_METADATA_KEY, metadata, target, propertyKey);\r\n\r\n // Also update the route metadata to include CSRF info\r\n const routeMetadata = this.getRouteMetadata(target, propertyKey);\r\n this.defineRoute(target, propertyKey, {\r\n ...routeMetadata,\r\n csrf: metadata\r\n });\r\n }\r\n\r\n /**\r\n * Get session metadata from reflect-metadata\r\n */\r\n static getSessionMetadata(target: any, propertyKey: string): any {\r\n return Reflect.getMetadata(SESSION_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Get CSRF metadata from reflect-metadata\r\n */\r\n static getCSRFMetadata(target: any, propertyKey: string): any {\r\n return Reflect.getMetadata(CSRF_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a method has session metadata\r\n */\r\n static hasSessionMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(SESSION_METADATA_KEY, target, propertyKey);\r\n }\r\n\r\n /**\r\n * Check if a method has CSRF metadata\r\n */\r\n static hasCSRFMetadata(target: any, propertyKey: string): boolean {\r\n return Reflect.hasMetadata(CSRF_METADATA_KEY, target, propertyKey);\r\n }\r\n}\r\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "C6BDE8013CBE320564756E2164756E21",
9
- "names": []
10
- }
@@ -1,5 +0,0 @@
1
- // @bun
2
- import"./chunk-keyvhe4h.js";function q(b){if(typeof b==="number")return b;let j=b.match(/^(\d+)([smhd])$/);if(!j)throw Error(`Invalid TTL format: ${b}. Use format like '5s', '5m', '5h', '5d' or a number`);let f=parseInt(j[1],10),k=j[2];switch(k){case"s":return f;case"m":return f*60;case"h":return f*3600;case"d":return f*86400;default:throw Error(`Unknown TTL unit: ${k}`)}}export{q as parseTTL};
3
- export{q as E};
4
-
5
- //# debugId=ACB24DB79A0AA16264756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["..\\..\\src\\cache\\types.ts"],
4
- "sourcesContent": [
5
- "/**\r\n * Cache system types\r\n */\r\n\r\n/**\r\n * Cache entry with data and expiration\r\n */\r\nexport interface CacheEntry<T = any> {\r\n data: T;\r\n expiresAt: number;\r\n createdAt: number;\r\n}\r\n\r\n/**\r\n * Cache store interface\r\n * Implement this interface to create custom cache backends\r\n */\r\nexport interface CacheStore {\r\n /**\r\n * Get a value from the cache\r\n * Returns null if the key doesn't exist or has expired\r\n */\r\n get<T = any>(key: string): Promise<T | null>;\r\n\r\n /**\r\n * Set a value in the cache with optional TTL\r\n * @param key - Cache key\r\n * @param value - Value to store\r\n * @param ttl - Time to live in seconds (0 = no expiration)\r\n */\r\n set<T = any>(key: string, value: T, ttl?: number): Promise<void>;\r\n\r\n /**\r\n * Delete a value from the cache\r\n */\r\n delete(key: string): Promise<boolean>;\r\n\r\n /**\r\n * Check if a key exists in the cache\r\n */\r\n has(key: string): Promise<boolean>;\r\n\r\n /**\r\n * Clear all values from the cache\r\n */\r\n clear(): Promise<void>;\r\n\r\n /**\r\n * Delete all keys matching a pattern\r\n * @param pattern - Pattern to match (supports wildcards like 'user:*')\r\n */\r\n deletePattern(pattern: string): Promise<number>;\r\n\r\n /**\r\n * Get all keys matching a pattern\r\n */\r\n keys(pattern?: string): Promise<string[]>;\r\n}\r\n\r\n/**\r\n * Cache configuration for decorators and middleware\r\n */\r\nexport interface CacheOptions {\r\n /**\r\n * Time to live in seconds\r\n * Can be a number or a string like '5m', '1h', '1d'\r\n */\r\n ttl: number | string;\r\n\r\n /**\r\n * Cache key\r\n * Can include placeholders like {id}, {userId}\r\n * If not provided, generates key from route and params\r\n */\r\n key?: string;\r\n\r\n /**\r\n * Key prefix for namespacing\r\n */\r\n prefix?: string;\r\n\r\n /**\r\n * Whether to include query parameters in cache key\r\n */\r\n includeQuery?: boolean;\r\n\r\n /**\r\n * Whether to vary cache by specific headers\r\n */\r\n varyByHeaders?: string[];\r\n\r\n /**\r\n * Custom condition to determine if response should be cached\r\n */\r\n condition?: (result: any) => boolean;\r\n\r\n /**\r\n * Cache store to use (defaults to global store)\r\n */\r\n store?: CacheStore;\r\n}\r\n\r\n/**\r\n * Parse TTL string to seconds\r\n * Supports: '5s', '5m', '5h', '5d'\r\n */\r\nexport function parseTTL(ttl: number | string): number {\r\n if (typeof ttl === 'number') {\r\n return ttl;\r\n }\r\n\r\n const match = ttl.match(/^(\\d+)([smhd])$/);\r\n if (!match) {\r\n throw new Error(`Invalid TTL format: ${ttl}. Use format like '5s', '5m', '5h', '5d' or a number`);\r\n }\r\n\r\n const value = parseInt(match[1], 10);\r\n const unit = match[2];\r\n\r\n switch (unit) {\r\n case 's': return value;\r\n case 'm': return value * 60;\r\n case 'h': return value * 3600;\r\n case 'd': return value * 86400;\r\n default: throw new Error(`Unknown TTL unit: ${unit}`);\r\n }\r\n}\r\n\r\n"
6
- ],
7
- "mappings": ";4BA0GO,SAAS,CAAQ,CAAC,EAA8B,CACrD,GAAI,OAAO,IAAQ,SACjB,OAAO,EAGT,IAAM,EAAQ,EAAI,MAAM,iBAAiB,EACzC,GAAI,CAAC,EACH,MAAU,MAAM,uBAAuB,uDAAyD,EAGlG,IAAM,EAAQ,SAAS,EAAM,GAAI,EAAE,EAC7B,EAAO,EAAM,GAEnB,OAAQ,OACD,IAAK,OAAO,MACZ,IAAK,OAAO,EAAQ,OACpB,IAAK,OAAO,EAAQ,SACpB,IAAK,OAAO,EAAQ,cAChB,MAAU,MAAM,qBAAqB,GAAM",
8
- "debugId": "ACB24DB79A0AA16264756E2164756E21",
9
- "names": []
10
- }
@@ -1,7 +0,0 @@
1
- // @bun
2
- import"./chunk-keyvhe4h.js";import{spawn as I}from"child_process";import{existsSync as J}from"fs";import{join as K}from"path";function Q(q){q.command("dev").description("Start development server with hot reload").option("-p, --port <port>","Port to run the server on","3000").option("-w, --watch <path>","Additional paths to watch","src").action(async(z)=>{await L(z)})}async function L(q){let z=K(process.cwd(),"src","index.ts");if(!J(z))console.error("Error: src/index.ts not found"),console.error("Make sure you are in a VeloceTS project directory"),process.exit(1);console.log("Starting development server..."),console.log(`Watching: ${q.watch||"src"}`),console.log(`Port: ${q.port||3000}`),console.log(`
3
- Press Ctrl+C to stop
4
- `);let F=["--watch","--hot",z],G={...process.env,NODE_ENV:"development",PORT:q.port?.toString()||"3000"},C=I("bun",F,{stdio:"inherit",env:G,shell:!0}),E=()=>{console.log(`
5
- Shutting down development server...`),C.kill("SIGTERM"),process.exit(0)};process.on("SIGINT",E),process.on("SIGTERM",E),C.on("error",(k)=>{console.error("Failed to start development server:",k),process.exit(1)}),C.on("exit",(k)=>{if(k!==0&&k!==null)console.error(`Development server exited with code ${k}`),process.exit(k)})}export{Q as registerDevCommand};
6
-
7
- //# debugId=5498E313E621681664756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["..\\..\\src\\cli\\commands\\dev.ts"],
4
- "sourcesContent": [
5
- "import { Command } from 'commander';\r\nimport { spawn } from 'child_process';\r\nimport { existsSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\ninterface DevOptions {\r\n port?: number;\r\n watch?: string;\r\n}\r\n\r\nexport function registerDevCommand(program: Command): void {\r\n program\r\n .command('dev')\r\n .description('Start development server with hot reload')\r\n .option('-p, --port <port>', 'Port to run the server on', '3000')\r\n .option('-w, --watch <path>', 'Additional paths to watch', 'src')\r\n .action(async (options: DevOptions) => {\r\n await startDevServer(options);\r\n });\r\n}\r\n\r\nasync function startDevServer(options: DevOptions): Promise<void> {\r\n const entryPoint = join(process.cwd(), 'src', 'index.ts');\r\n\r\n // Check if entry point exists\r\n if (!existsSync(entryPoint)) {\r\n console.error('Error: src/index.ts not found');\r\n console.error('Make sure you are in a VeloceTS project directory');\r\n process.exit(1);\r\n }\r\n\r\n console.log('Starting development server...');\r\n console.log(`Watching: ${options.watch || 'src'}`);\r\n console.log(`Port: ${options.port || 3000}`);\r\n console.log('\\nPress Ctrl+C to stop\\n');\r\n\r\n // Use Bun's built-in watch mode\r\n const bunArgs = ['--watch', '--hot', entryPoint];\r\n\r\n // Set environment variables\r\n const env = {\r\n ...process.env,\r\n NODE_ENV: 'development',\r\n PORT: options.port?.toString() || '3000',\r\n };\r\n\r\n const bunProcess = spawn('bun', bunArgs, {\r\n stdio: 'inherit',\r\n env,\r\n shell: true,\r\n });\r\n\r\n // Handle process cleanup\r\n const cleanup = () => {\r\n console.log('\\nShutting down development server...');\r\n bunProcess.kill('SIGTERM');\r\n process.exit(0);\r\n };\r\n\r\n process.on('SIGINT', cleanup);\r\n process.on('SIGTERM', cleanup);\r\n\r\n bunProcess.on('error', (error) => {\r\n console.error('Failed to start development server:', error);\r\n process.exit(1);\r\n });\r\n\r\n bunProcess.on('exit', (code) => {\r\n if (code !== 0 && code !== null) {\r\n console.error(`Development server exited with code ${code}`);\r\n process.exit(code);\r\n }\r\n });\r\n}\r\n"
6
- ],
7
- "mappings": ";4BACA,gBAAS,sBACT,qBAAS,WACT,eAAS,aAOF,SAAS,CAAkB,CAAC,EAAwB,CACzD,EACG,QAAQ,KAAK,EACb,YAAY,0CAA0C,EACtD,OAAO,oBAAqB,4BAA6B,MAAM,EAC/D,OAAO,qBAAsB,4BAA6B,KAAK,EAC/D,OAAO,MAAO,IAAwB,CACrC,MAAM,EAAe,CAAO,EAC7B,EAGL,eAAe,CAAc,CAAC,EAAoC,CAChE,IAAM,EAAa,EAAK,QAAQ,IAAI,EAAG,MAAO,UAAU,EAGxD,GAAI,CAAC,EAAW,CAAU,EACxB,QAAQ,MAAM,+BAA+B,EAC7C,QAAQ,MAAM,mDAAmD,EACjE,QAAQ,KAAK,CAAC,EAGhB,QAAQ,IAAI,gCAAgC,EAC5C,QAAQ,IAAI,aAAa,EAAQ,OAAS,OAAO,EACjD,QAAQ,IAAI,SAAS,EAAQ,MAAQ,MAAM,EAC3C,QAAQ,IAAI;AAAA;AAAA,CAA0B,EAGtC,IAAM,EAAU,CAAC,UAAW,QAAS,CAAU,EAGzC,EAAM,IACP,QAAQ,IACX,SAAU,cACV,KAAM,EAAQ,MAAM,SAAS,GAAK,MACpC,EAEM,EAAa,EAAM,MAAO,EAAS,CACvC,MAAO,UACP,MACA,MAAO,EACT,CAAC,EAGK,EAAU,IAAM,CACpB,QAAQ,IAAI;AAAA,oCAAuC,EACnD,EAAW,KAAK,SAAS,EACzB,QAAQ,KAAK,CAAC,GAGhB,QAAQ,GAAG,SAAU,CAAO,EAC5B,QAAQ,GAAG,UAAW,CAAO,EAE7B,EAAW,GAAG,QAAS,CAAC,IAAU,CAChC,QAAQ,MAAM,sCAAuC,CAAK,EAC1D,QAAQ,KAAK,CAAC,EACf,EAED,EAAW,GAAG,OAAQ,CAAC,IAAS,CAC9B,GAAI,IAAS,GAAK,IAAS,KACzB,QAAQ,MAAM,uCAAuC,GAAM,EAC3D,QAAQ,KAAK,CAAI,EAEpB",
8
- "debugId": "5498E313E621681664756E2164756E21",
9
- "names": []
10
- }
@@ -1,5 +0,0 @@
1
- // @bun
2
- import{E as N}from"./chunk-79b0bm4k.js";import"./chunk-keyvhe4h.js";class J{cache=new Map;cleanupInterval;maxSize;constructor(f={}){this.maxSize=f.maxSize||1000;let j=f.cleanupInterval??60000;if(j>0)this.cleanupInterval=setInterval(()=>{this.cleanup()},j)}async get(f){let j=this.cache.get(f);if(!j)return null;if(j.expiresAt>0&&Date.now()>j.expiresAt)return this.cache.delete(f),null;return j.data}async set(f,j,z=0){if(this.cache.size>=this.maxSize&&!this.cache.has(f))this.removeOldest();let A=Date.now(),B={data:j,createdAt:A,expiresAt:z>0?A+z*1000:0};this.cache.set(f,B)}async delete(f){return this.cache.delete(f)}async has(f){let j=this.cache.get(f);if(!j)return!1;if(j.expiresAt>0&&Date.now()>j.expiresAt)return this.cache.delete(f),!1;return!0}async clear(){this.cache.clear()}async deletePattern(f){let j=this.patternToRegex(f),z=0;for(let A of this.cache.keys())if(j.test(A))this.cache.delete(A),z++;return z}async keys(f){let j=Array.from(this.cache.keys());if(!f)return j;let z=this.patternToRegex(f);return j.filter((A)=>z.test(A))}getStats(){return{size:this.cache.size,maxSize:this.maxSize}}cleanup(){let f=Date.now();for(let[j,z]of this.cache.entries())if(z.expiresAt>0&&f>z.expiresAt)this.cache.delete(j)}removeOldest(){let f=null,j=1/0;for(let[z,A]of this.cache.entries())if(A.createdAt<j)j=A.createdAt,f=z;if(f)this.cache.delete(f)}patternToRegex(f){let z=f.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${z}$`)}destroy(){if(this.cleanupInterval)clearInterval(this.cleanupInterval)}}class E{static defaultStore=new J;static stores=new Map;static setDefaultStore(f){this.defaultStore=f}static getDefaultStore(){return this.defaultStore}static registerStore(f,j){this.stores.set(f,j)}static getStore(f){return this.stores.get(f)}static generateKey(f,j,z,A,B){let D=[];if(B?.prefix)D.push(B.prefix);if(B?.key){let F=B.key;if(z)for(let[G,H]of Object.entries(z))F=F.replace(`{${G}}`,String(H));D.push(F)}else if(D.push(f.toLowerCase()),D.push(j.replace(/\//g,":")),z&&Object.keys(z).length>0)D.push(JSON.stringify(z));if(B?.includeQuery&&A&&Object.keys(A).length>0){let F=Object.keys(A).sort().reduce((G,H)=>{return G[H]=A[H],G},{});D.push(JSON.stringify(F))}return D.join(":")}static async get(f,j){return await(j||this.defaultStore).get(f)}static async set(f,j,z,A){let B=A||this.defaultStore,D=z?N(z):0;await B.set(f,j,D)}static async delete(f,j){return await(j||this.defaultStore).delete(f)}static async invalidate(f,j){return await(j||this.defaultStore).deletePattern(f)}static async clear(f){await(f||this.defaultStore).clear()}}async function U(f){return await E.get(f)}async function W(f,j,z){await E.set(f,j,z)}async function X(f){return await E.delete(f)}async function Y(f){return await E.invalidate(f)}async function Z(){await E.clear()}export{W as setCache,Y as invalidateCache,U as getCache,X as deleteCache,Z as clearCache,E as CacheManager};
3
- export{J as x,E as y,U as z,W as A,X as B,Y as C,Z as D};
4
-
5
- //# debugId=2FFE42DD2988717364756E2164756E21
@@ -1,11 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["..\\..\\src\\cache\\memory-store.ts", "..\\..\\src\\cache\\manager.ts"],
4
- "sourcesContent": [
5
- "/**\r\n * In-memory cache store implementation\r\n * Suitable for single-instance applications\r\n * For distributed systems, use Redis store\r\n */\r\n\r\nimport type { CacheStore, CacheEntry } from './types';\r\n\r\nexport class MemoryCacheStore implements CacheStore {\r\n private cache: Map<string, CacheEntry> = new Map();\r\n private cleanupInterval?: ReturnType<typeof setInterval>;\r\n private maxSize: number;\r\n\r\n constructor(options: {\r\n /**\r\n * Maximum number of entries (default: 1000)\r\n * When exceeded, oldest entries are removed (LRU)\r\n */\r\n maxSize?: number;\r\n \r\n /**\r\n * Cleanup interval in milliseconds (default: 60000 = 1 minute)\r\n * Set to 0 to disable automatic cleanup\r\n */\r\n cleanupInterval?: number;\r\n } = {}) {\r\n this.maxSize = options.maxSize || 1000;\r\n\r\n // Set up automatic cleanup of expired entries\r\n const intervalMs = options.cleanupInterval ?? 60000;\r\n if (intervalMs > 0) {\r\n this.cleanupInterval = setInterval(() => {\r\n this.cleanup();\r\n }, intervalMs);\r\n }\r\n }\r\n\r\n async get<T = any>(key: string): Promise<T | null> {\r\n const entry = this.cache.get(key);\r\n \r\n if (!entry) {\r\n return null;\r\n }\r\n\r\n // Check if expired\r\n if (entry.expiresAt > 0 && Date.now() > entry.expiresAt) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n\r\n return entry.data as T;\r\n }\r\n\r\n async set<T = any>(key: string, value: T, ttl: number = 0): Promise<void> {\r\n // Check size limit and remove oldest if necessary\r\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\r\n this.removeOldest();\r\n }\r\n\r\n const now = Date.now();\r\n const entry: CacheEntry<T> = {\r\n data: value,\r\n createdAt: now,\r\n expiresAt: ttl > 0 ? now + (ttl * 1000) : 0\r\n };\r\n\r\n this.cache.set(key, entry);\r\n }\r\n\r\n async delete(key: string): Promise<boolean> {\r\n return this.cache.delete(key);\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n const entry = this.cache.get(key);\r\n \r\n if (!entry) {\r\n return false;\r\n }\r\n\r\n // Check if expired\r\n if (entry.expiresAt > 0 && Date.now() > entry.expiresAt) {\r\n this.cache.delete(key);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.cache.clear();\r\n }\r\n\r\n async deletePattern(pattern: string): Promise<number> {\r\n const regex = this.patternToRegex(pattern);\r\n let deleted = 0;\r\n\r\n for (const key of this.cache.keys()) {\r\n if (regex.test(key)) {\r\n this.cache.delete(key);\r\n deleted++;\r\n }\r\n }\r\n\r\n return deleted;\r\n }\r\n\r\n async keys(pattern?: string): Promise<string[]> {\r\n const allKeys = Array.from(this.cache.keys());\r\n \r\n if (!pattern) {\r\n return allKeys;\r\n }\r\n\r\n const regex = this.patternToRegex(pattern);\r\n return allKeys.filter(key => regex.test(key));\r\n }\r\n\r\n /**\r\n * Get cache statistics\r\n */\r\n getStats(): {\r\n size: number;\r\n maxSize: number;\r\n hitRate?: number;\r\n } {\r\n return {\r\n size: this.cache.size,\r\n maxSize: this.maxSize\r\n };\r\n }\r\n\r\n /**\r\n * Clean up expired entries\r\n */\r\n private cleanup(): void {\r\n const now = Date.now();\r\n \r\n for (const [key, entry] of this.cache.entries()) {\r\n if (entry.expiresAt > 0 && now > entry.expiresAt) {\r\n this.cache.delete(key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove oldest entry (LRU eviction)\r\n */\r\n private removeOldest(): void {\r\n let oldestKey: string | null = null;\r\n let oldestTime = Infinity;\r\n\r\n for (const [key, entry] of this.cache.entries()) {\r\n if (entry.createdAt < oldestTime) {\r\n oldestTime = entry.createdAt;\r\n oldestKey = key;\r\n }\r\n }\r\n\r\n if (oldestKey) {\r\n this.cache.delete(oldestKey);\r\n }\r\n }\r\n\r\n /**\r\n * Convert glob pattern to regex\r\n */\r\n private patternToRegex(pattern: string): RegExp {\r\n // Escape special regex characters except *\r\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n // Convert * to .*\r\n const regex = escaped.replace(/\\*/g, '.*');\r\n return new RegExp(`^${regex}$`);\r\n }\r\n\r\n /**\r\n * Stop cleanup interval\r\n */\r\n destroy(): void {\r\n if (this.cleanupInterval) {\r\n clearInterval(this.cleanupInterval);\r\n }\r\n }\r\n}\r\n\r\n",
6
- "/**\r\n * Cache manager for managing cache stores and providing utilities\r\n */\r\n\r\nimport type { CacheStore, CacheOptions } from './types';\r\nimport { parseTTL } from './types';\r\nimport { MemoryCacheStore } from './memory-store';\r\n\r\n/**\r\n * Global cache manager\r\n */\r\nexport class CacheManager {\r\n private static defaultStore: CacheStore = new MemoryCacheStore();\r\n private static stores: Map<string, CacheStore> = new Map();\r\n\r\n /**\r\n * Set the default cache store\r\n */\r\n static setDefaultStore(store: CacheStore): void {\r\n this.defaultStore = store;\r\n }\r\n\r\n /**\r\n * Get the default cache store\r\n */\r\n static getDefaultStore(): CacheStore {\r\n return this.defaultStore;\r\n }\r\n\r\n /**\r\n * Register a named cache store\r\n */\r\n static registerStore(name: string, store: CacheStore): void {\r\n this.stores.set(name, store);\r\n }\r\n\r\n /**\r\n * Get a named cache store\r\n */\r\n static getStore(name: string): CacheStore | undefined {\r\n return this.stores.get(name);\r\n }\r\n\r\n /**\r\n * Generate cache key from route and parameters\r\n */\r\n static generateKey(\r\n method: string,\r\n path: string,\r\n params?: Record<string, any>,\r\n query?: Record<string, any>,\r\n options?: Pick<CacheOptions, 'key' | 'prefix' | 'includeQuery'>\r\n ): string {\r\n const parts: string[] = [];\r\n\r\n // Add prefix if provided\r\n if (options?.prefix) {\r\n parts.push(options.prefix);\r\n }\r\n\r\n // Use custom key if provided\r\n if (options?.key) {\r\n let key = options.key;\r\n \r\n // Replace placeholders like {id}, {userId}\r\n if (params) {\r\n for (const [paramKey, paramValue] of Object.entries(params)) {\r\n key = key.replace(`{${paramKey}}`, String(paramValue));\r\n }\r\n }\r\n \r\n parts.push(key);\r\n } else {\r\n // Generate key from route\r\n parts.push(method.toLowerCase());\r\n parts.push(path.replace(/\\//g, ':'));\r\n\r\n // Add params to key\r\n if (params && Object.keys(params).length > 0) {\r\n parts.push(JSON.stringify(params));\r\n }\r\n }\r\n\r\n // Add query parameters if requested\r\n if (options?.includeQuery && query && Object.keys(query).length > 0) {\r\n const sortedQuery = Object.keys(query)\r\n .sort()\r\n .reduce((acc, key) => {\r\n acc[key] = query[key];\r\n return acc;\r\n }, {} as Record<string, any>);\r\n parts.push(JSON.stringify(sortedQuery));\r\n }\r\n\r\n return parts.join(':');\r\n }\r\n\r\n /**\r\n * Get value from cache\r\n */\r\n static async get<T = any>(\r\n key: string,\r\n store?: CacheStore\r\n ): Promise<T | null> {\r\n const cacheStore = store || this.defaultStore;\r\n return await cacheStore.get<T>(key);\r\n }\r\n\r\n /**\r\n * Set value in cache\r\n */\r\n static async set<T = any>(\r\n key: string,\r\n value: T,\r\n ttl?: number | string,\r\n store?: CacheStore\r\n ): Promise<void> {\r\n const cacheStore = store || this.defaultStore;\r\n const ttlSeconds = ttl ? parseTTL(ttl) : 0;\r\n await cacheStore.set(key, value, ttlSeconds);\r\n }\r\n\r\n /**\r\n * Delete value from cache\r\n */\r\n static async delete(\r\n key: string,\r\n store?: CacheStore\r\n ): Promise<boolean> {\r\n const cacheStore = store || this.defaultStore;\r\n return await cacheStore.delete(key);\r\n }\r\n\r\n /**\r\n * Delete all keys matching pattern\r\n */\r\n static async invalidate(\r\n pattern: string,\r\n store?: CacheStore\r\n ): Promise<number> {\r\n const cacheStore = store || this.defaultStore;\r\n return await cacheStore.deletePattern(pattern);\r\n }\r\n\r\n /**\r\n * Clear all cache\r\n */\r\n static async clear(store?: CacheStore): Promise<void> {\r\n const cacheStore = store || this.defaultStore;\r\n await cacheStore.clear();\r\n }\r\n}\r\n\r\n/**\r\n * Convenience functions for cache operations\r\n */\r\n\r\n/**\r\n * Get value from cache\r\n */\r\nexport async function getCache<T = any>(key: string): Promise<T | null> {\r\n return await CacheManager.get<T>(key);\r\n}\r\n\r\n/**\r\n * Set value in cache\r\n */\r\nexport async function setCache<T = any>(\r\n key: string,\r\n value: T,\r\n ttl?: number | string\r\n): Promise<void> {\r\n await CacheManager.set(key, value, ttl);\r\n}\r\n\r\n/**\r\n * Delete value from cache\r\n */\r\nexport async function deleteCache(key: string): Promise<boolean> {\r\n return await CacheManager.delete(key);\r\n}\r\n\r\n/**\r\n * Invalidate cache by pattern\r\n */\r\nexport async function invalidateCache(pattern: string): Promise<number> {\r\n return await CacheManager.invalidate(pattern);\r\n}\r\n\r\n/**\r\n * Clear all cache\r\n */\r\nexport async function clearCache(): Promise<void> {\r\n await CacheManager.clear();\r\n}\r\n\r\n"
7
- ],
8
- "mappings": "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",
9
- "debugId": "2FFE42DD2988717364756E2164756E21",
10
- "names": []
11
- }
@@ -1,5 +0,0 @@
1
- // @bun
2
- import{Ua as q}from"./chunk-fzj3j2tz.js";class A extends q{zodError;constructor(k){super(422,"Validation failed");this.zodError=k;this.name="ValidationException"}toJSON(){return{error:"Validation Error",statusCode:this.statusCode,details:this.zodError.errors.map((k)=>({path:k.path.join("."),message:k.message,code:k.code}))}}}
3
- export{A as Ta};
4
-
5
- //# debugId=D1D1E5D883BB817064756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["..\\..\\src\\validation\\exceptions.ts"],
4
- "sourcesContent": [
5
- "import { ZodError } from 'zod';\r\nimport { HTTPException } from '../errors/exceptions.js';\r\n\r\n/**\r\n * ValidationException is thrown when Zod validation fails\r\n * Extends HTTPException with 422 Unprocessable Entity status\r\n * Provides detailed validation error information\r\n */\r\nexport class ValidationException extends HTTPException {\r\n constructor(public zodError: ZodError) {\r\n super(422, 'Validation failed');\r\n this.name = 'ValidationException';\r\n }\r\n\r\n /**\r\n * Converts the validation error to a user-friendly JSON format\r\n * @returns Object with error message and detailed validation errors\r\n */\r\n toJSON() {\r\n return {\r\n error: 'Validation Error',\r\n statusCode: this.statusCode,\r\n details: this.zodError.errors.map(err => ({\r\n path: err.path.join('.'),\r\n message: err.message,\r\n code: err.code\r\n }))\r\n };\r\n }\r\n}\r\n"
6
- ],
7
- "mappings": ";yCAQO,MAAM,UAA4B,CAAc,CAClC,SAAnB,WAAW,CAAQ,EAAoB,CACrC,MAAM,IAAK,mBAAmB,EADb,gBAEjB,KAAK,KAAO,sBAOd,MAAM,EAAG,CACP,MAAO,CACL,MAAO,mBACP,WAAY,KAAK,WACjB,QAAS,KAAK,SAAS,OAAO,IAAI,MAAQ,CACxC,KAAM,EAAI,KAAK,KAAK,GAAG,EACvB,QAAS,EAAI,QACb,KAAM,EAAI,IACZ,EAAE,CACJ,EAEJ",
8
- "debugId": "D1D1E5D883BB817064756E2164756E21",
9
- "names": []
10
- }
@@ -1,5 +0,0 @@
1
- // @bun
2
- class k extends Error{statusCode;details;constructor(j,b,D){super(b);this.statusCode=j;this.details=D;if(this.name="HTTPException",Error.captureStackTrace)Error.captureStackTrace(this,this.constructor)}toJSON(){return{error:this.message,statusCode:this.statusCode,...this.details&&{details:this.details}}}}class y extends k{constructor(j="Not Found",b){super(404,j,b);this.name="NotFoundException"}toJSON(){return{error:this.message,statusCode:this.statusCode,...this.details&&{details:this.details}}}}class z extends k{constructor(j="Unauthorized",b){super(401,j,b);this.name="UnauthorizedException"}toJSON(){return{error:this.message,statusCode:this.statusCode,...this.details&&{details:this.details}}}}class A extends k{constructor(j="Forbidden",b){super(403,j,b);this.name="ForbiddenException"}toJSON(){return{error:this.message,statusCode:this.statusCode,...this.details&&{details:this.details}}}}class C extends k{constructor(j="Bad Request",b){super(400,j,b);this.name="BadRequestException"}toJSON(){return{error:this.message,statusCode:this.statusCode,...this.details&&{details:this.details}}}}
3
- export{k as Ua,y as Va,z as Wa,A as Xa,C as Ya};
4
-
5
- //# debugId=8F0E95BE49C1528C64756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["..\\..\\src\\errors\\exceptions.ts"],
4
- "sourcesContent": [
5
- "/**\r\n * Base HTTP exception class\r\n * All HTTP exceptions should extend this class\r\n * Provides consistent error response format\r\n */\r\nexport class HTTPException extends Error {\r\n constructor(\r\n public statusCode: number,\r\n message: string,\r\n public details?: any\r\n ) {\r\n super(message);\r\n this.name = 'HTTPException';\r\n \r\n // Maintains proper stack trace for where error was thrown (V8 only)\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, this.constructor);\r\n }\r\n }\r\n\r\n /**\r\n * Convert exception to JSON format for HTTP response\r\n * @returns Object with error details\r\n */\r\n toJSON() {\r\n return {\r\n error: this.message,\r\n statusCode: this.statusCode,\r\n ...(this.details && { details: this.details })\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * 404 Not Found exception\r\n * Thrown when a requested resource cannot be found\r\n */\r\nexport class NotFoundException extends HTTPException {\r\n constructor(message: string = 'Not Found', details?: any) {\r\n super(404, message, details);\r\n this.name = 'NotFoundException';\r\n }\r\n\r\n toJSON() {\r\n return {\r\n error: this.message,\r\n statusCode: this.statusCode,\r\n ...(this.details && { details: this.details })\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * 401 Unauthorized exception\r\n * Thrown when authentication is required but not provided or invalid\r\n */\r\nexport class UnauthorizedException extends HTTPException {\r\n constructor(message: string = 'Unauthorized', details?: any) {\r\n super(401, message, details);\r\n this.name = 'UnauthorizedException';\r\n }\r\n\r\n toJSON() {\r\n return {\r\n error: this.message,\r\n statusCode: this.statusCode,\r\n ...(this.details && { details: this.details })\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * 403 Forbidden exception\r\n * Thrown when user is authenticated but doesn't have permission\r\n */\r\nexport class ForbiddenException extends HTTPException {\r\n constructor(message: string = 'Forbidden', details?: any) {\r\n super(403, message, details);\r\n this.name = 'ForbiddenException';\r\n }\r\n\r\n toJSON() {\r\n return {\r\n error: this.message,\r\n statusCode: this.statusCode,\r\n ...(this.details && { details: this.details })\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * 400 Bad Request exception\r\n * Thrown when the request is malformed or invalid\r\n */\r\nexport class BadRequestException extends HTTPException {\r\n constructor(message: string = 'Bad Request', details?: any) {\r\n super(400, message, details);\r\n this.name = 'BadRequestException';\r\n }\r\n\r\n toJSON() {\r\n return {\r\n error: this.message,\r\n statusCode: this.statusCode,\r\n ...(this.details && { details: this.details })\r\n };\r\n }\r\n}\r\n"
6
- ],
7
- "mappings": ";AAKO,MAAM,UAAsB,KAAM,CAE9B,WAEA,QAHT,WAAW,CACF,EACP,EACO,EACP,CACA,MAAM,CAAO,EAJN,kBAEA,eAMP,GAHA,KAAK,KAAO,gBAGR,MAAM,kBACR,MAAM,kBAAkB,KAAM,KAAK,WAAW,EAQlD,MAAM,EAAG,CACP,MAAO,CACL,MAAO,KAAK,QACZ,WAAY,KAAK,cACb,KAAK,SAAW,CAAE,QAAS,KAAK,OAAQ,CAC9C,EAEJ,CAMO,MAAM,UAA0B,CAAc,CACnD,WAAW,CAAC,EAAkB,YAAa,EAAe,CACxD,MAAM,IAAK,EAAS,CAAO,EAC3B,KAAK,KAAO,oBAGd,MAAM,EAAG,CACP,MAAO,CACL,MAAO,KAAK,QACZ,WAAY,KAAK,cACb,KAAK,SAAW,CAAE,QAAS,KAAK,OAAQ,CAC9C,EAEJ,CAMO,MAAM,UAA8B,CAAc,CACvD,WAAW,CAAC,EAAkB,eAAgB,EAAe,CAC3D,MAAM,IAAK,EAAS,CAAO,EAC3B,KAAK,KAAO,wBAGd,MAAM,EAAG,CACP,MAAO,CACL,MAAO,KAAK,QACZ,WAAY,KAAK,cACb,KAAK,SAAW,CAAE,QAAS,KAAK,OAAQ,CAC9C,EAEJ,CAMO,MAAM,UAA2B,CAAc,CACpD,WAAW,CAAC,EAAkB,YAAa,EAAe,CACxD,MAAM,IAAK,EAAS,CAAO,EAC3B,KAAK,KAAO,qBAGd,MAAM,EAAG,CACP,MAAO,CACL,MAAO,KAAK,QACZ,WAAY,KAAK,cACb,KAAK,SAAW,CAAE,QAAS,KAAK,OAAQ,CAC9C,EAEJ,CAMO,MAAM,UAA4B,CAAc,CACrD,WAAW,CAAC,EAAkB,cAAe,EAAe,CAC1D,MAAM,IAAK,EAAS,CAAO,EAC3B,KAAK,KAAO,sBAGd,MAAM,EAAG,CACP,MAAO,CACL,MAAO,KAAK,QACZ,WAAY,KAAK,cACb,KAAK,SAAW,CAAE,QAAS,KAAK,OAAQ,CAC9C,EAEJ",
8
- "debugId": "8F0E95BE49C1528C64756E2164756E21",
9
- "names": []
10
- }
@@ -1,6 +0,0 @@
1
- // @bun
2
- import{Ta as A}from"./chunk-b7yr0p26.js";import{Ua as z}from"./chunk-fzj3j2tz.js";class C{customHandler;isDevelopment;constructor(k){this.customHandler=k,this.isDevelopment=!0}setCustomHandler(k){this.customHandler=k}async handle(k,q){if(console.log("ErrorHandler.handle called with:",k.constructor.name,k.message),this.customHandler)try{return await this.customHandler(k,q)}catch(w){console.error("Custom error handler failed:",w)}if(k instanceof A)return console.log("Handling as ValidationException"),this.handleValidationException(k,q);if(k instanceof z)return console.log("Handling as HTTPException"),this.handleHTTPException(k,q);return console.log("Handling as generic error"),this.handleGenericError(k,q)}handleValidationException(k,q){let w=k.toJSON();if(this.isDevelopment)console.error("Validation Error:",{path:q.req.path,method:q.req.method,details:w.details});return q.json(w,k.statusCode)}handleHTTPException(k,q){let w=k.toJSON();if(k.statusCode>=500)console.error("HTTP Exception:",{name:k.name,statusCode:k.statusCode,message:k.message,path:q.req.path,method:q.req.method,...this.isDevelopment&&k.stack?{stack:k.stack}:{}});else if(this.isDevelopment)console.warn("HTTP Exception:",{name:k.name,statusCode:k.statusCode,message:k.message,path:q.req.path,method:q.req.method});return q.json(w,k.statusCode)}handleGenericError(k,q){console.error("Internal Server Error:",{name:k.name,message:k.message,path:q.req.path,method:q.req.method,stack:k.stack});let w={error:"Internal Server Error",statusCode:500};if(this.isDevelopment){if(w.message=k.message,w.name=k.name,k.stack)w.stack=k.stack.split(`
3
- `).map((B)=>B.trim())}else w.message="An unexpected error occurred";return q.json(w,500)}isDevelopmentMode(){return this.isDevelopment}setDevelopmentMode(k){this.isDevelopment=k}}
4
- export{C as ua};
5
-
6
- //# debugId=17B592151EF81A2264756E2164756E21