wexts 2.0.9 → 3.0.1

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 (73) hide show
  1. package/README.md +241 -235
  2. package/dist/chunk-2KAQYLVN.js +1 -0
  3. package/dist/chunk-2KAQYLVN.js.map +1 -0
  4. package/dist/chunk-3OM7CHCA.js +65 -0
  5. package/dist/chunk-3OM7CHCA.js.map +1 -0
  6. package/dist/chunk-667BQCEM.js +375 -0
  7. package/dist/chunk-667BQCEM.js.map +1 -0
  8. package/dist/chunk-FCEZDH42.mjs +20 -0
  9. package/dist/chunk-FCEZDH42.mjs.map +1 -0
  10. package/dist/chunk-KXYLEUSW.mjs +242 -0
  11. package/dist/chunk-KXYLEUSW.mjs.map +1 -0
  12. package/dist/chunk-O42L6HOX.js +242 -0
  13. package/dist/chunk-O42L6HOX.js.map +1 -0
  14. package/dist/chunk-ONXNE2A6.mjs +375 -0
  15. package/dist/chunk-ONXNE2A6.mjs.map +1 -0
  16. package/dist/chunk-STTOPUZ2.mjs +88 -0
  17. package/dist/chunk-STTOPUZ2.mjs.map +1 -0
  18. package/dist/chunk-VMT3LALB.mjs +51 -0
  19. package/dist/chunk-VMT3LALB.mjs.map +1 -0
  20. package/dist/chunk-VNNVLQLJ.mjs +65 -0
  21. package/dist/chunk-VNNVLQLJ.mjs.map +1 -0
  22. package/dist/chunk-WF65EDRZ.js +88 -0
  23. package/dist/chunk-WF65EDRZ.js.map +1 -0
  24. package/dist/chunk-XE4OXN2W.js +12 -0
  25. package/dist/chunk-XE4OXN2W.js.map +1 -0
  26. package/dist/chunk-XVKTIYHY.js +51 -0
  27. package/dist/chunk-XVKTIYHY.js.map +1 -0
  28. package/dist/chunk-YSLEF5C5.mjs +1 -0
  29. package/dist/chunk-YSLEF5C5.mjs.map +1 -0
  30. package/dist/cli/index.js +134 -81
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/cli/index.mjs +93 -41
  33. package/dist/cli/index.mjs.map +1 -1
  34. package/dist/client/index.js +3 -3
  35. package/dist/client/index.mjs +2 -2
  36. package/dist/codegen/index.js +4 -4
  37. package/dist/codegen/index.mjs +3 -3
  38. package/dist/dev-server/index.js +4 -4
  39. package/dist/dev-server/index.mjs +3 -3
  40. package/dist/index.js +93 -51
  41. package/dist/index.js.map +1 -1
  42. package/dist/index.mjs +75 -33
  43. package/dist/index.mjs.map +1 -1
  44. package/dist/nest/index.js +3 -3
  45. package/dist/nest/index.mjs +2 -2
  46. package/dist/next/index.js +22 -9
  47. package/dist/next/index.js.map +1 -1
  48. package/dist/next/index.mjs +23 -9
  49. package/dist/next/index.mjs.map +1 -1
  50. package/dist/types/index.js +1 -1
  51. package/dist/types/index.mjs +2 -2
  52. package/package.json +126 -112
  53. package/templates/.dockerignore +43 -0
  54. package/templates/.env.example +17 -0
  55. package/templates/Dockerfile +60 -0
  56. package/templates/Procfile +1 -0
  57. package/templates/README.md +58 -0
  58. package/templates/api-sdk.ts +115 -0
  59. package/templates/docker-compose.yml +34 -0
  60. package/templates/nestjs-api/src/auth/auth.controller.ts +4 -7
  61. package/templates/nestjs-api/src/auth/auth.module.ts +4 -1
  62. package/templates/nestjs-api/src/auth/auth.service.ts +8 -13
  63. package/templates/nestjs-api/src/todos/todos.controller.ts +0 -7
  64. package/templates/nestjs-api/src/todos/todos.module.ts +3 -1
  65. package/templates/nestjs-api/src/users/users.controller.ts +0 -3
  66. package/templates/nestjs-api/src/users/users.module.ts +3 -1
  67. package/templates/nextjs-web/app/actions/auth.ts +49 -20
  68. package/templates/nextjs-web/lib/api.ts +115 -0
  69. package/templates/nextjs-web/next-env.d.ts +1 -1
  70. package/templates/nixpacks.toml +11 -0
  71. package/templates/root-package.json +32 -0
  72. package/templates/server.ts +66 -0
  73. package/templates/tsconfig.json +31 -0
