wexts 3.0.1 → 4.0.0

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 (276) hide show
  1. package/README.md +49 -346
  2. package/bin/wexts.cjs +2 -0
  3. package/dist/chunk-2KAQYLVN.js +0 -0
  4. package/dist/chunk-2KAQYLVN.js.map +1 -1
  5. package/dist/{chunk-O42L6HOX.js → chunk-2LJVUMXW.js} +79 -93
  6. package/dist/chunk-2LJVUMXW.js.map +1 -0
  7. package/dist/chunk-7QKLIVRF.js +94 -0
  8. package/dist/chunk-7QKLIVRF.js.map +1 -0
  9. package/dist/{chunk-FCEZDH42.mjs → chunk-7WULUGLH.mjs} +5 -3
  10. package/dist/chunk-7WULUGLH.mjs.map +1 -0
  11. package/dist/{chunk-WF65EDRZ.js → chunk-BG56B4DE.js} +20 -2
  12. package/dist/chunk-BG56B4DE.js.map +1 -0
  13. package/dist/chunk-CLM5PNSG.mjs +496 -0
  14. package/dist/chunk-CLM5PNSG.mjs.map +1 -0
  15. package/dist/chunk-DNLGCKTT.js +31 -0
  16. package/dist/chunk-DNLGCKTT.js.map +1 -0
  17. package/dist/{chunk-VNNVLQLJ.mjs → chunk-JHOVXH3X.mjs} +2 -2
  18. package/dist/chunk-JHOVXH3X.mjs.map +1 -0
  19. package/dist/chunk-MXINIFPC.js +105 -0
  20. package/dist/chunk-MXINIFPC.js.map +1 -0
  21. package/dist/chunk-SE32ZPOZ.js +496 -0
  22. package/dist/chunk-SE32ZPOZ.js.map +1 -0
  23. package/dist/{chunk-STTOPUZ2.mjs → chunk-UAL54DVV.mjs} +21 -3
  24. package/dist/chunk-UAL54DVV.mjs.map +1 -0
  25. package/dist/{chunk-3OM7CHCA.js → chunk-WCKSKU3C.js} +1 -1
  26. package/dist/chunk-WCKSKU3C.js.map +1 -0
  27. package/dist/chunk-WU6FW77M.mjs +105 -0
  28. package/dist/chunk-WU6FW77M.mjs.map +1 -0
  29. package/dist/chunk-XE4OXN2W.js +0 -0
  30. package/dist/chunk-XE4OXN2W.js.map +1 -1
  31. package/dist/chunk-YBM3IJEA.mjs +94 -0
  32. package/dist/chunk-YBM3IJEA.mjs.map +1 -0
  33. package/dist/{chunk-KXYLEUSW.mjs → chunk-YN6WIWNQ.mjs} +69 -83
  34. package/dist/chunk-YN6WIWNQ.mjs.map +1 -0
  35. package/dist/chunk-YSLEF5C5.mjs +0 -0
  36. package/dist/chunk-YSLEF5C5.mjs.map +0 -0
  37. package/dist/chunk-ZX7QIN24.mjs +31 -0
  38. package/dist/chunk-ZX7QIN24.mjs.map +1 -0
  39. package/dist/cli/index.d.mts +10 -0
  40. package/dist/cli/index.d.ts +10 -0
  41. package/dist/cli/index.js +292 -292
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/cli/index.mjs +294 -293
  44. package/dist/cli/index.mjs.map +1 -1
  45. package/dist/client/index.d.mts +10 -1
  46. package/dist/client/index.d.ts +10 -1
  47. package/dist/client/index.js +4 -2
  48. package/dist/client/index.js.map +1 -1
  49. package/dist/client/index.mjs +6 -4
  50. package/dist/client/index.mjs.map +0 -0
  51. package/dist/codegen/index.d.mts +2 -1
  52. package/dist/codegen/index.d.ts +2 -1
  53. package/dist/codegen/index.js +5 -3
  54. package/dist/codegen/index.js.map +1 -1
  55. package/dist/codegen/index.mjs +7 -5
  56. package/dist/codegen/index.mjs.map +0 -0
  57. package/dist/decorators-BT1FFqN0.d.mts +29 -0
  58. package/dist/decorators-DvS58PqC.d.ts +29 -0
  59. package/dist/dev-server/index.d.mts +1 -1
  60. package/dist/dev-server/index.d.ts +1 -1
  61. package/dist/dev-server/index.js +3 -3
  62. package/dist/dev-server/index.js.map +1 -1
  63. package/dist/dev-server/index.mjs +3 -3
  64. package/dist/dev-server/index.mjs.map +0 -0
  65. package/dist/{index-SjUaHgFr.d.ts → index-7QeQEf37.d.ts} +27 -10
  66. package/dist/{index-tFGPFVfQ.d.mts → index-7RvU-jGE.d.mts} +0 -1
  67. package/dist/{index-tFGPFVfQ.d.ts → index-7RvU-jGE.d.ts} +0 -1
  68. package/dist/{index-SjUaHgFr.d.mts → index-8nzxy0NN.d.mts} +27 -10
  69. package/dist/index-Co5ZsLqq.d.ts +58 -0
  70. package/dist/index-D94W1__r.d.mts +58 -0
  71. package/dist/index-DQmyVp6F.d.mts +27 -0
  72. package/dist/index-KL_1BrQb.d.ts +27 -0
  73. package/dist/index.d.mts +17 -6
  74. package/dist/index.d.ts +17 -6
  75. package/dist/index.js +57 -30
  76. package/dist/index.js.map +1 -1
  77. package/dist/index.mjs +48 -21
  78. package/dist/index.mjs.map +1 -1
  79. package/dist/nest/index.d.mts +3 -1
  80. package/dist/nest/index.d.ts +3 -1
  81. package/dist/nest/index.js +20 -2
  82. package/dist/nest/index.js.map +1 -1
  83. package/dist/nest/index.mjs +21 -3
  84. package/dist/nest/index.mjs.map +0 -0
  85. package/dist/next/index.d.mts +7 -2
  86. package/dist/next/index.d.ts +7 -2
  87. package/dist/next/index.js +72 -5
  88. package/dist/next/index.js.map +1 -1
  89. package/dist/next/index.mjs +70 -4
  90. package/dist/next/index.mjs.map +1 -1
  91. package/dist/rpc/index.d.mts +2 -0
  92. package/dist/rpc/index.d.ts +2 -0
  93. package/dist/rpc/index.js +23 -0
  94. package/dist/rpc/index.js.map +1 -0
  95. package/dist/rpc/index.mjs +23 -0
  96. package/dist/{chunk-7NSRDJ5C.mjs.map → rpc/index.mjs.map} +0 -0
  97. package/dist/runtime/index.d.mts +55 -0
  98. package/dist/runtime/index.d.ts +55 -0
  99. package/dist/runtime/index.js +213 -0
  100. package/dist/runtime/index.js.map +1 -0
  101. package/dist/runtime/index.mjs +213 -0
  102. package/dist/runtime/index.mjs.map +1 -0
  103. package/dist/types/index.d.mts +0 -0
  104. package/dist/types/index.d.ts +0 -0
  105. package/dist/types/index.js +0 -0
  106. package/dist/types/index.js.map +1 -1
  107. package/dist/types/index.mjs +1 -1
  108. package/dist/types/index.mjs.map +0 -0
  109. package/dist/types-7d_fC-C3.d.mts +32 -0
  110. package/dist/types-7d_fC-C3.d.ts +32 -0
  111. package/dist/vercel-builder/index.d.mts +58 -0
  112. package/dist/vercel-builder/index.d.ts +58 -0
  113. package/dist/vercel-builder/index.js +330 -0
  114. package/dist/vercel-builder/index.js.map +1 -0
  115. package/dist/vercel-builder/index.mjs +330 -0
  116. package/dist/vercel-builder/index.mjs.map +1 -0
  117. package/package.json +37 -16
  118. package/templates/.dockerignore +43 -43
  119. package/templates/.env.example +0 -0
  120. package/templates/Dockerfile +60 -60
  121. package/templates/Procfile +1 -1
  122. package/templates/README.md +67 -58
  123. package/templates/api-sdk.ts +115 -115
  124. package/templates/docker-compose.yml +34 -34
  125. package/templates/nestjs-api/.env.example +0 -0
  126. package/templates/nestjs-api/README.md +87 -79
  127. package/templates/nestjs-api/nest-cli.json +6 -6
  128. package/templates/nestjs-api/package-lock.json +5623 -5623
  129. package/templates/nestjs-api/package.json +40 -40
  130. package/templates/nestjs-api/prisma/dev.db +0 -0
  131. package/templates/nestjs-api/prisma/migrations/20251123205437_init/migration.sql +0 -0
  132. package/templates/nestjs-api/prisma/migrations/migration_lock.toml +0 -0
  133. package/templates/nestjs-api/prisma/schema.prisma +29 -29
  134. package/templates/nestjs-api/src/app.module.ts +17 -17
  135. package/templates/nestjs-api/src/auth/auth.controller.ts +27 -27
  136. package/templates/nestjs-api/src/auth/auth.module.ts +37 -29
  137. package/templates/nestjs-api/src/auth/auth.service.ts +86 -86
  138. package/templates/nestjs-api/src/auth/dto/auth.dto.ts +22 -22
  139. package/templates/nestjs-api/src/auth/guards/jwt-auth.guard.ts +5 -5
  140. package/templates/nestjs-api/src/auth/strategies/jwt.strategy.ts +27 -19
  141. package/templates/nestjs-api/src/main.ts +32 -32
  142. package/templates/nestjs-api/src/prisma/prisma.module.ts +9 -9
  143. package/templates/nestjs-api/src/prisma/prisma.service.ts +14 -14
  144. package/templates/nestjs-api/src/todos/dto/todo.dto.ts +24 -24
  145. package/templates/nestjs-api/src/todos/todos.controller.ts +39 -39
  146. package/templates/nestjs-api/src/todos/todos.module.ts +11 -11
  147. package/templates/nestjs-api/src/todos/todos.service.ts +53 -53
  148. package/templates/nestjs-api/src/users/users.controller.ts +14 -14
  149. package/templates/nestjs-api/src/users/users.module.ts +12 -12
  150. package/templates/nestjs-api/src/users/users.service.ts +19 -19
  151. package/templates/nestjs-api/tsconfig.json +39 -39
  152. package/templates/nextjs-web/README.md +76 -68
  153. package/templates/nextjs-web/app/actions/auth.ts +108 -108
  154. package/templates/nextjs-web/app/dashboard/error.tsx +39 -39
  155. package/templates/nextjs-web/app/dashboard/loading.tsx +14 -14
  156. package/templates/nextjs-web/app/dashboard/page.tsx +5 -5
  157. package/templates/nextjs-web/app/globals.css +93 -93
  158. package/templates/nextjs-web/app/layout.tsx +29 -29
  159. package/templates/nextjs-web/app/login/page.tsx +5 -5
  160. package/templates/nextjs-web/app/page.tsx +28 -28
  161. package/templates/nextjs-web/app/register/page.tsx +5 -5
  162. package/templates/nextjs-web/components/ui/button.tsx +56 -56
  163. package/templates/nextjs-web/components/ui/card.tsx +79 -79
  164. package/templates/nextjs-web/components/ui/input.tsx +25 -25
  165. package/templates/nextjs-web/components/ui/label.tsx +24 -24
  166. package/templates/nextjs-web/features/auth/LoginForm.tsx +140 -140
  167. package/templates/nextjs-web/features/auth/RegisterForm.tsx +159 -159
  168. package/templates/nextjs-web/features/auth/api.ts +35 -35
  169. package/templates/nextjs-web/features/auth/index.ts +3 -3
  170. package/templates/nextjs-web/features/dashboard/DashboardView.tsx +204 -204
  171. package/templates/nextjs-web/features/dashboard/api.ts +9 -9
  172. package/templates/nextjs-web/features/dashboard/components.tsx +74 -74
  173. package/templates/nextjs-web/features/dashboard/index.ts +3 -3
  174. package/templates/nextjs-web/hooks/index.ts +4 -4
  175. package/templates/nextjs-web/lib/api-client.ts +89 -89
  176. package/templates/nextjs-web/lib/api.ts +115 -115
  177. package/templates/nextjs-web/lib/axios-global-config.ts +17 -17
  178. package/templates/nextjs-web/lib/utils.ts +6 -6
  179. package/templates/nextjs-web/lib/wexts-client.ts +4 -4
  180. package/templates/nextjs-web/next-env.d.ts +6 -6
  181. package/templates/nextjs-web/next.config.ts +20 -20
  182. package/templates/nextjs-web/package-lock.json +3254 -3254
  183. package/templates/nextjs-web/package.json +37 -37
  184. package/templates/nextjs-web/postcss.config.js +6 -6
  185. package/templates/nextjs-web/tailwind.config.ts +69 -69
  186. package/templates/nextjs-web/tsconfig.json +1 -1
  187. package/templates/nixpacks.toml +11 -11
  188. package/templates/root-package.json +31 -31
  189. package/templates/server.ts +66 -66
  190. package/templates/tsconfig.json +30 -30
  191. package/dist/chunk-2MCBBWEA.js +0 -1
  192. package/dist/chunk-2MCBBWEA.js.map +0 -1
  193. package/dist/chunk-3OM7CHCA.js.map +0 -1
  194. package/dist/chunk-63MTCWU2.mjs +0 -361
  195. package/dist/chunk-63MTCWU2.mjs.map +0 -1
  196. package/dist/chunk-667BQCEM.js +0 -375
  197. package/dist/chunk-667BQCEM.js.map +0 -1
  198. package/dist/chunk-67IJ6H4J.mjs +0 -44
  199. package/dist/chunk-67IJ6H4J.mjs.map +0 -1
  200. package/dist/chunk-6SVQEGEX.mjs +0 -44
  201. package/dist/chunk-6SVQEGEX.mjs.map +0 -1
  202. package/dist/chunk-7NSRDJ5C.mjs +0 -1
  203. package/dist/chunk-ASDXAK6G.js +0 -44
  204. package/dist/chunk-ASDXAK6G.js.map +0 -1
  205. package/dist/chunk-CKZ4VSCB.mjs +0 -18
  206. package/dist/chunk-CKZ4VSCB.mjs.map +0 -1
  207. package/dist/chunk-DW6GOKMF.js +0 -57
  208. package/dist/chunk-DW6GOKMF.js.map +0 -1
  209. package/dist/chunk-EFZPSZWO.mjs +0 -1
  210. package/dist/chunk-EFZPSZWO.mjs.map +0 -1
  211. package/dist/chunk-FCEZDH42.mjs.map +0 -1
  212. package/dist/chunk-FYGXL4V7.js +0 -361
  213. package/dist/chunk-FYGXL4V7.js.map +0 -1
  214. package/dist/chunk-GKVPGKAH.js +0 -66
  215. package/dist/chunk-GKVPGKAH.js.map +0 -1
  216. package/dist/chunk-GWP6PNSP.js +0 -225
  217. package/dist/chunk-GWP6PNSP.js.map +0 -1
  218. package/dist/chunk-HQKTXE7E.mjs +0 -225
  219. package/dist/chunk-HQKTXE7E.mjs.map +0 -1
  220. package/dist/chunk-HSFLZUJN.mjs +0 -57
  221. package/dist/chunk-HSFLZUJN.mjs.map +0 -1
  222. package/dist/chunk-HU63F22V.js +0 -361
  223. package/dist/chunk-HU63F22V.js.map +0 -1
  224. package/dist/chunk-J5LGTIGS.mjs +0 -10
  225. package/dist/chunk-J5LGTIGS.mjs.map +0 -1
  226. package/dist/chunk-JMBD6DOP.js +0 -225
  227. package/dist/chunk-JMBD6DOP.js.map +0 -1
  228. package/dist/chunk-K7EIJSYQ.js +0 -1
  229. package/dist/chunk-K7EIJSYQ.js.map +0 -1
  230. package/dist/chunk-KXYLEUSW.mjs.map +0 -1
  231. package/dist/chunk-MTHKZO55.js +0 -44
  232. package/dist/chunk-MTHKZO55.js.map +0 -1
  233. package/dist/chunk-NNQFLD7O.mjs +0 -361
  234. package/dist/chunk-NNQFLD7O.mjs.map +0 -1
  235. package/dist/chunk-NU2UB242.js +0 -82
  236. package/dist/chunk-NU2UB242.js.map +0 -1
  237. package/dist/chunk-NULGSZFE.mjs +0 -57
  238. package/dist/chunk-NULGSZFE.mjs.map +0 -1
  239. package/dist/chunk-O42L6HOX.js.map +0 -1
  240. package/dist/chunk-ONXNE2A6.mjs +0 -375
  241. package/dist/chunk-ONXNE2A6.mjs.map +0 -1
  242. package/dist/chunk-OTBYRUBE.mjs +0 -225
  243. package/dist/chunk-OTBYRUBE.mjs.map +0 -1
  244. package/dist/chunk-OTSAVKLY.mjs +0 -66
  245. package/dist/chunk-OTSAVKLY.mjs.map +0 -1
  246. package/dist/chunk-PZ5AY32C.js +0 -10
  247. package/dist/chunk-PZ5AY32C.js.map +0 -1
  248. package/dist/chunk-QP2TMRLG.js +0 -57
  249. package/dist/chunk-QP2TMRLG.js.map +0 -1
  250. package/dist/chunk-RS23R3ZQ.mjs +0 -82
  251. package/dist/chunk-RS23R3ZQ.mjs.map +0 -1
  252. package/dist/chunk-STTOPUZ2.mjs.map +0 -1
  253. package/dist/chunk-VMT3LALB.mjs +0 -51
  254. package/dist/chunk-VMT3LALB.mjs.map +0 -1
  255. package/dist/chunk-VNNVLQLJ.mjs.map +0 -1
  256. package/dist/chunk-W3YRVEFQ.js +0 -66
  257. package/dist/chunk-W3YRVEFQ.js.map +0 -1
  258. package/dist/chunk-WF65EDRZ.js.map +0 -1
  259. package/dist/chunk-WMHVXEYQ.mjs +0 -66
  260. package/dist/chunk-WMHVXEYQ.mjs.map +0 -1
  261. package/dist/chunk-XVKTIYHY.js +0 -51
  262. package/dist/chunk-XVKTIYHY.js.map +0 -1
  263. package/dist/codegen-MRZDLCYI.js +0 -13
  264. package/dist/codegen-MRZDLCYI.js.map +0 -1
  265. package/dist/codegen-UI5HTMXE.mjs +0 -13
  266. package/dist/codegen-UI5HTMXE.mjs.map +0 -1
  267. package/dist/dev-server-JKRVBWPY.mjs +0 -13
  268. package/dist/dev-server-JKRVBWPY.mjs.map +0 -1
  269. package/dist/dev-server-TLL7UQMR.js +0 -13
  270. package/dist/dev-server-TLL7UQMR.js.map +0 -1
  271. package/dist/index-BsNaOUtH.d.mts +0 -44
  272. package/dist/index-BsNaOUtH.d.ts +0 -44
  273. package/dist/index-CrbXnXsO.d.ts +0 -62
  274. package/dist/index-kEbGExWM.d.mts +0 -62
  275. package/templates/nestjs-api/.env +0 -4
  276. package/templates/nextjs-web/.env +0 -1
