wexts 4.0.0 → 4.1.5

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 (189) hide show
  1. package/README.md +49 -49
  2. package/bin/wexts.cjs +2 -2
  3. package/package.json +153 -148
  4. package/templates/.dockerignore +43 -43
  5. package/templates/.env.example +17 -17
  6. package/templates/Dockerfile +60 -60
  7. package/templates/Procfile +1 -1
  8. package/templates/README.md +67 -67
  9. package/templates/api-sdk.ts +115 -115
  10. package/templates/docker-compose.yml +34 -34
  11. package/templates/nestjs-api/.env.example +3 -3
  12. package/templates/nestjs-api/README.md +87 -87
  13. package/templates/nestjs-api/nest-cli.json +6 -6
  14. package/templates/nestjs-api/package.json +40 -40
  15. package/templates/nestjs-api/prisma/migrations/20251123205437_init/migration.sql +24 -24
  16. package/templates/nestjs-api/prisma/migrations/migration_lock.toml +3 -3
  17. package/templates/nestjs-api/prisma/schema.prisma +29 -29
  18. package/templates/nestjs-api/src/app.module.ts +17 -17
  19. package/templates/nestjs-api/src/auth/auth.controller.ts +27 -27
  20. package/templates/nestjs-api/src/auth/auth.module.ts +37 -37
  21. package/templates/nestjs-api/src/auth/auth.service.ts +86 -86
  22. package/templates/nestjs-api/src/auth/dto/auth.dto.ts +22 -22
  23. package/templates/nestjs-api/src/auth/guards/jwt-auth.guard.ts +5 -5
  24. package/templates/nestjs-api/src/auth/strategies/jwt.strategy.ts +27 -27
  25. package/templates/nestjs-api/src/main.ts +32 -32
  26. package/templates/nestjs-api/src/prisma/prisma.module.ts +9 -9
  27. package/templates/nestjs-api/src/prisma/prisma.service.ts +14 -14
  28. package/templates/nestjs-api/src/todos/dto/todo.dto.ts +24 -24
  29. package/templates/nestjs-api/src/todos/todos.controller.ts +39 -39
  30. package/templates/nestjs-api/src/todos/todos.module.ts +11 -11
  31. package/templates/nestjs-api/src/todos/todos.service.ts +53 -53
  32. package/templates/nestjs-api/src/users/users.controller.ts +14 -14
  33. package/templates/nestjs-api/src/users/users.module.ts +12 -12
  34. package/templates/nestjs-api/src/users/users.service.ts +19 -19
  35. package/templates/nestjs-api/tsconfig.json +39 -39
  36. package/templates/nextjs-web/README.md +76 -76
  37. package/templates/nextjs-web/app/actions/auth.ts +108 -108
  38. package/templates/nextjs-web/app/dashboard/error.tsx +39 -39
  39. package/templates/nextjs-web/app/dashboard/loading.tsx +14 -14
  40. package/templates/nextjs-web/app/dashboard/page.tsx +5 -5
  41. package/templates/nextjs-web/app/globals.css +93 -93
  42. package/templates/nextjs-web/app/layout.tsx +29 -29
  43. package/templates/nextjs-web/app/login/page.tsx +5 -5
  44. package/templates/nextjs-web/app/page.tsx +28 -28
  45. package/templates/nextjs-web/app/register/page.tsx +5 -5
  46. package/templates/nextjs-web/components/ui/button.tsx +56 -56
  47. package/templates/nextjs-web/components/ui/card.tsx +79 -79
  48. package/templates/nextjs-web/components/ui/input.tsx +25 -25
  49. package/templates/nextjs-web/components/ui/label.tsx +24 -24
  50. package/templates/nextjs-web/features/auth/LoginForm.tsx +140 -140
  51. package/templates/nextjs-web/features/auth/RegisterForm.tsx +159 -159
  52. package/templates/nextjs-web/features/auth/api.ts +35 -35
  53. package/templates/nextjs-web/features/auth/index.ts +3 -3
  54. package/templates/nextjs-web/features/dashboard/DashboardView.tsx +204 -204
  55. package/templates/nextjs-web/features/dashboard/api.ts +9 -9
  56. package/templates/nextjs-web/features/dashboard/components.tsx +74 -74
  57. package/templates/nextjs-web/features/dashboard/index.ts +3 -3
  58. package/templates/nextjs-web/hooks/index.ts +4 -4
  59. package/templates/nextjs-web/lib/api-client.ts +89 -89
  60. package/templates/nextjs-web/lib/api.ts +115 -115
  61. package/templates/nextjs-web/lib/axios-global-config.ts +17 -17
  62. package/templates/nextjs-web/lib/utils.ts +6 -6
  63. package/templates/nextjs-web/lib/wexts-client.ts +4 -4
  64. package/templates/nextjs-web/next-env.d.ts +6 -6
  65. package/templates/nextjs-web/next.config.ts +20 -20
  66. package/templates/nextjs-web/package.json +37 -37
  67. package/templates/nextjs-web/postcss.config.js +6 -6
  68. package/templates/nextjs-web/tailwind.config.ts +69 -69
  69. package/templates/nextjs-web/tsconfig.json +41 -41
  70. package/templates/nixpacks.toml +11 -11
  71. package/templates/root-package.json +31 -31
  72. package/templates/server.ts +66 -66
  73. package/templates/tsconfig.json +30 -30
  74. package/dist/chunk-2KAQYLVN.js +0 -1
  75. package/dist/chunk-2KAQYLVN.js.map +0 -1
  76. package/dist/chunk-2LJVUMXW.js +0 -228
  77. package/dist/chunk-2LJVUMXW.js.map +0 -1
  78. package/dist/chunk-7QKLIVRF.js +0 -94
  79. package/dist/chunk-7QKLIVRF.js.map +0 -1
  80. package/dist/chunk-7WULUGLH.mjs +0 -22
  81. package/dist/chunk-7WULUGLH.mjs.map +0 -1
  82. package/dist/chunk-BG56B4DE.js +0 -106
  83. package/dist/chunk-BG56B4DE.js.map +0 -1
  84. package/dist/chunk-CLM5PNSG.mjs +0 -496
  85. package/dist/chunk-CLM5PNSG.mjs.map +0 -1
  86. package/dist/chunk-DNLGCKTT.js +0 -31
  87. package/dist/chunk-DNLGCKTT.js.map +0 -1
  88. package/dist/chunk-JHOVXH3X.mjs +0 -65
  89. package/dist/chunk-JHOVXH3X.mjs.map +0 -1
  90. package/dist/chunk-MXINIFPC.js +0 -105
  91. package/dist/chunk-MXINIFPC.js.map +0 -1
  92. package/dist/chunk-SE32ZPOZ.js +0 -496
  93. package/dist/chunk-SE32ZPOZ.js.map +0 -1
  94. package/dist/chunk-UAL54DVV.mjs +0 -106
  95. package/dist/chunk-UAL54DVV.mjs.map +0 -1
  96. package/dist/chunk-WCKSKU3C.js +0 -65
  97. package/dist/chunk-WCKSKU3C.js.map +0 -1
  98. package/dist/chunk-WU6FW77M.mjs +0 -105
  99. package/dist/chunk-WU6FW77M.mjs.map +0 -1
  100. package/dist/chunk-XE4OXN2W.js +0 -12
  101. package/dist/chunk-XE4OXN2W.js.map +0 -1
  102. package/dist/chunk-YBM3IJEA.mjs +0 -94
  103. package/dist/chunk-YBM3IJEA.mjs.map +0 -1
  104. package/dist/chunk-YN6WIWNQ.mjs +0 -228
  105. package/dist/chunk-YN6WIWNQ.mjs.map +0 -1
  106. package/dist/chunk-YSLEF5C5.mjs +0 -1
  107. package/dist/chunk-YSLEF5C5.mjs.map +0 -1
  108. package/dist/chunk-ZX7QIN24.mjs +0 -31
  109. package/dist/chunk-ZX7QIN24.mjs.map +0 -1
  110. package/dist/cli/index.d.mts +0 -11
  111. package/dist/cli/index.d.ts +0 -11
  112. package/dist/cli/index.js +0 -332
  113. package/dist/cli/index.js.map +0 -1
  114. package/dist/cli/index.mjs +0 -334
  115. package/dist/cli/index.mjs.map +0 -1
  116. package/dist/client/index.d.mts +0 -21
  117. package/dist/client/index.d.ts +0 -21
  118. package/dist/client/index.js +0 -12
  119. package/dist/client/index.js.map +0 -1
  120. package/dist/client/index.mjs +0 -12
  121. package/dist/client/index.mjs.map +0 -1
  122. package/dist/codegen/index.d.mts +0 -2
  123. package/dist/codegen/index.d.ts +0 -2
  124. package/dist/codegen/index.js +0 -15
  125. package/dist/codegen/index.js.map +0 -1
  126. package/dist/codegen/index.mjs +0 -15
  127. package/dist/codegen/index.mjs.map +0 -1
  128. package/dist/decorators-BT1FFqN0.d.mts +0 -29
  129. package/dist/decorators-DvS58PqC.d.ts +0 -29
  130. package/dist/dev-server/index.d.mts +0 -1
  131. package/dist/dev-server/index.d.ts +0 -1
  132. package/dist/dev-server/index.js +0 -13
  133. package/dist/dev-server/index.js.map +0 -1
  134. package/dist/dev-server/index.mjs +0 -13
  135. package/dist/dev-server/index.mjs.map +0 -1
  136. package/dist/index-7QeQEf37.d.ts +0 -92
  137. package/dist/index-7RvU-jGE.d.mts +0 -66
  138. package/dist/index-7RvU-jGE.d.ts +0 -66
  139. package/dist/index-8nzxy0NN.d.mts +0 -92
  140. package/dist/index-Co5ZsLqq.d.ts +0 -58
  141. package/dist/index-D94W1__r.d.mts +0 -58
  142. package/dist/index-DQmyVp6F.d.mts +0 -27
  143. package/dist/index-KL_1BrQb.d.ts +0 -27
  144. package/dist/index.d.mts +0 -258
  145. package/dist/index.d.ts +0 -258
  146. package/dist/index.js +0 -410
  147. package/dist/index.js.map +0 -1
  148. package/dist/index.mjs +0 -410
  149. package/dist/index.mjs.map +0 -1
  150. package/dist/nest/index.d.mts +0 -3
  151. package/dist/nest/index.d.ts +0 -3
  152. package/dist/nest/index.js +0 -38
  153. package/dist/nest/index.js.map +0 -1
  154. package/dist/nest/index.mjs +0 -38
  155. package/dist/nest/index.mjs.map +0 -1
  156. package/dist/next/index.d.mts +0 -66
  157. package/dist/next/index.d.ts +0 -66
  158. package/dist/next/index.js +0 -226
  159. package/dist/next/index.js.map +0 -1
  160. package/dist/next/index.mjs +0 -188
  161. package/dist/next/index.mjs.map +0 -1
  162. package/dist/rpc/index.d.mts +0 -2
  163. package/dist/rpc/index.d.ts +0 -2
  164. package/dist/rpc/index.js +0 -23
  165. package/dist/rpc/index.js.map +0 -1
  166. package/dist/rpc/index.mjs +0 -23
  167. package/dist/rpc/index.mjs.map +0 -1
  168. package/dist/runtime/index.d.mts +0 -55
  169. package/dist/runtime/index.d.ts +0 -55
  170. package/dist/runtime/index.js +0 -213
  171. package/dist/runtime/index.js.map +0 -1
  172. package/dist/runtime/index.mjs +0 -213
  173. package/dist/runtime/index.mjs.map +0 -1
  174. package/dist/types/index.d.mts +0 -12
  175. package/dist/types/index.d.ts +0 -12
  176. package/dist/types/index.js +0 -2
  177. package/dist/types/index.js.map +0 -1
  178. package/dist/types/index.mjs +0 -3
  179. package/dist/types/index.mjs.map +0 -1
  180. package/dist/types-7d_fC-C3.d.mts +0 -32
  181. package/dist/types-7d_fC-C3.d.ts +0 -32
  182. package/dist/vercel-builder/index.d.mts +0 -58
  183. package/dist/vercel-builder/index.d.ts +0 -58
  184. package/dist/vercel-builder/index.js +0 -330
  185. package/dist/vercel-builder/index.js.map +0 -1
  186. package/dist/vercel-builder/index.mjs +0 -330
  187. package/dist/vercel-builder/index.mjs.map +0 -1
  188. package/templates/nestjs-api/package-lock.json +0 -5623
  189. package/templates/nextjs-web/package-lock.json +0 -3254
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/cli/index.js","../../src/cli/index.ts"],"names":["createCliProgram","program","Command","name","description","version","command","option","action","projectName","options","createProject","template","skipInstall","FusionDevServer","server","start","apiPath","api","webPath","web","webPort","Number","port","apiPort","useProxy","proxy","alias","type","generateRpcClient","manifest","projectPath","resolve","project","outputPath","output","logger","success","services","length","Error","scaffoldRpcService","skipGenerate","existsSync","runScript","cwd","process","env","PORT","startWextsRuntime","configPath","config","runtimeConfig","loadRuntimeConfig","dev","buildVercelOutput","result","rootDir","apiProjectPath","rpcOutputPath","runtimeConfigPath","skipCodegen","skipBuild","nodeVersion","maxDuration","warnings","warning","warn","errors","error","exit","runDoctor","security","pkgPath","join","push","pkg","JSON","parse","readFileSync","packageManager","startsWith","dir","readAllText","findTemplatePath","templatePath","detectPackageManager","toKebabCase","toPascalCase","toCamelCase","className","script","platform","runCommand","candidate","dirs","absolute","text","entry","walk","value","split","toLowerCase","filePath","pathToFileUrl","mod","createRequire","argv","parseAsync"],"mappings":"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","file":"/Volumes/Projects/wexts/packages/dist/cli/index.js","sourcesContent":[null,"#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { spawnSync } from 'child_process';\nimport { createRequire } from 'module';\nimport * as pc from 'picocolors';\nimport { logger } from '../core/logger';\n\ninterface CommonOptions {\n cwd?: string;\n}\n\nexport function createCliProgram(): Command {\n const program = new Command();\n\n program\n .name('wexts')\n .description('Wexts - production-focused single-runtime Next.js + NestJS toolkit')\n .version('3.0.3');\n\n program\n .command('create <project-name>')\n .description('Create a compatibility project from bundled legacy templates')\n .option('-t, --template <template>', 'Legacy template to use (monorepo|api|web)', 'monorepo')\n .option('--skip-install', 'Skip dependency installation', false)\n .action(async (projectName: string, options: { template: string; skipInstall: boolean }) => {\n await createProject(projectName, options.template, { skipInstall: options.skipInstall });\n });\n\n program\n .command('dev')\n .description('Start local development processes')\n .option('-a, --api <path>', 'Path to API project', './apps/api')\n .option('-w, --web <path>', 'Path to Web project', './apps/web')\n .option('-p, --port <port>', 'Port for web server', '3000')\n .option('--api-port <port>', 'Port for API server', '5050')\n .option('--proxy', 'Enable development proxy on a separate proxy port', false)\n .action(async (options: { api: string; web: string; port: string; apiPort: string; proxy: boolean }) => {\n const { FusionDevServer } = await import('../dev-server/index.js');\n const server = new FusionDevServer();\n await server.start({\n apiPath: options.api,\n webPath: options.web,\n webPort: Number(options.port),\n apiPort: Number(options.apiPort),\n useProxy: options.proxy,\n });\n });\n\n program\n .command('generate [type] [name]')\n .alias('g')\n .description('Generate RPC manifest/client, or scaffold a minimal RPC service')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (type: string | undefined, name: string | undefined, options: { project: string; output: string }) => {\n if (!type || type === 'rpc') {\n const { generateRpcClient } = await import('../codegen/index.js');\n const manifest = await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n return;\n }\n\n if (type === 'service') {\n if (!name) throw new Error('Service name is required: wexts generate service hello');\n await scaffoldRpcService(path.resolve(options.project), name);\n logger.success(`Created RPC service ${name}. Run wexts generate to update the client.`);\n return;\n }\n\n throw new Error(`Unknown generator \"${type}\". Supported generators: rpc, service.`);\n });\n\n program\n .command('codegen')\n .description('Alias for wexts generate rpc')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (options: { project: string; output: string }) => {\n const { generateRpcClient } = await import('../codegen/index.js');\n const manifest = await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n });\n\n program\n .command('build')\n .description('Build a Wexts project for production')\n .option('--skip-generate', 'Skip RPC generation before build', false)\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (options: { skipGenerate: boolean; project: string; output: string }) => {\n if (!options.skipGenerate && fs.existsSync(options.project)) {\n const { generateRpcClient } = await import('../codegen/index.js');\n await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n }\n runScript('build', { cwd: process.cwd() });\n });\n\n program\n .command('start')\n .description('Start the production Wexts runtime')\n .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n .option('-p, --port <port>', 'Port to listen on', process.env.PORT ?? '3000')\n .action(async (options: { config: string; port: string }) => {\n const { startWextsRuntime } = await import('../runtime/index.js');\n const configPath = path.resolve(options.config);\n const runtimeConfig = fs.existsSync(configPath)\n ? await loadRuntimeConfig(configPath)\n : {};\n await startWextsRuntime({\n ...runtimeConfig,\n port: Number(options.port),\n dev: false,\n });\n });\n\n program\n .command('vercel-build')\n .description('Build for Vercel using Build Output API v3')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output dir for RPC client', './apps/web/lib/wexts')\n .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n .option('--skip-codegen', 'Skip RPC generation', false)\n .option('--skip-build', 'Skip project build step', false)\n .option('--node-version <version>', 'Node.js version for Vercel function', '20')\n .option('--max-duration <seconds>', 'Max duration for serverless function', '30')\n .action(async (options: {\n project: string;\n output: string;\n config: string;\n skipCodegen: boolean;\n skipBuild: boolean;\n nodeVersion: string;\n maxDuration: string;\n }) => {\n const { buildVercelOutput } = await import('../vercel-builder/index.js');\n const result = await buildVercelOutput({\n rootDir: process.cwd(),\n apiProjectPath: options.project,\n rpcOutputPath: options.output,\n runtimeConfigPath: options.config,\n skipCodegen: options.skipCodegen,\n skipBuild: options.skipBuild,\n nodeVersion: options.nodeVersion,\n maxDuration: Number(options.maxDuration),\n });\n if (result.warnings.length > 0) {\n for (const warning of result.warnings) logger.warn(warning);\n }\n if (result.errors.length > 0) {\n for (const error of result.errors) logger.error(error);\n process.exit(1);\n }\n logger.success('Vercel build output ready at .vercel/output');\n });\n\n program\n .command('doctor')\n .description('Validate Wexts project configuration')\n .option('--security', 'Run security-specific checks', false)\n .action(async (options: { security: boolean }) => {\n const result = runDoctor(process.cwd(), options.security);\n for (const warning of result.warnings) logger.warn(warning);\n for (const error of result.errors) logger.error(error);\n if (result.errors.length > 0) process.exit(1);\n logger.success(options.security ? 'Security doctor passed.' : 'Doctor passed.');\n });\n\n return program;\n}\n\nexport interface DoctorResult {\n errors: string[];\n warnings: string[];\n}\n\nexport function runDoctor(cwd: string, security = false): DoctorResult {\n const result: DoctorResult = { errors: [], warnings: [] };\n const pkgPath = path.join(cwd, 'package.json');\n\n if (!fs.existsSync(pkgPath)) {\n result.errors.push('package.json not found.');\n return result;\n }\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n if (!pkg.packageManager?.startsWith('pnpm@')) {\n result.warnings.push('packageManager should pin pnpm.');\n }\n\n for (const dir of ['apps/api', 'apps/web']) {\n if (!fs.existsSync(path.join(cwd, dir))) {\n result.warnings.push(`${dir} not found; some Wexts commands may need explicit paths.`);\n }\n }\n\n if (fs.existsSync(path.join(cwd, 'apps/api')) && fs.existsSync(path.join(cwd, 'apps/web'))) {\n result.warnings.push('Development mode starts separate web/API processes. Single-port serving is the production `wexts start` runtime path.');\n }\n\n if (security) {\n const source = readAllText(cwd, ['apps/api/src', 'packages/templates/nestjs-api/src']);\n if (source.includes('default-secret')) {\n result.errors.push('JWT fallback \"default-secret\" found. Production apps must fail without a strong JWT_SECRET.');\n }\n if (/origin:\\s*['\"]\\*['\"]/.test(source)) {\n result.errors.push('Wildcard CORS origin found. Use an explicit origin allowlist.');\n }\n }\n\n return result;\n}\n\nasync function createProject(projectName: string, template: string, options: { skipInstall: boolean }): Promise<void> {\n const projectPath = path.join(process.cwd(), projectName);\n if (fs.existsSync(projectPath)) {\n throw new Error(`Directory already exists: ${projectName}`);\n }\n\n const templatePath = findTemplatePath();\n if (!templatePath) {\n throw new Error('Template directory not found in package.');\n }\n\n fs.mkdirSync(projectPath, { recursive: true });\n\n if (template === 'monorepo') {\n fs.mkdirSync(path.join(projectPath, 'apps'), { recursive: true });\n fs.cpSync(path.join(templatePath, 'nestjs-api'), path.join(projectPath, 'apps/api'), { recursive: true });\n fs.cpSync(path.join(templatePath, 'nextjs-web'), path.join(projectPath, 'apps/web'), { recursive: true });\n fs.writeFileSync(path.join(projectPath, 'pnpm-workspace.yaml'), \"packages:\\n - 'apps/*'\\n\");\n fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify({\n name: projectName,\n private: true,\n packageManager: 'pnpm@10.22.0',\n scripts: {\n dev: 'wexts dev',\n generate: 'wexts generate',\n build: 'wexts build',\n start: 'wexts start',\n doctor: 'wexts doctor',\n },\n devDependencies: {\n wexts: 'latest',\n },\n }, null, 2));\n } else if (template === 'api') {\n fs.cpSync(path.join(templatePath, 'nestjs-api'), projectPath, { recursive: true });\n } else if (template === 'web') {\n fs.cpSync(path.join(templatePath, 'nextjs-web'), projectPath, { recursive: true });\n } else {\n throw new Error(`Unknown template \"${template}\".`);\n }\n\n if (!options.skipInstall) {\n runCommand(detectPackageManager(projectPath), ['install'], projectPath);\n }\n}\n\nasync function scaffoldRpcService(apiProjectPath: string, rawName: string): Promise<void> {\n const serviceName = toKebabCase(rawName);\n const className = `${toPascalCase(serviceName)}Service`;\n const dir = path.join(apiProjectPath, 'src', serviceName);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, `${serviceName}.service.ts`), `import { Injectable } from '@nestjs/common';\nimport { RpcMethod, RpcService } from 'wexts/nest';\n\n@Injectable()\n@RpcService({ name: '${toCamelCase(serviceName)}', requireAuth: false })\nexport class ${className} {\n @RpcMethod()\n async sayHello(name: string): Promise<string> {\n return \\`Hello, \\${name}!\\`;\n }\n}\n`);\n}\n\nfunction runScript(script: string, options: CommonOptions): void {\n const cwd = options.cwd ?? process.cwd();\n const packageManager = detectPackageManager(cwd);\n const args = packageManager === 'npm' ? ['run', script] : ['run', script];\n runCommand(packageManager, args, cwd);\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): void {\n const result = spawnSync(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\n if (result.status !== 0) {\n throw new Error(`${command} ${args.join(' ')} failed with exit code ${result.status}`);\n }\n}\n\nfunction detectPackageManager(cwd: string): 'pnpm' | 'npm' {\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n return 'npm';\n}\n\nfunction findTemplatePath(): string | undefined {\n const candidates = [\n path.resolve(__dirname, '../../templates'),\n path.resolve(__dirname, '../templates'),\n path.resolve(process.cwd(), 'packages/templates'),\n ];\n\n return candidates.find((candidate) => fs.existsSync(candidate));\n}\n\nfunction readAllText(cwd: string, dirs: string[]): string {\n let text = '';\n for (const dir of dirs) {\n const absolute = path.join(cwd, dir);\n if (!fs.existsSync(absolute)) continue;\n for (const file of walk(absolute)) {\n if (file.endsWith('.ts') || file.endsWith('.tsx') || file.endsWith('.js')) {\n text += fs.readFileSync(file, 'utf8');\n }\n }\n }\n return text;\n}\n\nfunction walk(dir: string): string[] {\n return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {\n const absolute = path.join(dir, entry.name);\n if (entry.isDirectory()) return walk(absolute);\n return [absolute];\n });\n}\n\nfunction toKebabCase(value: string): string {\n return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[_\\s]+/g, '-').toLowerCase();\n}\n\nfunction toPascalCase(value: string): string {\n return toKebabCase(value).split('-').map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join('');\n}\n\nfunction toCamelCase(value: string): string {\n const pascal = toPascalCase(value);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nfunction pathToFileUrl(filePath: string): string {\n return `file://${filePath}`;\n}\n\nasync function loadRuntimeConfig(configPath: string): Promise<Record<string, unknown>> {\n if (configPath.endsWith('.mjs')) {\n const mod = await import(pathToFileUrl(configPath));\n return (mod.default ?? mod) as Record<string, unknown>;\n }\n\n const require = createRequire(__filename);\n const mod = require(configPath);\n return (mod.default ?? mod) as Record<string, unknown>;\n}\n\nconst invokedAsCli = process.argv[1]\n && (path.basename(process.argv[1]) === 'wexts' || path.basename(process.argv[1]) === 'wexts.cjs' || path.resolve(process.argv[1]).includes(`${path.sep}dist${path.sep}cli${path.sep}index`));\n\nif (invokedAsCli && !process.env.VITEST) {\n createCliProgram().parseAsync(process.argv).catch((error) => {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n });\n}\n"]}
@@ -1,334 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- logger
4
- } from "../chunk-JHOVXH3X.mjs";
5
- import {
6
- __dirname,
7
- __filename,
8
- __name
9
- } from "../chunk-7WULUGLH.mjs";
10
-
11
- // src/cli/index.ts
12
- import { Command } from "commander";
13
- import * as fs from "fs";
14
- import * as path from "path";
15
- import { spawnSync } from "child_process";
16
- import { createRequire } from "module";
17
- function createCliProgram() {
18
- const program = new Command();
19
- program.name("wexts").description("Wexts - production-focused single-runtime Next.js + NestJS toolkit").version("3.0.3");
20
- program.command("create <project-name>").description("Create a compatibility project from bundled legacy templates").option("-t, --template <template>", "Legacy template to use (monorepo|api|web)", "monorepo").option("--skip-install", "Skip dependency installation", false).action(async (projectName, options) => {
21
- await createProject(projectName, options.template, {
22
- skipInstall: options.skipInstall
23
- });
24
- });
25
- program.command("dev").description("Start local development processes").option("-a, --api <path>", "Path to API project", "./apps/api").option("-w, --web <path>", "Path to Web project", "./apps/web").option("-p, --port <port>", "Port for web server", "3000").option("--api-port <port>", "Port for API server", "5050").option("--proxy", "Enable development proxy on a separate proxy port", false).action(async (options) => {
26
- const { FusionDevServer } = await import("../dev-server/index.mjs");
27
- const server = new FusionDevServer();
28
- await server.start({
29
- apiPath: options.api,
30
- webPath: options.web,
31
- webPort: Number(options.port),
32
- apiPort: Number(options.apiPort),
33
- useProxy: options.proxy
34
- });
35
- });
36
- program.command("generate [type] [name]").alias("g").description("Generate RPC manifest/client, or scaffold a minimal RPC service").option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output directory for generated RPC client", "./apps/web/lib/wexts").action(async (type, name, options) => {
37
- if (!type || type === "rpc") {
38
- const { generateRpcClient } = await import("../codegen/index.mjs");
39
- const manifest = await generateRpcClient({
40
- projectPath: path.resolve(options.project),
41
- outputPath: path.resolve(options.output)
42
- });
43
- logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);
44
- return;
45
- }
46
- if (type === "service") {
47
- if (!name) throw new Error("Service name is required: wexts generate service hello");
48
- await scaffoldRpcService(path.resolve(options.project), name);
49
- logger.success(`Created RPC service ${name}. Run wexts generate to update the client.`);
50
- return;
51
- }
52
- throw new Error(`Unknown generator "${type}". Supported generators: rpc, service.`);
53
- });
54
- program.command("codegen").description("Alias for wexts generate rpc").option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output directory for generated RPC client", "./apps/web/lib/wexts").action(async (options) => {
55
- const { generateRpcClient } = await import("../codegen/index.mjs");
56
- const manifest = await generateRpcClient({
57
- projectPath: path.resolve(options.project),
58
- outputPath: path.resolve(options.output)
59
- });
60
- logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);
61
- });
62
- program.command("build").description("Build a Wexts project for production").option("--skip-generate", "Skip RPC generation before build", false).option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output directory for generated RPC client", "./apps/web/lib/wexts").action(async (options) => {
63
- if (!options.skipGenerate && fs.existsSync(options.project)) {
64
- const { generateRpcClient } = await import("../codegen/index.mjs");
65
- await generateRpcClient({
66
- projectPath: path.resolve(options.project),
67
- outputPath: path.resolve(options.output)
68
- });
69
- }
70
- runScript("build", {
71
- cwd: process.cwd()
72
- });
73
- });
74
- program.command("start").description("Start the production Wexts runtime").option("-c, --config <path>", "Runtime config module path", "./wexts.runtime.js").option("-p, --port <port>", "Port to listen on", process.env.PORT ?? "3000").action(async (options) => {
75
- const { startWextsRuntime } = await import("../runtime/index.mjs");
76
- const configPath = path.resolve(options.config);
77
- const runtimeConfig = fs.existsSync(configPath) ? await loadRuntimeConfig(configPath) : {};
78
- await startWextsRuntime({
79
- ...runtimeConfig,
80
- port: Number(options.port),
81
- dev: false
82
- });
83
- });
84
- program.command("vercel-build").description("Build for Vercel using Build Output API v3").option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output dir for RPC client", "./apps/web/lib/wexts").option("-c, --config <path>", "Runtime config module path", "./wexts.runtime.js").option("--skip-codegen", "Skip RPC generation", false).option("--skip-build", "Skip project build step", false).option("--node-version <version>", "Node.js version for Vercel function", "20").option("--max-duration <seconds>", "Max duration for serverless function", "30").action(async (options) => {
85
- const { buildVercelOutput } = await import("../vercel-builder/index.mjs");
86
- const result = await buildVercelOutput({
87
- rootDir: process.cwd(),
88
- apiProjectPath: options.project,
89
- rpcOutputPath: options.output,
90
- runtimeConfigPath: options.config,
91
- skipCodegen: options.skipCodegen,
92
- skipBuild: options.skipBuild,
93
- nodeVersion: options.nodeVersion,
94
- maxDuration: Number(options.maxDuration)
95
- });
96
- if (result.warnings.length > 0) {
97
- for (const warning of result.warnings) logger.warn(warning);
98
- }
99
- if (result.errors.length > 0) {
100
- for (const error of result.errors) logger.error(error);
101
- process.exit(1);
102
- }
103
- logger.success("Vercel build output ready at .vercel/output");
104
- });
105
- program.command("doctor").description("Validate Wexts project configuration").option("--security", "Run security-specific checks", false).action(async (options) => {
106
- const result = runDoctor(process.cwd(), options.security);
107
- for (const warning of result.warnings) logger.warn(warning);
108
- for (const error of result.errors) logger.error(error);
109
- if (result.errors.length > 0) process.exit(1);
110
- logger.success(options.security ? "Security doctor passed." : "Doctor passed.");
111
- });
112
- return program;
113
- }
114
- __name(createCliProgram, "createCliProgram");
115
- function runDoctor(cwd, security = false) {
116
- const result = {
117
- errors: [],
118
- warnings: []
119
- };
120
- const pkgPath = path.join(cwd, "package.json");
121
- if (!fs.existsSync(pkgPath)) {
122
- result.errors.push("package.json not found.");
123
- return result;
124
- }
125
- const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
126
- if (!pkg.packageManager?.startsWith("pnpm@")) {
127
- result.warnings.push("packageManager should pin pnpm.");
128
- }
129
- for (const dir of [
130
- "apps/api",
131
- "apps/web"
132
- ]) {
133
- if (!fs.existsSync(path.join(cwd, dir))) {
134
- result.warnings.push(`${dir} not found; some Wexts commands may need explicit paths.`);
135
- }
136
- }
137
- if (fs.existsSync(path.join(cwd, "apps/api")) && fs.existsSync(path.join(cwd, "apps/web"))) {
138
- result.warnings.push("Development mode starts separate web/API processes. Single-port serving is the production `wexts start` runtime path.");
139
- }
140
- if (security) {
141
- const source = readAllText(cwd, [
142
- "apps/api/src",
143
- "packages/templates/nestjs-api/src"
144
- ]);
145
- if (source.includes("default-secret")) {
146
- result.errors.push('JWT fallback "default-secret" found. Production apps must fail without a strong JWT_SECRET.');
147
- }
148
- if (/origin:\s*['"]\*['"]/.test(source)) {
149
- result.errors.push("Wildcard CORS origin found. Use an explicit origin allowlist.");
150
- }
151
- }
152
- return result;
153
- }
154
- __name(runDoctor, "runDoctor");
155
- async function createProject(projectName, template, options) {
156
- const projectPath = path.join(process.cwd(), projectName);
157
- if (fs.existsSync(projectPath)) {
158
- throw new Error(`Directory already exists: ${projectName}`);
159
- }
160
- const templatePath = findTemplatePath();
161
- if (!templatePath) {
162
- throw new Error("Template directory not found in package.");
163
- }
164
- fs.mkdirSync(projectPath, {
165
- recursive: true
166
- });
167
- if (template === "monorepo") {
168
- fs.mkdirSync(path.join(projectPath, "apps"), {
169
- recursive: true
170
- });
171
- fs.cpSync(path.join(templatePath, "nestjs-api"), path.join(projectPath, "apps/api"), {
172
- recursive: true
173
- });
174
- fs.cpSync(path.join(templatePath, "nextjs-web"), path.join(projectPath, "apps/web"), {
175
- recursive: true
176
- });
177
- fs.writeFileSync(path.join(projectPath, "pnpm-workspace.yaml"), "packages:\n - 'apps/*'\n");
178
- fs.writeFileSync(path.join(projectPath, "package.json"), JSON.stringify({
179
- name: projectName,
180
- private: true,
181
- packageManager: "pnpm@10.22.0",
182
- scripts: {
183
- dev: "wexts dev",
184
- generate: "wexts generate",
185
- build: "wexts build",
186
- start: "wexts start",
187
- doctor: "wexts doctor"
188
- },
189
- devDependencies: {
190
- wexts: "latest"
191
- }
192
- }, null, 2));
193
- } else if (template === "api") {
194
- fs.cpSync(path.join(templatePath, "nestjs-api"), projectPath, {
195
- recursive: true
196
- });
197
- } else if (template === "web") {
198
- fs.cpSync(path.join(templatePath, "nextjs-web"), projectPath, {
199
- recursive: true
200
- });
201
- } else {
202
- throw new Error(`Unknown template "${template}".`);
203
- }
204
- if (!options.skipInstall) {
205
- runCommand(detectPackageManager(projectPath), [
206
- "install"
207
- ], projectPath);
208
- }
209
- }
210
- __name(createProject, "createProject");
211
- async function scaffoldRpcService(apiProjectPath, rawName) {
212
- const serviceName = toKebabCase(rawName);
213
- const className = `${toPascalCase(serviceName)}Service`;
214
- const dir = path.join(apiProjectPath, "src", serviceName);
215
- fs.mkdirSync(dir, {
216
- recursive: true
217
- });
218
- fs.writeFileSync(path.join(dir, `${serviceName}.service.ts`), `import { Injectable } from '@nestjs/common';
219
- import { RpcMethod, RpcService } from 'wexts/nest';
220
-
221
- @Injectable()
222
- @RpcService({ name: '${toCamelCase(serviceName)}', requireAuth: false })
223
- export class ${className} {
224
- @RpcMethod()
225
- async sayHello(name: string): Promise<string> {
226
- return \`Hello, \${name}!\`;
227
- }
228
- }
229
- `);
230
- }
231
- __name(scaffoldRpcService, "scaffoldRpcService");
232
- function runScript(script, options) {
233
- const cwd = options.cwd ?? process.cwd();
234
- const packageManager = detectPackageManager(cwd);
235
- const args = packageManager === "npm" ? [
236
- "run",
237
- script
238
- ] : [
239
- "run",
240
- script
241
- ];
242
- runCommand(packageManager, args, cwd);
243
- }
244
- __name(runScript, "runScript");
245
- function runCommand(command, args, cwd) {
246
- const result = spawnSync(command, args, {
247
- cwd,
248
- stdio: "inherit",
249
- shell: process.platform === "win32"
250
- });
251
- if (result.status !== 0) {
252
- throw new Error(`${command} ${args.join(" ")} failed with exit code ${result.status}`);
253
- }
254
- }
255
- __name(runCommand, "runCommand");
256
- function detectPackageManager(cwd) {
257
- if (fs.existsSync(path.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
258
- return "npm";
259
- }
260
- __name(detectPackageManager, "detectPackageManager");
261
- function findTemplatePath() {
262
- const candidates = [
263
- path.resolve(__dirname, "../../templates"),
264
- path.resolve(__dirname, "../templates"),
265
- path.resolve(process.cwd(), "packages/templates")
266
- ];
267
- return candidates.find((candidate) => fs.existsSync(candidate));
268
- }
269
- __name(findTemplatePath, "findTemplatePath");
270
- function readAllText(cwd, dirs) {
271
- let text = "";
272
- for (const dir of dirs) {
273
- const absolute = path.join(cwd, dir);
274
- if (!fs.existsSync(absolute)) continue;
275
- for (const file of walk(absolute)) {
276
- if (file.endsWith(".ts") || file.endsWith(".tsx") || file.endsWith(".js")) {
277
- text += fs.readFileSync(file, "utf8");
278
- }
279
- }
280
- }
281
- return text;
282
- }
283
- __name(readAllText, "readAllText");
284
- function walk(dir) {
285
- return fs.readdirSync(dir, {
286
- withFileTypes: true
287
- }).flatMap((entry) => {
288
- const absolute = path.join(dir, entry.name);
289
- if (entry.isDirectory()) return walk(absolute);
290
- return [
291
- absolute
292
- ];
293
- });
294
- }
295
- __name(walk, "walk");
296
- function toKebabCase(value) {
297
- return value.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[_\s]+/g, "-").toLowerCase();
298
- }
299
- __name(toKebabCase, "toKebabCase");
300
- function toPascalCase(value) {
301
- return toKebabCase(value).split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
302
- }
303
- __name(toPascalCase, "toPascalCase");
304
- function toCamelCase(value) {
305
- const pascal = toPascalCase(value);
306
- return pascal.charAt(0).toLowerCase() + pascal.slice(1);
307
- }
308
- __name(toCamelCase, "toCamelCase");
309
- function pathToFileUrl(filePath) {
310
- return `file://${filePath}`;
311
- }
312
- __name(pathToFileUrl, "pathToFileUrl");
313
- async function loadRuntimeConfig(configPath) {
314
- if (configPath.endsWith(".mjs")) {
315
- const mod2 = await import(pathToFileUrl(configPath));
316
- return mod2.default ?? mod2;
317
- }
318
- const require2 = createRequire(__filename);
319
- const mod = require2(configPath);
320
- return mod.default ?? mod;
321
- }
322
- __name(loadRuntimeConfig, "loadRuntimeConfig");
323
- var invokedAsCli = process.argv[1] && (path.basename(process.argv[1]) === "wexts" || path.basename(process.argv[1]) === "wexts.cjs" || path.resolve(process.argv[1]).includes(`${path.sep}dist${path.sep}cli${path.sep}index`));
324
- if (invokedAsCli && !process.env.VITEST) {
325
- createCliProgram().parseAsync(process.argv).catch((error) => {
326
- logger.error(error instanceof Error ? error.message : String(error));
327
- process.exit(1);
328
- });
329
- }
330
- export {
331
- createCliProgram,
332
- runDoctor
333
- };
334
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { spawnSync } from 'child_process';\nimport { createRequire } from 'module';\nimport * as pc from 'picocolors';\nimport { logger } from '../core/logger';\n\ninterface CommonOptions {\n cwd?: string;\n}\n\nexport function createCliProgram(): Command {\n const program = new Command();\n\n program\n .name('wexts')\n .description('Wexts - production-focused single-runtime Next.js + NestJS toolkit')\n .version('3.0.3');\n\n program\n .command('create <project-name>')\n .description('Create a compatibility project from bundled legacy templates')\n .option('-t, --template <template>', 'Legacy template to use (monorepo|api|web)', 'monorepo')\n .option('--skip-install', 'Skip dependency installation', false)\n .action(async (projectName: string, options: { template: string; skipInstall: boolean }) => {\n await createProject(projectName, options.template, { skipInstall: options.skipInstall });\n });\n\n program\n .command('dev')\n .description('Start local development processes')\n .option('-a, --api <path>', 'Path to API project', './apps/api')\n .option('-w, --web <path>', 'Path to Web project', './apps/web')\n .option('-p, --port <port>', 'Port for web server', '3000')\n .option('--api-port <port>', 'Port for API server', '5050')\n .option('--proxy', 'Enable development proxy on a separate proxy port', false)\n .action(async (options: { api: string; web: string; port: string; apiPort: string; proxy: boolean }) => {\n const { FusionDevServer } = await import('../dev-server/index.js');\n const server = new FusionDevServer();\n await server.start({\n apiPath: options.api,\n webPath: options.web,\n webPort: Number(options.port),\n apiPort: Number(options.apiPort),\n useProxy: options.proxy,\n });\n });\n\n program\n .command('generate [type] [name]')\n .alias('g')\n .description('Generate RPC manifest/client, or scaffold a minimal RPC service')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (type: string | undefined, name: string | undefined, options: { project: string; output: string }) => {\n if (!type || type === 'rpc') {\n const { generateRpcClient } = await import('../codegen/index.js');\n const manifest = await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n return;\n }\n\n if (type === 'service') {\n if (!name) throw new Error('Service name is required: wexts generate service hello');\n await scaffoldRpcService(path.resolve(options.project), name);\n logger.success(`Created RPC service ${name}. Run wexts generate to update the client.`);\n return;\n }\n\n throw new Error(`Unknown generator \"${type}\". Supported generators: rpc, service.`);\n });\n\n program\n .command('codegen')\n .description('Alias for wexts generate rpc')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (options: { project: string; output: string }) => {\n const { generateRpcClient } = await import('../codegen/index.js');\n const manifest = await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n });\n\n program\n .command('build')\n .description('Build a Wexts project for production')\n .option('--skip-generate', 'Skip RPC generation before build', false)\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n .action(async (options: { skipGenerate: boolean; project: string; output: string }) => {\n if (!options.skipGenerate && fs.existsSync(options.project)) {\n const { generateRpcClient } = await import('../codegen/index.js');\n await generateRpcClient({\n projectPath: path.resolve(options.project),\n outputPath: path.resolve(options.output),\n });\n }\n runScript('build', { cwd: process.cwd() });\n });\n\n program\n .command('start')\n .description('Start the production Wexts runtime')\n .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n .option('-p, --port <port>', 'Port to listen on', process.env.PORT ?? '3000')\n .action(async (options: { config: string; port: string }) => {\n const { startWextsRuntime } = await import('../runtime/index.js');\n const configPath = path.resolve(options.config);\n const runtimeConfig = fs.existsSync(configPath)\n ? await loadRuntimeConfig(configPath)\n : {};\n await startWextsRuntime({\n ...runtimeConfig,\n port: Number(options.port),\n dev: false,\n });\n });\n\n program\n .command('vercel-build')\n .description('Build for Vercel using Build Output API v3')\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n .option('-o, --output <path>', 'Output dir for RPC client', './apps/web/lib/wexts')\n .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n .option('--skip-codegen', 'Skip RPC generation', false)\n .option('--skip-build', 'Skip project build step', false)\n .option('--node-version <version>', 'Node.js version for Vercel function', '20')\n .option('--max-duration <seconds>', 'Max duration for serverless function', '30')\n .action(async (options: {\n project: string;\n output: string;\n config: string;\n skipCodegen: boolean;\n skipBuild: boolean;\n nodeVersion: string;\n maxDuration: string;\n }) => {\n const { buildVercelOutput } = await import('../vercel-builder/index.js');\n const result = await buildVercelOutput({\n rootDir: process.cwd(),\n apiProjectPath: options.project,\n rpcOutputPath: options.output,\n runtimeConfigPath: options.config,\n skipCodegen: options.skipCodegen,\n skipBuild: options.skipBuild,\n nodeVersion: options.nodeVersion,\n maxDuration: Number(options.maxDuration),\n });\n if (result.warnings.length > 0) {\n for (const warning of result.warnings) logger.warn(warning);\n }\n if (result.errors.length > 0) {\n for (const error of result.errors) logger.error(error);\n process.exit(1);\n }\n logger.success('Vercel build output ready at .vercel/output');\n });\n\n program\n .command('doctor')\n .description('Validate Wexts project configuration')\n .option('--security', 'Run security-specific checks', false)\n .action(async (options: { security: boolean }) => {\n const result = runDoctor(process.cwd(), options.security);\n for (const warning of result.warnings) logger.warn(warning);\n for (const error of result.errors) logger.error(error);\n if (result.errors.length > 0) process.exit(1);\n logger.success(options.security ? 'Security doctor passed.' : 'Doctor passed.');\n });\n\n return program;\n}\n\nexport interface DoctorResult {\n errors: string[];\n warnings: string[];\n}\n\nexport function runDoctor(cwd: string, security = false): DoctorResult {\n const result: DoctorResult = { errors: [], warnings: [] };\n const pkgPath = path.join(cwd, 'package.json');\n\n if (!fs.existsSync(pkgPath)) {\n result.errors.push('package.json not found.');\n return result;\n }\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n if (!pkg.packageManager?.startsWith('pnpm@')) {\n result.warnings.push('packageManager should pin pnpm.');\n }\n\n for (const dir of ['apps/api', 'apps/web']) {\n if (!fs.existsSync(path.join(cwd, dir))) {\n result.warnings.push(`${dir} not found; some Wexts commands may need explicit paths.`);\n }\n }\n\n if (fs.existsSync(path.join(cwd, 'apps/api')) && fs.existsSync(path.join(cwd, 'apps/web'))) {\n result.warnings.push('Development mode starts separate web/API processes. Single-port serving is the production `wexts start` runtime path.');\n }\n\n if (security) {\n const source = readAllText(cwd, ['apps/api/src', 'packages/templates/nestjs-api/src']);\n if (source.includes('default-secret')) {\n result.errors.push('JWT fallback \"default-secret\" found. Production apps must fail without a strong JWT_SECRET.');\n }\n if (/origin:\\s*['\"]\\*['\"]/.test(source)) {\n result.errors.push('Wildcard CORS origin found. Use an explicit origin allowlist.');\n }\n }\n\n return result;\n}\n\nasync function createProject(projectName: string, template: string, options: { skipInstall: boolean }): Promise<void> {\n const projectPath = path.join(process.cwd(), projectName);\n if (fs.existsSync(projectPath)) {\n throw new Error(`Directory already exists: ${projectName}`);\n }\n\n const templatePath = findTemplatePath();\n if (!templatePath) {\n throw new Error('Template directory not found in package.');\n }\n\n fs.mkdirSync(projectPath, { recursive: true });\n\n if (template === 'monorepo') {\n fs.mkdirSync(path.join(projectPath, 'apps'), { recursive: true });\n fs.cpSync(path.join(templatePath, 'nestjs-api'), path.join(projectPath, 'apps/api'), { recursive: true });\n fs.cpSync(path.join(templatePath, 'nextjs-web'), path.join(projectPath, 'apps/web'), { recursive: true });\n fs.writeFileSync(path.join(projectPath, 'pnpm-workspace.yaml'), \"packages:\\n - 'apps/*'\\n\");\n fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify({\n name: projectName,\n private: true,\n packageManager: 'pnpm@10.22.0',\n scripts: {\n dev: 'wexts dev',\n generate: 'wexts generate',\n build: 'wexts build',\n start: 'wexts start',\n doctor: 'wexts doctor',\n },\n devDependencies: {\n wexts: 'latest',\n },\n }, null, 2));\n } else if (template === 'api') {\n fs.cpSync(path.join(templatePath, 'nestjs-api'), projectPath, { recursive: true });\n } else if (template === 'web') {\n fs.cpSync(path.join(templatePath, 'nextjs-web'), projectPath, { recursive: true });\n } else {\n throw new Error(`Unknown template \"${template}\".`);\n }\n\n if (!options.skipInstall) {\n runCommand(detectPackageManager(projectPath), ['install'], projectPath);\n }\n}\n\nasync function scaffoldRpcService(apiProjectPath: string, rawName: string): Promise<void> {\n const serviceName = toKebabCase(rawName);\n const className = `${toPascalCase(serviceName)}Service`;\n const dir = path.join(apiProjectPath, 'src', serviceName);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, `${serviceName}.service.ts`), `import { Injectable } from '@nestjs/common';\nimport { RpcMethod, RpcService } from 'wexts/nest';\n\n@Injectable()\n@RpcService({ name: '${toCamelCase(serviceName)}', requireAuth: false })\nexport class ${className} {\n @RpcMethod()\n async sayHello(name: string): Promise<string> {\n return \\`Hello, \\${name}!\\`;\n }\n}\n`);\n}\n\nfunction runScript(script: string, options: CommonOptions): void {\n const cwd = options.cwd ?? process.cwd();\n const packageManager = detectPackageManager(cwd);\n const args = packageManager === 'npm' ? ['run', script] : ['run', script];\n runCommand(packageManager, args, cwd);\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): void {\n const result = spawnSync(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\n if (result.status !== 0) {\n throw new Error(`${command} ${args.join(' ')} failed with exit code ${result.status}`);\n }\n}\n\nfunction detectPackageManager(cwd: string): 'pnpm' | 'npm' {\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n return 'npm';\n}\n\nfunction findTemplatePath(): string | undefined {\n const candidates = [\n path.resolve(__dirname, '../../templates'),\n path.resolve(__dirname, '../templates'),\n path.resolve(process.cwd(), 'packages/templates'),\n ];\n\n return candidates.find((candidate) => fs.existsSync(candidate));\n}\n\nfunction readAllText(cwd: string, dirs: string[]): string {\n let text = '';\n for (const dir of dirs) {\n const absolute = path.join(cwd, dir);\n if (!fs.existsSync(absolute)) continue;\n for (const file of walk(absolute)) {\n if (file.endsWith('.ts') || file.endsWith('.tsx') || file.endsWith('.js')) {\n text += fs.readFileSync(file, 'utf8');\n }\n }\n }\n return text;\n}\n\nfunction walk(dir: string): string[] {\n return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {\n const absolute = path.join(dir, entry.name);\n if (entry.isDirectory()) return walk(absolute);\n return [absolute];\n });\n}\n\nfunction toKebabCase(value: string): string {\n return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[_\\s]+/g, '-').toLowerCase();\n}\n\nfunction toPascalCase(value: string): string {\n return toKebabCase(value).split('-').map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join('');\n}\n\nfunction toCamelCase(value: string): string {\n const pascal = toPascalCase(value);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nfunction pathToFileUrl(filePath: string): string {\n return `file://${filePath}`;\n}\n\nasync function loadRuntimeConfig(configPath: string): Promise<Record<string, unknown>> {\n if (configPath.endsWith('.mjs')) {\n const mod = await import(pathToFileUrl(configPath));\n return (mod.default ?? mod) as Record<string, unknown>;\n }\n\n const require = createRequire(__filename);\n const mod = require(configPath);\n return (mod.default ?? mod) as Record<string, unknown>;\n}\n\nconst invokedAsCli = process.argv[1]\n && (path.basename(process.argv[1]) === 'wexts' || path.basename(process.argv[1]) === 'wexts.cjs' || path.resolve(process.argv[1]).includes(`${path.sep}dist${path.sep}cli${path.sep}index`));\n\nif (invokedAsCli && !process.env.VITEST) {\n createCliProgram().parseAsync(process.argv).catch((error) => {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n });\n}\n"],"mappings":"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","names":["Command","fs","path","spawnSync","createRequire","createCliProgram","program","Command","name","description","version","command","option","action","projectName","options","createProject","template","skipInstall","FusionDevServer","server","start","apiPath","api","webPath","web","webPort","Number","port","apiPort","useProxy","proxy","alias","type","generateRpcClient","manifest","projectPath","resolve","project","outputPath","output","logger","success","services","length","Error","scaffoldRpcService","skipGenerate","existsSync","runScript","cwd","process","env","PORT","startWextsRuntime","configPath","config","runtimeConfig","loadRuntimeConfig","dev","buildVercelOutput","result","rootDir","apiProjectPath","rpcOutputPath","runtimeConfigPath","skipCodegen","skipBuild","nodeVersion","maxDuration","warnings","warning","warn","errors","error","exit","runDoctor","security","pkgPath","join","push","pkg","JSON","parse","readFileSync","packageManager","startsWith","dir","source","readAllText","includes","test","templatePath","findTemplatePath","fs","mkdirSync","recursive","cpSync","writeFileSync","stringify","private","scripts","generate","build","doctor","devDependencies","wexts","runCommand","detectPackageManager","rawName","serviceName","toKebabCase","className","toPascalCase","toCamelCase","script","args","spawnSync","stdio","shell","platform","status","candidates","__dirname","find","candidate","dirs","text","absolute","file","walk","endsWith","readdirSync","withFileTypes","flatMap","entry","isDirectory","value","replace","toLowerCase","split","map","part","charAt","toUpperCase","slice","pascal","pathToFileUrl","filePath","mod","default","require","createRequire","__filename","invokedAsCli","argv","basename","sep","VITEST","parseAsync","catch","message","String"]}
@@ -1,21 +0,0 @@
1
- import { c as RpcManifest } from '../types-7d_fC-C3.mjs';
2
-
3
- declare class FusionFetcher {
4
- private baseUrl;
5
- constructor(baseUrl?: string);
6
- private request;
7
- get<T>(path: string): Promise<T>;
8
- post<T>(path: string, body: any): Promise<T>;
9
- put<T>(path: string, body: any): Promise<T>;
10
- delete<T>(path: string): Promise<T>;
11
- }
12
- declare const apiFetcher: FusionFetcher;
13
- interface WextsRpcClientOptions {
14
- baseUrl?: string;
15
- fetch?: typeof fetch;
16
- getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
17
- }
18
- type WextsRpcClient = Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>;
19
- declare function createWextsRpcClient(manifest: Pick<RpcManifest, 'services'> | undefined, options?: WextsRpcClientOptions): WextsRpcClient;
20
-
21
- export { FusionFetcher, type WextsRpcClient, type WextsRpcClientOptions, apiFetcher, createWextsRpcClient };
@@ -1,21 +0,0 @@
1
- import { c as RpcManifest } from '../types-7d_fC-C3.js';
2
-
3
- declare class FusionFetcher {
4
- private baseUrl;
5
- constructor(baseUrl?: string);
6
- private request;
7
- get<T>(path: string): Promise<T>;
8
- post<T>(path: string, body: any): Promise<T>;
9
- put<T>(path: string, body: any): Promise<T>;
10
- delete<T>(path: string): Promise<T>;
11
- }
12
- declare const apiFetcher: FusionFetcher;
13
- interface WextsRpcClientOptions {
14
- baseUrl?: string;
15
- fetch?: typeof fetch;
16
- getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
17
- }
18
- type WextsRpcClient = Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>;
19
- declare function createWextsRpcClient(manifest: Pick<RpcManifest, 'services'> | undefined, options?: WextsRpcClientOptions): WextsRpcClient;
20
-
21
- export { FusionFetcher, type WextsRpcClient, type WextsRpcClientOptions, apiFetcher, createWextsRpcClient };
@@ -1,12 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
-
3
-
4
-
5
- var _chunkMXINIFPCjs = require('../chunk-MXINIFPC.js');
6
- require('../chunk-XE4OXN2W.js');
7
-
8
-
9
-
10
-
11
- exports.FusionFetcher = _chunkMXINIFPCjs.FusionFetcher; exports.apiFetcher = _chunkMXINIFPCjs.apiFetcher; exports.createWextsRpcClient = _chunkMXINIFPCjs.createWextsRpcClient;
12
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/client/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACF,+KAAC","file":"/Volumes/Projects/wexts/packages/dist/client/index.js"}
@@ -1,12 +0,0 @@
1
- import {
2
- FusionFetcher,
3
- apiFetcher,
4
- createWextsRpcClient
5
- } from "../chunk-WU6FW77M.mjs";
6
- import "../chunk-7WULUGLH.mjs";
7
- export {
8
- FusionFetcher,
9
- apiFetcher,
10
- createWextsRpcClient
11
- };
12
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,2 +0,0 @@
1
- export { C as ClientGenerator, a as CodegenWatcher, b as ControllerInfo, G as GenerateOptions, c as GenerateRpcOptions, N as NestJSParser, R as RouteInfo, W as WatchOptions, g as generateRpcClient } from '../index-8nzxy0NN.mjs';
2
- import '../types-7d_fC-C3.mjs';
@@ -1,2 +0,0 @@
1
- export { C as ClientGenerator, a as CodegenWatcher, b as ControllerInfo, G as GenerateOptions, c as GenerateRpcOptions, N as NestJSParser, R as RouteInfo, W as WatchOptions, g as generateRpcClient } from '../index-7QeQEf37.js';
2
- import '../types-7d_fC-C3.js';
@@ -1,15 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
-
3
-
4
-
5
-
6
- var _chunkSE32ZPOZjs = require('../chunk-SE32ZPOZ.js');
7
- require('../chunk-WCKSKU3C.js');
8
- require('../chunk-XE4OXN2W.js');
9
-
10
-
11
-
12
-
13
-
14
- exports.ClientGenerator = _chunkSE32ZPOZjs.ClientGenerator; exports.CodegenWatcher = _chunkSE32ZPOZjs.CodegenWatcher; exports.NestJSParser = _chunkSE32ZPOZjs.NestJSParser; exports.generateRpcClient = _chunkSE32ZPOZjs.generateRpcClient;
15
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/codegen/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,2OAAC","file":"/Volumes/Projects/wexts/packages/dist/codegen/index.js"}
@@ -1,15 +0,0 @@
1
- import {
2
- ClientGenerator,
3
- CodegenWatcher,
4
- NestJSParser,
5
- generateRpcClient
6
- } from "../chunk-CLM5PNSG.mjs";
7
- import "../chunk-JHOVXH3X.mjs";
8
- import "../chunk-7WULUGLH.mjs";
9
- export {
10
- ClientGenerator,
11
- CodegenWatcher,
12
- NestJSParser,
13
- generateRpcClient
14
- };
15
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,29 +0,0 @@
1
- import { R as RpcAuthPolicy } from './types-7d_fC-C3.mjs';
2
-
3
- interface RpcServiceOptions {
4
- name?: string;
5
- requireAuth?: boolean;
6
- }
7
- interface RpcMethodOptions {
8
- name?: string;
9
- requireAuth?: boolean;
10
- }
11
- interface RuntimeRpcServiceMetadata {
12
- name?: string;
13
- requireAuth: boolean;
14
- }
15
- interface RuntimeRpcMethodMetadata {
16
- propertyKey: string | symbol;
17
- name?: string;
18
- requireAuth?: boolean;
19
- }
20
- declare function RpcService(nameOrOptions?: string | RpcServiceOptions): ClassDecorator;
21
- declare function RpcMethod(nameOrOptions?: string | RpcMethodOptions): MethodDecorator;
22
- declare function RequireAuth(): MethodDecorator & ClassDecorator;
23
- declare function getRuntimeRpcServiceMetadata(target: Function): RuntimeRpcServiceMetadata | undefined;
24
- declare function getRuntimeRpcMethodsMetadata(target: Function): RuntimeRpcMethodMetadata[];
25
- declare function getRpcAuthPolicy(requireAuth?: boolean): RpcAuthPolicy;
26
- declare const WextsRpcService: typeof RpcService;
27
- declare const WextsRpc: typeof RpcMethod;
28
-
29
- export { RequireAuth as R, WextsRpc as W, RpcMethod as a, type RpcMethodOptions as b, RpcService as c, type RpcServiceOptions as d, type RuntimeRpcMethodMetadata as e, type RuntimeRpcServiceMetadata as f, WextsRpcService as g, getRpcAuthPolicy as h, getRuntimeRpcMethodsMetadata as i, getRuntimeRpcServiceMetadata as j };