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.
- package/README.md +241 -235
- package/dist/chunk-2KAQYLVN.js +1 -0
- package/dist/chunk-2KAQYLVN.js.map +1 -0
- package/dist/chunk-3OM7CHCA.js +65 -0
- package/dist/chunk-3OM7CHCA.js.map +1 -0
- package/dist/chunk-667BQCEM.js +375 -0
- package/dist/chunk-667BQCEM.js.map +1 -0
- package/dist/chunk-FCEZDH42.mjs +20 -0
- package/dist/chunk-FCEZDH42.mjs.map +1 -0
- package/dist/chunk-KXYLEUSW.mjs +242 -0
- package/dist/chunk-KXYLEUSW.mjs.map +1 -0
- package/dist/chunk-O42L6HOX.js +242 -0
- package/dist/chunk-O42L6HOX.js.map +1 -0
- package/dist/chunk-ONXNE2A6.mjs +375 -0
- package/dist/chunk-ONXNE2A6.mjs.map +1 -0
- package/dist/chunk-STTOPUZ2.mjs +88 -0
- package/dist/chunk-STTOPUZ2.mjs.map +1 -0
- package/dist/chunk-VMT3LALB.mjs +51 -0
- package/dist/chunk-VMT3LALB.mjs.map +1 -0
- package/dist/chunk-VNNVLQLJ.mjs +65 -0
- package/dist/chunk-VNNVLQLJ.mjs.map +1 -0
- package/dist/chunk-WF65EDRZ.js +88 -0
- package/dist/chunk-WF65EDRZ.js.map +1 -0
- package/dist/chunk-XE4OXN2W.js +12 -0
- package/dist/chunk-XE4OXN2W.js.map +1 -0
- package/dist/chunk-XVKTIYHY.js +51 -0
- package/dist/chunk-XVKTIYHY.js.map +1 -0
- package/dist/chunk-YSLEF5C5.mjs +1 -0
- package/dist/chunk-YSLEF5C5.mjs.map +1 -0
- package/dist/cli/index.js +134 -81
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +93 -41
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.js +3 -3
- package/dist/client/index.mjs +2 -2
- package/dist/codegen/index.js +4 -4
- package/dist/codegen/index.mjs +3 -3
- package/dist/dev-server/index.js +4 -4
- package/dist/dev-server/index.mjs +3 -3
- package/dist/index.js +93 -51
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +75 -33
- package/dist/index.mjs.map +1 -1
- package/dist/nest/index.js +3 -3
- package/dist/nest/index.mjs +2 -2
- package/dist/next/index.js +22 -9
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +23 -9
- package/dist/next/index.mjs.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.mjs +2 -2
- package/package.json +126 -112
- package/templates/.dockerignore +43 -0
- package/templates/.env.example +17 -0
- package/templates/Dockerfile +60 -0
- package/templates/Procfile +1 -0
- package/templates/README.md +58 -0
- package/templates/api-sdk.ts +115 -0
- package/templates/docker-compose.yml +34 -0
- package/templates/nestjs-api/src/auth/auth.controller.ts +4 -7
- package/templates/nestjs-api/src/auth/auth.module.ts +4 -1
- package/templates/nestjs-api/src/auth/auth.service.ts +8 -13
- package/templates/nestjs-api/src/todos/todos.controller.ts +0 -7
- package/templates/nestjs-api/src/todos/todos.module.ts +3 -1
- package/templates/nestjs-api/src/users/users.controller.ts +0 -3
- package/templates/nestjs-api/src/users/users.module.ts +3 -1
- package/templates/nextjs-web/app/actions/auth.ts +49 -20
- package/templates/nextjs-web/lib/api.ts +115 -0
- package/templates/nextjs-web/next-env.d.ts +1 -1
- package/templates/nixpacks.toml +11 -0
- package/templates/root-package.json +32 -0
- package/templates/server.ts +66 -0
- package/templates/tsconfig.json +31 -0
package/dist/index.mjs
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FusionFetcher
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VMT3LALB.mjs";
|
|
4
4
|
import {
|
|
5
5
|
nest_exports
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
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-
|
|
12
|
+
} from "./chunk-ONXNE2A6.mjs";
|
|
13
13
|
import {
|
|
14
14
|
dev_server_exports
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-KXYLEUSW.mjs";
|
|
16
16
|
import {
|
|
17
17
|
LogLevel,
|
|
18
18
|
Logger,
|
|
19
19
|
createLogger,
|
|
20
20
|
logger
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-VNNVLQLJ.mjs";
|
|
22
22
|
import {
|
|
23
|
-
__export
|
|
24
|
-
|
|
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, {
|
|
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"), {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
await mkdir(join2(projectPath, "
|
|
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: [
|
|
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), [
|
|
277
|
-
|
|
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,
|
package/dist/index.mjs.map
CHANGED
|
@@ -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"]}
|
package/dist/nest/index.js
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
10
|
-
require('../chunk-
|
|
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 =
|
|
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
|
package/dist/nest/index.mjs
CHANGED
package/dist/next/index.js
CHANGED
|
@@ -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), [
|
|
86
|
-
|
|
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,
|
package/dist/next/index.js.map
CHANGED
|
@@ -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":"
|
|
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"]}
|
package/dist/next/index.mjs
CHANGED
|
@@ -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), [
|
|
49
|
-
|
|
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,
|