@@ -0,0 +1,330 @@
1
+ import {
2
+ __name
3
+ } from "../chunk-7WULUGLH.mjs";
4
+
5
+ // src/vercel-builder/index.ts
6
+ import * as fs from "fs";
7
+ import * as path from "path";
8
+ import { spawnSync } from "child_process";
9
+ async function buildVercelOutput(options = {}) {
10
+ const rootDir = path.resolve(options.rootDir ?? process.cwd());
11
+ const outputDir = path.join(rootDir, ".vercel", "output");
12
+ const staticDir = path.join(outputDir, "static");
13
+ const functionDir = path.join(outputDir, "functions", "index.func");
14
+ const configPath = path.join(outputDir, "config.json");
15
+ const errors = [];
16
+ const warnings = [];
17
+ if (fs.existsSync(outputDir)) {
18
+ fs.rmSync(outputDir, {
19
+ recursive: true,
20
+ force: true
21
+ });
22
+ }
23
+ if (!options.skipCodegen) {
24
+ const apiDir = path.resolve(rootDir, options.apiProjectPath ?? "apps/api");
25
+ const rpcOut = path.resolve(rootDir, options.rpcOutputPath ?? "apps/web/lib/wexts");
26
+ if (fs.existsSync(apiDir)) {
27
+ console.log("\u{1F527} Running RPC codegen...");
28
+ const result = spawnSync("npx", [
29
+ "wexts",
30
+ "generate",
31
+ "-p",
32
+ apiDir,
33
+ "-o",
34
+ rpcOut
35
+ ], {
36
+ cwd: rootDir,
37
+ stdio: "inherit",
38
+ shell: process.platform === "win32"
39
+ });
40
+ if (result.status !== 0) {
41
+ errors.push("RPC codegen failed.");
42
+ return {
43
+ outputDir,
44
+ configPath,
45
+ functionDir,
46
+ staticDir,
47
+ errors,
48
+ warnings
49
+ };
50
+ }
51
+ } else {
52
+ warnings.push(`API directory not found at ${apiDir}; skipping codegen.`);
53
+ }
54
+ }
55
+ if (!options.skipBuild) {
56
+ console.log("\u{1F3D7}\uFE0F Building project...");
57
+ const apiDir = path.resolve(rootDir, options.apiProjectPath ?? "apps/api");
58
+ if (fs.existsSync(path.join(apiDir, "tsconfig.json"))) {
59
+ const tscResult = spawnSync("npx", [
60
+ "tsc",
61
+ "-p",
62
+ path.join(apiDir, "tsconfig.json")
63
+ ], {
64
+ cwd: rootDir,
65
+ stdio: "inherit",
66
+ shell: process.platform === "win32"
67
+ });
68
+ if (tscResult.status !== 0) {
69
+ errors.push("API TypeScript compilation failed.");
70
+ return {
71
+ outputDir,
72
+ configPath,
73
+ functionDir,
74
+ staticDir,
75
+ errors,
76
+ warnings
77
+ };
78
+ }
79
+ }
80
+ const webDir = path.resolve(rootDir, "apps/web");
81
+ if (fs.existsSync(webDir)) {
82
+ const nextResult = spawnSync("npx", [
83
+ "next",
84
+ "build",
85
+ webDir
86
+ ], {
87
+ cwd: rootDir,
88
+ stdio: "inherit",
89
+ shell: process.platform === "win32",
90
+ env: {
91
+ ...process.env,
92
+ NODE_ENV: "production"
93
+ }
94
+ });
95
+ if (nextResult.status !== 0) {
96
+ errors.push("Next.js build failed.");
97
+ return {
98
+ outputDir,
99
+ configPath,
100
+ functionDir,
101
+ staticDir,
102
+ errors,
103
+ warnings
104
+ };
105
+ }
106
+ }
107
+ }
108
+ console.log("\u{1F4E6} Creating .vercel/output...");
109
+ fs.mkdirSync(functionDir, {
110
+ recursive: true
111
+ });
112
+ fs.mkdirSync(staticDir, {
113
+ recursive: true
114
+ });
115
+ const config = {
116
+ version: 3
117
+ };
118
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
119
+ const vcConfig = {
120
+ runtime: `nodejs${options.nodeVersion ?? "20"}.x`,
121
+ handler: "index.js",
122
+ launcherType: "Nodejs",
123
+ maxDuration: options.maxDuration ?? 30,
124
+ ...options.memory ? {
125
+ memory: options.memory
126
+ } : {},
127
+ ...options.regions?.length ? {
128
+ regions: options.regions
129
+ } : {}
130
+ };
131
+ fs.writeFileSync(path.join(functionDir, ".vc-config.json"), JSON.stringify(vcConfig, null, 2));
132
+ const runtimeConfigSrc = path.resolve(rootDir, options.runtimeConfigPath ?? "wexts.runtime.js");
133
+ const apiDistDir = path.resolve(rootDir, options.apiProjectPath ?? "apps/api", "dist");
134
+ if (fs.existsSync(apiDistDir)) {
135
+ const targetApiDist = path.join(functionDir, "apps", "api", "dist");
136
+ fs.mkdirSync(path.dirname(targetApiDist), {
137
+ recursive: true
138
+ });
139
+ fs.cpSync(apiDistDir, targetApiDist, {
140
+ recursive: true
141
+ });
142
+ } else {
143
+ warnings.push("API dist not found; function may not have service implementations.");
144
+ }
145
+ const manifestCandidates = [
146
+ path.resolve(rootDir, options.rpcOutputPath ?? "apps/web/lib/wexts", "wexts.rpc.manifest.json")
147
+ ];
148
+ for (const manifestPath of manifestCandidates) {
149
+ if (fs.existsSync(manifestPath)) {
150
+ const relPath = path.relative(rootDir, manifestPath);
151
+ const dest = path.join(functionDir, relPath);
152
+ fs.mkdirSync(path.dirname(dest), {
153
+ recursive: true
154
+ });
155
+ fs.copyFileSync(manifestPath, dest);
156
+ break;
157
+ }
158
+ }
159
+ if (fs.existsSync(runtimeConfigSrc)) {
160
+ fs.copyFileSync(runtimeConfigSrc, path.join(functionDir, "wexts.runtime.js"));
161
+ } else {
162
+ warnings.push(`Runtime config not found at ${runtimeConfigSrc}.`);
163
+ }
164
+ const entryJs = generateServerlessEntry();
165
+ fs.writeFileSync(path.join(functionDir, "index.js"), entryJs);
166
+ const funcPkg = generateFunctionPackageJson(rootDir);
167
+ fs.writeFileSync(path.join(functionDir, "package.json"), JSON.stringify(funcPkg, null, 2));
168
+ const publicDir = path.join(rootDir, "apps/web/public");
169
+ if (fs.existsSync(publicDir)) {
170
+ fs.cpSync(publicDir, staticDir, {
171
+ recursive: true
172
+ });
173
+ }
174
+ const nextStaticDir = path.join(rootDir, "apps/web/.next/static");
175
+ if (fs.existsSync(nextStaticDir)) {
176
+ const dest = path.join(staticDir, "_next", "static");
177
+ fs.mkdirSync(path.dirname(dest), {
178
+ recursive: true
179
+ });
180
+ fs.cpSync(nextStaticDir, dest, {
181
+ recursive: true
182
+ });
183
+ }
184
+ const validation = validateOutput(outputDir);
185
+ errors.push(...validation.errors);
186
+ warnings.push(...validation.warnings);
187
+ if (errors.length === 0) {
188
+ console.log("\u2705 Vercel Build Output created successfully.");
189
+ console.log(` Output: ${outputDir}`);
190
+ } else {
191
+ console.error("\u274C Vercel build completed with errors:");
192
+ for (const err of errors) {
193
+ console.error(` \u2022 ${err}`);
194
+ }
195
+ }
196
+ return {
197
+ outputDir,
198
+ configPath,
199
+ functionDir,
200
+ staticDir,
201
+ errors,
202
+ warnings
203
+ };
204
+ }
205
+ __name(buildVercelOutput, "buildVercelOutput");
206
+ function generateServerlessEntry() {
207
+ return `// Wexts serverless entry for Vercel
208
+ // Auto-generated by wexts vercel-build \u2014 do not edit.
209
+ const path = require('path');
210
+
211
+ let handlerPromise;
212
+
213
+ function getHandler() {
214
+ if (!handlerPromise) {
215
+ handlerPromise = (async () => {
216
+ const { createWextsHandler } = require('wexts/runtime');
217
+ const runtimeConfigPath = path.join(__dirname, 'wexts.runtime.js');
218
+ let runtimeConfig = {};
219
+ try {
220
+ runtimeConfig = require(runtimeConfigPath);
221
+ runtimeConfig = runtimeConfig.default || runtimeConfig;
222
+ } catch (_e) {
223
+ // No runtime config \u2014 use defaults
224
+ }
225
+ return createWextsHandler({
226
+ ...runtimeConfig,
227
+ dev: false,
228
+ });
229
+ })();
230
+ }
231
+ return handlerPromise;
232
+ }
233
+
234
+ module.exports = async (req, res) => {
235
+ const handler = await getHandler();
236
+ return handler(req, res);
237
+ };
238
+ `;
239
+ }
240
+ __name(generateServerlessEntry, "generateServerlessEntry");
241
+ function generateFunctionPackageJson(rootDir) {
242
+ const projectPkgPath = path.join(rootDir, "package.json");
243
+ let projectPkg = {};
244
+ if (fs.existsSync(projectPkgPath)) {
245
+ projectPkg = JSON.parse(fs.readFileSync(projectPkgPath, "utf8"));
246
+ }
247
+ const deps = {};
248
+ const rawDeps = projectPkg.dependencies ?? {};
249
+ for (const [name, version] of Object.entries(rawDeps)) {
250
+ if (version.startsWith("workspace:")) {
251
+ const resolved = resolveWorkspaceDependencyVersion(rootDir, name);
252
+ if (resolved) {
253
+ deps[name] = resolved;
254
+ }
255
+ } else {
256
+ deps[name] = version;
257
+ }
258
+ }
259
+ return {
260
+ name: "wexts-vercel-function",
261
+ version: "0.0.0",
262
+ private: true,
263
+ main: "index.js",
264
+ dependencies: deps
265
+ };
266
+ }
267
+ __name(generateFunctionPackageJson, "generateFunctionPackageJson");
268
+ function resolveWorkspaceDependencyVersion(rootDir, name) {
269
+ const candidates = [
270
+ path.join(rootDir, "packages", "package.json"),
271
+ path.join(rootDir, "packages", name, "package.json"),
272
+ path.join(rootDir, "node_modules", name, "package.json")
273
+ ];
274
+ for (const candidate of candidates) {
275
+ if (fs.existsSync(candidate)) {
276
+ try {
277
+ const pkg = JSON.parse(fs.readFileSync(candidate, "utf8"));
278
+ if (pkg.name === name && pkg.version) {
279
+ return `^${pkg.version}`;
280
+ }
281
+ } catch {
282
+ }
283
+ }
284
+ }
285
+ return void 0;
286
+ }
287
+ __name(resolveWorkspaceDependencyVersion, "resolveWorkspaceDependencyVersion");
288
+ function validateOutput(outputDir) {
289
+ const errors = [];
290
+ const warnings = [];
291
+ const configPath = path.join(outputDir, "config.json");
292
+ if (!fs.existsSync(configPath)) {
293
+ errors.push("Missing .vercel/output/config.json");
294
+ } else {
295
+ const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
296
+ if (config.version !== 3) {
297
+ errors.push(`config.json version must be 3, got ${config.version}`);
298
+ }
299
+ }
300
+ const funcDir = path.join(outputDir, "functions", "index.func");
301
+ if (!fs.existsSync(funcDir)) {
302
+ errors.push("Missing .vercel/output/functions/index.func");
303
+ } else {
304
+ if (!fs.existsSync(path.join(funcDir, "index.js"))) {
305
+ errors.push("Missing index.js in function directory");
306
+ }
307
+ if (!fs.existsSync(path.join(funcDir, ".vc-config.json"))) {
308
+ errors.push("Missing .vc-config.json in function directory");
309
+ }
310
+ const funcPkgPath = path.join(funcDir, "package.json");
311
+ if (!fs.existsSync(funcPkgPath)) {
312
+ errors.push("Missing package.json in function directory");
313
+ } else {
314
+ const funcPkgContent = fs.readFileSync(funcPkgPath, "utf8");
315
+ if (funcPkgContent.includes("workspace:")) {
316
+ errors.push("Function package.json contains workspace:* protocol \u2014 not deployable.");
317
+ }
318
+ }
319
+ }
320
+ return {
321
+ errors,
322
+ warnings
323
+ };
324
+ }
325
+ __name(validateOutput, "validateOutput");
326
+ export {
327
+ buildVercelOutput,
328
+ validateOutput
329
+ };
330
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/vercel-builder/index.ts"],"sourcesContent":["/**\n * Wexts Vercel Build Output API builder.\n *\n * Produces the `.vercel/output` tree (Build Output API v3) that Vercel\n * uses for deployment. This module is invoked by `wexts vercel-build`.\n *\n * Layout produced:\n * .vercel/output/\n * config.json – { version: 3 }\n * static/ – public / static assets copied here\n * functions/\n * index.func/\n * index.js – serverless entry point\n * package.json – { type: \"module\" } or cjs\n * .vc-config.json – Vercel function config\n * ...copied runtime files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { spawnSync } from 'child_process';\n\nexport interface VercelBuildOptions {\n /** Project root (cwd). Defaults to process.cwd(). */\n rootDir?: string;\n /** Path to NestJS/API project for codegen. */\n apiProjectPath?: string;\n /** Output directory for generated RPC client. */\n rpcOutputPath?: string;\n /** Path to wexts.runtime.js config. */\n runtimeConfigPath?: string;\n /** Node.js runtime version for the Vercel function. */\n nodeVersion?: string;\n /** Max duration in seconds for the serverless function. */\n maxDuration?: number;\n /** Memory size in MB for the serverless function. */\n memory?: number;\n /** Regions to deploy to. */\n regions?: string[];\n /** Skip the RPC codegen step. */\n skipCodegen?: boolean;\n /** Skip the Next.js / project build step. */\n skipBuild?: boolean;\n}\n\nexport interface VercelBuildResult {\n outputDir: string;\n configPath: string;\n functionDir: string;\n staticDir: string;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Build the `.vercel/output` directory from a Wexts project.\n */\nexport async function buildVercelOutput(\n options: VercelBuildOptions = {},\n): Promise<VercelBuildResult> {\n const rootDir = path.resolve(options.rootDir ?? process.cwd());\n const outputDir = path.join(rootDir, '.vercel', 'output');\n const staticDir = path.join(outputDir, 'static');\n const functionDir = path.join(outputDir, 'functions', 'index.func');\n const configPath = path.join(outputDir, 'config.json');\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // ── 0. Clean previous output ────────────────────────────────────────\n if (fs.existsSync(outputDir)) {\n fs.rmSync(outputDir, { recursive: true, force: true });\n }\n\n // ── 1. Run RPC codegen ──────────────────────────────────────────────\n if (!options.skipCodegen) {\n const apiDir = path.resolve(rootDir, options.apiProjectPath ?? 'apps/api');\n const rpcOut = path.resolve(rootDir, options.rpcOutputPath ?? 'apps/web/lib/wexts');\n\n if (fs.existsSync(apiDir)) {\n console.log('🔧 Running RPC codegen...');\n const result = spawnSync(\n 'npx',\n ['wexts', 'generate', '-p', apiDir, '-o', rpcOut],\n { cwd: rootDir, stdio: 'inherit', shell: process.platform === 'win32' },\n );\n if (result.status !== 0) {\n errors.push('RPC codegen failed.');\n return { outputDir, configPath, functionDir, staticDir, errors, warnings };\n }\n } else {\n warnings.push(`API directory not found at ${apiDir}; skipping codegen.`);\n }\n }\n\n // ── 2. Build the project ────────────────────────────────────────────\n if (!options.skipBuild) {\n console.log('🏗️ Building project...');\n // Build API (TypeScript)\n const apiDir = path.resolve(rootDir, options.apiProjectPath ?? 'apps/api');\n if (fs.existsSync(path.join(apiDir, 'tsconfig.json'))) {\n const tscResult = spawnSync('npx', ['tsc', '-p', path.join(apiDir, 'tsconfig.json')], {\n cwd: rootDir,\n stdio: 'inherit',\n shell: process.platform === 'win32',\n });\n if (tscResult.status !== 0) {\n errors.push('API TypeScript compilation failed.');\n return { outputDir, configPath, functionDir, staticDir, errors, warnings };\n }\n }\n\n // Build Next.js\n const webDir = path.resolve(rootDir, 'apps/web');\n if (fs.existsSync(webDir)) {\n const nextResult = spawnSync('npx', ['next', 'build', webDir], {\n cwd: rootDir,\n stdio: 'inherit',\n shell: process.platform === 'win32',\n env: { ...process.env, NODE_ENV: 'production' },\n });\n if (nextResult.status !== 0) {\n errors.push('Next.js build failed.');\n return { outputDir, configPath, functionDir, staticDir, errors, warnings };\n }\n }\n }\n\n // ── 3. Create output structure ──────────────────────────────────────\n console.log('📦 Creating .vercel/output...');\n fs.mkdirSync(functionDir, { recursive: true });\n fs.mkdirSync(staticDir, { recursive: true });\n\n // ── 4. Write config.json ────────────────────────────────────────────\n const config = { version: 3 as const };\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n\n // ── 5. Write .vc-config.json for the function ───────────────────────\n const vcConfig = {\n runtime: `nodejs${options.nodeVersion ?? '20'}.x`,\n handler: 'index.js',\n launcherType: 'Nodejs',\n maxDuration: options.maxDuration ?? 30,\n ...(options.memory ? { memory: options.memory } : {}),\n ...(options.regions?.length ? { regions: options.regions } : {}),\n };\n fs.writeFileSync(\n path.join(functionDir, '.vc-config.json'),\n JSON.stringify(vcConfig, null, 2),\n );\n\n // ── 6. Copy runtime files into the function ─────────────────────────\n const runtimeConfigSrc = path.resolve(\n rootDir,\n options.runtimeConfigPath ?? 'wexts.runtime.js',\n );\n\n // Copy API dist\n const apiDistDir = path.resolve(rootDir, options.apiProjectPath ?? 'apps/api', 'dist');\n if (fs.existsSync(apiDistDir)) {\n const targetApiDist = path.join(functionDir, 'apps', 'api', 'dist');\n fs.mkdirSync(path.dirname(targetApiDist), { recursive: true });\n fs.cpSync(apiDistDir, targetApiDist, { recursive: true });\n } else {\n warnings.push('API dist not found; function may not have service implementations.');\n }\n\n // Copy RPC manifest\n const manifestCandidates = [\n path.resolve(rootDir, options.rpcOutputPath ?? 'apps/web/lib/wexts', 'wexts.rpc.manifest.json'),\n ];\n for (const manifestPath of manifestCandidates) {\n if (fs.existsSync(manifestPath)) {\n const relPath = path.relative(rootDir, manifestPath);\n const dest = path.join(functionDir, relPath);\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.copyFileSync(manifestPath, dest);\n break;\n }\n }\n\n // Copy wexts.runtime.js (adjusted for Vercel paths)\n if (fs.existsSync(runtimeConfigSrc)) {\n fs.copyFileSync(runtimeConfigSrc, path.join(functionDir, 'wexts.runtime.js'));\n } else {\n warnings.push(`Runtime config not found at ${runtimeConfigSrc}.`);\n }\n\n // ── 7. Write serverless entry point ─────────────────────────────────\n const entryJs = generateServerlessEntry();\n fs.writeFileSync(path.join(functionDir, 'index.js'), entryJs);\n\n // ── 8. Write package.json for the function (no workspace:* deps) ───\n const funcPkg = generateFunctionPackageJson(rootDir);\n fs.writeFileSync(\n path.join(functionDir, 'package.json'),\n JSON.stringify(funcPkg, null, 2),\n );\n\n // ── 9. Copy static assets ───────────────────────────────────────────\n const publicDir = path.join(rootDir, 'apps/web/public');\n if (fs.existsSync(publicDir)) {\n fs.cpSync(publicDir, staticDir, { recursive: true });\n }\n\n // ── 10. Copy Next.js static output if standalone/export exists ──────\n const nextStaticDir = path.join(rootDir, 'apps/web/.next/static');\n if (fs.existsSync(nextStaticDir)) {\n const dest = path.join(staticDir, '_next', 'static');\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n fs.cpSync(nextStaticDir, dest, { recursive: true });\n }\n\n // ── 11. Validate the output ─────────────────────────────────────────\n const validation = validateOutput(outputDir);\n errors.push(...validation.errors);\n warnings.push(...validation.warnings);\n\n if (errors.length === 0) {\n console.log('✅ Vercel Build Output created successfully.');\n console.log(` Output: ${outputDir}`);\n } else {\n console.error('❌ Vercel build completed with errors:');\n for (const err of errors) {\n console.error(` • ${err}`);\n }\n }\n\n return { outputDir, configPath, functionDir, staticDir, errors, warnings };\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────\n\nfunction generateServerlessEntry(): string {\n return `// Wexts serverless entry for Vercel\n// Auto-generated by wexts vercel-build — do not edit.\nconst path = require('path');\n\nlet handlerPromise;\n\nfunction getHandler() {\n if (!handlerPromise) {\n handlerPromise = (async () => {\n const { createWextsHandler } = require('wexts/runtime');\n const runtimeConfigPath = path.join(__dirname, 'wexts.runtime.js');\n let runtimeConfig = {};\n try {\n runtimeConfig = require(runtimeConfigPath);\n runtimeConfig = runtimeConfig.default || runtimeConfig;\n } catch (_e) {\n // No runtime config — use defaults\n }\n return createWextsHandler({\n ...runtimeConfig,\n dev: false,\n });\n })();\n }\n return handlerPromise;\n}\n\nmodule.exports = async (req, res) => {\n const handler = await getHandler();\n return handler(req, res);\n};\n`;\n}\n\nfunction generateFunctionPackageJson(rootDir: string): Record<string, unknown> {\n const projectPkgPath = path.join(rootDir, 'package.json');\n let projectPkg: Record<string, unknown> = {};\n if (fs.existsSync(projectPkgPath)) {\n projectPkg = JSON.parse(fs.readFileSync(projectPkgPath, 'utf8'));\n }\n\n // Collect dependencies but resolve workspace:* to real versions\n const deps: Record<string, string> = {};\n const rawDeps = (projectPkg.dependencies ?? {}) as Record<string, string>;\n for (const [name, version] of Object.entries(rawDeps)) {\n if (version.startsWith('workspace:')) {\n // Resolve from the monorepo\n const resolved = resolveWorkspaceDependencyVersion(rootDir, name);\n if (resolved) {\n deps[name] = resolved;\n }\n // Skip if not resolvable — it'll be caught by validation\n } else {\n deps[name] = version;\n }\n }\n\n return {\n name: 'wexts-vercel-function',\n version: '0.0.0',\n private: true,\n main: 'index.js',\n dependencies: deps,\n };\n}\n\nfunction resolveWorkspaceDependencyVersion(rootDir: string, name: string): string | undefined {\n // Walk common monorepo locations\n const candidates = [\n path.join(rootDir, 'packages', 'package.json'), // packages/ (the main wexts package)\n path.join(rootDir, 'packages', name, 'package.json'), // packages/<name>\n path.join(rootDir, 'node_modules', name, 'package.json'), // fallback\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(candidate, 'utf8'));\n if (pkg.name === name && pkg.version) {\n return `^${pkg.version}`;\n }\n } catch {\n // ignore\n }\n }\n }\n\n return undefined;\n}\n\nexport interface ValidationResult {\n errors: string[];\n warnings: string[];\n}\n\nexport function validateOutput(outputDir: string): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n const configPath = path.join(outputDir, 'config.json');\n if (!fs.existsSync(configPath)) {\n errors.push('Missing .vercel/output/config.json');\n } else {\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));\n if (config.version !== 3) {\n errors.push(`config.json version must be 3, got ${config.version}`);\n }\n }\n\n const funcDir = path.join(outputDir, 'functions', 'index.func');\n if (!fs.existsSync(funcDir)) {\n errors.push('Missing .vercel/output/functions/index.func');\n } else {\n if (!fs.existsSync(path.join(funcDir, 'index.js'))) {\n errors.push('Missing index.js in function directory');\n }\n if (!fs.existsSync(path.join(funcDir, '.vc-config.json'))) {\n errors.push('Missing .vc-config.json in function directory');\n }\n const funcPkgPath = path.join(funcDir, 'package.json');\n if (!fs.existsSync(funcPkgPath)) {\n errors.push('Missing package.json in function directory');\n } else {\n const funcPkgContent = fs.readFileSync(funcPkgPath, 'utf8');\n if (funcPkgContent.includes('workspace:')) {\n errors.push('Function package.json contains workspace:* protocol — not deployable.');\n }\n }\n }\n\n return { errors, warnings };\n}\n"],"mappings":"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","names":["fs","path","spawnSync","buildVercelOutput","options","rootDir","resolve","process","cwd","outputDir","join","staticDir","functionDir","configPath","errors","warnings","existsSync","fs","rmSync","recursive","force","skipCodegen","apiDir","apiProjectPath","rpcOut","rpcOutputPath","console","log","result","spawnSync","stdio","shell","platform","status","push","skipBuild","tscResult","webDir","nextResult","env","NODE_ENV","mkdirSync","config","version","writeFileSync","JSON","stringify","vcConfig","runtime","nodeVersion","handler","launcherType","maxDuration","memory","regions","length","runtimeConfigSrc","runtimeConfigPath","apiDistDir","targetApiDist","dirname","cpSync","manifestCandidates","manifestPath","relPath","relative","dest","copyFileSync","entryJs","generateServerlessEntry","funcPkg","generateFunctionPackageJson","publicDir","nextStaticDir","validation","validateOutput","error","err","projectPkgPath","projectPkg","parse","readFileSync","deps","rawDeps","dependencies","name","Object","entries","startsWith","resolved","resolveWorkspaceDependencyVersion","private","main","candidates","candidate","pkg","undefined","funcDir","funcPkgPath","funcPkgContent","includes"]}
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "wexts",
3
- "version": "3.0.1",
4
- "description": "Build production-ready full-stack apps with Next.js 16 + NestJS 11 in a unified runtime. Zero URLs. Zero configuration.",
3
+ "version": "4.0.0",
4
+ "description": "Production-focused single-runtime Next.js + NestJS toolkit with typed RPC.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
8
8
  "bin": {
9
- "wexts": "./dist/cli/index.js"
9
+ "wexts": "bin/wexts.cjs"
10
10
  },
11
11
  "files": [
12
12
  "dist",
13
13
  "templates",
14
+ "bin",
14
15
  "README.md",
15
16
  "LICENSE"
16
17
  ],
@@ -39,6 +40,16 @@
39
40
  "types": "./dist/next/index.d.ts",
40
41
  "import": "./dist/next/index.mjs",
41
42
  "require": "./dist/next/index.js"
43
+ },
44
+ "./rpc": {
45
+ "types": "./dist/rpc/index.d.ts",
46
+ "import": "./dist/rpc/index.mjs",
47
+ "require": "./dist/rpc/index.js"
48
+ },
49
+ "./runtime": {
50
+ "types": "./dist/runtime/index.d.ts",
51
+ "import": "./dist/runtime/index.mjs",
52
+ "require": "./dist/runtime/index.js"
42
53
  }
43
54
  },
