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
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/index.ts","../src/core/config.ts","../src/core/process-manager.ts","../src/core/errors.ts","../src/config/index.ts","../src/config/loader.ts","../src/insight/index.ts","../src/insight/server.ts","../src/create-fusion/index.ts","../src/create-fusion/scaffold.ts","../src/next/index.ts","../src/next/provider.tsx","../src/next/useAuth.ts"],"sourcesContent":["// Core exports placeholder\r\nexport * from './config';\r\nexport * from './logger';\r\nexport * from './filesystem';\r\nexport * from './process-manager';\r\nexport * from './errors';\r\n","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport interface FusionConfig {\r\n [key: string]: any;\r\n}\r\n\r\nexport class ConfigLoader {\r\n private config: Map<string, any> = new Map();\r\n private configDir: string;\r\n\r\n constructor(configDir: string = process.cwd()) {\r\n this.configDir = configDir;\r\n }\r\n\r\n /**\r\n * Load configuration from file or environment\r\n */\r\n load(key: string, defaultValue?: any): any {\r\n if (this.config.has(key)) {\r\n return this.config.get(key);\r\n }\r\n\r\n // Try to load from environment variable\r\n const envKey = `FUSION_${key.toUpperCase()}`;\r\n if (process.env[envKey]) {\r\n const value = this.parseEnvValue(process.env[envKey]!);\r\n this.config.set(key, value);\r\n return value;\r\n }\r\n\r\n // Try to load from config file\r\n const configPath = path.join(this.configDir, 'fusion.config.json');\r\n if (fs.existsSync(configPath)) {\r\n try {\r\n const fileConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\r\n if (fileConfig[key] !== undefined) {\r\n this.config.set(key, fileConfig[key]);\r\n return fileConfig[key];\r\n }\r\n } catch (error) {\r\n // Silently fail and use default\r\n }\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n /**\r\n * Set configuration value\r\n */\r\n set(key: string, value: any): void {\r\n this.config.set(key, value);\r\n }\r\n\r\n /**\r\n * Get all configuration\r\n */\r\n getAll(): FusionConfig {\r\n return Object.fromEntries(this.config);\r\n }\r\n\r\n /**\r\n * Parse environment value (handles JSON strings)\r\n */\r\n private parseEnvValue(value: string): any {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const config = new ConfigLoader();\r\n\r\n// Helper function for backward compatibility\r\nexport function load(key: string, defaultValue?: any): any {\r\n return config.load(key, defaultValue);\r\n}\r\n","export class ProcessManager {\r\n /**\r\n * Setup process error handlers\r\n */\r\n static initialize(): void {\r\n process.on('uncaughtException', (error) => {\r\n console.error('[Fusion] Uncaught Exception:', error);\r\n process.exit(1);\r\n });\r\n\r\n process.on('unhandledRejection', (reason, promise) => {\r\n console.error('[Fusion] Unhandled Rejection at:', promise, 'reason:', reason);\r\n });\r\n\r\n process.on('SIGTERM', () => {\r\n console.log('[Fusion] SIGTERM received, shutting down gracefully');\r\n process.exit(0);\r\n });\r\n\r\n process.on('SIGINT', () => {\r\n console.log('[Fusion] SIGINT received, shutting down gracefully');\r\n process.exit(0);\r\n });\r\n }\r\n\r\n /**\r\n * Graceful shutdown helper\r\n */\r\n static async shutdown(cleanup: () => Promise<void>): Promise<void> {\r\n try {\r\n await cleanup();\r\n process.exit(0);\r\n } catch (error) {\r\n console.error('[Fusion] Error during shutdown:', error);\r\n process.exit(1);\r\n }\r\n }\r\n}\r\n","export class FusionError extends Error {\r\n constructor(message: string, public code?: string) {\r\n super(message);\r\n this.name = 'FusionError';\r\n }\r\n}\r\n\r\nexport class ConfigError extends FusionError {\r\n constructor(message: string) {\r\n super(message, 'CONFIG_ERROR');\r\n this.name = 'ConfigError';\r\n }\r\n}\r\n\r\nexport class ValidationError extends FusionError {\r\n constructor(message: string) {\r\n super(message, 'VALIDATION_ERROR');\r\n this.name = 'ValidationError';\r\n }\r\n}\r\n\r\nexport class APIError extends FusionError {\r\n constructor(message: string, public statusCode?: number) {\r\n super(message, 'API_ERROR');\r\n this.name = 'APIError';\r\n }\r\n}\r\n","// Config exports placeholder\r\nexport * from './loader';\r\n","export const loader = {\r\n load: () => ({}),\r\n};\r\n","// Insight exports placeholder\r\nexport * from './server';\r\n","export const server = {\r\n start: () => console.log('Insight server started'),\r\n};\r\n","export * from './scaffold';\r\n","import { mkdir, writeFile } from 'fs/promises';\r\nimport { join } from 'path';\r\nimport { logger } from '../core/logger';\r\n\r\nexport interface ScaffoldOptions {\r\n projectName: string;\r\n template: 'monorepo' | 'api' | 'web';\r\n packageManager?: 'npm' | 'pnpm' | 'yarn';\r\n}\r\n\r\nexport class ProjectScaffolder {\r\n async scaffold(options: ScaffoldOptions): Promise<void> {\r\n const { projectName, template } = options;\r\n const projectPath = join(process.cwd(), projectName);\r\n\r\n logger.info(`Creating project at: ${projectPath}`);\r\n\r\n // Create base directory\r\n await mkdir(projectPath, { recursive: true });\r\n\r\n if (template === 'monorepo') {\r\n await this.createMonorepo(projectPath, projectName);\r\n } else if (template === 'api') {\r\n await this.createNestJSApp(projectPath, projectName);\r\n } else if (template === 'web') {\r\n await this.createNextJSApp(projectPath, projectName);\r\n }\r\n\r\n logger.success(`Project ${projectName} created successfully!`);\r\n logger.info(`\\nNext steps:`);\r\n logger.info(` cd ${projectName}`);\r\n logger.info(` fusion dev`);\r\n }\r\n\r\n private async createMonorepo(projectPath: string, projectName: string): Promise<void> {\r\n // Create directory structure\r\n await mkdir(join(projectPath, 'apps', 'api'), { recursive: true });\r\n await mkdir(join(projectPath, 'apps', 'web'), { recursive: true });\r\n await mkdir(join(projectPath, 'packages', 'types'), { recursive: true });\r\n await mkdir(join(projectPath, 'packages', 'api-client'), { recursive: true });\r\n\r\n // Create root package.json\r\n const packageJson = {\r\n name: projectName,\r\n version: '0.0.1',\r\n private: true,\r\n workspaces: ['apps/*', 'packages/*'],\r\n scripts: {\r\n dev: 'fusion dev',\r\n build: 'fusion build',\r\n },\r\n devDependencies: {\r\n 'wexts': '^1.0.0',\r\n },\r\n };\r\n\r\n await writeFile(\r\n join(projectPath, 'package.json'),\r\n JSON.stringify(packageJson, null, 2)\r\n );\r\n\r\n // Create README\r\n const readme = `# ${projectName}\\n\\nCreated with wexts\\n\\n## Getting Started\\n\\n\\`\\`\\`bash\\nfusion dev\\n\\`\\`\\`\\n`;\r\n await writeFile(join(projectPath, 'README.md'), readme);\r\n }\r\n\r\n private async createNestJSApp(projectPath: string, projectName: string): Promise<void> {\r\n // TODO: Implement NestJS scaffolding\r\n logger.info('Creating NestJS application...');\r\n }\r\n\r\n private async createNextJSApp(projectPath: string, projectName: string): Promise<void> {\r\n // TODO: Implement Next.js scaffolding\r\n logger.info('Creating Next.js application...');\r\n }\r\n}\r\n","export * from './provider';\r\nexport * from './useAuth';\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, ReactNode } from 'react';\r\nimport { FusionFetcher } from '../client/fetcher';\r\n\r\ninterface FusionContextType {\r\n client: FusionFetcher;\r\n}\r\n\r\nconst FusionContext = createContext<FusionContextType | null>(null);\r\n\r\nexport interface FusionProviderProps {\r\n children: ReactNode;\r\n baseUrl?: string;\r\n}\r\n\r\n/**\r\n * FusionProvider - Provides API client to React components\r\n * Usage:\r\n * ```tsx\r\n * <FusionProvider baseUrl=\"/api\">\r\n * <App />\r\n * </FusionProvider>\r\n * ```\r\n */\r\nexport function FusionProvider({ children, baseUrl = '/api' }: FusionProviderProps) {\r\n const client = React.useMemo(() => new FusionFetcher(baseUrl), [baseUrl]);\r\n\r\n return (\r\n <FusionContext.Provider value={{ client }}>\r\n {children}\r\n </FusionContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * useFusion hook - Access API client in components\r\n * Usage:\r\n * ```tsx\r\n * const { client } = useFusion();\r\n * const data = await client.get('/users');\r\n * ```\r\n */\r\nexport function useFusion(): FusionContextType {\r\n const context = useContext(FusionContext);\r\n if (!context) {\r\n throw new Error('useFusion must be used within FusionProvider');\r\n }\r\n return context;\r\n}\r\n","'use client';\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useFusion } from './provider';\r\n\r\nexport interface AuthUser {\r\n id: string;\r\n email: string;\r\n name?: string;\r\n}\r\n\r\nexport interface UseAuthReturn {\r\n user: AuthUser | null;\r\n loading: boolean;\r\n login: (email: string, password: string) => Promise<void>;\r\n logout: () => Promise<void>;\r\n isAuthenticated: boolean;\r\n}\r\n\r\n/**\r\n * useAuth hook - Authentication state management\r\n * Usage:\r\n * ```tsx\r\n * const { user, login, logout, isAuthenticated } = useAuth();\r\n * ```\r\n */\r\nexport function useAuth(): UseAuthReturn {\r\n const { client } = useFusion();\r\n const [user, setUser] = useState<AuthUser | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n // Check for existing session\r\n const token = localStorage.getItem('fusion_token');\r\n if (token) {\r\n // Validate token and load user\r\n loadUser();\r\n } else {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const loadUser = async () => {\r\n try {\r\n const userData = await client.get<AuthUser>('/auth/me');\r\n setUser(userData);\r\n } catch (error) {\r\n localStorage.removeItem('fusion_token');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const login = async (email: string, password: string) => {\r\n const response = await client.post<{ token: string; user: AuthUser }>('/auth/login', {\r\n email,\r\n password,\r\n });\r\n localStorage.setItem('fusion_token', response.token);\r\n setUser(response.user);\r\n };\r\n\r\n const logout = async () => {\r\n localStorage.removeItem('fusion_token');\r\n setUser(null);\r\n };\r\n\r\n return {\r\n user,\r\n loading,\r\n login,\r\n logout,\r\n isAuthenticated: !!user,\r\n };\r\n}\r\n"],"mappings":"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","names":["fs","path","ConfigLoader","config","Map","configDir","process","cwd","load","key","defaultValue","has","get","envKey","toUpperCase","env","value","parseEnvValue","set","configPath","join","existsSync","fileConfig","JSON","parse","readFileSync","undefined","error","getAll","Object","fromEntries","ProcessManager","initialize","process","on","error","console","exit","reason","promise","log","shutdown","cleanup","FusionError","Error","message","code","name","ConfigError","ValidationError","APIError","statusCode","loader","load","server","start","console","log","mkdir","writeFile","join","ProjectScaffolder","scaffold","options","projectName","template","projectPath","join","process","cwd","logger","info","mkdir","recursive","createMonorepo","createNestJSApp","createNextJSApp","success","packageJson","name","version","private","workspaces","scripts","dev","build","devDependencies","writeFile","JSON","stringify","readme","React","createContext","useContext","FusionContext","createContext","FusionProvider","children","baseUrl","client","React","useMemo","FusionFetcher","Provider","value","useFusion","context","useContext","Error","useState","useEffect","useAuth","client","useFusion","user","setUser","useState","loading","setLoading","useEffect","token","localStorage","getItem","loadUser","userData","get","error","removeItem","login","email","password","response","post","setItem","logout","isAuthenticated"]}
1
+ {"version":3,"sources":["../src/core/index.ts","../src/core/config.ts","../src/core/process-manager.ts","../src/core/errors.ts","../src/config/index.ts","../src/config/loader.ts","../src/insight/index.ts","../src/insight/server.ts","../src/create-fusion/index.ts","../src/create-fusion/scaffold.ts","../src/next/index.ts","../src/next/provider.tsx","../src/next/useAuth.ts"],"sourcesContent":["// Core exports placeholder\nexport * from './config';\nexport * from './logger';\nexport * from './filesystem';\nexport * from './process-manager';\nexport * from './errors';\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface FusionConfig {\n [key: string]: any;\n}\n\nexport class ConfigLoader {\n private config: Map<string, any> = new Map();\n private configDir: string;\n\n constructor(configDir: string = process.cwd()) {\n this.configDir = configDir;\n }\n\n /**\n * Load configuration from file or environment\n */\n load(key: string, defaultValue?: any): any {\n if (this.config.has(key)) {\n return this.config.get(key);\n }\n\n // Try to load from environment variable\n const envKey = `FUSION_${key.toUpperCase()}`;\n if (process.env[envKey]) {\n const value = this.parseEnvValue(process.env[envKey]!);\n this.config.set(key, value);\n return value;\n }\n\n // Try to load from config file\n const configPath = path.join(this.configDir, 'fusion.config.json');\n if (fs.existsSync(configPath)) {\n try {\n const fileConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\n if (fileConfig[key] !== undefined) {\n this.config.set(key, fileConfig[key]);\n return fileConfig[key];\n }\n } catch (error) {\n // Silently fail and use default\n }\n }\n\n return defaultValue;\n }\n\n /**\n * Set configuration value\n */\n set(key: string, value: any): void {\n this.config.set(key, value);\n }\n\n /**\n * Get all configuration\n */\n getAll(): FusionConfig {\n return Object.fromEntries(this.config);\n }\n\n /**\n * Parse environment value (handles JSON strings)\n */\n private parseEnvValue(value: string): any {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n}\n\n// Export singleton instance\nexport const config = new ConfigLoader();\n\n// Helper function for backward compatibility\nexport function load(key: string, defaultValue?: any): any {\n return config.load(key, defaultValue);\n}\n","export class ProcessManager {\n /**\n * Setup process error handlers\n */\n static initialize(): void {\n process.on('uncaughtException', (error) => {\n console.error('[Fusion] Uncaught Exception:', error);\n process.exit(1);\n });\n\n process.on('unhandledRejection', (reason, promise) => {\n console.error('[Fusion] Unhandled Rejection at:', promise, 'reason:', reason);\n });\n\n process.on('SIGTERM', () => {\n console.log('[Fusion] SIGTERM received, shutting down gracefully');\n process.exit(0);\n });\n\n process.on('SIGINT', () => {\n console.log('[Fusion] SIGINT received, shutting down gracefully');\n process.exit(0);\n });\n }\n\n /**\n * Graceful shutdown helper\n */\n static async shutdown(cleanup: () => Promise<void>): Promise<void> {\n try {\n await cleanup();\n process.exit(0);\n } catch (error) {\n console.error('[Fusion] Error during shutdown:', error);\n process.exit(1);\n }\n }\n}\n","export class FusionError extends Error {\n constructor(message: string, public code?: string) {\n super(message);\n this.name = 'FusionError';\n }\n}\n\nexport class ConfigError extends FusionError {\n constructor(message: string) {\n super(message, 'CONFIG_ERROR');\n this.name = 'ConfigError';\n }\n}\n\nexport class ValidationError extends FusionError {\n constructor(message: string) {\n super(message, 'VALIDATION_ERROR');\n this.name = 'ValidationError';\n }\n}\n\nexport class APIError extends FusionError {\n constructor(message: string, public statusCode?: number) {\n super(message, 'API_ERROR');\n this.name = 'APIError';\n }\n}\n","// Config exports placeholder\nexport * from './loader';\n","export const loader = {\n load: () => ({}),\n};\n","// Insight exports placeholder\nexport * from './server';\n","export const server = {\n start: () => console.log('Insight server started'),\n};\n","export * from './scaffold';\n","import { mkdir, writeFile } from 'fs/promises';\nimport { join } from 'path';\nimport { logger } from '../core/logger';\n\nexport interface ScaffoldOptions {\n projectName: string;\n template: 'monorepo' | 'api' | 'web';\n packageManager?: 'npm' | 'pnpm' | 'yarn';\n}\n\n/**\n * @deprecated Use the `wexts create` CLI and `examples/hello-rpc` canonical scaffold instead.\n */\nexport class ProjectScaffolder {\n async scaffold(options: ScaffoldOptions): Promise<void> {\n const { projectName, template } = options;\n const projectPath = join(process.cwd(), projectName);\n\n logger.info(`Creating project at: ${projectPath}`);\n\n // Create base directory\n await mkdir(projectPath, { recursive: true });\n\n if (template === 'monorepo') {\n await this.createMonorepo(projectPath, projectName);\n } else if (template === 'api') {\n await this.createNestJSApp(projectPath, projectName);\n } else if (template === 'web') {\n await this.createNextJSApp(projectPath, projectName);\n }\n\n logger.success(`Project ${projectName} created successfully!`);\n logger.info(`\\nNext steps:`);\n logger.info(` cd ${projectName}`);\n logger.info(` wexts dev`);\n }\n\n private async createMonorepo(projectPath: string, projectName: string): Promise<void> {\n // Create directory structure\n await mkdir(join(projectPath, 'apps', 'api'), { recursive: true });\n await mkdir(join(projectPath, 'apps', 'web'), { recursive: true });\n await mkdir(join(projectPath, 'packages', 'types'), { recursive: true });\n await mkdir(join(projectPath, 'packages', 'api-client'), { recursive: true });\n\n // Create root package.json\n const packageJson = {\n name: projectName,\n version: '0.0.1',\n private: true,\n workspaces: ['apps/*', 'packages/*'],\n scripts: {\n dev: 'wexts dev',\n build: 'wexts build',\n },\n devDependencies: {\n 'wexts': '^3.0.3',\n },\n };\n\n await writeFile(\n join(projectPath, 'package.json'),\n JSON.stringify(packageJson, null, 2)\n );\n\n // Create README\n const readme = `# ${projectName}\\n\\nCreated with the deprecated ProjectScaffolder compatibility API.\\n\\nUse examples/hello-rpc as the canonical Wexts reference.\\n\\n## Getting Started\\n\\n\\`\\`\\`bash\\nwexts dev\\n\\`\\`\\`\\n`;\n await writeFile(join(projectPath, 'README.md'), readme);\n }\n\n private async createNestJSApp(projectPath: string, projectName: string): Promise<void> {\n await writeFile(\n join(projectPath, 'README.md'),\n `# ${projectName}\\n\\nStandalone API scaffolding through ProjectScaffolder is deprecated. Use examples/hello-rpc or wexts create for the canonical path.\\n`\n );\n }\n\n private async createNextJSApp(projectPath: string, projectName: string): Promise<void> {\n await writeFile(\n join(projectPath, 'README.md'),\n `# ${projectName}\\n\\nStandalone web scaffolding through ProjectScaffolder is deprecated. Use examples/hello-rpc or wexts create for the canonical path.\\n`\n );\n }\n}\n","export * from './provider';\nexport * from './useAuth';\n","'use client';\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport { createWextsRpcClient, FusionFetcher, WextsRpcClient } from '../client/fetcher';\n\ninterface FusionContextType {\n client: FusionFetcher;\n wexts: WextsRpcClient;\n}\n\nconst FusionContext = createContext<FusionContextType | null>(null);\n\nexport interface FusionProviderProps {\n children: ReactNode;\n baseUrl?: string;\n rpcBaseUrl?: string;\n rpcClient?: object;\n}\n\n/**\n * FusionProvider - Provides API client to React components\n * Usage:\n * ```tsx\n * <FusionProvider baseUrl=\"/api\">\n * <App />\n * </FusionProvider>\n * ```\n */\nexport function FusionProvider({ children, baseUrl = '/api', rpcBaseUrl = '/rpc', rpcClient }: FusionProviderProps) {\n const client = React.useMemo(() => new FusionFetcher(baseUrl), [baseUrl]);\n const wexts = React.useMemo(\n () => (rpcClient as WextsRpcClient | undefined) ?? createWextsRpcClient(undefined, { baseUrl: rpcBaseUrl }),\n [rpcBaseUrl, rpcClient]\n );\n\n return (\n <FusionContext.Provider value={{ client, wexts }}>\n {children}\n </FusionContext.Provider>\n );\n}\n\n/**\n * useFusion hook - Access API client in components\n * Usage:\n * ```tsx\n * const { client } = useFusion();\n * const data = await client.get('/users');\n * ```\n */\nexport function useFusion(): FusionContextType {\n const context = useContext(FusionContext);\n if (!context) {\n throw new Error('useFusion must be used within FusionProvider');\n }\n return context;\n}\n\nexport function useWexts<TClient = WextsRpcClient>(): TClient {\n const context = useFusion();\n return context.wexts as TClient;\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport { useFusion } from './provider';\n\nexport interface AuthUser {\n id: string;\n email: string;\n name?: string;\n}\n\nexport interface UseAuthReturn {\n user: AuthUser | null;\n loading: boolean;\n login: (email: string, password: string) => Promise<void>;\n logout: () => Promise<void>;\n isAuthenticated: boolean;\n}\n\n/**\n * useAuth hook - Authentication state management\n * Usage:\n * ```tsx\n * const { user, login, logout, isAuthenticated } = useAuth();\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { client } = useFusion();\n const [user, setUser] = useState<AuthUser | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n // Check for existing session\n const token = localStorage.getItem('fusion_token');\n if (token) {\n // Validate token and load user\n loadUser();\n } else {\n setLoading(false);\n }\n }, []);\n\n const loadUser = async () => {\n try {\n const userData = await client.get<AuthUser>('/auth/me');\n setUser(userData);\n } catch (error) {\n localStorage.removeItem('fusion_token');\n } finally {\n setLoading(false);\n }\n };\n\n const login = async (email: string, password: string) => {\n const response = await client.post<{ token: string; user: AuthUser }>('/auth/login', {\n email,\n password,\n });\n localStorage.setItem('fusion_token', response.token);\n setUser(response.user);\n };\n\n const logout = async () => {\n localStorage.removeItem('fusion_token');\n setUser(null);\n };\n\n return {\n user,\n loading,\n login,\n logout,\n isAuthenticated: !!user,\n };\n}\n"],"mappings":"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","names":["fs","path","ConfigLoader","config","Map","configDir","process","cwd","load","key","defaultValue","has","get","envKey","toUpperCase","env","value","parseEnvValue","set","configPath","join","existsSync","fileConfig","JSON","parse","readFileSync","undefined","error","getAll","Object","fromEntries","ProcessManager","initialize","process","on","error","console","exit","reason","promise","log","shutdown","cleanup","FusionError","Error","message","code","name","ConfigError","ValidationError","APIError","statusCode","loader","load","server","start","console","log","mkdir","writeFile","join","ProjectScaffolder","scaffold","options","projectName","template","projectPath","join","process","cwd","logger","info","mkdir","recursive","createMonorepo","createNestJSApp","createNextJSApp","success","packageJson","name","version","private","workspaces","scripts","dev","build","devDependencies","writeFile","JSON","stringify","readme","React","createContext","useContext","FusionContext","createContext","FusionProvider","children","baseUrl","rpcBaseUrl","rpcClient","client","React","useMemo","FusionFetcher","wexts","createWextsRpcClient","undefined","Provider","value","useFusion","context","useContext","Error","useWexts","useState","useEffect","useAuth","client","useFusion","user","setUser","useState","loading","setLoading","useEffect","token","localStorage","getItem","loadUser","userData","get","error","removeItem","login","email","password","response","post","setItem","logout","isAuthenticated"]}
@@ -1 +1,3 @@
1
- export { a as FusionController, f as FusionDelete, c as FusionGet, d as FusionPost, e as FusionPut, b as FusionRoute, F as FusionRouteMetadata, g as getFusionMetadata } from '../index-BsNaOUtH.mjs';
1
+ export { F as FusionController, a as FusionDelete, b as FusionGet, c as FusionPost, d as FusionPut, e as FusionRoute, f as FusionRouteMetadata, g as getFusionMetadata } from '../index-D94W1__r.mjs';
2
+ export { R as RequireAuth, a as RpcMethod, b as RpcMethodOptions, c as RpcService, d as RpcServiceOptions, e as RuntimeRpcMethodMetadata, f as RuntimeRpcServiceMetadata, W as WextsRpc, g as WextsRpcService, h as getRpcAuthPolicy, i as getRuntimeRpcMethodsMetadata, j as getRuntimeRpcServiceMetadata } from '../decorators-BT1FFqN0.mjs';
3
+ import '../types-7d_fC-C3.mjs';
@@ -1 +1,3 @@
1
- export { a as FusionController, f as FusionDelete, c as FusionGet, d as FusionPost, e as FusionPut, b as FusionRoute, F as FusionRouteMetadata, g as getFusionMetadata } from '../index-BsNaOUtH.js';
1
+ export { F as FusionController, a as FusionDelete, b as FusionGet, c as FusionPost, d as FusionPut, e as FusionRoute, f as FusionRouteMetadata, g as getFusionMetadata } from '../index-Co5ZsLqq.js';
2
+ export { R as RequireAuth, a as RpcMethod, b as RpcMethodOptions, c as RpcService, d as RpcServiceOptions, e as RuntimeRpcMethodMetadata, f as RuntimeRpcServiceMetadata, W as WextsRpc, g as WextsRpcService, h as getRpcAuthPolicy, i as getRuntimeRpcMethodsMetadata, j as getRuntimeRpcServiceMetadata } from '../decorators-DvS58PqC.js';
3
+ import '../types-7d_fC-C3.js';
@@ -6,7 +6,17 @@
6
6
 