package/dist/index.mjs CHANGED
@@ -1,27 +1,28 @@
1
1
  import {
2
2
  FusionFetcher
3
- } from "./chunk-67IJ6H4J.mjs";
3
+ } from "./chunk-VMT3LALB.mjs";
4
4
  import {
5
5
  nest_exports
6
- } from "./chunk-WMHVXEYQ.mjs";
7
- import "./chunk-7NSRDJ5C.mjs";
6
+ } from "./chunk-STTOPUZ2.mjs";
7
+ import "./chunk-YSLEF5C5.mjs";
8
8
  import {
9
9
  FileSystem,
10
10
  codegen_exports,
11
11
  filesystem
12
- } from "./chunk-63MTCWU2.mjs";
12
+ } from "./chunk-ONXNE2A6.mjs";
13
13
  import {
14
14
  dev_server_exports
15
- } from "./chunk-OTBYRUBE.mjs";
15
+ } from "./chunk-KXYLEUSW.mjs";
16
16
  import {
17
17
  LogLevel,
18
18
  Logger,
19
19
  createLogger,
20
20
  logger
21
- } from "./chunk-HSFLZUJN.mjs";
21
+ } from "./chunk-VNNVLQLJ.mjs";
22
22
  import {
23
- __export
24
- } from "./chunk-CKZ4VSCB.mjs";
23
+ __export,
24
+ __name
25
+ } from "./chunk-FCEZDH42.mjs";
25
26
 
26
27
  // src/core/index.ts
27
28
  var core_exports = {};