44
55
  "scripts": {
@@ -46,7 +57,7 @@
46
57
  "dev": "tsup --watch",
47
58
  "test": "vitest run",
48
59
  "test:watch": "vitest",
49
- "lint": "eslint src",
60
+ "lint": "tsc --noEmit",
50
61
  "typecheck": "tsc --noEmit",
51
62
  "release": "npm run build && npm publish --access public"
52
63
  },
@@ -60,7 +71,7 @@
60
71
  "typescript",
61
72
  "react",
62
73
  "unified-runtime",
63
- "zero-config",
74
+ "generated-rpc",
64
75
  "type-safe",
65
76
  "prisma",
66
77
  "jwt-auth",
@@ -72,7 +83,7 @@
72
83
  "license": "MIT",
73
84
  "repository": {
74
85
  "type": "git",
75
- "url": "https://github.com/ziadmustafa1/wexts.git"
86
+ "url": "git+https://github.com/ziadmustafa1/wexts.git"
76
87
  },
77
88
  "homepage": "https://github.com/ziadmustafa1/wexts#readme",
78
89
  "bugs": {
@@ -83,20 +94,22 @@
83
94
  "pnpm": ">=10.0.0"
84
95
  },
85
96
  "devDependencies": {
86
- "@swc/core": "^1.15.3",
97
+ "@swc/core": "^1.15.32",
87
98
  "@types/http-proxy": "^1.17.15",
88
- "@types/node": "^22.10.2",
89
- "@types/react": "^19.0.6",
99
+ "@types/node": "^22.19.1",
100
+ "@types/react": "^19.2.14",
90
101
  "eslint": "^9.17.0",
91
- "tsup": "^8.3.5",
92
- "vitest": "^2.1.8"
102
+ "tsup": "^8.5.1",
103
+ "vite": "^6.4.2",
104
+ "vitest": "^4.1.5"
93
105
  },