7
7
 
8
8
 
9
- var _chunkWF65EDRZjs = require('../chunk-WF65EDRZ.js');
9
+ var _chunkBG56B4DEjs = require('../chunk-BG56B4DE.js');
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+ var _chunk7QKLIVRFjs = require('../chunk-7QKLIVRF.js');
10
20
  require('../chunk-XE4OXN2W.js');
11
21
 
12
22
 
@@ -16,5 +26,13 @@ require('../chunk-XE4OXN2W.js');
16
26
 
17
27
 
18
28
 
19
- exports.FusionController = _chunkWF65EDRZjs.FusionController; exports.FusionDelete = _chunkWF65EDRZjs.FusionDelete; exports.FusionGet = _chunkWF65EDRZjs.FusionGet; exports.FusionPost = _chunkWF65EDRZjs.FusionPost; exports.FusionPut = _chunkWF65EDRZjs.FusionPut; exports.FusionRoute = _chunkWF65EDRZjs.FusionRoute; exports.getFusionMetadata = _chunkWF65EDRZjs.getFusionMetadata;
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+ exports.FusionController = _chunkBG56B4DEjs.FusionController; exports.FusionDelete = _chunkBG56B4DEjs.FusionDelete; exports.FusionGet = _chunkBG56B4DEjs.FusionGet; exports.FusionPost = _chunkBG56B4DEjs.FusionPost; exports.FusionPut = _chunkBG56B4DEjs.FusionPut; exports.FusionRoute = _chunkBG56B4DEjs.FusionRoute; exports.RequireAuth = _chunk7QKLIVRFjs.RequireAuth; exports.RpcMethod = _chunk7QKLIVRFjs.RpcMethod; exports.RpcService = _chunk7QKLIVRFjs.RpcService; exports.WextsRpc = _chunk7QKLIVRFjs.WextsRpc; exports.WextsRpcService = _chunk7QKLIVRFjs.WextsRpcService; exports.getFusionMetadata = _chunkBG56B4DEjs.getFusionMetadata; exports.getRpcAuthPolicy = _chunk7QKLIVRFjs.getRpcAuthPolicy; exports.getRuntimeRpcMethodsMetadata = _chunk7QKLIVRFjs.getRuntimeRpcMethodsMetadata; exports.getRuntimeRpcServiceMetadata = _chunk7QKLIVRFjs.getRuntimeRpcServiceMetadata;
20
38
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\dist\\nest\\index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yXAAC","file":"C:\\Users\\ziad\\Desktop\\wexts\\packages\\dist\\nest\\index.js"}
1
+ {"version":3,"sources":["/Volumes/Projects/wexts/packages/dist/nest/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,m2BAAC","file":"/Volumes/Projects/wexts/packages/dist/nest/index.js"}
@@ -6,8 +6,18 @@ import {
6
6
  FusionPut,
7
7
  FusionRoute,
8
8
  getFusionMetadata
9
- } from "../chunk-STTOPUZ2.mjs";
10
- import "../chunk-FCEZDH42.mjs";
9
+ } from "../chunk-UAL54DVV.mjs";
10
+ import {
11
+ RequireAuth,
12
+ RpcMethod,
13
+ RpcService,
14
+ WextsRpc,
15
+ WextsRpcService,
16
+ getRpcAuthPolicy,
17
+ getRuntimeRpcMethodsMetadata,
18
+ getRuntimeRpcServiceMetadata
19
+ } from "../chunk-YBM3IJEA.mjs";
20
+ import "../chunk-7WULUGLH.mjs";
11
21
  export {
12
22
  FusionController,
13
23
  FusionDelete,
@@ -15,6 +25,14 @@ export {
15
25
  FusionPost,
16
26
  FusionPut,
17
27
  FusionRoute,
18
- getFusionMetadata
28
+ RequireAuth,
29
+ RpcMethod,
30
+ RpcService,
31
+ WextsRpc,
32
+ WextsRpcService,
33
+ getFusionMetadata,
34
+ getRpcAuthPolicy,
35
+ getRuntimeRpcMethodsMetadata,
36
+ getRuntimeRpcServiceMetadata
19
37
  };
20
38
  //# sourceMappingURL=index.mjs.map
File without changes
@@ -9,13 +9,17 @@ declare class FusionFetcher {
9
9
  put<T>(path: string, body: any): Promise<T>;
10
10
  delete<T>(path: string): Promise<T>;
11
11
  }
12
+ type WextsRpcClient = Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>;
12
13
 
13
14
  interface FusionContextType {
14
15
  client: FusionFetcher;
16
+ wexts: WextsRpcClient;
15
17
  }
16
18
  interface FusionProviderProps {
17
19
  children: ReactNode;
18
20
  baseUrl?: string;
21
+ rpcBaseUrl?: string;
22
+ rpcClient?: object;
19
23
  }
20
24
  /**
21
25
  * FusionProvider - Provides API client to React components
@@ -26,7 +30,7 @@ interface FusionProviderProps {
26
30
  * </FusionProvider>
27
31
  * ```
28
32
  */
29
- declare function FusionProvider({ children, baseUrl }: FusionProviderProps): React.JSX.Element;
33
+ declare function FusionProvider({ children, baseUrl, rpcBaseUrl, rpcClient }: FusionProviderProps): React.JSX.Element;
30
34
  /**
31
35
  * useFusion hook - Access API client in components
32
36
  * Usage:
@@ -36,6 +40,7 @@ declare function FusionProvider({ children, baseUrl }: FusionProviderProps): Rea
36
40
  * ```
37
41
  */
38
42
  declare function useFusion(): FusionContextType;
43
+ declare function useWexts<TClient = WextsRpcClient>(): TClient;
39
44
 
40
45
  interface AuthUser {
41
46
  id: string;
@@ -58,4 +63,4 @@ interface UseAuthReturn {
58
63
  */
59
64
  declare function useAuth(): UseAuthReturn;
60
65
 
61
- export { type AuthUser, FusionProvider, type FusionProviderProps, type UseAuthReturn, useAuth, useFusion };
66
+ export { type AuthUser, FusionProvider, type FusionProviderProps, type UseAuthReturn, useAuth, useFusion, useWexts };
@@ -9,13 +9,17 @@ declare class FusionFetcher {
9
9
  put<T>(path: string, body: any): Promise<T>;
10
10
  delete<T>(path: string): Promise<T>;
11
11
  }
12
+ type WextsRpcClient = Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>;
12
13
 
13
14
  interface FusionContextType {
14
15
  client: FusionFetcher;
16
+ wexts: WextsRpcClient;
15
17
  }
16
18
  interface FusionProviderProps {
17
19
  children: ReactNode;
18
20
  baseUrl?: string;
21
+ rpcBaseUrl?: string;
22
+ rpcClient?: object;
19
23
  }
20
24
  /**
21
25
  * FusionProvider - Provides API client to React components
@@ -26,7 +30,7 @@ interface FusionProviderProps {
26
30
  * </FusionProvider>
27
31
  * ```
28
32
  */
29
- declare function FusionProvider({ children, baseUrl }: FusionProviderProps): React.JSX.Element;
33
+ declare function FusionProvider({ children, baseUrl, rpcBaseUrl, rpcClient }: FusionProviderProps): React.JSX.Element;
30
34
  /**
31
35
  * useFusion hook - Access API client in components
32
36
  * Usage:
@@ -36,6 +40,7 @@ declare function FusionProvider({ children, baseUrl }: FusionProviderProps): Rea
36
40
  * ```
37
41
  */
38
42
  declare function useFusion(): FusionContextType;
43
+ declare function useWexts<TClient = WextsRpcClient>(): TClient;
39
44
 
40
45
  interface AuthUser {
41
46
  id: string;
@@ -58,4 +63,4 @@ interface UseAuthReturn {
58
63
  */
59
64
  declare function useAuth(): UseAuthReturn;
60
65
 
61
- export { type AuthUser, FusionProvider, type FusionProviderProps, type UseAuthReturn, useAuth, useFusion };
66
+ export { type AuthUser, FusionProvider, type FusionProviderProps, type UseAuthReturn, useAuth, useFusion, useWexts };
@@ -34,7 +34,8 @@ var next_exports = {};
34
34
  __export(next_exports, {
35
35
  FusionProvider: () => FusionProvider,
36
36
  useAuth: () => useAuth,
37
- useFusion: () => useFusion
37
+ useFusion: () => useFusion,
38
+ useWexts: () => useWexts
38
39
  });
39
40
  module.exports = __toCommonJS(next_exports);
40
41
 
@@ -64,7 +65,10 @@ var FusionFetcher = class {
64
65
  body: body ? JSON.stringify(body) : void 0
65
66
  });
66
67
  if (!response.ok) {
67
- throw new Error(`Fusion API Error: ${response.statusText}`);
68
+ throw new Error(`Fusion API Error: ${response.status} ${response.statusText}`);
69
+ }
70
+ if (response.status === 204) {
71
+ return void 0;
68
72
  }
69
73
  return response.json();
70
74
  }
@@ -82,16 +86,73 @@ var FusionFetcher = class {
82
86
  }
83
87
  };
84
88
  var apiFetcher = new FusionFetcher();
89
+ function createWextsRpcClient(manifest, options = {}) {
90
+ const services = new Set((manifest?.services ?? []).map((service) => service.name));
91
+ const methodMap = /* @__PURE__ */ new Map();
92
+ for (const service of manifest?.services ?? []) {
93
+ methodMap.set(service.name, new Set(service.methods.map((method) => method.name)));
94
+ }
95
+ const createServiceProxy = /* @__PURE__ */ __name((serviceName) => new Proxy({}, {
96
+ get(_target, methodName) {
97
+ if (typeof methodName !== "string") return void 0;
98
+ if (methodName === "then") return void 0;
99
+ const knownMethods = methodMap.get(serviceName);
100
+ if (knownMethods && !knownMethods.has(methodName)) {
101
+ throw new Error(`Wexts RPC method not found: ${serviceName}.${methodName}`);
102
+ }
103
+ return (...args) => invokeRpc(serviceName, methodName, args, options);
104
+ }
105
+ }), "createServiceProxy");
106
+ return new Proxy({}, {
107
+ get(_target, serviceName) {
108
+ if (typeof serviceName !== "string") return void 0;
109
+ if (serviceName === "then") return void 0;
110
+ if (services.size > 0 && !services.has(serviceName)) {
111
+ throw new Error(`Wexts RPC service not found: ${serviceName}`);
112
+ }
113
+ return createServiceProxy(serviceName);
114
+ }
115
+ });
116
+ }
117
+ __name(createWextsRpcClient, "createWextsRpcClient");
118
+ async function invokeRpc(serviceName, methodName, args, options) {
119
+ const fetchImpl = options.fetch ?? fetch;
120
+ const baseUrl = options.baseUrl ?? "/rpc";
121
+ const headers = {
122
+ "Content-Type": "application/json",
123
+ ...await options.getHeaders?.() ?? {}
124
+ };
125
+ const response = await fetchImpl(`${baseUrl}/${encodeURIComponent(serviceName)}/${encodeURIComponent(methodName)}`, {
126
+ method: "POST",
127
+ headers,
128
+ body: JSON.stringify({
129
+ args
130
+ })
131
+ });
132
+ if (!response.ok) {
133
+ throw new Error(`Wexts RPC Error: ${response.status} ${response.statusText}`);
134
+ }
135
+ const payload = await response.json();
136
+ return payload.data;
137
+ }
138
+ __name(invokeRpc, "invokeRpc");
85
139
 
86
140
  // src/next/provider.tsx
87
141
  var FusionContext = /* @__PURE__ */ (0, import_react.createContext)(null);
88
- function FusionProvider({ children, baseUrl = "/api" }) {
142
+ function FusionProvider({ children, baseUrl = "/api", rpcBaseUrl = "/rpc", rpcClient }) {
89
143
  const client = import_react.default.useMemo(() => new FusionFetcher(baseUrl), [
90
144
  baseUrl
91
145
  ]);
146
+ const wexts = import_react.default.useMemo(() => rpcClient ?? createWextsRpcClient(void 0, {
147
+ baseUrl: rpcBaseUrl
148
+ }), [
149
+ rpcBaseUrl,
150
+ rpcClient
151
+ ]);
92
152
  return /* @__PURE__ */ import_react.default.createElement(FusionContext.Provider, {
93
153
  value: {
94
- client
154
+ client,
155
+ wexts
95
156
  }
96
157
  }, children);
97
158
  }
@@ -104,6 +165,11 @@ function useFusion() {
104
165
  return context;
105
166
  }
106
167
  __name(useFusion, "useFusion");
168
+ function useWexts() {
169
+ const context = useFusion();
170
+ return context.wexts;
171
+ }
172
+ __name(useWexts, "useWexts");
107
173
 
108
174
  // src/next/useAuth.ts
109
175
  var import_react2 = require("react");
@@ -154,6 +220,7 @@ __name(useAuth, "useAuth");
154
220
  0 && (module.exports = {
155
221
  FusionProvider,
156
222
  useAuth,
157
- useFusion
223
+ useFusion,
224
+ useWexts
158
225
  });
159
226
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/index.ts","../../src/next/provider.tsx","../../src/client/fetcher.ts","../../src/next/useAuth.ts"],"sourcesContent":["export * from './provider';\r\nexport * from './useAuth';\r\n","'use client';\r\n\r\nimport React, { createContext, useContext, ReactNode } from 'react';\r\nimport { FusionFetcher } from '../client/fetcher';\r\n\r\ninterface FusionContextType {\r\n client: FusionFetcher;\r\n}\r\n\r\nconst FusionContext = createContext<FusionContextType | null>(null);\r\n\r\nexport interface FusionProviderProps {\r\n children: ReactNode;\r\n baseUrl?: string;\r\n}\r\n\r\n/**\r\n * FusionProvider - Provides API client to React components\r\n * Usage:\r\n * ```tsx\r\n * <FusionProvider baseUrl=\"/api\">\r\n * <App />\r\n * </FusionProvider>\r\n * ```\r\n */\r\nexport function FusionProvider({ children, baseUrl = '/api' }: FusionProviderProps) {\r\n const client = React.useMemo(() => new FusionFetcher(baseUrl), [baseUrl]);\r\n\r\n return (\r\n <FusionContext.Provider value={{ client }}>\r\n {children}\r\n </FusionContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * useFusion hook - Access API client in components\r\n * Usage:\r\n * ```tsx\r\n * const { client } = useFusion();\r\n * const data = await client.get('/users');\r\n * ```\r\n */\r\nexport function useFusion(): FusionContextType {\r\n const context = useContext(FusionContext);\r\n if (!context) {\r\n throw new Error('useFusion must be used within FusionProvider');\r\n }\r\n return context;\r\n}\r\n","// packages/api-client/src/fetcher.ts\r\n\r\nexport class FusionFetcher {\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string = '/api') {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n private async request<T>(method: string, path: string, body?: any): Promise<T> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n };\r\n\r\n // Automatically attach Fusion Token if present\r\n if (typeof window !== 'undefined') {\r\n const token = localStorage.getItem('fusion_token');\r\n if (token) headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}${path}`, {\r\n method,\r\n headers,\r\n body: body ? JSON.stringify(body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Fusion API Error: ${response.statusText}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n get<T>(path: string) { return this.request<T>('GET', path); }\r\n post<T>(path: string, body: any) { return this.request<T>('POST', path, body); }\r\n put<T>(path: string, body: any) { return this.request<T>('PUT', path, body); }\r\n delete<T>(path: string) { return this.request<T>('DELETE', path); }\r\n}\r\n\r\nexport const apiFetcher = new FusionFetcher();\r\n","'use client';\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useFusion } from './provider';\r\n\r\nexport interface AuthUser {\r\n id: string;\r\n email: string;\r\n name?: string;\r\n}\r\n\r\nexport interface UseAuthReturn {\r\n user: AuthUser | null;\r\n loading: boolean;\r\n login: (email: string, password: string) => Promise<void>;\r\n logout: () => Promise<void>;\r\n isAuthenticated: boolean;\r\n}\r\n\r\n/**\r\n * useAuth hook - Authentication state management\r\n * Usage:\r\n * ```tsx\r\n * const { user, login, logout, isAuthenticated } = useAuth();\r\n * ```\r\n */\r\nexport function useAuth(): UseAuthReturn {\r\n const { client } = useFusion();\r\n const [user, setUser] = useState<AuthUser | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n // Check for existing session\r\n const token = localStorage.getItem('fusion_token');\r\n if (token) {\r\n // Validate token and load user\r\n loadUser();\r\n } else {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const loadUser = async () => {\r\n try {\r\n const userData = await client.get<AuthUser>('/auth/me');\r\n setUser(userData);\r\n } catch (error) {\r\n localStorage.removeItem('fusion_token');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const login = async (email: string, password: string) => {\r\n const response = await client.post<{ token: string; user: AuthUser }>('/auth/login', {\r\n email,\r\n password,\r\n });\r\n localStorage.setItem('fusion_token', response.token);\r\n setUser(response.user);\r\n };\r\n\r\n const logout = async () => {\r\n localStorage.removeItem('fusion_token');\r\n setUser(null);\r\n };\r\n\r\n return {\r\n user,\r\n loading,\r\n login,\r\n logout,\r\n isAuthenticated: !!user,\r\n };\r\n}\r\n"],"mappings":"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","names":["FusionFetcher","baseUrl","request","method","path","body","headers","window","token","localStorage","getItem","response","fetch","JSON","stringify","undefined","ok","Error","statusText","json","get","post","put","delete","apiFetcher","FusionContext","createContext","FusionProvider","children","baseUrl","client","React","useMemo","FusionFetcher","Provider","value","useFusion","context","useContext","Error","import_react","useAuth","client","useFusion","user","setUser","useState","loading","setLoading","useEffect","token","localStorage","getItem","loadUser","userData","get","error","removeItem","login","email","password","response","post","setItem","logout","isAuthenticated"]}
1
+ {"version":3,"sources":["../../src/next/index.ts","../../src/next/provider.tsx","../../src/client/fetcher.ts","../../src/next/useAuth.ts"],"sourcesContent":["export * from './provider';\nexport * from './useAuth';\n","'use client';\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport { createWextsRpcClient, FusionFetcher, WextsRpcClient } from '../client/fetcher';\n\ninterface FusionContextType {\n client: FusionFetcher;\n wexts: WextsRpcClient;\n}\n\nconst FusionContext = createContext<FusionContextType | null>(null);\n\nexport interface FusionProviderProps {\n children: ReactNode;\n baseUrl?: string;\n rpcBaseUrl?: string;\n rpcClient?: object;\n}\n\n/**\n * FusionProvider - Provides API client to React components\n * Usage:\n * ```tsx\n * <FusionProvider baseUrl=\"/api\">\n * <App />\n * </FusionProvider>\n * ```\n */\nexport function FusionProvider({ children, baseUrl = '/api', rpcBaseUrl = '/rpc', rpcClient }: FusionProviderProps) {\n const client = React.useMemo(() => new FusionFetcher(baseUrl), [baseUrl]);\n const wexts = React.useMemo(\n () => (rpcClient as WextsRpcClient | undefined) ?? createWextsRpcClient(undefined, { baseUrl: rpcBaseUrl }),\n [rpcBaseUrl, rpcClient]\n );\n\n return (\n <FusionContext.Provider value={{ client, wexts }}>\n {children}\n </FusionContext.Provider>\n );\n}\n\n/**\n * useFusion hook - Access API client in components\n * Usage:\n * ```tsx\n * const { client } = useFusion();\n * const data = await client.get('/users');\n * ```\n */\nexport function useFusion(): FusionContextType {\n const context = useContext(FusionContext);\n if (!context) {\n throw new Error('useFusion must be used within FusionProvider');\n }\n return context;\n}\n\nexport function useWexts<TClient = WextsRpcClient>(): TClient {\n const context = useFusion();\n return context.wexts as TClient;\n}\n","import type { RpcManifest, RpcInvocationResponse } from '../rpc/types';\n\nexport class FusionFetcher {\n private baseUrl: string;\n\n constructor(baseUrl: string = '/api') {\n this.baseUrl = baseUrl;\n }\n\n private async request<T>(method: string, path: string, body?: any): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Automatically attach Fusion Token if present\n if (typeof window !== 'undefined') {\n const token = localStorage.getItem('fusion_token');\n if (token) headers['Authorization'] = `Bearer ${token}`;\n }\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Fusion API Error: ${response.status} ${response.statusText}`);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n }\n\n get<T>(path: string) { return this.request<T>('GET', path); }\n post<T>(path: string, body: any) { return this.request<T>('POST', path, body); }\n put<T>(path: string, body: any) { return this.request<T>('PUT', path, body); }\n delete<T>(path: string) { return this.request<T>('DELETE', path); }\n}\n\nexport const apiFetcher = new FusionFetcher();\n\nexport interface WextsRpcClientOptions {\n baseUrl?: string;\n fetch?: typeof fetch;\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\nexport type WextsRpcClient = Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>;\n\nexport function createWextsRpcClient(\n manifest: Pick<RpcManifest, 'services'> | undefined,\n options: WextsRpcClientOptions = {}\n): WextsRpcClient {\n const services = new Set((manifest?.services ?? []).map((service) => service.name));\n const methodMap = new Map<string, Set<string>>();\n\n for (const service of manifest?.services ?? []) {\n methodMap.set(service.name, new Set(service.methods.map((method) => method.name)));\n }\n\n const createServiceProxy = (serviceName: string) => new Proxy({}, {\n get(_target, methodName) {\n if (typeof methodName !== 'string') return undefined;\n if (methodName === 'then') return undefined;\n\n const knownMethods = methodMap.get(serviceName);\n if (knownMethods && !knownMethods.has(methodName)) {\n throw new Error(`Wexts RPC method not found: ${serviceName}.${methodName}`);\n }\n\n return (...args: unknown[]) => invokeRpc(serviceName, methodName, args, options);\n },\n }) as Record<string, (...args: unknown[]) => Promise<unknown>>;\n\n return new Proxy({}, {\n get(_target, serviceName) {\n if (typeof serviceName !== 'string') return undefined;\n if (serviceName === 'then') return undefined;\n if (services.size > 0 && !services.has(serviceName)) {\n throw new Error(`Wexts RPC service not found: ${serviceName}`);\n }\n\n return createServiceProxy(serviceName);\n },\n }) as WextsRpcClient;\n}\n\nasync function invokeRpc(\n serviceName: string,\n methodName: string,\n args: unknown[],\n options: WextsRpcClientOptions\n): Promise<unknown> {\n const fetchImpl = options.fetch ?? fetch;\n const baseUrl = options.baseUrl ?? '/rpc';\n const headers = {\n 'Content-Type': 'application/json',\n ...(await options.getHeaders?.() ?? {}),\n };\n const response = await fetchImpl(`${baseUrl}/${encodeURIComponent(serviceName)}/${encodeURIComponent(methodName)}`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ args }),\n });\n\n if (!response.ok) {\n throw new Error(`Wexts RPC Error: ${response.status} ${response.statusText}`);\n }\n\n const payload = await response.json() as RpcInvocationResponse;\n return payload.data;\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport { useFusion } from './provider';\n\nexport interface AuthUser {\n id: string;\n email: string;\n name?: string;\n}\n\nexport interface UseAuthReturn {\n user: AuthUser | null;\n loading: boolean;\n login: (email: string, password: string) => Promise<void>;\n logout: () => Promise<void>;\n isAuthenticated: boolean;\n}\n\n/**\n * useAuth hook - Authentication state management\n * Usage:\n * ```tsx\n * const { user, login, logout, isAuthenticated } = useAuth();\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { client } = useFusion();\n const [user, setUser] = useState<AuthUser | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n // Check for existing session\n const token = localStorage.getItem('fusion_token');\n if (token) {\n // Validate token and load user\n loadUser();\n } else {\n setLoading(false);\n }\n }, []);\n\n const loadUser = async () => {\n try {\n const userData = await client.get<AuthUser>('/auth/me');\n setUser(userData);\n } catch (error) {\n localStorage.removeItem('fusion_token');\n } finally {\n setLoading(false);\n }\n };\n\n const login = async (email: string, password: string) => {\n const response = await client.post<{ token: string; user: AuthUser }>('/auth/login', {\n email,\n password,\n });\n localStorage.setItem('fusion_token', response.token);\n setUser(response.user);\n };\n\n const logout = async () => {\n localStorage.removeItem('fusion_token');\n setUser(null);\n };\n\n return {\n user,\n loading,\n login,\n logout,\n isAuthenticated: !!user,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;ACEA,mBAA4D;;;ACArD,IAAMA,gBAAN,MAAMA;EAAb,OAAaA;;;EACDC;EAER,YAAYA,UAAkB,QAAQ;AAClC,SAAKA,UAAUA;EACnB;EAEA,MAAcC,QAAWC,QAAgBC,MAAcC,MAAwB;AAC3E,UAAMC,UAAkC;MACpC,gBAAgB;IACpB;AAGA,QAAI,OAAOC,WAAW,aAAa;AAC/B,YAAMC,QAAQC,aAAaC,QAAQ,cAAA;AACnC,UAAIF,MAAOF,SAAQ,eAAA,IAAmB,UAAUE,KAAAA;IACpD;AAEJ,UAAMG,WAAW,MAAMC,MAAM,GAAG,KAAKX,OAAO,GAAGG,IAAAA,IAAQ;MAC/CD;MACAG;MACAD,MAAMA,OAAOQ,KAAKC,UAAUT,IAAAA,IAAQU;IACxC,CAAA;AAEA,QAAI,CAACJ,SAASK,IAAI;AACd,YAAM,IAAIC,MAAM,qBAAqBN,SAASO,MAAM,IAAIP,SAASQ,UAAU,EAAE;IACjF;AAEA,QAAIR,SAASO,WAAW,KAAK;AACzB,aAAOH;IACX;AAEA,WAAOJ,SAASS,KAAI;EACxB;EAEAC,IAAOjB,MAAc;AAAE,WAAO,KAAKF,QAAW,OAAOE,IAAAA;EAAO;EAC5DkB,KAAQlB,MAAcC,MAAW;AAAE,WAAO,KAAKH,QAAW,QAAQE,MAAMC,IAAAA;EAAO;EAC/EkB,IAAOnB,MAAcC,MAAW;AAAE,WAAO,KAAKH,QAAW,OAAOE,MAAMC,IAAAA;EAAO;EAC7EmB,OAAUpB,MAAc;AAAE,WAAO,KAAKF,QAAW,UAAUE,IAAAA;EAAO;AACtE;AAEO,IAAMqB,aAAa,IAAIzB,cAAAA;AAUvB,SAAS0B,qBACZC,UACAC,UAAiC,CAAC,GAAC;AAEnC,QAAMC,WAAW,IAAIC,KAAKH,UAAUE,YAAY,CAAA,GAAIE,IAAI,CAACC,YAAYA,QAAQC,IAAI,CAAA;AACjF,QAAMC,YAAY,oBAAIC,IAAAA;AAEtB,aAAWH,WAAWL,UAAUE,YAAY,CAAA,GAAI;AAC5CK,cAAUE,IAAIJ,QAAQC,MAAM,IAAIH,IAAIE,QAAQK,QAAQN,IAAI,CAAC5B,WAAWA,OAAO8B,IAAI,CAAA,CAAA;EACnF;AAEA,QAAMK,qBAAqB,wBAACC,gBAAwB,IAAIC,MAAM,CAAC,GAAG;IAC9DnB,IAAIoB,SAASC,YAAU;AACnB,UAAI,OAAOA,eAAe,SAAU,QAAO3B;AAC3C,UAAI2B,eAAe,OAAQ,QAAO3B;AAElC,YAAM4B,eAAeT,UAAUb,IAAIkB,WAAAA;AACnC,UAAII,gBAAgB,CAACA,aAAaC,IAAIF,UAAAA,GAAa;AAC/C,cAAM,IAAIzB,MAAM,+BAA+BsB,WAAAA,IAAeG,UAAAA,EAAY;MAC9E;AAEA,aAAO,IAAIG,SAAoBC,UAAUP,aAAaG,YAAYG,MAAMjB,OAAAA;IAC5E;EACJ,CAAA,GAZ2B;AAc3B,SAAO,IAAIY,MAAM,CAAC,GAAG;IACjBnB,IAAIoB,SAASF,aAAW;AACpB,UAAI,OAAOA,gBAAgB,SAAU,QAAOxB;AAC5C,UAAIwB,gBAAgB,OAAQ,QAAOxB;AACnC,UAAIc,SAASkB,OAAO,KAAK,CAAClB,SAASe,IAAIL,WAAAA,GAAc;AACjD,cAAM,IAAItB,MAAM,gCAAgCsB,WAAAA,EAAa;MACjE;AAEA,aAAOD,mBAAmBC,WAAAA;IAC9B;EACJ,CAAA;AACJ;AApCgBb;AAsChB,eAAeoB,UACXP,aACAG,YACAG,MACAjB,SAA8B;AAE9B,QAAMoB,YAAYpB,QAAQhB,SAASA;AACnC,QAAMX,UAAU2B,QAAQ3B,WAAW;AACnC,QAAMK,UAAU;IACZ,gBAAgB;IAChB,GAAI,MAAMsB,QAAQqB,aAAU,KAAQ,CAAC;EACzC;AACA,QAAMtC,WAAW,MAAMqC,UAAU,GAAG/C,OAAAA,IAAWiD,mBAAmBX,WAAAA,CAAAA,IAAgBW,mBAAmBR,UAAAA,CAAAA,IAAe;IAChHvC,QAAQ;IACRG;IACAD,MAAMQ,KAAKC,UAAU;MAAE+B;IAAK,CAAA;EAChC,CAAA;AAEA,MAAI,CAAClC,SAASK,IAAI;AACd,UAAM,IAAIC,MAAM,oBAAoBN,SAASO,MAAM,IAAIP,SAASQ,UAAU,EAAE;EAChF;AAEA,QAAMgC,UAAU,MAAMxC,SAASS,KAAI;AACnC,SAAO+B,QAAQC;AACnB;AAxBeN;;;ADjFf,IAAMO,gBAAgBC,gDAAwC,IAAA;AAkBvD,SAASC,eAAe,EAAEC,UAAUC,UAAU,QAAQC,aAAa,QAAQC,UAAS,GAAuB;AAC9G,QAAMC,SAASC,aAAAA,QAAMC,QAAQ,MAAM,IAAIC,cAAcN,OAAAA,GAAU;IAACA;GAAQ;AACxE,QAAMO,QAAQH,aAAAA,QAAMC,QAChB,MAAOH,aAA4CM,qBAAqBC,QAAW;IAAET,SAASC;EAAW,CAAA,GACzG;IAACA;IAAYC;GAAU;AAG3B,SACI,6BAAAE,QAAA,cAACR,cAAcc,UAAQ;IAACC,OAAO;MAAER;MAAQI;IAAM;KAC1CR,QAAAA;AAGb;AAZgBD;AAsBT,SAASc,YAAAA;AACZ,QAAMC,cAAUC,yBAAWlB,aAAAA;AAC3B,MAAI,CAACiB,SAAS;AACV,UAAM,IAAIE,MAAM,8CAAA;EACpB;AACA,SAAOF;AACX;AANgBD;AAQT,SAASI,WAAAA;AACZ,QAAMH,UAAUD,UAAAA;AAChB,SAAOC,QAAQN;AACnB;AAHgBS;;;AExDhB,IAAAC,gBAAoC;AAwB7B,SAASC,UAAAA;AACZ,QAAM,EAAEC,OAAM,IAAKC,UAAAA;AACnB,QAAM,CAACC,MAAMC,OAAAA,QAAWC,wBAA0B,IAAA;AAClD,QAAM,CAACC,SAASC,UAAAA,QAAcF,wBAAS,IAAA;AAEvCG,+BAAU,MAAA;AAEN,UAAMC,QAAQC,aAAaC,QAAQ,cAAA;AACnC,QAAIF,OAAO;AAEPG,eAAAA;IACJ,OAAO;AACHL,iBAAW,KAAA;IACf;EACJ,GAAG,CAAA,CAAE;AAEL,QAAMK,WAAW,mCAAA;AACb,QAAI;AACA,YAAMC,WAAW,MAAMZ,OAAOa,IAAc,UAAA;AAC5CV,cAAQS,QAAAA;IACZ,SAASE,OAAO;AACZL,mBAAaM,WAAW,cAAA;IAC5B,UAAA;AACIT,iBAAW,KAAA;IACf;EACJ,GATiB;AAWjB,QAAMU,QAAQ,8BAAOC,OAAeC,aAAAA;AAChC,UAAMC,WAAW,MAAMnB,OAAOoB,KAAwC,eAAe;MACjFH;MACAC;IACJ,CAAA;AACAT,iBAAaY,QAAQ,gBAAgBF,SAASX,KAAK;AACnDL,YAAQgB,SAASjB,IAAI;EACzB,GAPc;AASd,QAAMoB,SAAS,mCAAA;AACXb,iBAAaM,WAAW,cAAA;AACxBZ,YAAQ,IAAA;EACZ,GAHe;AAKf,SAAO;IACHD;IACAG;IACAW;IACAM;IACAC,iBAAiB,CAAC,CAACrB;EACvB;AACJ;AAhDgBH;","names":["FusionFetcher","baseUrl","request","method","path","body","headers","window","token","localStorage","getItem","response","fetch","JSON","stringify","undefined","ok","Error","status","statusText","json","get","post","put","delete","apiFetcher","createWextsRpcClient","manifest","options","services","Set","map","service","name","methodMap","Map","set","methods","createServiceProxy","serviceName","Proxy","_target","methodName","knownMethods","has","args","invokeRpc","size","fetchImpl","getHeaders","encodeURIComponent","payload","data","FusionContext","createContext","FusionProvider","children","baseUrl","rpcBaseUrl","rpcClient","client","React","useMemo","FusionFetcher","wexts","createWextsRpcClient","undefined","Provider","value","useFusion","context","useContext","Error","useWexts","import_react","useAuth","client","useFusion","user","setUser","useState","loading","setLoading","useEffect","token","localStorage","getItem","loadUser","userData","get","error","removeItem","login","email","password","response","post","setItem","logout","isAuthenticated"]}
@@ -28,7 +28,10 @@ var FusionFetcher = class {
28
28
  body: body ? JSON.stringify(body) : void 0
29
29
  });
30
30
  if (!response.ok) {
31
- throw new Error(`Fusion API Error: ${response.statusText}`);
31
+ throw new Error(`Fusion API Error: ${response.status} ${response.statusText}`);
32
+ }
33
+ if (response.status === 204) {
34
+ return void 0;
32
35
  }
33
36
  return response.json();
34
37
  }
@@ -46,16 +49,73 @@ var FusionFetcher = class {
46
49
  }
47
50
  };
48
51
  var apiFetcher = new FusionFetcher();
52
+ function createWextsRpcClient(manifest, options = {}) {
53
+ const services = new Set((manifest?.services ?? []).map((service) => service.name));
54
+ const methodMap = /* @__PURE__ */ new Map();
55
+ for (const service of manifest?.services ?? []) {
56
+ methodMap.set(service.name, new Set(service.methods.map((method) => method.name)));
57
+ }
58
+ const createServiceProxy = /* @__PURE__ */ __name((serviceName) => new Proxy({}, {
59
+ get(_target, methodName) {
60
+ if (typeof methodName !== "string") return void 0;
61
+ if (methodName === "then") return void 0;
62
+ const knownMethods = methodMap.get(serviceName);
63
+ if (knownMethods && !knownMethods.has(methodName)) {
64
+ throw new Error(`Wexts RPC method not found: ${serviceName}.${methodName}`);
65
+ }
66
+ return (...args) => invokeRpc(serviceName, methodName, args, options);
67
+ }
68
+ }), "createServiceProxy");
69
+ return new Proxy({}, {
70
+ get(_target, serviceName) {
71
+ if (typeof serviceName !== "string") return void 0;
72
+ if (serviceName === "then") return void 0;
73
+ if (services.size > 0 && !services.has(serviceName)) {
74
+ throw new Error(`Wexts RPC service not found: ${serviceName}`);
75
+ }
76
+ return createServiceProxy(serviceName);
77
+ }
78
+ });
79
+ }
80
+ __name(createWextsRpcClient, "createWextsRpcClient");
81
+ async function invokeRpc(serviceName, methodName, args, options) {
82
+ const fetchImpl = options.fetch ?? fetch;
83
+ const baseUrl = options.baseUrl ?? "/rpc";
84
+ const headers = {
85
+ "Content-Type": "application/json",
86
+ ...await options.getHeaders?.() ?? {}
87
+ };
88
+ const response = await fetchImpl(`${baseUrl}/${encodeURIComponent(serviceName)}/${encodeURIComponent(methodName)}`, {
89
+ method: "POST",
90
+ headers,
91
+ body: JSON.stringify({
92
+ args
93
+ })
94
+ });
95
+ if (!response.ok) {
96
+ throw new Error(`Wexts RPC Error: ${response.status} ${response.statusText}`);
97
+ }
98
+ const payload = await response.json();
99
+ return payload.data;
100
+ }
101
+ __name(invokeRpc, "invokeRpc");
49
102
 
50
103
  // src/next/provider.tsx
51
104
  var FusionContext = /* @__PURE__ */ createContext(null);
52
- function FusionProvider({ children, baseUrl = "/api" }) {
105
+ function FusionProvider({ children, baseUrl = "/api", rpcBaseUrl = "/rpc", rpcClient }) {
53
106
  const client = React.useMemo(() => new FusionFetcher(baseUrl), [
54
107
  baseUrl
55
108
  ]);
109
+ const wexts = React.useMemo(() => rpcClient ?? createWextsRpcClient(void 0, {
110
+ baseUrl: rpcBaseUrl
111
+ }), [
112
+ rpcBaseUrl,
113
+ rpcClient
114
+ ]);
56
115
  return /* @__PURE__ */ React.createElement(FusionContext.Provider, {
57
116
  value: {
58
- client
117
+ client,
118
+ wexts
59
119
  }
60
120
  }, children);
61
121
  }
@@ -68,6 +128,11 @@ function useFusion() {
68
128
  return context;
69
129
  }
70
130
  __name(useFusion, "useFusion");
131
+ function useWexts() {
132
+ const context = useFusion();
133
+ return context.wexts;
134
+ }
135
+ __name(useWexts, "useWexts");
71
136
 
72
137
  // src/next/useAuth.ts
73
138
  import { useState, useEffect } from "react";
@@ -117,6 +182,7 @@ __name(useAuth, "useAuth");
117
182
  export {
118
183
  FusionProvider,
119
184
  useAuth,
120
- useFusion
185
+ useFusion,
186
+ useWexts
121
187
  };
122
188
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/provider.tsx","../../src/client/fetcher.ts","../../src/next/useAuth.ts"],"sourcesContent":["'use client';\r\n\r\nimport React, { createContext, useContext, ReactNode } from 'react';\r\nimport { FusionFetcher } from '../client/fetcher';\r\n\r\ninterface FusionContextType {\r\n client: FusionFetcher;\r\n}\r\n\r\nconst FusionContext = createContext<FusionContextType | null>(null);\r\n\r\nexport interface FusionProviderProps {\r\n children: ReactNode;\r\n baseUrl?: string;\r\n}\r\n\r\n/**\r\n * FusionProvider - Provides API client to React components\r\n * Usage:\r\n * ```tsx\r\n * <FusionProvider baseUrl=\"/api\">\r\n * <App />\r\n * </FusionProvider>\r\n * ```\r\n */\r\nexport function FusionProvider({ children, baseUrl = '/api' }: FusionProviderProps) {\r\n const client = React.useMemo(() => new FusionFetcher(baseUrl), [baseUrl]);\r\n\r\n return (\r\n <FusionContext.Provider value={{ client }}>\r\n {children}\r\n </FusionContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * useFusion hook - Access API client in components\r\n * Usage:\r\n * ```tsx\r\n * const { client } = useFusion();\r\n * const data = await client.get('/users');\r\n * ```\r\n */\r\nexport function useFusion(): FusionContextType {\r\n const context = useContext(FusionContext);\r\n if (!context) {\r\n throw new Error('useFusion must be used within FusionProvider');\r\n }\r\n return context;\r\n}\r\n","// packages/api-client/src/fetcher.ts\r\n\r\nexport class FusionFetcher {\r\n private baseUrl: string;\r\n\r\n constructor(baseUrl: string = '/api') {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n private async request<T>(method: string, path: string, body?: any): Promise<T> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n };\r\n\r\n // Automatically attach Fusion Token if present\r\n if (typeof window !== 'undefined') {\r\n const token = localStorage.getItem('fusion_token');\r\n if (token) headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n const response = await fetch(`${this.baseUrl}${path}`, {\r\n method,\r\n headers,\r\n body: body ? JSON.stringify(body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Fusion API Error: ${response.statusText}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n\r\n get<T>(path: string) { return this.request<T>('GET', path); }\r\n post<T>(path: string, body: any) { return this.request<T>('POST', path, body); }\r\n put<T>(path: string, body: any) { return this.request<T>('PUT', path, body); }\r\n delete<T>(path: string) { return this.request<T>('DELETE', path); }\r\n}\r\n\r\nexport const apiFetcher = new FusionFetcher();\r\n","'use client';\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { useFusion } from './provider';\r\n\r\nexport interface AuthUser {\r\n id: string;\r\n email: string;\r\n name?: string;\r\n}\r\n\r\nexport interface UseAuthReturn {\r\n user: AuthUser | null;\r\n loading: boolean;\r\n login: (email: string, password: string) => Promise<void>;\r\n logout: () => Promise<void>;\r\n isAuthenticated: boolean;\r\n}\r\n\r\n/**\r\n * useAuth hook - Authentication state management\r\n * Usage:\r\n * ```tsx\r\n * const { user, login, logout, isAuthenticated } = useAuth();\r\n * ```\r\n */\r\nexport function useAuth(): UseAuthReturn {\r\n const { client } = useFusion();\r\n const [user, setUser] = useState<AuthUser | null>(null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n // Check for existing session\r\n const token = localStorage.getItem('fusion_token');\r\n if (token) {\r\n // Validate token and load user\r\n loadUser();\r\n } else {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n const loadUser = async () => {\r\n try {\r\n const userData = await client.get<AuthUser>('/auth/me');\r\n setUser(userData);\r\n } catch (error) {\r\n localStorage.removeItem('fusion_token');\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const login = async (email: string, password: string) => {\r\n const response = await client.post<{ token: string; user: AuthUser }>('/auth/login', {\r\n email,\r\n password,\r\n });\r\n localStorage.setItem('fusion_token', response.token);\r\n setUser(response.user);\r\n };\r\n\r\n const logout = async () => {\r\n localStorage.removeItem('fusion_token');\r\n setUser(null);\r\n };\r\n\r\n return {\r\n user,\r\n loading,\r\n login,\r\n logout,\r\n isAuthenticated: !!user,\r\n };\r\n}\r\n"],"mappings":";;;;;AAEA,OAAOA,SAASC,eAAeC,kBAA6B;;;ACArD,IAAMC,gBAAN,MAAMA;EAFb,OAEaA;;;EACDC;EAER,YAAYA,UAAkB,QAAQ;AAClC,SAAKA,UAAUA;EACnB;EAEA,MAAcC,QAAWC,QAAgBC,MAAcC,MAAwB;AAC3E,UAAMC,UAAkC;MACpC,gBAAgB;IACpB;AAGA,QAAI,OAAOC,WAAW,aAAa;AAC/B,YAAMC,QAAQC,aAAaC,QAAQ,cAAA;AACnC,UAAIF,MAAOF,SAAQ,eAAA,IAAmB,UAAUE,KAAAA;IACpD;AAEA,UAAMG,WAAW,MAAMC,MAAM,GAAG,KAAKX,OAAO,GAAGG,IAAAA,IAAQ;MACnDD;MACAG;MACAD,MAAMA,OAAOQ,KAAKC,UAAUT,IAAAA,IAAQU;IACxC,CAAA;AAEA,QAAI,CAACJ,SAASK,IAAI;AACd,YAAM,IAAIC,MAAM,qBAAqBN,SAASO,UAAU,EAAE;IAC9D;AAEA,WAAOP,SAASQ,KAAI;EACxB;EAEAC,IAAOhB,MAAc;AAAE,WAAO,KAAKF,QAAW,OAAOE,IAAAA;EAAO;EAC5DiB,KAAQjB,MAAcC,MAAW;AAAE,WAAO,KAAKH,QAAW,QAAQE,MAAMC,IAAAA;EAAO;EAC/EiB,IAAOlB,MAAcC,MAAW;AAAE,WAAO,KAAKH,QAAW,OAAOE,MAAMC,IAAAA;EAAO;EAC7EkB,OAAUnB,MAAc;AAAE,WAAO,KAAKF,QAAW,UAAUE,IAAAA;EAAO;AACtE;AAEO,IAAMoB,aAAa,IAAIxB,cAAAA;;;AD9B9B,IAAMyB,gBAAgBC,8BAAwC,IAAA;AAgBvD,SAASC,eAAe,EAAEC,UAAUC,UAAU,OAAM,GAAuB;AAC9E,QAAMC,SAASC,MAAMC,QAAQ,MAAM,IAAIC,cAAcJ,OAAAA,GAAU;IAACA;GAAQ;AAExE,SACI,sBAAA,cAACJ,cAAcS,UAAQ;IAACC,OAAO;MAAEL;IAAO;KACnCF,QAAAA;AAGb;AARgBD;AAkBT,SAASS,YAAAA;AACZ,QAAMC,UAAUC,WAAWb,aAAAA;AAC3B,MAAI,CAACY,SAAS;AACV,UAAM,IAAIE,MAAM,8CAAA;EACpB;AACA,SAAOF;AACX;AANgBD;;;AEzChB,SAASI,UAAUC,iBAAiB;AAwB7B,SAASC,UAAAA;AACZ,QAAM,EAAEC,OAAM,IAAKC,UAAAA;AACnB,QAAM,CAACC,MAAMC,OAAAA,IAAWC,SAA0B,IAAA;AAClD,QAAM,CAACC,SAASC,UAAAA,IAAcF,SAAS,IAAA;AAEvCG,YAAU,MAAA;AAEN,UAAMC,QAAQC,aAAaC,QAAQ,cAAA;AACnC,QAAIF,OAAO;AAEPG,eAAAA;IACJ,OAAO;AACHL,iBAAW,KAAA;IACf;EACJ,GAAG,CAAA,CAAE;AAEL,QAAMK,WAAW,mCAAA;AACb,QAAI;AACA,YAAMC,WAAW,MAAMZ,OAAOa,IAAc,UAAA;AAC5CV,cAAQS,QAAAA;IACZ,SAASE,OAAO;AACZL,mBAAaM,WAAW,cAAA;IAC5B,UAAA;AACIT,iBAAW,KAAA;IACf;EACJ,GATiB;AAWjB,QAAMU,QAAQ,8BAAOC,OAAeC,aAAAA;AAChC,UAAMC,WAAW,MAAMnB,OAAOoB,KAAwC,eAAe;MACjFH;MACAC;IACJ,CAAA;AACAT,iBAAaY,QAAQ,gBAAgBF,SAASX,KAAK;AACnDL,YAAQgB,SAASjB,IAAI;EACzB,GAPc;AASd,QAAMoB,SAAS,mCAAA;AACXb,iBAAaM,WAAW,cAAA;AACxBZ,YAAQ,IAAA;EACZ,GAHe;AAKf,SAAO;IACHD;IACAG;IACAW;IACAM;IACAC,iBAAiB,CAAC,CAACrB;EACvB;AACJ;AAhDgBH;","names":["React","createContext","useContext","FusionFetcher","baseUrl","request","method","path","body","headers","window","token","localStorage","getItem","response","fetch","JSON","stringify","undefined","ok","Error","statusText","json","get","post","put","delete","apiFetcher","FusionContext","createContext","FusionProvider","children","baseUrl","client","React","useMemo","FusionFetcher","Provider","value","useFusion","context","useContext","Error","useState","useEffect","useAuth","client","useFusion","user","setUser","useState","loading","setLoading","useEffect","token","localStorage","getItem","loadUser","userData","get","error","removeItem","login","email","password","response","post","setItem","logout","isAuthenticated"]}
1
+ {"version":3,"sources":["../../src/next/provider.tsx","../../src/client/fetcher.ts","../../src/next/useAuth.ts"],"sourcesContent":["'use client';\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport { createWextsRpcClient, FusionFetcher, WextsRpcClient } from '../client/fetcher';\n\ninterface FusionContextType {\n client: FusionFetcher;\n wexts: WextsRpcClient;\n}\n\nconst FusionContext = createContext<FusionContextType | null>(null);\n\nexport interface FusionProviderProps {\n children: ReactNode;\n baseUrl?: string;\n rpcBaseUrl?: string;\n rpcClient?: object;\n}\n\n/**\n * FusionProvider - Provides API client to React components\n * Usage:\n * ```tsx\n * <FusionProvider baseUrl=\"/api\">\n * <App />\n * </FusionProvider>\n * ```\n */\nexport function FusionProvider({ children, baseUrl = '/api', rpcBaseUrl = '/rpc', rpcClient }: FusionProviderProps) {\n const client = React.useMemo(() => new FusionFetcher(baseUrl), [baseUrl]);\n const wexts = React.useMemo(\n () => (rpcClient as WextsRpcClient | undefined) ?? createWextsRpcClient(undefined, { baseUrl: rpcBaseUrl }),\n [rpcBaseUrl, rpcClient]\n );\n\n return (\n <FusionContext.Provider value={{ client, wexts }}>\n {children}\n </FusionContext.Provider>\n );\n}\n\n/**\n * useFusion hook - Access API client in components\n * Usage:\n * ```tsx\n * const { client } = useFusion();\n * const data = await client.get('/users');\n * ```\n */\nexport function useFusion(): FusionContextType {\n const context = useContext(FusionContext);\n if (!context) {\n throw new Error('useFusion must be used within FusionProvider');\n }\n return context;\n}\n\nexport function useWexts<TClient = WextsRpcClient>(): TClient {\n const context = useFusion();\n return context.wexts as TClient;\n}\n","import type { RpcManifest, RpcInvocationResponse } from '../rpc/types';\n\nexport class FusionFetcher {\n private baseUrl: string;\n\n constructor(baseUrl: string = '/api') {\n this.baseUrl = baseUrl;\n }\n\n private async request<T>(method: string, path: string, body?: any): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Automatically attach Fusion Token if present\n if (typeof window !== 'undefined') {\n const token = localStorage.getItem('fusion_token');\n if (token) headers['Authorization'] = `Bearer ${token}`;\n }\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Fusion API Error: ${response.status} ${response.statusText}`);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n }\n\n get<T>(path: string) { return this.request<T>('GET', path); }\n post<T>(path: string, body: any) { return this.request<T>('POST', path, body); }\n put<T>(path: string, body: any) { return this.request<T>('PUT', path, body); }\n delete<T>(path: string) { return this.request<T>('DELETE', path); }\n}\n\nexport const apiFetcher = new FusionFetcher();\n\nexport interface WextsRpcClientOptions {\n baseUrl?: string;\n fetch?: typeof fetch;\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\nexport type WextsRpcClient = Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>;\n\nexport function createWextsRpcClient(\n manifest: Pick<RpcManifest, 'services'> | undefined,\n options: WextsRpcClientOptions = {}\n): WextsRpcClient {\n const services = new Set((manifest?.services ?? []).map((service) => service.name));\n const methodMap = new Map<string, Set<string>>();\n\n for (const service of manifest?.services ?? []) {\n methodMap.set(service.name, new Set(service.methods.map((method) => method.name)));\n }\n\n const createServiceProxy = (serviceName: string) => new Proxy({}, {\n get(_target, methodName) {\n if (typeof methodName !== 'string') return undefined;\n if (methodName === 'then') return undefined;\n\n const knownMethods = methodMap.get(serviceName);\n if (knownMethods && !knownMethods.has(methodName)) {\n throw new Error(`Wexts RPC method not found: ${serviceName}.${methodName}`);\n }\n\n return (...args: unknown[]) => invokeRpc(serviceName, methodName, args, options);\n },\n }) as Record<string, (...args: unknown[]) => Promise<unknown>>;\n\n return new Proxy({}, {\n get(_target, serviceName) {\n if (typeof serviceName !== 'string') return undefined;\n if (serviceName === 'then') return undefined;\n if (services.size > 0 && !services.has(serviceName)) {\n throw new Error(`Wexts RPC service not found: ${serviceName}`);\n }\n\n return createServiceProxy(serviceName);\n },\n }) as WextsRpcClient;\n}\n\nasync function invokeRpc(\n serviceName: string,\n methodName: string,\n args: unknown[],\n options: WextsRpcClientOptions\n): Promise<unknown> {\n const fetchImpl = options.fetch ?? fetch;\n const baseUrl = options.baseUrl ?? '/rpc';\n const headers = {\n 'Content-Type': 'application/json',\n ...(await options.getHeaders?.() ?? {}),\n };\n const response = await fetchImpl(`${baseUrl}/${encodeURIComponent(serviceName)}/${encodeURIComponent(methodName)}`, {\n method: 'POST',\n headers,\n body: JSON.stringify({ args }),\n });\n\n if (!response.ok) {\n throw new Error(`Wexts RPC Error: ${response.status} ${response.statusText}`);\n }\n\n const payload = await response.json() as RpcInvocationResponse;\n return payload.data;\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport { useFusion } from './provider';\n\nexport interface AuthUser {\n id: string;\n email: string;\n name?: string;\n}\n\nexport interface UseAuthReturn {\n user: AuthUser | null;\n loading: boolean;\n login: (email: string, password: string) => Promise<void>;\n logout: () => Promise<void>;\n isAuthenticated: boolean;\n}\n\n/**\n * useAuth hook - Authentication state management\n * Usage:\n * ```tsx\n * const { user, login, logout, isAuthenticated } = useAuth();\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { client } = useFusion();\n const [user, setUser] = useState<AuthUser | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n // Check for existing session\n const token = localStorage.getItem('fusion_token');\n if (token) {\n // Validate token and load user\n loadUser();\n } else {\n setLoading(false);\n }\n }, []);\n\n const loadUser = async () => {\n try {\n const userData = await client.get<AuthUser>('/auth/me');\n setUser(userData);\n } catch (error) {\n localStorage.removeItem('fusion_token');\n } finally {\n setLoading(false);\n }\n };\n\n const login = async (email: string, password: string) => {\n const response = await client.post<{ token: string; user: AuthUser }>('/auth/login', {\n email,\n password,\n });\n localStorage.setItem('fusion_token', response.token);\n setUser(response.user);\n };\n\n const logout = async () => {\n localStorage.removeItem('fusion_token');\n setUser(null);\n };\n\n return {\n user,\n loading,\n login,\n logout,\n isAuthenticated: !!user,\n };\n}\n"],"mappings":"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","names":["React","createContext","useContext","FusionFetcher","baseUrl","request","method","path","body","headers","window","token","localStorage","getItem","response","fetch","JSON","stringify","undefined","ok","Error","status","statusText","json","get","post","put","delete","apiFetcher","createWextsRpcClient","manifest","options","services","Set","map","service","name","methodMap","Map","set","methods","createServiceProxy","serviceName","Proxy","_target","methodName","knownMethods","has","args","invokeRpc","size","fetchImpl","getHeaders","encodeURIComponent","payload","data","FusionContext","createContext","FusionProvider","children","baseUrl","rpcBaseUrl","rpcClient","client","React","useMemo","FusionFetcher","wexts","createWextsRpcClient","undefined","Provider","value","useFusion","context","useContext","Error","useWexts","useState","useEffect","useAuth","client","useFusion","user","setUser","useState","loading","setLoading","useEffect","token","localStorage","getItem","loadUser","userData","get","error","removeItem","login","email","password","response","post","setItem","logout","isAuthenticated"]}
@@ -0,0 +1,2 @@
1
+ export { R as RequireAuth, a as RpcMethod, b as RpcMethodOptions, c as RpcService, d as RpcServiceOptions, e as RuntimeRpcMethodMetadata, f as RuntimeRpcServiceMetadata, W as WextsRpc, g as WextsRpcService, h as getRpcAuthPolicy, i as getRuntimeRpcMethodsMetadata, j as getRuntimeRpcServiceMetadata } from '../decorators-BT1FFqN0.mjs';
2
+ export { R as RpcAuthPolicy, a as RpcInvocationRequest, b as RpcInvocationResponse, c as RpcManifest, d as RpcMethodManifest, e as RpcParameterManifest, f as RpcServiceManifest } from '../types-7d_fC-C3.mjs';
@@ -0,0 +1,2 @@
1
+ export { R as RequireAuth, a as RpcMethod, b as RpcMethodOptions, c as RpcService, d as RpcServiceOptions, e as RuntimeRpcMethodMetadata, f as RuntimeRpcServiceMetadata, W as WextsRpc, g as WextsRpcService, h as getRpcAuthPolicy, i as getRuntimeRpcMethodsMetadata, j as getRuntimeRpcServiceMetadata } from '../decorators-DvS58PqC.js';
2
+ export { R as RpcAuthPolicy, a as RpcInvocationRequest, b as RpcInvocationResponse, c as RpcManifest, d as RpcMethodManifest, e as RpcParameterManifest, f as RpcServiceManifest } from '../types-7d_fC-C3.js';