veloce-ts 0.2.6 → 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 (180) hide show
  1. package/CHANGELOG.md +501 -240
  2. package/README.md +141 -1
  3. package/dist/cjs/src/cli/index.js +125 -74
  4. package/dist/cjs/src/cli/index.js.map +4 -4
  5. package/dist/cjs/src/index.js +66 -25
  6. package/dist/cjs/src/index.js.map +112 -10
  7. package/dist/cjs/src/middleware/index.js +28 -2
  8. package/dist/cjs/src/middleware/index.js.map +79 -4
  9. package/dist/cjs/src/plugins/index.js +49 -23
  10. package/dist/cjs/src/plugins/index.js.map +74 -4
  11. package/dist/cjs/src/testing/index.js +30 -4
  12. package/dist/cjs/src/testing/index.js.map +80 -7
  13. package/dist/cjs/src/websocket/index.js +3 -3
  14. package/dist/cjs/src/websocket/index.js.map +1 -1
  15. package/dist/esm/src/cli/index.js +561 -22
  16. package/dist/esm/src/cli/index.js.map +8 -4
  17. package/dist/esm/src/docs/index.js +6 -6
  18. package/dist/esm/src/docs/index.js.map +10 -3
  19. package/dist/esm/src/errors/index.js +3 -2
  20. package/dist/esm/src/errors/index.js.map +7 -3
  21. package/dist/esm/src/graphql/index.js +82 -2
  22. package/dist/esm/src/graphql/index.js.map +18 -3
  23. package/dist/esm/src/index.js +165 -3
  24. package/dist/esm/src/index.js.map +202 -6
  25. package/dist/esm/src/middleware/index.js +28 -2
  26. package/dist/esm/src/middleware/index.js.map +81 -3
  27. package/dist/esm/src/plugins/index.js +113 -3
  28. package/dist/esm/src/plugins/index.js.map +131 -4
  29. package/dist/esm/src/testing/index.js +42 -2
  30. package/dist/esm/src/testing/index.js.map +97 -7
  31. package/dist/esm/src/types/index.js +2 -2
  32. package/dist/esm/src/types/index.js.map +10 -3
  33. package/dist/esm/src/validation/index.js +2 -2
  34. package/dist/esm/src/validation/index.js.map +13 -3
  35. package/dist/esm/src/websocket/index.js +15 -2
  36. package/dist/esm/src/websocket/index.js.map +9 -4
  37. package/dist/types/adapters/base.d.ts +10 -2
  38. package/dist/types/adapters/base.d.ts.map +1 -1
  39. package/dist/types/adapters/hono.d.ts +2 -2
  40. package/dist/types/adapters/hono.d.ts.map +1 -1
  41. package/dist/types/auth/permissions.d.ts +10 -10
  42. package/dist/types/auth/session.d.ts +2 -2
  43. package/dist/types/cache/index.d.ts +9 -0
  44. package/dist/types/cache/index.d.ts.map +1 -0
  45. package/dist/types/cache/manager.d.ts +75 -0
  46. package/dist/types/cache/manager.d.ts.map +1 -0
  47. package/dist/types/cache/memory-store.d.ts +55 -0
  48. package/dist/types/cache/memory-store.d.ts.map +1 -0
  49. package/dist/types/cache/redis-store.d.ts +55 -0
  50. package/dist/types/cache/redis-store.d.ts.map +1 -0
  51. package/dist/types/cache/types.d.ts +92 -0
  52. package/dist/types/cache/types.d.ts.map +1 -0
  53. package/dist/types/cli/commands/new.d.ts.map +1 -1
  54. package/dist/types/context/request-context.d.ts +66 -0
  55. package/dist/types/context/request-context.d.ts.map +1 -0
  56. package/dist/types/core/application.d.ts +11 -0
  57. package/dist/types/core/application.d.ts.map +1 -1
  58. package/dist/types/core/router-compiler.d.ts +1 -1
  59. package/dist/types/core/router-compiler.d.ts.map +1 -1
  60. package/dist/types/decorators/cache.d.ts +56 -0
  61. package/dist/types/decorators/cache.d.ts.map +1 -0
  62. package/dist/types/decorators/params.d.ts +24 -0
  63. package/dist/types/decorators/params.d.ts.map +1 -1
  64. package/dist/types/dependencies/container.d.ts +1 -1
  65. package/dist/types/dependencies/container.d.ts.map +1 -1
  66. package/dist/types/index.d.ts +7 -1
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/logging/index.d.ts +10 -0
  69. package/dist/types/logging/index.d.ts.map +1 -0
  70. package/dist/types/logging/logger.d.ts +25 -0
  71. package/dist/types/logging/logger.d.ts.map +1 -0
  72. package/dist/types/logging/middleware.d.ts +15 -0
  73. package/dist/types/logging/middleware.d.ts.map +1 -0
  74. package/dist/types/logging/types.d.ts +22 -0
  75. package/dist/types/logging/types.d.ts.map +1 -0
  76. package/dist/types/middleware/cache.d.ts +54 -0
  77. package/dist/types/middleware/cache.d.ts.map +1 -0
  78. package/dist/types/middleware/index.d.ts +3 -0
  79. package/dist/types/middleware/index.d.ts.map +1 -1
  80. package/dist/types/middleware/request-context.d.ts +55 -0
  81. package/dist/types/middleware/request-context.d.ts.map +1 -0
  82. package/dist/types/orm/base-repository.d.ts +77 -0
  83. package/dist/types/orm/base-repository.d.ts.map +1 -0
  84. package/dist/types/orm/decorators.d.ts +35 -0
  85. package/dist/types/orm/decorators.d.ts.map +1 -0
  86. package/dist/types/orm/drizzle/index.d.ts +6 -0
  87. package/dist/types/orm/drizzle/index.d.ts.map +1 -0
  88. package/dist/types/orm/drizzle/plugin.d.ts +165 -0
  89. package/dist/types/orm/drizzle/plugin.d.ts.map +1 -0
  90. package/dist/types/orm/drizzle/repository.d.ts +61 -0
  91. package/dist/types/orm/drizzle/repository.d.ts.map +1 -0
  92. package/dist/types/orm/drizzle/schema-converter.d.ts +53 -0
  93. package/dist/types/orm/drizzle/schema-converter.d.ts.map +1 -0
  94. package/dist/types/orm/drizzle/transaction-manager.d.ts +58 -0
  95. package/dist/types/orm/drizzle/transaction-manager.d.ts.map +1 -0
  96. package/dist/types/orm/drizzle/types.d.ts +121 -0
  97. package/dist/types/orm/drizzle/types.d.ts.map +1 -0
  98. package/dist/types/orm/index.d.ts +16 -0
  99. package/dist/types/orm/index.d.ts.map +1 -0
  100. package/dist/types/orm/pagination.d.ts +147 -0
  101. package/dist/types/orm/pagination.d.ts.map +1 -0
  102. package/dist/types/orm/prisma/index.d.ts +6 -0
  103. package/dist/types/orm/prisma/index.d.ts.map +1 -0
  104. package/dist/types/orm/prisma/plugin.d.ts +68 -0
  105. package/dist/types/orm/prisma/plugin.d.ts.map +1 -0
  106. package/dist/types/orm/prisma/repository.d.ts +70 -0
  107. package/dist/types/orm/prisma/repository.d.ts.map +1 -0
  108. package/dist/types/orm/prisma/schema-generator.d.ts +45 -0
  109. package/dist/types/orm/prisma/schema-generator.d.ts.map +1 -0
  110. package/dist/types/orm/prisma/transaction-manager.d.ts +32 -0
  111. package/dist/types/orm/prisma/transaction-manager.d.ts.map +1 -0
  112. package/dist/types/orm/prisma/types.d.ts +67 -0
  113. package/dist/types/orm/prisma/types.d.ts.map +1 -0
  114. package/dist/types/orm/query-builder.d.ts +129 -0
  115. package/dist/types/orm/query-builder.d.ts.map +1 -0
  116. package/dist/types/orm/repository-factory.d.ts +130 -0
  117. package/dist/types/orm/repository-factory.d.ts.map +1 -0
  118. package/dist/types/orm/transaction-events.d.ts +122 -0
  119. package/dist/types/orm/transaction-events.d.ts.map +1 -0
  120. package/dist/types/orm/transaction-interceptor.d.ts +30 -0
  121. package/dist/types/orm/transaction-interceptor.d.ts.map +1 -0
  122. package/dist/types/orm/transaction-manager.d.ts +64 -0
  123. package/dist/types/orm/transaction-manager.d.ts.map +1 -0
  124. package/dist/types/orm/transaction-plugin.d.ts +117 -0
  125. package/dist/types/orm/transaction-plugin.d.ts.map +1 -0
  126. package/dist/types/orm/transaction-propagation.d.ts +49 -0
  127. package/dist/types/orm/transaction-propagation.d.ts.map +1 -0
  128. package/dist/types/orm/typeorm/decorators.d.ts +40 -0
  129. package/dist/types/orm/typeorm/decorators.d.ts.map +1 -0
  130. package/dist/types/orm/typeorm/index.d.ts +6 -0
  131. package/dist/types/orm/typeorm/index.d.ts.map +1 -0
  132. package/dist/types/orm/typeorm/plugin.d.ts +100 -0
  133. package/dist/types/orm/typeorm/plugin.d.ts.map +1 -0
  134. package/dist/types/orm/typeorm/repository.d.ts +58 -0
  135. package/dist/types/orm/typeorm/repository.d.ts.map +1 -0
  136. package/dist/types/orm/typeorm/transaction-manager.d.ts +48 -0
  137. package/dist/types/orm/typeorm/transaction-manager.d.ts.map +1 -0
  138. package/dist/types/orm/typeorm/types.d.ts +139 -0
  139. package/dist/types/orm/typeorm/types.d.ts.map +1 -0
  140. package/dist/types/plugins/health.d.ts +75 -0
  141. package/dist/types/plugins/health.d.ts.map +1 -0
  142. package/dist/types/plugins/index.d.ts +2 -0
  143. package/dist/types/plugins/index.d.ts.map +1 -1
  144. package/dist/types/types/index.d.ts +15 -2
  145. package/dist/types/types/index.d.ts.map +1 -1
  146. package/dist/types/websocket/index.d.ts +1 -1
  147. package/dist/types/websocket/index.d.ts.map +1 -1
  148. package/package.json +22 -2
  149. package/dist/esm/chunk-2100y16g.js +0 -5
  150. package/dist/esm/chunk-2100y16g.js.map +0 -10
  151. package/dist/esm/chunk-5q75d71c.js +0 -4
  152. package/dist/esm/chunk-5q75d71c.js.map +0 -16
  153. package/dist/esm/chunk-8dpc6an2.js +0 -7
  154. package/dist/esm/chunk-8dpc6an2.js.map +0 -10
  155. package/dist/esm/chunk-9v7atckx.js +0 -5
  156. package/dist/esm/chunk-9v7atckx.js.map +0 -10
  157. package/dist/esm/chunk-bvstdn0t.js +0 -60
  158. package/dist/esm/chunk-bvstdn0t.js.map +0 -10
  159. package/dist/esm/chunk-ctwpr5gr.js +0 -430
  160. package/dist/esm/chunk-ctwpr5gr.js.map +0 -10
  161. package/dist/esm/chunk-dtw2tbsd.js +0 -5
  162. package/dist/esm/chunk-dtw2tbsd.js.map +0 -12
  163. package/dist/esm/chunk-ef0vfd27.js +0 -72
  164. package/dist/esm/chunk-ef0vfd27.js.map +0 -13
  165. package/dist/esm/chunk-k66rn4fj.js +0 -18
  166. package/dist/esm/chunk-k66rn4fj.js.map +0 -10
  167. package/dist/esm/chunk-mky5qqg0.js +0 -5
  168. package/dist/esm/chunk-mky5qqg0.js.map +0 -10
  169. package/dist/esm/chunk-mznkhz9c.js +0 -5
  170. package/dist/esm/chunk-mznkhz9c.js.map +0 -12
  171. package/dist/esm/chunk-s5z0wb7e.js +0 -5
  172. package/dist/esm/chunk-s5z0wb7e.js.map +0 -10
  173. package/dist/esm/chunk-vh4sxcpe.js +0 -6
  174. package/dist/esm/chunk-vh4sxcpe.js.map +0 -10
  175. package/dist/esm/chunk-xa333k40.js +0 -7
  176. package/dist/esm/chunk-xa333k40.js.map +0 -10
  177. package/dist/esm/chunk-y262e56g.js +0 -5
  178. package/dist/esm/chunk-y262e56g.js.map +0 -9
  179. package/dist/esm/chunk-yq3gf9ts.js +0 -5
  180. package/dist/esm/chunk-yq3gf9ts.js.map +0 -10