94
106
  "dependencies": {
107
+ "@wexts/security": "^0.1.0",
95
108
  "chokidar": "^4.0.3",
96
- "commander": "^12.1.0",
109
+ "commander": "^14.0.3",
97
110
  "consola": "^3.2.3",
111
+ "fastify": "^5.8.5",
98
112
  "http-proxy": "^1.18.1",
99
- "inquirer": "^12.4.0",
100
113
  "picocolors": "^1.1.1",
101
114
  "reflect-metadata": "^0.2.2",
102
115
  "typescript": "^5.9.3"
@@ -104,8 +117,10 @@
104
117
  "peerDependencies": {
105
118
  "@nestjs/common": "^11.0.0",
106
119
  "@nestjs/core": "^11.0.0",
107
- "next": "^16.0.0",
108
- "react": "^19.0.0"
120
+ "@nestjs/platform-fastify": "^11.0.0",
121
+ "next": "^16.2.4",
122
+ "react": "^19.2.5",
123
+ "react-dom": "^19.2.5"
109
124
  },
110
125
  "peerDependenciesMeta": {
111
126
  "@nestjs/common": {
@@ -114,9 +129,15 @@
114
129
  "@nestjs/core": {
115
130
  "optional": true
116
131
  },
132
+ "@nestjs/platform-fastify": {
133
+ "optional": true
134
+ },
117
135
  "react": {
118
136
  "optional": true
119
137
  },
138
+ "react-dom": {
139
+ "optional": true
140
+ },
120
141
  "next": {
121
142
  "optional": true
122
143
  }
@@ -124,4 +145,4 @@
124
145
  "publishConfig": {
125
146
  "access": "public"
126
147
  }
127
- }
148
+ }
@@ -1,43 +1,43 @@
1
- # Environment files
2
- .env
3
- .env.local
4
- .env.*.local
5
-
6
- # Node modules
7
- node_modules
8
- dist
9
- build
10
- .next
11
- .turbo
12
-
13
- # Database
14
- *.db
15
- *.db-journal
16
-
17
- # Logs
18
- *.log
19
- npm-debug.log*
20
-
21
- # OS
22
- .DS_Store
23
- Thumbs.db
24
-
25
- # IDE
26
- .vscode
27
- .idea
28
- *.swp
29
-
30
- # Git
31
- .git
32
- .gitignore
33
-
34
- # CI/CD
35
- .github
36
-
37
- # Documentation
38
- *.md
39
- !README.md
40
-
41
- # Config files
42
- .prettierrc
43
- .eslintrc*
1
+ # Environment files
2
+ .env
3
+ .env.local
4
+ .env.*.local
5
+
6
+ # Node modules
7
+ node_modules
8
+ dist
9
+ build
10
+ .next
11
+ .turbo
12
+
13
+ # Database
14
+ *.db
15
+ *.db-journal
16
+
17
+ # Logs
18
+ *.log
19
+ npm-debug.log*
20
+
21
+ # OS
22
+ .DS_Store
23
+ Thumbs.db
24
+
25
+ # IDE
26
+ .vscode
27
+ .idea
28
+ *.swp
29
+
30
+ # Git
31
+ .git
32
+ .gitignore
33
+
34
+ # CI/CD
35
+ .github
36
+
37
+ # Documentation
38
+ *.md
39
+ !README.md
40
+
41
+ # Config files
42
+ .prettierrc
43
+ .eslintrc*
File without changes