@@ -46,6 +47,9 @@ __export(core_exports, {
46
47
  import * as fs from "fs";
47
48
  import * as path from "path";
48
49
  var ConfigLoader = class {
50
+ static {
51
+ __name(this, "ConfigLoader");
52
+ }
49
53
  config = /* @__PURE__ */ new Map();
50
54
  configDir;
51
55
  constructor(configDir = process.cwd()) {
@@ -104,9 +108,13 @@ var config = new ConfigLoader();
104
108
  function load(key, defaultValue) {
105
109
  return config.load(key, defaultValue);
106
110
  }
111
+ __name(load, "load");
107
112
 
108
113
  // src/core/process-manager.ts
109
114
  var ProcessManager = class {
115
+ static {
116
+ __name(this, "ProcessManager");
117
+ }
110
118
  /**
111
119
  * Setup process error handlers
112
120
  */
@@ -143,28 +151,40 @@ var ProcessManager = class {
143
151
 
144
152
  // src/core/errors.ts
145
153
  var FusionError = class extends Error {
154
+ static {
155
+ __name(this, "FusionError");
156
+ }
157
+ code;
146
158
  constructor(message, code) {
147
- super(message);
148
- this.code = code;
159
+ super(message), this.code = code;
149
160
  this.name = "FusionError";
150
161
  }
151
162
  };
152
163
  var ConfigError = class extends FusionError {
164
+ static {
165
+ __name(this, "ConfigError");
166
+ }
153
167
  constructor(message) {
154
168
  super(message, "CONFIG_ERROR");
155
169
  this.name = "ConfigError";
156
170
  }
157
171
  };
158
172
  var ValidationError = class extends FusionError {
173
+ static {
174
+ __name(this, "ValidationError");
175
+ }
159
176
  constructor(message) {
160
177
  super(message, "VALIDATION_ERROR");
161
178
  this.name = "ValidationError";
162
179
  }
163
180
  };
164
181
  var APIError = class extends FusionError {
182
+ static {
183
+ __name(this, "APIError");
184
+ }
185
+ statusCode;
165
186
  constructor(message, statusCode) {
166
- super(message, "API_ERROR");
167
- this.statusCode = statusCode;
187
+ super(message, "API_ERROR"), this.statusCode = statusCode;
168
188
  this.name = "APIError";
169
189
  }
170
190
  };
@@ -177,7 +197,7 @@ __export(config_exports, {
177
197
 
178
198
  // src/config/loader.ts
179
199
  var loader = {
180
- load: () => ({})
200
+ load: /* @__PURE__ */ __name(() => ({}), "load")
181
201
  };
182
202
 
183
203
  // src/insight/index.ts
@@ -188,7 +208,7 @@ __export(insight_exports, {
188
208
 
189
209
  // src/insight/server.ts
190
210
  var server = {
191
- start: () => console.log("Insight server started")
211
+ start: /* @__PURE__ */ __name(() => console.log("Insight server started"), "start")
192
212
  };
193
213
 
194
214
  // src/create-fusion/index.ts
@@ -201,11 +221,16 @@ __export(create_fusion_exports, {
201
221
  import { mkdir, writeFile } from "fs/promises";
202
222
  import { join as join2 } from "path";
203
223
  var ProjectScaffolder = class {
224
+ static {
225
+ __name(this, "ProjectScaffolder");
226
+ }
204
227
  async scaffold(options) {
205
228
  const { projectName, template } = options;
206
229
  const projectPath = join2(process.cwd(), projectName);
207
230
  logger.info(`Creating project at: ${projectPath}`);
208
- await mkdir(projectPath, { recursive: true });
231
+ await mkdir(projectPath, {
232
+ recursive: true
233
+ });
209
234
  if (template === "monorepo") {
210
235
  await this.createMonorepo(projectPath, projectName);
211
236
  } else if (template === "api") {
@@ -220,15 +245,26 @@ Next steps:`);
220
245
  logger.info(` fusion dev`);
221
246
  }
222
247
  async createMonorepo(projectPath, projectName) {
223
- await mkdir(join2(projectPath, "apps", "api"), { recursive: true });
224
- await mkdir(join2(projectPath, "apps", "web"), { recursive: true });
225
- await mkdir(join2(projectPath, "packages", "types"), { recursive: true });
226
- await mkdir(join2(projectPath, "packages", "api-client"), { recursive: true });
248
+ await mkdir(join2(projectPath, "apps", "api"), {
249
+ recursive: true
250
+ });
251
+ await mkdir(join2(projectPath, "apps", "web"), {
252
+ recursive: true
253
+ });
254
+ await mkdir(join2(projectPath, "packages", "types"), {
255
+ recursive: true
256
+ });
257
+ await mkdir(join2(projectPath, "packages", "api-client"), {
258
+ recursive: true
259
+ });
227
260
  const packageJson = {
228
261
  name: projectName,
229
262
  version: "0.0.1",
230
263
  private: true,
231
- workspaces: ["apps/*", "packages/*"],
264
+ workspaces: [
265
+ "apps/*",
266
+ "packages/*"
267
+ ],
232
268
  scripts: {
233
269
  dev: "fusion dev",
234
270
  build: "fusion build"
@@ -237,10 +273,7 @@ Next steps:`);
237
273
  "wexts": "^1.0.0"
238
274
  }
239
275
  };
240
- await writeFile(
241
- join2(projectPath, "package.json"),
242
- JSON.stringify(packageJson, null, 2)
243
- );
276
+ await writeFile(join2(projectPath, "package.json"), JSON.stringify(packageJson, null, 2));
244
277
  const readme = `# ${projectName}
245
278
 
246
279
  Created with wexts
@@ -271,11 +304,18 @@ __export(next_exports, {
271
304
 
272
305
  // src/next/provider.tsx
273
306
  import React, { createContext, useContext } from "react";
274
- var FusionContext = createContext(null);
307
+ var FusionContext = /* @__PURE__ */ createContext(null);
275
308
  function FusionProvider({ children, baseUrl = "/api" }) {
276
- const client = React.useMemo(() => new FusionFetcher(baseUrl), [baseUrl]);
277
- return /* @__PURE__ */ React.createElement(FusionContext.Provider, { value: { client } }, children);
309
+ const client = React.useMemo(() => new FusionFetcher(baseUrl), [
310
+ baseUrl
311
+ ]);
312
+ return /* @__PURE__ */ React.createElement(FusionContext.Provider, {
313
+ value: {
314
+ client
315
+ }
316
+ }, children);
278
317
  }
318
+ __name(FusionProvider, "FusionProvider");
279
319
  function useFusion() {
280
320
  const context = useContext(FusionContext);
281
321
  if (!context) {
@@ -283,6 +323,7 @@ function useFusion() {
283
323
  }
284
324
  return context;
285
325
  }
326
+ __name(useFusion, "useFusion");
286
327
 
287
328
  // src/next/useAuth.ts
288
329
  import { useState, useEffect } from "react";
@@ -298,7 +339,7 @@ function useAuth() {
298
339
  setLoading(false);
299
340
  }
300
341
  }, []);
301
- const loadUser = async () => {
342
+ const loadUser = /* @__PURE__ */ __name(async () => {
302
343
  try {
303
344
  const userData = await client.get("/auth/me");
304
345
  setUser(userData);
@@ -307,19 +348,19 @@ function useAuth() {
307
348
  } finally {
308
349
  setLoading(false);
309
350
  }
310
- };
311
- const login = async (email, password) => {
351
+ }, "loadUser");
352
+ const login = /* @__PURE__ */ __name(async (email, password) => {
312
353
  const response = await client.post("/auth/login", {
313
354
  email,
314
355
  password
315
356
  });
316
357
  localStorage.setItem("fusion_token", response.token);
317
358
  setUser(response.user);
318
- };
319
- const logout = async () => {
359
+ }, "login");
360
+ const logout = /* @__PURE__ */ __name(async () => {
320
361
  localStorage.removeItem("fusion_token");
321
362
  setUser(null);
322
- };
363
+ }, "logout");
323
364
  return {
324
365
  user,
325
366
  loading,
@@ -328,6 +369,7 @@ function useAuth() {
328
369
  isAuthenticated: !!user
329
370
  };
330
371
  }
372
+ __name(useAuth, "useAuth");
331
373
  export {
332
374
  codegen_exports as Codegen,
333
375
  config_exports as Config,
@@ -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":["join","join"]}
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"]}
@@ -6,8 +6,8 @@
6
6
 
7
7
 
8
8
 
9
- var _chunkGKVPGKAHjs = require('../chunk-GKVPGKAH.js');
10
- require('../chunk-PZ5AY32C.js');
9
+ var _chunkWF65EDRZjs = require('../chunk-WF65EDRZ.js');
10
+ require('../chunk-XE4OXN2W.js');
11
11
 
12
12
 
13
13
 
@@ -16,5 +16,5 @@ require('../chunk-PZ5AY32C.js');
16
16
 
17
17
 
18
18
 
19
- exports.FusionController = _chunkGKVPGKAHjs.FusionController; exports.FusionDelete = _chunkGKVPGKAHjs.FusionDelete; exports.FusionGet = _chunkGKVPGKAHjs.FusionGet; exports.FusionPost = _chunkGKVPGKAHjs.FusionPost; exports.FusionPut = _chunkGKVPGKAHjs.FusionPut; exports.FusionRoute = _chunkGKVPGKAHjs.FusionRoute; exports.getFusionMetadata = _chunkGKVPGKAHjs.getFusionMetadata;
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;
20
20
  //# sourceMappingURL=index.js.map
@@ -6,8 +6,8 @@ import {
6
6
  FusionPut,
7
7
  FusionRoute,
8
8
  getFusionMetadata
9
- } from "../chunk-WMHVXEYQ.mjs";
10
- import "../chunk-CKZ4VSCB.mjs";
9
+ } from "../chunk-STTOPUZ2.mjs";
10
+ import "../chunk-FCEZDH42.mjs";
11
11
  export {
12
12
  FusionController,
13
13
  FusionDelete,
@@ -6,6 +6,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __getProtoOf = Object.getPrototypeOf;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
10
  var __export = (target, all) => {
10
11
  for (var name in all)
11
12
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -42,6 +43,9 @@ var import_react = __toESM(require("react"));
42
43
 
43
44
  // src/client/fetcher.ts
44
45
  var FusionFetcher = class {
46
+ static {
47
+ __name(this, "FusionFetcher");
48
+ }
45
49
  baseUrl;
46
50
  constructor(baseUrl = "/api") {
47
51
  this.baseUrl = baseUrl;
@@ -80,11 +84,18 @@ var FusionFetcher = class {
80
84
  var apiFetcher = new FusionFetcher();
81
85
 
82
86
  // src/next/provider.tsx
83
- var FusionContext = (0, import_react.createContext)(null);
87
+ var FusionContext = /* @__PURE__ */ (0, import_react.createContext)(null);
84
88
  function FusionProvider({ children, baseUrl = "/api" }) {
85
- const client = import_react.default.useMemo(() => new FusionFetcher(baseUrl), [baseUrl]);
86
- return /* @__PURE__ */ import_react.default.createElement(FusionContext.Provider, { value: { client } }, children);
89
+ const client = import_react.default.useMemo(() => new FusionFetcher(baseUrl), [
90
+ baseUrl
91
+ ]);
92
+ return /* @__PURE__ */ import_react.default.createElement(FusionContext.Provider, {
93
+ value: {
94
+ client
95
+ }
96
+ }, children);
87
97
  }
98
+ __name(FusionProvider, "FusionProvider");
88
99
  function useFusion() {
89
100
  const context = (0, import_react.useContext)(FusionContext);
90
101
  if (!context) {
@@ -92,6 +103,7 @@ function useFusion() {
92
103
  }
93
104
  return context;
94
105
  }
106
+ __name(useFusion, "useFusion");
95
107
 
96
108
  // src/next/useAuth.ts
97
109
  var import_react2 = require("react");
@@ -107,7 +119,7 @@ function useAuth() {
107
119
  setLoading(false);
108
120
  }
109
121
  }, []);
110
- const loadUser = async () => {
122
+ const loadUser = /* @__PURE__ */ __name(async () => {
111
123
  try {
112
124
  const userData = await client.get("/auth/me");
113
125
  setUser(userData);
@@ -116,19 +128,19 @@ function useAuth() {
116
128
  } finally {
117
129
  setLoading(false);
118
130
  }
119
- };
120
- const login = async (email, password) => {
131
+ }, "loadUser");
132
+ const login = /* @__PURE__ */ __name(async (email, password) => {
121
133
  const response = await client.post("/auth/login", {
122
134
  email,
123
135
  password
124
136
  });
125
137
  localStorage.setItem("fusion_token", response.token);
126
138
  setUser(response.user);
127
- };
128
- const logout = async () => {
139
+ }, "login");
140
+ const logout = /* @__PURE__ */ __name(async () => {
129
141
  localStorage.removeItem("fusion_token");
130
142
  setUser(null);
131
- };
143
+ }, "logout");
132
144
  return {
133
145
  user,
134
146
  loading,
@@ -137,6 +149,7 @@ function useAuth() {
137
149
  isAuthenticated: !!user
138
150
  };
139
151
  }
152
+ __name(useAuth, "useAuth");
140
153
  // Annotate the CommonJS export names for ESM import in node:
141
154
  0 && (module.exports = {
142
155
  FusionProvider,
@@ -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":["React","import_react"]}
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,10 +1,15 @@
1
1
  "use client";
2
+ var __defProp = Object.defineProperty;
3
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
2
4
 
3
5
  // src/next/provider.tsx
4
6
  import React, { createContext, useContext } from "react";
5
7
 
6
8
  // src/client/fetcher.ts
7
9
  var FusionFetcher = class {
10
+ static {
11
+ __name(this, "FusionFetcher");
12
+ }
8
13
  baseUrl;
9
14
  constructor(baseUrl = "/api") {
10
15
  this.baseUrl = baseUrl;
@@ -43,11 +48,18 @@ var FusionFetcher = class {
43
48
  var apiFetcher = new FusionFetcher();
44
49
 
45
50
  // src/next/provider.tsx
46
- var FusionContext = createContext(null);
51
+ var FusionContext = /* @__PURE__ */ createContext(null);
47
52
  function FusionProvider({ children, baseUrl = "/api" }) {
48
- const client = React.useMemo(() => new FusionFetcher(baseUrl), [baseUrl]);
49
- return /* @__PURE__ */ React.createElement(FusionContext.Provider, { value: { client } }, children);
53
+ const client = React.useMemo(() => new FusionFetcher(baseUrl), [
54
+ baseUrl
55
+ ]);
56
+ return /* @__PURE__ */ React.createElement(FusionContext.Provider, {
57
+ value: {
58
+ client
59
+ }
60
+ }, children);
50
61
  }
62
+ __name(FusionProvider, "FusionProvider");
51
63
  function useFusion() {
52
64
  const context = useContext(FusionContext);
53
65
  if (!context) {
@@ -55,6 +67,7 @@ function useFusion() {
55
67
  }
56
68
  return context;
57
69
  }
70
+ __name(useFusion, "useFusion");
58
71
 
59
72
  // src/next/useAuth.ts
60
73
  import { useState, useEffect } from "react";
@@ -70,7 +83,7 @@ function useAuth() {
70
83
  setLoading(false);
71
84
  }
72
85
  }, []);
73
- const loadUser = async () => {
86
+ const loadUser = /* @__PURE__ */ __name(async () => {
74
87
  try {
75
88
  const userData = await client.get("/auth/me");
76
89
  setUser(userData);
@@ -79,19 +92,19 @@ function useAuth() {
79
92
  } finally {
80
93
  setLoading(false);
81
94
  }
82
- };
83
- const login = async (email, password) => {
95
+ }, "loadUser");
96
+ const login = /* @__PURE__ */ __name(async (email, password) => {
84
97
  const response = await client.post("/auth/login", {
85
98
  email,
86
99
  password
87
100
  });
88
101
  localStorage.setItem("fusion_token", response.token);
89
102
  setUser(response.user);
90
- };
91
- const logout = async () => {
103
+ }, "login");
104
+ const logout = /* @__PURE__ */ __name(async () => {
92
105
  localStorage.removeItem("fusion_token");
93
106
  setUser(null);
94
- };
107
+ }, "logout");
95
108
  return {
96
109
  user,
97
110
  loading,
@@ -100,6 +113,7 @@ function useAuth() {
100
113
  isAuthenticated: !!user
101
114
  };
102
115
  }
116
+ __name(useAuth, "useAuth");
103
117
  export {
104
118
  FusionProvider,
105
119
  useAuth,