@@ -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": "9CCAEB503A40C66664756E2164756E21",
9
- "names": []
10
- }
@@ -1,60 +0,0 @@
1
- // @bun
2
- import"./chunk-y262e56g.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,430 +0,0 @@
1
- // @bun
2
- import"./chunk-y262e56g.js";import{mkdir as K,writeFile as D}from"fs/promises";import{readFileSync as X,existsSync as Y}from"fs";import{join as A}from"path";var Z=()=>{try{let q=A(process.cwd(),"package.json");return JSON.parse(X(q,"utf-8")).version||"0.2.1"}catch{return"0.2.1"}};async function _(q){await D(A(q,"public","docs.html"),`<!DOCTYPE html>
3
- <html lang="en">
4
- <head>
5
- <meta charset="utf-8" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1" />
7
- <title>API Documentation</title>
8
- <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui.css" />
9
- <style>
10
- body { margin: 0; padding: 0; }
11
- </style>
12
- </head>
13
- <body>
14
- <div id="swagger-ui"></div>
15
- <script src="https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-bundle.js" crossorigin></script>
16
- <script src="https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-standalone-preset.js" crossorigin></script>
17
- <script>
18
- window.onload = () => {
19
- window.ui = SwaggerUIBundle({
20
- url: 'http://localhost:3000/openapi.json',
21
- dom_id: '#swagger-ui',
22
- deepLinking: true,
23
- presets: [
24
- SwaggerUIBundle.presets.apis,
25
- SwaggerUIStandalonePreset
26
- ],
27
- layout: "StandaloneLayout"
28
- });
29
- };
30
- </script>
31
- </body>
32
- </html>`)}function v(q){q.command("new").description("Create a new VeloceTS project").argument("<name>","Project name").option("-t, --template <template>","Project template (rest, graphql, websocket, fullstack)","rest").action(async(B,z)=>{await $(B,z)})}async function $(q,B){let z=A(process.cwd(),q);if(Y(z))console.error(`Error: Directory "${q}" already exists`),process.exit(1);console.log(`Creating new VeloceTS project: ${q}`),console.log(`Template: ${B.template}`);try{switch(await K(z,{recursive:!0}),await K(A(z,"src"),{recursive:!0}),await K(A(z,"src","controllers"),{recursive:!0}),await E(z,q),await H(z),await M(z),await V(z,q,B.template),B.template){case"rest":await u(z);break;case"graphql":await x(z);break;case"websocket":await I(z);break;case"fullstack":await J(z);break}await K(A(z,"public"),{recursive:!0}),await _(z),console.log(`
33
- \u2713 Project created successfully!`),console.log(`
34
- Next steps:`),console.log(` cd ${q}`),console.log(" bun install"),console.log(" bun run dev")}catch(N){console.error("Error creating project:",N),process.exit(1)}}async function E(q,B){let z={name:B,version:"0.1.0",description:"A Veloce-TS application",type:"module",main:"./dist/index.js",scripts:{dev:"bun --watch src/index.ts",build:"bun build src/index.ts --outdir dist --target bun",start:"bun run dist/index.js","generate:openapi":"bun run node_modules/veloce-ts/bin/veloce.ts generate openapi","generate:client":"bun run node_modules/veloce-ts/bin/veloce.ts generate client"},dependencies:{"veloce-ts":`^${Z()}`,hono:"^4.0.0","reflect-metadata":"^0.2.0",zod:"^3.22.0"},devDependencies:{"@types/bun":"latest",typescript:"^5.3.0"}};await D(A(q,"package.json"),JSON.stringify(z,null,2))}async function H(q){let B={compilerOptions:{target:"ES2022",module:"ESNext",lib:["ES2022"],moduleResolution:"bundler",experimentalDecorators:!0,emitDecoratorMetadata:!0,strict:!0,esModuleInterop:!0,skipLibCheck:!0,forceConsistentCasingInFileNames:!0,resolveJsonModule:!0,outDir:"./dist",rootDir:"./src"},include:["src/**/*"],exclude:["node_modules","dist"]};await D(A(q,"tsconfig.json"),JSON.stringify(B,null,2))}async function M(q){await D(A(q,".gitignore"),`node_modules/
35
- dist/
36
- *.log
37
- .env
38
- .DS_Store
39
- `)}async function V(q,B,z){let N=`# ${B}
40
-
41
- A modern TypeScript API built with [Veloce-TS](https://github.com/AlfredoMejia3001/veloce-ts) using the **${z}** template.
42
-
43
- ## Getting Started
44
-
45
- ### Install Dependencies
46
-
47
- \`\`\`bash
48
- bun install
49
- \`\`\`
50
-
51
- ### Development
52
-
53
- Run the development server with hot reload:
54
-
55
- \`\`\`bash
56
- bun run dev
57
- \`\`\`
58
-
59
- Your API will be available at http://localhost:3000
60
-
61
- ### Production
62
-
63
- Build and start the production server:
64
-
65
- \`\`\`bash
66
- bun run build
67
- bun run start
68
- \`\`\`
69
-
70
- ## Documentation
71
-
72
- - **API Documentation**: Visit http://localhost:3000/docs.html for interactive Swagger UI
73
- - **Veloce-TS Docs**: Check out the [official documentation](https://docs.veloce-ts.com)
74
-
75
- ## Project Structure
76
-
77
- \`\`\`
78
- ${B}/
79
- \u251C\u2500\u2500 src/
80
- \u2502 \u2514\u2500\u2500 index.ts # Application entry point
81
- \u251C\u2500\u2500 package.json
82
- \u251C\u2500\u2500 tsconfig.json
83
- \u2514\u2500\u2500 README.md
84
- \`\`\`
85
-
86
- ## Learn More
87
-
88
- - [Veloce-TS GitHub](https://github.com/AlfredoMejia3001/veloce-ts)
89
- - [TypeScript Documentation](https://www.typescriptlang.org/docs/)
90
- - [Bun Documentation](https://bun.sh/docs)
91
-
92
- ---
93
-
94
- Built with Veloce-TS
95
- `;await D(A(q,"README.md"),N)}async function u(q){await D(A(q,"src","index.ts"),`import 'reflect-metadata';
96
- import { Veloce } from 'veloce-ts';
97
- import { OpenAPIPlugin } from 'veloce-ts/plugins';
98
- import { UserController } from './controllers/user.controller';
99
- import { cors } from 'hono/cors';
100
- import { serveStatic } from 'hono/bun';
101
-
102
- const app = new Veloce({
103
- title: 'My REST API',
104
- version: '1.0.0',
105
- docs: true,
106
- });
107
-
108
- // Enable CORS
109
- app.use(cors());
110
-
111
- // Serve static files (for Swagger UI)
112
- app.use(serveStatic({ root: './public' }));
113
-
114
- // Enable OpenAPI documentation
115
- app.usePlugin(new OpenAPIPlugin({
116
- path: '/openapi.json',
117
- docsPath: '/docs',
118
- }));
119
-
120
- // Register controllers
121
- app.include(UserController);
122
-
123
- // Compile routes
124
- await app.compile();
125
-
126
- // Start server
127
- app.listen(3000, () => {
128
- console.log('Server running on http://localhost:3000');
129
- console.log('API Docs available at http://localhost:3000/docs.html');
130
- console.log('OpenAPI Spec at http://localhost:3000/openapi.json');
131
- });
132
- `);let z=`import { Controller, Get, Post, Body, Param } from 'veloce-ts';
133
- import { z } from 'zod';
134
-
135
- const UserSchema = z.object({
136
- name: z.string(),
137
- email: z.string().email(),
138
- age: z.number().min(0).optional(),
139
- });
140
-
141
- type User = z.infer<typeof UserSchema>;
142
-
143
- @Controller('/users')
144
- export class UserController {
145
- private users: User[] = [];
146
-
147
- @Get('/')
148
- async getUsers() {
149
- return { users: this.users };
150
- }
151
-
152
- @Get('/:id')
153
- async getUser(@Param('id') id: string) {
154
- const user = this.users[parseInt(id)];
155
- if (!user) {
156
- throw new Error('User not found');
157
- }
158
- return user;
159
- }
160
-
161
- @Post('/')
162
- async createUser(@Body(UserSchema) user: User) {
163
- this.users.push(user);
164
- return { message: 'User created', user };
165
- }
166
- }
167
- `;await D(A(q,"src","controllers","user.controller.ts"),z)}async function x(q){await K(A(q,"src","resolvers"),{recursive:!0});let B=`import 'reflect-metadata';
168
- import { Veloce } from 'veloce-ts';
169
- import { GraphQLPlugin } from 'veloce-ts/plugins';
170
- import { UserResolver } from './resolvers/user.resolver';
171
-
172
- const app = new Veloce({
173
- title: 'My GraphQL API',
174
- version: '1.0.0',
175
- });
176
-
177
- // Enable GraphQL
178
- app.usePlugin(new GraphQLPlugin({
179
- resolvers: [UserResolver],
180
- }));
181
-
182
- // Compile routes
183
- await app.compile();
184
-
185
- app.listen(3000, () => {
186
- console.log('Server running on http://localhost:3000');
187
- console.log('GraphQL Playground at http://localhost:3000/graphql');
188
- });
189
- `;await D(A(q,"src","index.ts"),B);let z=`import { Resolver, Query, Mutation, Arg } from 'veloce-ts/graphql';
190
- import { z } from 'zod';
191
-
192
- const UserSchema = z.object({
193
- id: z.string(),
194
- name: z.string(),
195
- email: z.string().email(),
196
- });
197
-
198
- type User = z.infer<typeof UserSchema>;
199
-
200
- @Resolver()
201
- export class UserResolver {
202
- private users: User[] = [];
203
-
204
- @Query()
205
- async users(): Promise<User[]> {
206
- return this.users;
207
- }
208
-
209
- @Query()
210
- async user(@Arg('id', z.string()) id: string): Promise<User | null> {
211
- return this.users.find(u => u.id === id) || null;
212
- }
213
-
214
- @Mutation()
215
- async createUser(
216
- @Arg('name', z.string()) name: string,
217
- @Arg('email', z.string().email()) email: string
218
- ): Promise<User> {
219
- const user = { id: Date.now().toString(), name, email };
220
- this.users.push(user);
221
- return user;
222
- }
223
- }
224
- `;await D(A(q,"src","resolvers","user.resolver.ts"),z)}async function I(q){await K(A(q,"src","websockets"),{recursive:!0});let B=`import 'reflect-metadata';
225
- import { Veloce } from 'veloce-ts';
226
- import { WebSocketPlugin } from 'veloce-ts/plugins';
227
- import { ChatWebSocket } from './websockets/chat.websocket';
228
-
229
- const app = new Veloce({
230
- title: 'My WebSocket API',
231
- version: '1.0.0',
232
- });
233
-
234
- // Enable WebSocket
235
- app.usePlugin(new WebSocketPlugin({
236
- handlers: [ChatWebSocket],
237
- }));
238
-
239
- // Compile routes
240
- await app.compile();
241
-
242
- app.listen(3000, () => {
243
- console.log('Server running on http://localhost:3000');
244
- console.log('WebSocket endpoint at ws://localhost:3000/ws/chat');
245
- });
246
- `;await D(A(q,"src","index.ts"),B);let z=`import { WebSocket, OnConnect, OnMessage, OnDisconnect } from 'veloce-ts/websocket';
247
- import { z } from 'zod';
248
- import type { WebSocketConnection } from 'veloce-ts/websocket';
249
-
250
- const MessageSchema = z.object({
251
- type: z.enum(['message', 'join', 'leave']),
252
- content: z.string(),
253
- username: z.string(),
254
- });
255
-
256
- @WebSocket('/ws/chat')
257
- export class ChatWebSocket {
258
- @OnConnect()
259
- handleConnect(connection: WebSocketConnection) {
260
- console.log('Client connected:', connection.id);
261
- connection.send({ type: 'system', content: 'Welcome to the chat!' });
262
- }
263
-
264
- @OnMessage(MessageSchema)
265
- async handleMessage(connection: WebSocketConnection, message: z.infer<typeof MessageSchema>) {
266
- console.log('Received message:', message);
267
-
268
- // Broadcast to all clients
269
- connection.broadcast({
270
- type: 'message',
271
- username: message.username,
272
- content: message.content,
273
- timestamp: new Date().toISOString(),
274
- });
275
- }
276
-
277
- @OnDisconnect()
278
- handleDisconnect(connection: WebSocketConnection) {
279
- console.log('Client disconnected:', connection.id);
280
- }
281
- }
282
- `;await D(A(q,"src","websockets","chat.websocket.ts"),z)}async function J(q){await K(A(q,"src","controllers"),{recursive:!0}),await K(A(q,"src","resolvers"),{recursive:!0}),await K(A(q,"src","websockets"),{recursive:!0});let B=`import 'reflect-metadata';
283
- import { Veloce } from 'veloce-ts';
284
- import { OpenAPIPlugin, GraphQLPlugin, WebSocketPlugin } from 'veloce-ts/plugins';
285
- import { UserController } from './controllers/user.controller';
286
- import { UserResolver } from './resolvers/user.resolver';
287
- import { ChatWebSocket } from './websockets/chat.websocket';
288
-
289
- const app = new Veloce({
290
- title: 'My Fullstack API',
291
- version: '1.0.0',
292
- docs: true,
293
- });
294
-
295
- // Enable OpenAPI documentation
296
- app.usePlugin(new OpenAPIPlugin({
297
- path: '/docs',
298
- }));
299
-
300
- // REST API
301
- app.include(UserController);
302
-
303
- // GraphQL
304
- app.usePlugin(new GraphQLPlugin({
305
- resolvers: [UserResolver],
306
- }));
307
-
308
- // WebSocket
309
- app.usePlugin(new WebSocketPlugin({
310
- handlers: [ChatWebSocket],
311
- }));
312
-
313
- // Compile routes
314
- await app.compile();
315
-
316
- app.listen(3000, () => {
317
- console.log('Server running on http://localhost:3000');
318
- console.log('REST API docs at http://localhost:3000/docs');
319
- console.log('GraphQL Playground at http://localhost:3000/graphql');
320
- console.log('WebSocket endpoint at ws://localhost:3000/ws/chat');
321
- });
322
- `;await D(A(q,"src","index.ts"),B);let z=`import { Controller, Get, Post, Body, Param } from 'veloce-ts';
323
- import { z } from 'zod';
324
-
325
- const UserSchema = z.object({
326
- name: z.string(),
327
- email: z.string().email(),
328
- age: z.number().min(0).optional(),
329
- });
330
-
331
- type User = z.infer<typeof UserSchema>;
332
-
333
- @Controller('/users')
334
- export class UserController {
335
- private users: User[] = [];
336
-
337
- @Get('/')
338
- async getUsers() {
339
- return { users: this.users };
340
- }
341
-
342
- @Get('/:id')
343
- async getUser(@Param('id') id: string) {
344
- const user = this.users[parseInt(id)];
345
- if (!user) {
346
- throw new Error('User not found');
347
- }
348
- return user;
349
- }
350
-
351
- @Post('/')
352
- async createUser(@Body(UserSchema) user: User) {
353
- this.users.push(user);
354
- return { message: 'User created', user };
355
- }
356
- }
357
- `;await D(A(q,"src","controllers","user.controller.ts"),z);let N=`import { Resolver, Query, Mutation, Arg } from 'veloce-ts/graphql';
358
- import { z } from 'zod';
359
-
360
- const UserSchema = z.object({
361
- id: z.string(),
362
- name: z.string(),
363
- email: z.string().email(),
364
- });
365
-
366
- type User = z.infer<typeof UserSchema>;
367
-
368
- @Resolver()
369
- export class UserResolver {
370
- private users: User[] = [];
371
-
372
- @Query()
373
- async users(): Promise<User[]> {
374
- return this.users;
375
- }
376
-
377
- @Query()
378
- async user(@Arg('id', z.string()) id: string): Promise<User | null> {
379
- return this.users.find(u => u.id === id) || null;
380
- }
381
-
382
- @Mutation()
383
- async createUser(
384
- @Arg('name', z.string()) name: string,
385
- @Arg('email', z.string().email()) email: string
386
- ): Promise<User> {
387
- const user = { id: Date.now().toString(), name, email };
388
- this.users.push(user);
389
- return user;
390
- }
391
- }
392
- `;await D(A(q,"src","resolvers","user.resolver.ts"),N);let O=`import { WebSocket, OnConnect, OnMessage, OnDisconnect } from 'veloce-ts/websocket';
393
- import { z } from 'zod';
394
- import type { WebSocketConnection } from 'veloce-ts/websocket';
395
-
396
- const MessageSchema = z.object({
397
- type: z.enum(['message', 'join', 'leave']),
398
- content: z.string(),
399
- username: z.string(),
400
- });
401
-
402
- @WebSocket('/ws/chat')
403
- export class ChatWebSocket {
404
- @OnConnect()
405
- handleConnect(connection: WebSocketConnection) {
406
- console.log('Client connected:', connection.id);
407
- connection.send({ type: 'system', content: 'Welcome to the chat!' });
408
- }
409
-
410
- @OnMessage(MessageSchema)
411
- async handleMessage(connection: WebSocketConnection, message: z.infer<typeof MessageSchema>) {
412
- console.log('Received message:', message);
413
-
414
- // Broadcast to all clients
415
- connection.broadcast({
416
- type: 'message',
417
- username: message.username,
418
- content: message.content,
419
- timestamp: new Date().toISOString(),
420
- });
421
- }
422
-
423
- @OnDisconnect()
424
- handleDisconnect(connection: WebSocketConnection) {
425
- console.log('Client disconnected:', connection.id);
426
- }
427
- }
428
- `;await D(A(q,"src","websockets","chat.websocket.ts"),O)}export{v as registerNewCommand};
429
-
430
- //# debugId=D5BAB43B8E075A1864756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["..\\..\\src\\cli\\commands\\new.ts"],
4
- "sourcesContent": [
5
- "import { Command } from 'commander';\r\nimport { mkdir, writeFile } from 'fs/promises';\r\nimport { readFileSync, existsSync } from 'fs';\r\nimport { join } from 'path';\r\n\r\n// Get current package version\r\nconst getVersion = (): string => {\r\n try {\r\n const packagePath = join(process.cwd(), 'package.json');\r\n const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));\r\n return packageJson.version || '0.2.1';\r\n } catch {\r\n return '0.2.1';\r\n }\r\n};\r\n\r\nasync function generateSwaggerUI(projectPath: string): Promise<void> {\r\n const html = `<!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\" />\r\n <title>API Documentation</title>\r\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui.css\" />\r\n <style>\r\n body { margin: 0; padding: 0; }\r\n </style>\r\n</head>\r\n<body>\r\n <div id=\"swagger-ui\"></div>\r\n <script src=\"https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-bundle.js\" crossorigin></script>\r\n <script src=\"https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-standalone-preset.js\" crossorigin></script>\r\n <script>\r\n window.onload = () => {\r\n window.ui = SwaggerUIBundle({\r\n url: 'http://localhost:3000/openapi.json',\r\n dom_id: '#swagger-ui',\r\n deepLinking: true,\r\n presets: [\r\n SwaggerUIBundle.presets.apis,\r\n SwaggerUIStandalonePreset\r\n ],\r\n layout: \"StandaloneLayout\"\r\n });\r\n };\r\n </script>\r\n</body>\r\n</html>`;\r\n \r\n await writeFile(join(projectPath, 'public', 'docs.html'), html);\r\n}\r\n\r\ntype Template = 'rest' | 'graphql' | 'websocket' | 'fullstack';\r\n\r\ninterface ProjectOptions {\r\n template: Template;\r\n}\r\n\r\nexport function registerNewCommand(program: Command): void {\r\n program\r\n .command('new')\r\n .description('Create a new VeloceTS project')\r\n .argument('<name>', 'Project name')\r\n .option('-t, --template <template>', 'Project template (rest, graphql, websocket, fullstack)', 'rest')\r\n .action(async (name: string, options: ProjectOptions) => {\r\n await createProject(name, options);\r\n });\r\n}\r\n\r\nasync function createProject(name: string, options: ProjectOptions): Promise<void> {\r\n const projectPath = join(process.cwd(), name);\r\n\r\n // Check if directory already exists\r\n if (existsSync(projectPath)) {\r\n console.error(`Error: Directory \"${name}\" already exists`);\r\n process.exit(1);\r\n }\r\n\r\n console.log(`Creating new VeloceTS project: ${name}`);\r\n console.log(`Template: ${options.template}`);\r\n\r\n try {\r\n // Create project directory\r\n await mkdir(projectPath, { recursive: true });\r\n\r\n // Create subdirectories\r\n await mkdir(join(projectPath, 'src'), { recursive: true });\r\n await mkdir(join(projectPath, 'src', 'controllers'), { recursive: true });\r\n\r\n // Generate files based on template\r\n await generatePackageJson(projectPath, name);\r\n await generateTsConfig(projectPath);\r\n await generateGitignore(projectPath);\r\n await generateReadme(projectPath, name, options.template);\r\n\r\n switch (options.template) {\r\n case 'rest':\r\n await generateRestTemplate(projectPath);\r\n break;\r\n case 'graphql':\r\n await generateGraphQLTemplate(projectPath);\r\n break;\r\n case 'websocket':\r\n await generateWebSocketTemplate(projectPath);\r\n break;\r\n case 'fullstack':\r\n await generateFullstackTemplate(projectPath);\r\n break;\r\n }\r\n\r\n // Generate public directory with Swagger UI HTML\r\n await mkdir(join(projectPath, 'public'), { recursive: true });\r\n await generateSwaggerUI(projectPath);\r\n\r\n console.log('\\n✓ Project created successfully!');\r\n console.log('\\nNext steps:');\r\n console.log(` cd ${name}`);\r\n console.log(' bun install');\r\n console.log(' bun run dev');\r\n } catch (error) {\r\n console.error('Error creating project:', error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function generatePackageJson(projectPath: string, name: string): Promise<void> {\r\n const packageJson = {\r\n name,\r\n version: '0.1.0',\r\n description: 'A Veloce-TS application',\r\n type: 'module',\r\n main: './dist/index.js',\r\n scripts: {\r\n dev: 'bun --watch src/index.ts',\r\n build: 'bun build src/index.ts --outdir dist --target bun',\r\n start: 'bun run dist/index.js',\r\n 'generate:openapi': 'bun run node_modules/veloce-ts/bin/veloce.ts generate openapi',\r\n 'generate:client': 'bun run node_modules/veloce-ts/bin/veloce.ts generate client',\r\n },\r\n dependencies: {\r\n 'veloce-ts': `^${getVersion()}`,\r\n hono: '^4.0.0',\r\n 'reflect-metadata': '^0.2.0',\r\n zod: '^3.22.0',\r\n },\r\n devDependencies: {\r\n '@types/bun': 'latest',\r\n typescript: '^5.3.0',\r\n },\r\n };\r\n\r\n await writeFile(\r\n join(projectPath, 'package.json'),\r\n JSON.stringify(packageJson, null, 2)\r\n );\r\n}\r\n\r\nasync function generateTsConfig(projectPath: string): Promise<void> {\r\n const tsConfig = {\r\n compilerOptions: {\r\n target: 'ES2022',\r\n module: 'ESNext',\r\n lib: ['ES2022'],\r\n moduleResolution: 'bundler',\r\n experimentalDecorators: true,\r\n emitDecoratorMetadata: true,\r\n strict: true,\r\n esModuleInterop: true,\r\n skipLibCheck: true,\r\n forceConsistentCasingInFileNames: true,\r\n resolveJsonModule: true,\r\n outDir: './dist',\r\n rootDir: './src',\r\n },\r\n include: ['src/**/*'],\r\n exclude: ['node_modules', 'dist'],\r\n };\r\n\r\n await writeFile(\r\n join(projectPath, 'tsconfig.json'),\r\n JSON.stringify(tsConfig, null, 2)\r\n );\r\n}\r\n\r\nasync function generateGitignore(projectPath: string): Promise<void> {\r\n const gitignore = `node_modules/\r\ndist/\r\n*.log\r\n.env\r\n.DS_Store\r\n`;\r\n\r\n await writeFile(join(projectPath, '.gitignore'), gitignore);\r\n}\r\n\r\nasync function generateReadme(projectPath: string, name: string, template: Template): Promise<void> {\r\n const readme = `# ${name}\r\n\r\nA modern TypeScript API built with [Veloce-TS](https://github.com/AlfredoMejia3001/veloce-ts) using the **${template}** template.\r\n\r\n## Getting Started\r\n\r\n### Install Dependencies\r\n\r\n\\`\\`\\`bash\r\nbun install\r\n\\`\\`\\`\r\n\r\n### Development\r\n\r\nRun the development server with hot reload:\r\n\r\n\\`\\`\\`bash\r\nbun run dev\r\n\\`\\`\\`\r\n\r\nYour API will be available at http://localhost:3000\r\n\r\n### Production\r\n\r\nBuild and start the production server:\r\n\r\n\\`\\`\\`bash\r\nbun run build\r\nbun run start\r\n\\`\\`\\`\r\n\r\n## Documentation\r\n\r\n- **API Documentation**: Visit http://localhost:3000/docs.html for interactive Swagger UI\r\n- **Veloce-TS Docs**: Check out the [official documentation](https://docs.veloce-ts.com)\r\n\r\n## Project Structure\r\n\r\n\\`\\`\\`\r\n${name}/\r\n├── src/\r\n│ └── index.ts # Application entry point\r\n├── package.json\r\n├── tsconfig.json\r\n└── README.md\r\n\\`\\`\\`\r\n\r\n## Learn More\r\n\r\n- [Veloce-TS GitHub](https://github.com/AlfredoMejia3001/veloce-ts)\r\n- [TypeScript Documentation](https://www.typescriptlang.org/docs/)\r\n- [Bun Documentation](https://bun.sh/docs)\r\n\r\n---\r\n\r\nBuilt with Veloce-TS\r\n`;\r\n\r\n await writeFile(join(projectPath, 'README.md'), readme);\r\n}\r\n\r\nasync function generateRestTemplate(projectPath: string): Promise<void> {\r\n // Create main entry point\r\n const mainFile = `import 'reflect-metadata';\r\nimport { Veloce } from 'veloce-ts';\r\nimport { OpenAPIPlugin } from 'veloce-ts/plugins';\r\nimport { UserController } from './controllers/user.controller';\r\nimport { cors } from 'hono/cors';\r\nimport { serveStatic } from 'hono/bun';\r\n\r\nconst app = new Veloce({\r\n title: 'My REST API',\r\n version: '1.0.0',\r\n docs: true,\r\n});\r\n\r\n// Enable CORS\r\napp.use(cors());\r\n\r\n// Serve static files (for Swagger UI)\r\napp.use(serveStatic({ root: './public' }));\r\n\r\n// Enable OpenAPI documentation\r\napp.usePlugin(new OpenAPIPlugin({\r\n path: '/openapi.json',\r\n docsPath: '/docs',\r\n}));\r\n\r\n// Register controllers\r\napp.include(UserController);\r\n\r\n// Compile routes\r\nawait app.compile();\r\n\r\n// Start server\r\napp.listen(3000, () => {\r\n console.log('Server running on http://localhost:3000');\r\n console.log('API Docs available at http://localhost:3000/docs.html');\r\n console.log('OpenAPI Spec at http://localhost:3000/openapi.json');\r\n});\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'index.ts'), mainFile);\r\n\r\n // Create example controller\r\n const controllerFile = `import { Controller, Get, Post, Body, Param } from 'veloce-ts';\r\nimport { z } from 'zod';\r\n\r\nconst UserSchema = z.object({\r\n name: z.string(),\r\n email: z.string().email(),\r\n age: z.number().min(0).optional(),\r\n});\r\n\r\ntype User = z.infer<typeof UserSchema>;\r\n\r\n@Controller('/users')\r\nexport class UserController {\r\n private users: User[] = [];\r\n\r\n @Get('/')\r\n async getUsers() {\r\n return { users: this.users };\r\n }\r\n\r\n @Get('/:id')\r\n async getUser(@Param('id') id: string) {\r\n const user = this.users[parseInt(id)];\r\n if (!user) {\r\n throw new Error('User not found');\r\n }\r\n return user;\r\n }\r\n\r\n @Post('/')\r\n async createUser(@Body(UserSchema) user: User) {\r\n this.users.push(user);\r\n return { message: 'User created', user };\r\n }\r\n}\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'controllers', 'user.controller.ts'), controllerFile);\r\n}\r\n\r\nasync function generateGraphQLTemplate(projectPath: string): Promise<void> {\r\n await mkdir(join(projectPath, 'src', 'resolvers'), { recursive: true });\r\n\r\n const mainFile = `import 'reflect-metadata';\r\nimport { Veloce } from 'veloce-ts';\r\nimport { GraphQLPlugin } from 'veloce-ts/plugins';\r\nimport { UserResolver } from './resolvers/user.resolver';\r\n\r\nconst app = new Veloce({\r\n title: 'My GraphQL API',\r\n version: '1.0.0',\r\n});\r\n\r\n// Enable GraphQL\r\napp.usePlugin(new GraphQLPlugin({\r\n resolvers: [UserResolver],\r\n}));\r\n\r\n// Compile routes\r\nawait app.compile();\r\n\r\napp.listen(3000, () => {\r\n console.log('Server running on http://localhost:3000');\r\n console.log('GraphQL Playground at http://localhost:3000/graphql');\r\n});\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'index.ts'), mainFile);\r\n\r\n const resolverFile = `import { Resolver, Query, Mutation, Arg } from 'veloce-ts/graphql';\r\nimport { z } from 'zod';\r\n\r\nconst UserSchema = z.object({\r\n id: z.string(),\r\n name: z.string(),\r\n email: z.string().email(),\r\n});\r\n\r\ntype User = z.infer<typeof UserSchema>;\r\n\r\n@Resolver()\r\nexport class UserResolver {\r\n private users: User[] = [];\r\n\r\n @Query()\r\n async users(): Promise<User[]> {\r\n return this.users;\r\n }\r\n\r\n @Query()\r\n async user(@Arg('id', z.string()) id: string): Promise<User | null> {\r\n return this.users.find(u => u.id === id) || null;\r\n }\r\n\r\n @Mutation()\r\n async createUser(\r\n @Arg('name', z.string()) name: string,\r\n @Arg('email', z.string().email()) email: string\r\n ): Promise<User> {\r\n const user = { id: Date.now().toString(), name, email };\r\n this.users.push(user);\r\n return user;\r\n }\r\n}\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'resolvers', 'user.resolver.ts'), resolverFile);\r\n}\r\n\r\nasync function generateWebSocketTemplate(projectPath: string): Promise<void> {\r\n await mkdir(join(projectPath, 'src', 'websockets'), { recursive: true });\r\n\r\n const mainFile = `import 'reflect-metadata';\r\nimport { Veloce } from 'veloce-ts';\r\nimport { WebSocketPlugin } from 'veloce-ts/plugins';\r\nimport { ChatWebSocket } from './websockets/chat.websocket';\r\n\r\nconst app = new Veloce({\r\n title: 'My WebSocket API',\r\n version: '1.0.0',\r\n});\r\n\r\n// Enable WebSocket\r\napp.usePlugin(new WebSocketPlugin({\r\n handlers: [ChatWebSocket],\r\n}));\r\n\r\n// Compile routes\r\nawait app.compile();\r\n\r\napp.listen(3000, () => {\r\n console.log('Server running on http://localhost:3000');\r\n console.log('WebSocket endpoint at ws://localhost:3000/ws/chat');\r\n});\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'index.ts'), mainFile);\r\n\r\n const websocketFile = `import { WebSocket, OnConnect, OnMessage, OnDisconnect } from 'veloce-ts/websocket';\r\nimport { z } from 'zod';\r\nimport type { WebSocketConnection } from 'veloce-ts/websocket';\r\n\r\nconst MessageSchema = z.object({\r\n type: z.enum(['message', 'join', 'leave']),\r\n content: z.string(),\r\n username: z.string(),\r\n});\r\n\r\n@WebSocket('/ws/chat')\r\nexport class ChatWebSocket {\r\n @OnConnect()\r\n handleConnect(connection: WebSocketConnection) {\r\n console.log('Client connected:', connection.id);\r\n connection.send({ type: 'system', content: 'Welcome to the chat!' });\r\n }\r\n\r\n @OnMessage(MessageSchema)\r\n async handleMessage(connection: WebSocketConnection, message: z.infer<typeof MessageSchema>) {\r\n console.log('Received message:', message);\r\n \r\n // Broadcast to all clients\r\n connection.broadcast({\r\n type: 'message',\r\n username: message.username,\r\n content: message.content,\r\n timestamp: new Date().toISOString(),\r\n });\r\n }\r\n\r\n @OnDisconnect()\r\n handleDisconnect(connection: WebSocketConnection) {\r\n console.log('Client disconnected:', connection.id);\r\n }\r\n}\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'websockets', 'chat.websocket.ts'), websocketFile);\r\n}\r\n\r\nasync function generateFullstackTemplate(projectPath: string): Promise<void> {\r\n await mkdir(join(projectPath, 'src', 'controllers'), { recursive: true });\r\n await mkdir(join(projectPath, 'src', 'resolvers'), { recursive: true });\r\n await mkdir(join(projectPath, 'src', 'websockets'), { recursive: true });\r\n\r\n // Generate main file\r\n const mainFile = `import 'reflect-metadata';\r\nimport { Veloce } from 'veloce-ts';\r\nimport { OpenAPIPlugin, GraphQLPlugin, WebSocketPlugin } from 'veloce-ts/plugins';\r\nimport { UserController } from './controllers/user.controller';\r\nimport { UserResolver } from './resolvers/user.resolver';\r\nimport { ChatWebSocket } from './websockets/chat.websocket';\r\n\r\nconst app = new Veloce({\r\n title: 'My Fullstack API',\r\n version: '1.0.0',\r\n docs: true,\r\n});\r\n\r\n// Enable OpenAPI documentation\r\napp.usePlugin(new OpenAPIPlugin({\r\n path: '/docs',\r\n}));\r\n\r\n// REST API\r\napp.include(UserController);\r\n\r\n// GraphQL\r\napp.usePlugin(new GraphQLPlugin({\r\n resolvers: [UserResolver],\r\n}));\r\n\r\n// WebSocket\r\napp.usePlugin(new WebSocketPlugin({\r\n handlers: [ChatWebSocket],\r\n}));\r\n\r\n// Compile routes\r\nawait app.compile();\r\n\r\napp.listen(3000, () => {\r\n console.log('Server running on http://localhost:3000');\r\n console.log('REST API docs at http://localhost:3000/docs');\r\n console.log('GraphQL Playground at http://localhost:3000/graphql');\r\n console.log('WebSocket endpoint at ws://localhost:3000/ws/chat');\r\n});\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'index.ts'), mainFile);\r\n\r\n // Generate REST controller\r\n const controllerFile = `import { Controller, Get, Post, Body, Param } from 'veloce-ts';\r\nimport { z } from 'zod';\r\n\r\nconst UserSchema = z.object({\r\n name: z.string(),\r\n email: z.string().email(),\r\n age: z.number().min(0).optional(),\r\n});\r\n\r\ntype User = z.infer<typeof UserSchema>;\r\n\r\n@Controller('/users')\r\nexport class UserController {\r\n private users: User[] = [];\r\n\r\n @Get('/')\r\n async getUsers() {\r\n return { users: this.users };\r\n }\r\n\r\n @Get('/:id')\r\n async getUser(@Param('id') id: string) {\r\n const user = this.users[parseInt(id)];\r\n if (!user) {\r\n throw new Error('User not found');\r\n }\r\n return user;\r\n }\r\n\r\n @Post('/')\r\n async createUser(@Body(UserSchema) user: User) {\r\n this.users.push(user);\r\n return { message: 'User created', user };\r\n }\r\n}\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'controllers', 'user.controller.ts'), controllerFile);\r\n\r\n // Generate GraphQL resolver\r\n const resolverFile = `import { Resolver, Query, Mutation, Arg } from 'veloce-ts/graphql';\r\nimport { z } from 'zod';\r\n\r\nconst UserSchema = z.object({\r\n id: z.string(),\r\n name: z.string(),\r\n email: z.string().email(),\r\n});\r\n\r\ntype User = z.infer<typeof UserSchema>;\r\n\r\n@Resolver()\r\nexport class UserResolver {\r\n private users: User[] = [];\r\n\r\n @Query()\r\n async users(): Promise<User[]> {\r\n return this.users;\r\n }\r\n\r\n @Query()\r\n async user(@Arg('id', z.string()) id: string): Promise<User | null> {\r\n return this.users.find(u => u.id === id) || null;\r\n }\r\n\r\n @Mutation()\r\n async createUser(\r\n @Arg('name', z.string()) name: string,\r\n @Arg('email', z.string().email()) email: string\r\n ): Promise<User> {\r\n const user = { id: Date.now().toString(), name, email };\r\n this.users.push(user);\r\n return user;\r\n }\r\n}\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'resolvers', 'user.resolver.ts'), resolverFile);\r\n\r\n // Generate WebSocket handler\r\n const websocketFile = `import { WebSocket, OnConnect, OnMessage, OnDisconnect } from 'veloce-ts/websocket';\r\nimport { z } from 'zod';\r\nimport type { WebSocketConnection } from 'veloce-ts/websocket';\r\n\r\nconst MessageSchema = z.object({\r\n type: z.enum(['message', 'join', 'leave']),\r\n content: z.string(),\r\n username: z.string(),\r\n});\r\n\r\n@WebSocket('/ws/chat')\r\nexport class ChatWebSocket {\r\n @OnConnect()\r\n handleConnect(connection: WebSocketConnection) {\r\n console.log('Client connected:', connection.id);\r\n connection.send({ type: 'system', content: 'Welcome to the chat!' });\r\n }\r\n\r\n @OnMessage(MessageSchema)\r\n async handleMessage(connection: WebSocketConnection, message: z.infer<typeof MessageSchema>) {\r\n console.log('Received message:', message);\r\n \r\n // Broadcast to all clients\r\n connection.broadcast({\r\n type: 'message',\r\n username: message.username,\r\n content: message.content,\r\n timestamp: new Date().toISOString(),\r\n });\r\n }\r\n\r\n @OnDisconnect()\r\n handleDisconnect(connection: WebSocketConnection) {\r\n console.log('Client disconnected:', connection.id);\r\n }\r\n}\r\n`;\r\n\r\n await writeFile(join(projectPath, 'src', 'websockets', 'chat.websocket.ts'), websocketFile);\r\n}\r\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "D5BAB43B8E075A1864756E2164756E21",
9
- "names": []
10
- }
@@ -1,5 +0,0 @@
1
- // @bun
2
- function E($){let{origin:F="*",methods:Q=["GET","POST","PUT","DELETE","PATCH","OPTIONS"],allowedHeaders:Z=["Content-Type","Authorization"],exposedHeaders:S=[],credentials:K=!1,maxAge:j=86400}=$||{};return async(z,U)=>{let N=z.req.header("origin"),P=z.req.method,B=null;if(typeof F==="string")B=F;else if(Array.isArray(F)){if(N&&F.includes(N))B=N}else if(typeof F==="function"){if(N&&F(N))B=N}if(B)z.header("Access-Control-Allow-Origin",B);if(K)z.header("Access-Control-Allow-Credentials","true");if(S.length>0)z.header("Access-Control-Expose-Headers",S.join(", "));if(P==="OPTIONS")return z.header("Access-Control-Allow-Methods",Q.join(", ")),z.header("Access-Control-Allow-Headers",Z.join(", ")),z.header("Access-Control-Max-Age",j.toString()),z.body(null,204);await U()}}function v($){let{windowMs:F=60000,max:Q=100,keyGenerator:Z=(j)=>{return j.req.header("x-forwarded-for")||j.req.header("x-real-ip")||"unknown"}}=$,S=new Map,K=setInterval(()=>{let j=Date.now();for(let[z,U]of S.entries())if(j>U.resetTime)S.delete(z)},F);if(typeof process<"u"&&process.on)process.on("exit",()=>clearInterval(K));return async(j,z)=>{let U=Z(j),N=Date.now(),P=S.get(U);if(!P||N>P.resetTime)S.set(U,{count:1,resetTime:N+F}),j.header("X-RateLimit-Limit",Q.toString()),j.header("X-RateLimit-Remaining",(Q-1).toString()),j.header("X-RateLimit-Reset",new Date(N+F).toISOString()),await z();else if(P.count<Q)P.count++,j.header("X-RateLimit-Limit",Q.toString()),j.header("X-RateLimit-Remaining",(Q-P.count).toString()),j.header("X-RateLimit-Reset",new Date(P.resetTime).toISOString()),await z();else{let B=Math.ceil((P.resetTime-N)/1000);return j.header("X-RateLimit-Limit",Q.toString()),j.header("X-RateLimit-Remaining","0"),j.header("X-RateLimit-Reset",new Date(P.resetTime).toISOString()),j.header("Retry-After",B.toString()),j.json({error:"Too Many Requests",message:`Rate limit exceeded. Please try again in ${B} seconds.`,retryAfter:B},429)}}}function L($){let{threshold:F=1024,level:Q=6}=$||{};return async(Z,S)=>{await S();let K=Z.res;if(!K)return;let j=K.headers.get("content-type")||"",z=K.headers.get("content-length"),U=Z.req.header("accept-encoding")||"";if(!["text/","application/json","application/javascript","application/xml","application/x-www-form-urlencoded"].some((D)=>j.toLowerCase().includes(D)))return;if(z&&parseInt(z)<F)return;if(K.headers.get("content-encoding"))return;let B=await K.arrayBuffer();if(B.byteLength<F)return;let V=null,R=null;if(U.includes("br")&&typeof CompressionStream<"u")try{let D=new CompressionStream("deflate"),_=D.writable.getWriter();_.write(new Uint8Array(B)),_.close();let T=D.readable.getReader(),X=[];while(!0){let{done:J,value:Y}=await T.read();if(J)break;X.push(Y)}let W=X.reduce((J,Y)=>J+Y.length,0),C=new Uint8Array(W),G=0;for(let J of X)C.set(J,G),G+=J.length;V=C,R="deflate"}catch(D){V=null}if(!V&&U.includes("gzip")&&typeof CompressionStream<"u")try{let D=new CompressionStream("gzip"),_=D.writable.getWriter();_.write(new Uint8Array(B)),_.close();let T=D.readable.getReader(),X=[];while(!0){let{done:J,value:Y}=await T.read();if(J)break;X.push(Y)}let W=X.reduce((J,Y)=>J+Y.length,0),C=new Uint8Array(W),G=0;for(let J of X)C.set(J,G),G+=J.length;V=C,R="gzip"}catch(D){V=null}if(V&&R&&V.byteLength<B.byteLength){let D=new Headers(K.headers);return D.set("content-encoding",R),D.set("content-length",V.byteLength.toString()),D.delete("content-length"),new Response(V,{status:K.status,statusText:K.statusText,headers:D})}}}
3
- export{E as K,v as L,L as M};
4
-
5
- //# debugId=2E3D970A175650DA64756E2164756E21