wexts 1.0.1 → 2.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 +13 -2
- package/dist/chunk-2MCBBWEA.js +1 -0
- package/dist/chunk-2MCBBWEA.js.map +1 -0
- package/dist/{chunk-6K3RXN4Y.mjs → chunk-6SVQEGEX.mjs} +2 -3
- package/dist/{chunk-6K3RXN4Y.mjs.map → chunk-6SVQEGEX.mjs.map} +1 -1
- package/dist/chunk-EFZPSZWO.mjs +1 -0
- package/dist/{chunk-QUV6QXTP.js → chunk-FYGXL4V7.js} +16 -18
- package/dist/chunk-FYGXL4V7.js.map +1 -0
- package/dist/{chunk-J7J2LRG7.js → chunk-GWP6PNSP.js} +46 -50
- package/dist/chunk-GWP6PNSP.js.map +1 -0
- package/dist/{chunk-HHXRAV67.mjs → chunk-HQKTXE7E.mjs} +18 -22
- package/dist/chunk-HQKTXE7E.mjs.map +1 -0
- package/dist/{chunk-H6XDQJ3N.mjs → chunk-J5LGTIGS.mjs} +1 -2
- package/dist/{chunk-2ZKONAXC.js → chunk-MTHKZO55.js} +3 -4
- package/dist/chunk-MTHKZO55.js.map +1 -0
- package/dist/{chunk-WZBBQLFT.mjs → chunk-NNQFLD7O.mjs} +5 -7
- package/dist/{chunk-WZBBQLFT.mjs.map → chunk-NNQFLD7O.mjs.map} +1 -1
- package/dist/{chunk-ELVFG4US.js → chunk-NU2UB242.js} +5 -6
- package/dist/chunk-NU2UB242.js.map +1 -0
- package/dist/{chunk-A5OZK2TO.mjs → chunk-NULGSZFE.mjs} +4 -3
- package/dist/{chunk-A5OZK2TO.mjs.map → chunk-NULGSZFE.mjs.map} +1 -1
- package/dist/{chunk-XMPCR7N3.mjs → chunk-OTSAVKLY.mjs} +2 -3
- package/dist/{chunk-XMPCR7N3.mjs.map → chunk-OTSAVKLY.mjs.map} +1 -1
- package/dist/{chunk-2H7UOFLK.js → chunk-PZ5AY32C.js} +1 -2
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/{chunk-HE3JQ62E.js → chunk-QP2TMRLG.js} +5 -4
- package/dist/chunk-QP2TMRLG.js.map +1 -0
- package/dist/{chunk-57VDULE3.mjs → chunk-RS23R3ZQ.mjs} +3 -4
- package/dist/{chunk-57VDULE3.mjs.map → chunk-RS23R3ZQ.mjs.map} +1 -1
- package/dist/{chunk-6KN6UIHT.js → chunk-W3YRVEFQ.js} +3 -4
- package/dist/chunk-W3YRVEFQ.js.map +1 -0
- package/dist/cli/index.d.mts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +68 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +8 -9
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.d.mts +12 -0
- package/dist/client/index.d.ts +12 -0
- package/dist/client/index.js +3 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +2 -3
- package/dist/codegen-MRZDLCYI.js +13 -0
- package/dist/codegen-MRZDLCYI.js.map +1 -0
- package/dist/codegen-UI5HTMXE.mjs +13 -0
- package/dist/dev-server-JKRVBWPY.mjs +13 -0
- package/dist/dev-server-TLL7UQMR.js +13 -0
- package/dist/dev-server-TLL7UQMR.js.map +1 -0
- package/dist/index-BsNaOUtH.d.mts +44 -0
- package/dist/index-BsNaOUtH.d.ts +44 -0
- package/dist/index-CrbXnXsO.d.ts +62 -0
- package/dist/index-kEbGExWM.d.mts +62 -0
- package/dist/index.d.mts +328 -0
- package/dist/index.d.ts +328 -0
- package/dist/index.js +32 -32
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +12 -12
- package/dist/index.mjs.map +1 -1
- package/dist/nest/index.d.mts +1 -0
- package/dist/nest/index.d.ts +1 -0
- package/dist/nest/index.js +3 -4
- package/dist/nest/index.js.map +1 -1
- package/dist/nest/index.mjs +2 -3
- package/dist/next/index.d.mts +3 -0
- package/dist/next/index.d.ts +3 -0
- package/dist/next/index.js +4 -5
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +3 -4
- package/dist/types/index.d.mts +12 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +1 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/index.mjs +1 -2
- package/package.json +29 -20
- package/dist/chunk-2H7UOFLK.js.map +0 -1
- package/dist/chunk-2ZKONAXC.js.map +0 -1
- package/dist/chunk-6KN6UIHT.js.map +0 -1
- package/dist/chunk-ELVFG4US.js.map +0 -1
- package/dist/chunk-HE3JQ62E.js.map +0 -1
- package/dist/chunk-HHXRAV67.mjs.map +0 -1
- package/dist/chunk-J7J2LRG7.js.map +0 -1
- package/dist/chunk-LWNHEPTL.mjs +0 -2
- package/dist/chunk-MAVJYD6O.js +0 -2
- package/dist/chunk-MAVJYD6O.js.map +0 -1
- package/dist/chunk-QUV6QXTP.js.map +0 -1
- package/dist/codegen-J3XOZCQZ.js +0 -14
- package/dist/codegen-J3XOZCQZ.js.map +0 -1
- package/dist/codegen-ZZBQIGUQ.mjs +0 -14
- package/dist/dev-server-K5YZAZY2.mjs +0 -14
- package/dist/dev-server-X453DBCE.js +0 -14
- package/dist/dev-server-X453DBCE.js.map +0 -1
- /package/dist/{chunk-H6XDQJ3N.mjs.map → chunk-EFZPSZWO.mjs.map} +0 -0
- /package/dist/{chunk-LWNHEPTL.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/{codegen-ZZBQIGUQ.mjs.map → codegen-UI5HTMXE.mjs.map} +0 -0
- /package/dist/{dev-server-K5YZAZY2.mjs.map → dev-server-JKRVBWPY.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/codegen/index.ts","../src/codegen/parser.ts","../src/core/filesystem.ts","../src/codegen/generator.ts","../src/codegen/watcher.ts"],"sourcesContent":["export * from './parser';\r\nexport * from './generator';\r\nexport * from './watcher';\r\n","import * as ts from 'typescript';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\nimport { getFusionMetadata } from '../nest/decorators';\r\n\r\nexport interface RouteInfo {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n path: string;\r\n handler: string;\r\n controllerName: string;\r\n}\r\n\r\nexport interface ControllerInfo {\r\n name: string;\r\n prefix: string;\r\n routes: RouteInfo[];\r\n}\r\n\r\n/**\r\n * Parse NestJS controllers to extract Fusion metadata\r\n */\r\nexport class NestJSParser {\r\n private program: ts.Program;\r\n\r\n constructor(private projectPath: string) {\r\n const configPath = ts.findConfigFile(projectPath, ts.sys.fileExists, 'tsconfig.json');\r\n if (!configPath) {\r\n throw new Error('tsconfig.json not found');\r\n }\r\n\r\n const config = ts.readConfigFile(configPath, ts.sys.readFile);\r\n const parsedConfig = ts.parseJsonConfigFileContent(\r\n config.config,\r\n ts.sys,\r\n path.dirname(configPath)\r\n );\r\n\r\n this.program = ts.createProgram(parsedConfig.fileNames, parsedConfig.options);\r\n }\r\n\r\n /**\r\n * Find all controllers with @FusionController decorator\r\n */\r\n findFusionControllers(): ControllerInfo[] {\r\n const controllers: ControllerInfo[] = [];\r\n const sourceFiles = this.program.getSourceFiles();\r\n\r\n for (const sourceFile of sourceFiles) {\r\n if (sourceFile.fileName.includes('node_modules')) continue;\r\n if (!sourceFile.fileName.includes('.controller.ts')) continue;\r\n\r\n const fileControllers = this.parseSourceFile(sourceFile);\r\n controllers.push(...fileControllers);\r\n }\r\n\r\n return controllers;\r\n }\r\n\r\n private parseSourceFile(sourceFile: ts.SourceFile): ControllerInfo[] {\r\n const controllers: ControllerInfo[] = [];\r\n\r\n ts.forEachChild(sourceFile, (node) => {\r\n if (ts.isClassDeclaration(node) && node.name) {\r\n const controllerInfo = this.parseController(node);\r\n if (controllerInfo) {\r\n controllers.push(controllerInfo);\r\n }\r\n }\r\n });\r\n\r\n return controllers;\r\n }\r\n\r\n private parseController(classNode: ts.ClassDeclaration): ControllerInfo | null {\r\n const decorators = ts.getDecorators(classNode);\r\n if (!decorators) return null;\r\n\r\n let controllerPrefix = '';\r\n let isFusionController = false;\r\n\r\n // Check for @FusionController decorator\r\n for (const decorator of decorators) {\r\n const expr = decorator.expression;\r\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\r\n const decoratorName = expr.expression.text;\r\n\r\n if (decoratorName === 'FusionController') {\r\n isFusionController = true;\r\n if (expr.arguments.length > 0) {\r\n const arg = expr.arguments[0];\r\n if (ts.isStringLiteral(arg)) {\r\n controllerPrefix = arg.text;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!isFusionController) return null;\r\n\r\n const routes = this.parseRoutes(classNode);\r\n const className = classNode.name?.text || 'Unknown';\r\n\r\n return {\r\n name: className,\r\n prefix: controllerPrefix,\r\n routes: routes.map(r => ({ ...r, controllerName: className })),\r\n };\r\n }\r\n\r\n private parseRoutes(classNode: ts.ClassDeclaration): RouteInfo[] {\r\n const routes: RouteInfo[] = [];\r\n\r\n classNode.members.forEach((member) => {\r\n if (ts.isMethodDeclaration(member)) {\r\n const decorators = ts.getDecorators(member);\r\n if (!decorators) return;\r\n\r\n for (const decorator of decorators) {\r\n const expr = decorator.expression;\r\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\r\n const decoratorName = expr.expression.text;\r\n\r\n let method: RouteInfo['method'] | null = null;\r\n let routePath = '';\r\n\r\n // Map decorator to HTTP method\r\n if (decoratorName === 'FusionGet') method = 'GET';\r\n else if (decoratorName === 'FusionPost') method = 'POST';\r\n else if (decoratorName === 'FusionPut') method = 'PUT';\r\n else if (decoratorName === 'FusionDelete') method = 'DELETE';\r\n\r\n if (method) {\r\n // Get route path from decorator argument\r\n if (expr.arguments.length > 0) {\r\n const arg = expr.arguments[0];\r\n if (ts.isStringLiteral(arg)) {\r\n routePath = arg.text;\r\n }\r\n }\r\n\r\n const handlerName = (member.name as ts.Identifier).text;\r\n\r\n routes.push({\r\n method,\r\n path: routePath,\r\n handler: handlerName,\r\n controllerName: '', // Will be set by caller\r\n });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n return routes;\r\n }\r\n}\r\n","import * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { promisify } from 'util';\r\n\r\nconst readFile = promisify(fs.readFile);\r\nconst writeFile = promisify(fs.writeFile);\r\nconst mkdir = promisify(fs.mkdir);\r\nconst access = promisify(fs.access);\r\n\r\nexport class FileSystem {\r\n /**\r\n * Read file as string\r\n */\r\n async readFile(filePath: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\r\n return readFile(filePath, encoding);\r\n }\r\n\r\n /**\r\n * Write file\r\n */\r\n async writeFile(filePath: string, content: string): Promise<void> {\r\n // Ensure directory exists\r\n await this.ensureDir(path.dirname(filePath));\r\n return writeFile(filePath, content, 'utf-8');\r\n }\r\n\r\n /**\r\n * Read JSON file\r\n */\r\n async readJSON<T = any>(filePath: string): Promise<T> {\r\n const content = await this.readFile(filePath);\r\n return JSON.parse(content);\r\n }\r\n\r\n /**\r\n * Write JSON file\r\n */\r\n async writeJSON(filePath: string, data: any, pretty: boolean = true): Promise<void> {\r\n const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\r\n return this.writeFile(filePath, content);\r\n }\r\n\r\n /**\r\n * Check if file/directory exists\r\n */\r\n async exists(filePath: string): Promise<boolean> {\r\n try {\r\n await access(filePath, fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Ensure directory exists (create if not)\r\n */\r\n async ensureDir(dirPath: string): Promise<void> {\r\n if (!(await this.exists(dirPath))) {\r\n await mkdir(dirPath, { recursive: true });\r\n }\r\n }\r\n\r\n /**\r\n * Copy file\r\n */\r\n async copyFile(src: string, dest: string): Promise<void> {\r\n const content = await this.readFile(src);\r\n await this.writeFile(dest, content);\r\n }\r\n\r\n /**\r\n * Read directory\r\n */\r\n readDir(dirPath: string): Promise<string[]> {\r\n return promisify(fs.readdir)(dirPath);\r\n }\r\n}\r\n\r\n// Export singleton\r\nexport const filesystem = new FileSystem();\r\n","import { ControllerInfo, RouteInfo } from './parser';\r\nimport { filesystem } from '../core/filesystem';\r\nimport * as path from 'path';\r\n\r\nexport interface GenerateOptions {\r\n controllers: ControllerInfo[];\r\n outputPath: string;\r\n baseUrl?: string;\r\n}\r\n\r\n/**\r\n * Generate TypeScript API client from controller metadata\r\n */\r\nexport class ClientGenerator {\r\n async generate(options: GenerateOptions): Promise<void> {\r\n const { controllers, outputPath } = options;\r\n\r\n // Generate client file\r\n const clientCode = this.generateClientCode(controllers, options.baseUrl);\r\n await filesystem.writeFile(path.join(outputPath, 'client.ts'), clientCode);\r\n\r\n // Generate barrel export\r\n const indexCode = `export * from './client';\\n`;\r\n await filesystem.writeFile(path.join(outputPath, 'index.ts'), indexCode);\r\n\r\n console.log(`✅ Generated API client at ${outputPath}`);\r\n }\r\n\r\n private generateClientCode(controllers: ControllerInfo[], baseUrl = '/api'): string {\r\n const imports = `import { FusionFetcher } from 'wexts/client';\\n\\n`;\r\n\r\n const clientClass = this.generateClientClass(controllers, baseUrl);\r\n\r\n const exports = `\\n// Export singleton instance\\nexport const apiClient = new ApiClient();\\n`;\r\n\r\n return imports + clientClass + exports;\r\n }\r\n\r\n private generateClientClass(controllers: ControllerInfo[], baseUrl: string): string {\r\n let code = `export class ApiClient {\\n`;\r\n code += ` private client: FusionFetcher;\\n\\n`;\r\n code += ` constructor(baseUrl: string = '${baseUrl}') {\\n`;\r\n code += ` this.client = new FusionFetcher(baseUrl);\\n`;\r\n code += ` }\\n\\n`;\r\n\r\n // Generate methods for each controller\r\n for (const controller of controllers) {\r\n const methods = this.generateControllerMethods(controller);\r\n code += methods;\r\n }\r\n\r\n code += `}\\n`;\r\n return code;\r\n }\r\n\r\n private generateControllerMethods(controller: ControllerInfo): string {\r\n let code = ` // ${controller.name} endpoints\\n`;\r\n\r\n for (const route of controller.routes) {\r\n const methodName = this.generateMethodName(controller, route);\r\n const methodCode = this.generateMethod(controller, route, methodName);\r\n code += methodCode + '\\n';\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private generateMethodName(controller: ControllerInfo, route: RouteInfo): string {\r\n // Convert handler name to camelCase\r\n // e.g., \"findAll\" -> \"getTodos\" (if controller is TodosController)\r\n const controllerBase = controller.name.replace('Controller', '').toLowerCase();\r\n\r\n if (route.handler === 'findAll') {\r\n return `get${this.capitalize(controllerBase)}`;\r\n } else if (route.handler === 'findOne') {\r\n return `get${this.capitalize(controllerBase)}ById`;\r\n } else if (route.handler === 'create') {\r\n return `create${this.capitalize(controllerBase.replace(/s$/, ''))}`;\r\n } else if (route.handler === 'update') {\r\n return `update${this.capitalize(controllerBase.replace(/s$/, ''))}`;\r\n } else if (route.handler === 'remove' || route.handler === 'delete') {\r\n return `delete${this.capitalize(controllerBase.replace(/s$/, ''))}`;\r\n }\r\n\r\n // Default: use handler name as-is\r\n return route.handler;\r\n }\r\n\r\n private generateMethod(controller: ControllerInfo, route: RouteInfo, methodName: string): string {\r\n const fullPath = `/${controller.prefix}${route.path}`;\r\n const hasPathParam = fullPath.includes(':');\r\n\r\n let params = '';\r\n let pathExpr = `'${fullPath}'`;\r\n\r\n if (hasPathParam) {\r\n // Extract path param name\r\n const paramMatch = fullPath.match(/:(\\w+)/);\r\n const paramName = paramMatch ? paramMatch[1] : 'id';\r\n params = `${paramName}: string`;\r\n pathExpr = `'${fullPath.replace(`:${paramName}`, '${' + paramName + '}')}'`;\r\n }\r\n\r\n // Add data param for POST/PUT\r\n if (route.method === 'POST' || route.method === 'PUT') {\r\n if (params) params += ', ';\r\n params += 'data: any';\r\n }\r\n\r\n let methodBody = '';\r\n\r\n if (route.method === 'GET' || route.method === 'DELETE') {\r\n methodBody = ` return this.client.${route.method.toLowerCase()}<any>(${pathExpr});`;\r\n } else {\r\n methodBody = ` return this.client.${route.method.toLowerCase()}<any>(${pathExpr}, data);`;\r\n }\r\n\r\n return ` async ${methodName}(${params}): Promise<any> {\\n${methodBody}\\n }\\n`;\r\n }\r\n\r\n private capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n }\r\n}\r\n","import * as chokidar from 'chokidar';\r\nimport { logger } from '../core/logger';\r\nimport { NestJSParser } from './parser';\r\nimport { ClientGenerator } from './generator';\r\n\r\nexport interface WatchOptions {\r\n projectPath: string;\r\n outputPath: string;\r\n pattern?: string;\r\n}\r\n\r\n/**\r\n * Watch NestJS controllers and regenerate client on changes\r\n */\r\nexport class CodegenWatcher {\r\n private watcher: chokidar.FSWatcher | null = null;\r\n\r\n async watch(options: WatchOptions): Promise<void> {\r\n const { projectPath, outputPath, pattern = '**/*.controller.ts' } = options;\r\n\r\n logger.info('👀 Watching for controller changes...');\r\n\r\n // Initial generation\r\n await this.generateClient(projectPath, outputPath);\r\n\r\n // Watch for changes\r\n this.watcher = chokidar.watch(pattern, {\r\n cwd: projectPath,\r\n ignored: /node_modules/,\r\n persistent: true,\r\n });\r\n\r\n this.watcher.on('change', async (path) => {\r\n logger.info(`📝 Controller changed: ${path}`);\r\n await this.generateClient(projectPath, outputPath);\r\n });\r\n\r\n this.watcher.on('add', async (path) => {\r\n logger.info(`➕ New controller: ${path}`);\r\n await this.generateClient(projectPath, outputPath);\r\n });\r\n\r\n this.watcher.on('unlink', async (path) => {\r\n logger.info(`➖ Controller removed: ${path}`);\r\n await this.generateClient(projectPath, outputPath);\r\n });\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (this.watcher) {\r\n await this.watcher.close();\r\n this.watcher = null;\r\n }\r\n }\r\n\r\n private async generateClient(projectPath: string, outputPath: string): Promise<void> {\r\n try {\r\n const parser = new NestJSParser(projectPath);\r\n const controllers = parser.findFusionControllers();\r\n\r\n if (controllers.length === 0) {\r\n logger.warn('No Fusion controllers found');\r\n return;\r\n }\r\n\r\n const generator = new ClientGenerator();\r\n await generator.generate({\r\n controllers,\r\n outputPath,\r\n });\r\n\r\n logger.success(`Generated client for ${controllers.length} controller(s)`);\r\n } catch (error: any) {\r\n logger.error('Failed to generate client:', error.message);\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["path","readFile","writeFile","mkdir","access","path","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/codegen/index.ts","../src/codegen/parser.ts","../src/core/filesystem.ts","../src/codegen/generator.ts","../src/codegen/watcher.ts"],"sourcesContent":["export * from './parser';\r\nexport * from './generator';\r\nexport * from './watcher';\r\n","import * as ts from 'typescript';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\nimport { getFusionMetadata } from '../nest/decorators';\r\n\r\nexport interface RouteInfo {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n path: string;\r\n handler: string;\r\n controllerName: string;\r\n}\r\n\r\nexport interface ControllerInfo {\r\n name: string;\r\n prefix: string;\r\n routes: RouteInfo[];\r\n}\r\n\r\n/**\r\n * Parse NestJS controllers to extract Fusion metadata\r\n */\r\nexport class NestJSParser {\r\n private program: ts.Program;\r\n\r\n constructor(private projectPath: string) {\r\n const configPath = ts.findConfigFile(projectPath, ts.sys.fileExists, 'tsconfig.json');\r\n if (!configPath) {\r\n throw new Error('tsconfig.json not found');\r\n }\r\n\r\n const config = ts.readConfigFile(configPath, ts.sys.readFile);\r\n const parsedConfig = ts.parseJsonConfigFileContent(\r\n config.config,\r\n ts.sys,\r\n path.dirname(configPath)\r\n );\r\n\r\n this.program = ts.createProgram(parsedConfig.fileNames, parsedConfig.options);\r\n }\r\n\r\n /**\r\n * Find all controllers with @FusionController decorator\r\n */\r\n findFusionControllers(): ControllerInfo[] {\r\n const controllers: ControllerInfo[] = [];\r\n const sourceFiles = this.program.getSourceFiles();\r\n\r\n for (const sourceFile of sourceFiles) {\r\n if (sourceFile.fileName.includes('node_modules')) continue;\r\n if (!sourceFile.fileName.includes('.controller.ts')) continue;\r\n\r\n const fileControllers = this.parseSourceFile(sourceFile);\r\n controllers.push(...fileControllers);\r\n }\r\n\r\n return controllers;\r\n }\r\n\r\n private parseSourceFile(sourceFile: ts.SourceFile): ControllerInfo[] {\r\n const controllers: ControllerInfo[] = [];\r\n\r\n ts.forEachChild(sourceFile, (node) => {\r\n if (ts.isClassDeclaration(node) && node.name) {\r\n const controllerInfo = this.parseController(node);\r\n if (controllerInfo) {\r\n controllers.push(controllerInfo);\r\n }\r\n }\r\n });\r\n\r\n return controllers;\r\n }\r\n\r\n private parseController(classNode: ts.ClassDeclaration): ControllerInfo | null {\r\n const decorators = ts.getDecorators(classNode);\r\n if (!decorators) return null;\r\n\r\n let controllerPrefix = '';\r\n let isFusionController = false;\r\n\r\n // Check for @FusionController decorator\r\n for (const decorator of decorators) {\r\n const expr = decorator.expression;\r\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\r\n const decoratorName = expr.expression.text;\r\n\r\n if (decoratorName === 'FusionController') {\r\n isFusionController = true;\r\n if (expr.arguments.length > 0) {\r\n const arg = expr.arguments[0];\r\n if (ts.isStringLiteral(arg)) {\r\n controllerPrefix = arg.text;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!isFusionController) return null;\r\n\r\n const routes = this.parseRoutes(classNode);\r\n const className = classNode.name?.text || 'Unknown';\r\n\r\n return {\r\n name: className,\r\n prefix: controllerPrefix,\r\n routes: routes.map(r => ({ ...r, controllerName: className })),\r\n };\r\n }\r\n\r\n private parseRoutes(classNode: ts.ClassDeclaration): RouteInfo[] {\r\n const routes: RouteInfo[] = [];\r\n\r\n classNode.members.forEach((member) => {\r\n if (ts.isMethodDeclaration(member)) {\r\n const decorators = ts.getDecorators(member);\r\n if (!decorators) return;\r\n\r\n for (const decorator of decorators) {\r\n const expr = decorator.expression;\r\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\r\n const decoratorName = expr.expression.text;\r\n\r\n let method: RouteInfo['method'] | null = null;\r\n let routePath = '';\r\n\r\n // Map decorator to HTTP method\r\n if (decoratorName === 'FusionGet') method = 'GET';\r\n else if (decoratorName === 'FusionPost') method = 'POST';\r\n else if (decoratorName === 'FusionPut') method = 'PUT';\r\n else if (decoratorName === 'FusionDelete') method = 'DELETE';\r\n\r\n if (method) {\r\n // Get route path from decorator argument\r\n if (expr.arguments.length > 0) {\r\n const arg = expr.arguments[0];\r\n if (ts.isStringLiteral(arg)) {\r\n routePath = arg.text;\r\n }\r\n }\r\n\r\n const handlerName = (member.name as ts.Identifier).text;\r\n\r\n routes.push({\r\n method,\r\n path: routePath,\r\n handler: handlerName,\r\n controllerName: '', // Will be set by caller\r\n });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n return routes;\r\n }\r\n}\r\n","import * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { promisify } from 'util';\r\n\r\nconst readFile = promisify(fs.readFile);\r\nconst writeFile = promisify(fs.writeFile);\r\nconst mkdir = promisify(fs.mkdir);\r\nconst access = promisify(fs.access);\r\n\r\nexport class FileSystem {\r\n /**\r\n * Read file as string\r\n */\r\n async readFile(filePath: string, encoding: BufferEncoding = 'utf-8'): Promise<string> {\r\n return readFile(filePath, encoding);\r\n }\r\n\r\n /**\r\n * Write file\r\n */\r\n async writeFile(filePath: string, content: string): Promise<void> {\r\n // Ensure directory exists\r\n await this.ensureDir(path.dirname(filePath));\r\n return writeFile(filePath, content, 'utf-8');\r\n }\r\n\r\n /**\r\n * Read JSON file\r\n */\r\n async readJSON<T = any>(filePath: string): Promise<T> {\r\n const content = await this.readFile(filePath);\r\n return JSON.parse(content);\r\n }\r\n\r\n /**\r\n * Write JSON file\r\n */\r\n async writeJSON(filePath: string, data: any, pretty: boolean = true): Promise<void> {\r\n const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);\r\n return this.writeFile(filePath, content);\r\n }\r\n\r\n /**\r\n * Check if file/directory exists\r\n */\r\n async exists(filePath: string): Promise<boolean> {\r\n try {\r\n await access(filePath, fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Ensure directory exists (create if not)\r\n */\r\n async ensureDir(dirPath: string): Promise<void> {\r\n if (!(await this.exists(dirPath))) {\r\n await mkdir(dirPath, { recursive: true });\r\n }\r\n }\r\n\r\n /**\r\n * Copy file\r\n */\r\n async copyFile(src: string, dest: string): Promise<void> {\r\n const content = await this.readFile(src);\r\n await this.writeFile(dest, content);\r\n }\r\n\r\n /**\r\n * Read directory\r\n */\r\n readDir(dirPath: string): Promise<string[]> {\r\n return promisify(fs.readdir)(dirPath);\r\n }\r\n}\r\n\r\n// Export singleton\r\nexport const filesystem = new FileSystem();\r\n","import { ControllerInfo, RouteInfo } from './parser';\r\nimport { filesystem } from '../core/filesystem';\r\nimport * as path from 'path';\r\n\r\nexport interface GenerateOptions {\r\n controllers: ControllerInfo[];\r\n outputPath: string;\r\n baseUrl?: string;\r\n}\r\n\r\n/**\r\n * Generate TypeScript API client from controller metadata\r\n */\r\nexport class ClientGenerator {\r\n async generate(options: GenerateOptions): Promise<void> {\r\n const { controllers, outputPath } = options;\r\n\r\n // Generate client file\r\n const clientCode = this.generateClientCode(controllers, options.baseUrl);\r\n await filesystem.writeFile(path.join(outputPath, 'client.ts'), clientCode);\r\n\r\n // Generate barrel export\r\n const indexCode = `export * from './client';\\n`;\r\n await filesystem.writeFile(path.join(outputPath, 'index.ts'), indexCode);\r\n\r\n console.log(`✅ Generated API client at ${outputPath}`);\r\n }\r\n\r\n private generateClientCode(controllers: ControllerInfo[], baseUrl = '/api'): string {\r\n const imports = `import { FusionFetcher } from 'wexts/client';\\n\\n`;\r\n\r\n const clientClass = this.generateClientClass(controllers, baseUrl);\r\n\r\n const exports = `\\n// Export singleton instance\\nexport const apiClient = new ApiClient();\\n`;\r\n\r\n return imports + clientClass + exports;\r\n }\r\n\r\n private generateClientClass(controllers: ControllerInfo[], baseUrl: string): string {\r\n let code = `export class ApiClient {\\n`;\r\n code += ` private client: FusionFetcher;\\n\\n`;\r\n code += ` constructor(baseUrl: string = '${baseUrl}') {\\n`;\r\n code += ` this.client = new FusionFetcher(baseUrl);\\n`;\r\n code += ` }\\n\\n`;\r\n\r\n // Generate methods for each controller\r\n for (const controller of controllers) {\r\n const methods = this.generateControllerMethods(controller);\r\n code += methods;\r\n }\r\n\r\n code += `}\\n`;\r\n return code;\r\n }\r\n\r\n private generateControllerMethods(controller: ControllerInfo): string {\r\n let code = ` // ${controller.name} endpoints\\n`;\r\n\r\n for (const route of controller.routes) {\r\n const methodName = this.generateMethodName(controller, route);\r\n const methodCode = this.generateMethod(controller, route, methodName);\r\n code += methodCode + '\\n';\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private generateMethodName(controller: ControllerInfo, route: RouteInfo): string {\r\n // Convert handler name to camelCase\r\n // e.g., \"findAll\" -> \"getTodos\" (if controller is TodosController)\r\n const controllerBase = controller.name.replace('Controller', '').toLowerCase();\r\n\r\n if (route.handler === 'findAll') {\r\n return `get${this.capitalize(controllerBase)}`;\r\n } else if (route.handler === 'findOne') {\r\n return `get${this.capitalize(controllerBase)}ById`;\r\n } else if (route.handler === 'create') {\r\n return `create${this.capitalize(controllerBase.replace(/s$/, ''))}`;\r\n } else if (route.handler === 'update') {\r\n return `update${this.capitalize(controllerBase.replace(/s$/, ''))}`;\r\n } else if (route.handler === 'remove' || route.handler === 'delete') {\r\n return `delete${this.capitalize(controllerBase.replace(/s$/, ''))}`;\r\n }\r\n\r\n // Default: use handler name as-is\r\n return route.handler;\r\n }\r\n\r\n private generateMethod(controller: ControllerInfo, route: RouteInfo, methodName: string): string {\r\n const fullPath = `/${controller.prefix}${route.path}`;\r\n const hasPathParam = fullPath.includes(':');\r\n\r\n let params = '';\r\n let pathExpr = `'${fullPath}'`;\r\n\r\n if (hasPathParam) {\r\n // Extract path param name\r\n const paramMatch = fullPath.match(/:(\\w+)/);\r\n const paramName = paramMatch ? paramMatch[1] : 'id';\r\n params = `${paramName}: string`;\r\n pathExpr = `'${fullPath.replace(`:${paramName}`, '${' + paramName + '}')}'`;\r\n }\r\n\r\n // Add data param for POST/PUT\r\n if (route.method === 'POST' || route.method === 'PUT') {\r\n if (params) params += ', ';\r\n params += 'data: any';\r\n }\r\n\r\n let methodBody = '';\r\n\r\n if (route.method === 'GET' || route.method === 'DELETE') {\r\n methodBody = ` return this.client.${route.method.toLowerCase()}<any>(${pathExpr});`;\r\n } else {\r\n methodBody = ` return this.client.${route.method.toLowerCase()}<any>(${pathExpr}, data);`;\r\n }\r\n\r\n return ` async ${methodName}(${params}): Promise<any> {\\n${methodBody}\\n }\\n`;\r\n }\r\n\r\n private capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n }\r\n}\r\n","import * as chokidar from 'chokidar';\r\nimport { logger } from '../core/logger';\r\nimport { NestJSParser } from './parser';\r\nimport { ClientGenerator } from './generator';\r\n\r\nexport interface WatchOptions {\r\n projectPath: string;\r\n outputPath: string;\r\n pattern?: string;\r\n}\r\n\r\n/**\r\n * Watch NestJS controllers and regenerate client on changes\r\n */\r\nexport class CodegenWatcher {\r\n private watcher: chokidar.FSWatcher | null = null;\r\n\r\n async watch(options: WatchOptions): Promise<void> {\r\n const { projectPath, outputPath, pattern = '**/*.controller.ts' } = options;\r\n\r\n logger.info('👀 Watching for controller changes...');\r\n\r\n // Initial generation\r\n await this.generateClient(projectPath, outputPath);\r\n\r\n // Watch for changes\r\n this.watcher = chokidar.watch(pattern, {\r\n cwd: projectPath,\r\n ignored: /node_modules/,\r\n persistent: true,\r\n });\r\n\r\n this.watcher.on('change', async (path) => {\r\n logger.info(`📝 Controller changed: ${path}`);\r\n await this.generateClient(projectPath, outputPath);\r\n });\r\n\r\n this.watcher.on('add', async (path) => {\r\n logger.info(`➕ New controller: ${path}`);\r\n await this.generateClient(projectPath, outputPath);\r\n });\r\n\r\n this.watcher.on('unlink', async (path) => {\r\n logger.info(`➖ Controller removed: ${path}`);\r\n await this.generateClient(projectPath, outputPath);\r\n });\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (this.watcher) {\r\n await this.watcher.close();\r\n this.watcher = null;\r\n }\r\n }\r\n\r\n private async generateClient(projectPath: string, outputPath: string): Promise<void> {\r\n try {\r\n const parser = new NestJSParser(projectPath);\r\n const controllers = parser.findFusionControllers();\r\n\r\n if (controllers.length === 0) {\r\n logger.warn('No Fusion controllers found');\r\n return;\r\n }\r\n\r\n const generator = new ClientGenerator();\r\n await generator.generate({\r\n controllers,\r\n outputPath,\r\n });\r\n\r\n logger.success(`Generated client for ${controllers.length} controller(s)`);\r\n } catch (error: any) {\r\n logger.error('Failed to generate client:', error.message);\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["path","readFile","writeFile","mkdir","access","path","path"]}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
3
2
|
|
|
4
|
-
var
|
|
3
|
+
var _chunkMTHKZO55js = require('./chunk-MTHKZO55.js');
|
|
5
4
|
|
|
6
5
|
|
|
7
|
-
var
|
|
6
|
+
var _chunkPZ5AY32Cjs = require('./chunk-PZ5AY32C.js');
|
|
8
7
|
|
|
9
8
|
// src/next/index.ts
|
|
10
9
|
var next_exports = {};
|
|
11
|
-
|
|
10
|
+
_chunkPZ5AY32Cjs.__export.call(void 0, next_exports, {
|
|
12
11
|
FusionProvider: () => FusionProvider,
|
|
13
12
|
useAuth: () => useAuth,
|
|
14
13
|
useFusion: () => useFusion
|
|
@@ -18,7 +17,7 @@ _chunk2H7UOFLKjs.__export.call(void 0, next_exports, {
|
|
|
18
17
|
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
19
18
|
var FusionContext = _react.createContext.call(void 0, null);
|
|
20
19
|
function FusionProvider({ children, baseUrl = "/api" }) {
|
|
21
|
-
const client = _react2.default.useMemo(() => new (0,
|
|
20
|
+
const client = _react2.default.useMemo(() => new (0, _chunkMTHKZO55js.FusionFetcher)(baseUrl), [baseUrl]);
|
|
22
21
|
return /* @__PURE__ */ _react2.default.createElement(FusionContext.Provider, { value: { client } }, children);
|
|
23
22
|
}
|
|
24
23
|
function useFusion() {
|
|
@@ -80,4 +79,4 @@ function useAuth() {
|
|
|
80
79
|
|
|
81
80
|
|
|
82
81
|
exports.FusionProvider = FusionProvider; exports.useFusion = useFusion; exports.useAuth = useAuth; exports.next_exports = next_exports;
|
|
83
|
-
//# sourceMappingURL=chunk-
|
|
82
|
+
//# sourceMappingURL=chunk-NU2UB242.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\chunk-NU2UB242.js"],"names":[],"mappings":"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","file":"C:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\chunk-NU2UB242.js","sourcesContent":[null]}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
1
|
// src/core/logger.ts
|
|
4
2
|
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
5
3
|
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
|
|
@@ -9,6 +7,9 @@ var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
|
9
7
|
return LogLevel2;
|
|
10
8
|
})(LogLevel || {});
|
|
11
9
|
var Logger = class {
|
|
10
|
+
level;
|
|
11
|
+
prefix;
|
|
12
|
+
timestamp;
|
|
12
13
|
constructor(options = {}) {
|
|
13
14
|
this.level = options.level ?? 1 /* INFO */;
|
|
14
15
|
this.prefix = options.prefix ?? "[Fusion]";
|
|
@@ -53,4 +54,4 @@ export {
|
|
|
53
54
|
logger,
|
|
54
55
|
createLogger
|
|
55
56
|
};
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
57
|
+
//# sourceMappingURL=chunk-NULGSZFE.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/logger.ts"],"sourcesContent":["export enum LogLevel {\r\n DEBUG = 0,\r\n INFO = 1,\r\n WARN = 2,\r\n ERROR = 3,\r\n}\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n prefix?: string;\r\n timestamp?: boolean;\r\n}\r\n\r\nexport class Logger {\r\n private level: LogLevel;\r\n private prefix: string;\r\n private timestamp: boolean;\r\n\r\n constructor(options: LoggerOptions = {}) {\r\n this.level = options.level ?? LogLevel.INFO;\r\n this.prefix = options.prefix ?? '[Fusion]';\r\n this.timestamp = options.timestamp ?? true;\r\n }\r\n\r\n private formatMessage(level: string, ...args: any[]): string {\r\n const timestamp = this.timestamp ? `[${new Date().toISOString()}]` : '';\r\n return `${timestamp} ${this.prefix} ${level}: ${args.join(' ')}`;\r\n }\r\n\r\n debug(...args: any[]): void {\r\n if (this.level <= LogLevel.DEBUG) {\r\n console.log(this.formatMessage('DEBUG', ...args));\r\n }\r\n }\r\n\r\n info(...args: any[]): void {\r\n if (this.level <= LogLevel.INFO) {\r\n console.log(this.formatMessage('INFO', ...args));\r\n }\r\n }\r\n\r\n warn(...args: any[]): void {\r\n if (this.level <= LogLevel.WARN) {\r\n console.warn(this.formatMessage('WARN', ...args));\r\n }\r\n }\r\n\r\n error(...args: any[]): void {\r\n if (this.level <= LogLevel.ERROR) {\r\n console.error(this.formatMessage('ERROR', ...args));\r\n }\r\n }\r\n\r\n success(...args: any[]): void {\r\n console.log(this.formatMessage('✓', ...args));\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const logger = new Logger();\r\n\r\n// Export factory\r\nexport function createLogger(options: LoggerOptions): Logger {\r\n return new Logger(options);\r\n}\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/core/logger.ts"],"sourcesContent":["export enum LogLevel {\r\n DEBUG = 0,\r\n INFO = 1,\r\n WARN = 2,\r\n ERROR = 3,\r\n}\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n prefix?: string;\r\n timestamp?: boolean;\r\n}\r\n\r\nexport class Logger {\r\n private level: LogLevel;\r\n private prefix: string;\r\n private timestamp: boolean;\r\n\r\n constructor(options: LoggerOptions = {}) {\r\n this.level = options.level ?? LogLevel.INFO;\r\n this.prefix = options.prefix ?? '[Fusion]';\r\n this.timestamp = options.timestamp ?? true;\r\n }\r\n\r\n private formatMessage(level: string, ...args: any[]): string {\r\n const timestamp = this.timestamp ? `[${new Date().toISOString()}]` : '';\r\n return `${timestamp} ${this.prefix} ${level}: ${args.join(' ')}`;\r\n }\r\n\r\n debug(...args: any[]): void {\r\n if (this.level <= LogLevel.DEBUG) {\r\n console.log(this.formatMessage('DEBUG', ...args));\r\n }\r\n }\r\n\r\n info(...args: any[]): void {\r\n if (this.level <= LogLevel.INFO) {\r\n console.log(this.formatMessage('INFO', ...args));\r\n }\r\n }\r\n\r\n warn(...args: any[]): void {\r\n if (this.level <= LogLevel.WARN) {\r\n console.warn(this.formatMessage('WARN', ...args));\r\n }\r\n }\r\n\r\n error(...args: any[]): void {\r\n if (this.level <= LogLevel.ERROR) {\r\n console.error(this.formatMessage('ERROR', ...args));\r\n }\r\n }\r\n\r\n success(...args: any[]): void {\r\n console.log(this.formatMessage('✓', ...args));\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const logger = new Logger();\r\n\r\n// Export factory\r\nexport function createLogger(options: LoggerOptions): Logger {\r\n return new Logger(options);\r\n}\r\n"],"mappings":";AAAO,IAAK,WAAL,kBAAKA,cAAL;AACH,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,WAAQ,KAAR;AAJQ,SAAAA;AAAA,GAAA;AAaL,IAAM,SAAN,MAAa;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,UAAyB,CAAC,GAAG;AACrC,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,YAAY,QAAQ,aAAa;AAAA,EAC1C;AAAA,EAEQ,cAAc,UAAkB,MAAqB;AACzD,UAAM,YAAY,KAAK,YAAY,KAAI,oBAAI,KAAK,GAAE,YAAY,CAAC,MAAM;AACrE,WAAO,GAAG,SAAS,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,EAClE;AAAA,EAEA,SAAS,MAAmB;AACxB,QAAI,KAAK,SAAS,eAAgB;AAC9B,cAAQ,IAAI,KAAK,cAAc,SAAS,GAAG,IAAI,CAAC;AAAA,IACpD;AAAA,EACJ;AAAA,EAEA,QAAQ,MAAmB;AACvB,QAAI,KAAK,SAAS,cAAe;AAC7B,cAAQ,IAAI,KAAK,cAAc,QAAQ,GAAG,IAAI,CAAC;AAAA,IACnD;AAAA,EACJ;AAAA,EAEA,QAAQ,MAAmB;AACvB,QAAI,KAAK,SAAS,cAAe;AAC7B,cAAQ,KAAK,KAAK,cAAc,QAAQ,GAAG,IAAI,CAAC;AAAA,IACpD;AAAA,EACJ;AAAA,EAEA,SAAS,MAAmB;AACxB,QAAI,KAAK,SAAS,eAAgB;AAC9B,cAAQ,MAAM,KAAK,cAAc,SAAS,GAAG,IAAI,CAAC;AAAA,IACtD;AAAA,EACJ;AAAA,EAEA,WAAW,MAAmB;AAC1B,YAAQ,IAAI,KAAK,cAAc,UAAK,GAAG,IAAI,CAAC;AAAA,EAChD;AACJ;AAGO,IAAM,SAAS,IAAI,OAAO;AAG1B,SAAS,aAAa,SAAgC;AACzD,SAAO,IAAI,OAAO,OAAO;AAC7B;","names":["LogLevel"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
import {
|
|
3
2
|
__export
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-J5LGTIGS.mjs";
|
|
5
4
|
|
|
6
5
|
// src/nest/index.ts
|
|
7
6
|
var nest_exports = {};
|
|
@@ -64,4 +63,4 @@ export {
|
|
|
64
63
|
getFusionMetadata,
|
|
65
64
|
nest_exports
|
|
66
65
|
};
|
|
67
|
-
//# sourceMappingURL=chunk-
|
|
66
|
+
//# sourceMappingURL=chunk-OTSAVKLY.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/nest/index.ts","../src/nest/decorators.ts"],"sourcesContent":["export * from './decorators';\r\n","// NestJS Integration - Decorators for wexts\r\n// These decorators add metadata for auto API client generation\r\n\r\nimport 'reflect-metadata';\r\n\r\nexport interface FusionRouteMetadata {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n path: string;\r\n responseType?: string;\r\n requestType?: string;\r\n}\r\n\r\nconst FUSION_METADATA_KEY = 'fusion:routes';\r\n\r\n/**\r\n * Mark a NestJS controller for Fusion codegen\r\n * Usage: @FusionController('users')\r\n */\r\nexport function FusionController(prefix: string = ''): ClassDecorator {\r\n return function (target: any) {\r\n Reflect.defineMetadata('fusion:controller', { prefix }, target);\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Mark a route for API client generation\r\n * Usage: @FusionRoute({ method: 'GET', path: '/:id' })\r\n */\r\nexport function FusionRoute(metadata: FusionRouteMetadata): MethodDecorator {\r\n return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\r\n const routes = Reflect.getMetadata(FUSION_METADATA_KEY, target.constructor) || [];\r\n routes.push({\r\n ...metadata,\r\n handler: propertyKey,\r\n });\r\n Reflect.defineMetadata(FUSION_METADATA_KEY, routes, target.constructor);\r\n return descriptor;\r\n };\r\n}\r\n\r\n/**\r\n * Helper decorators for common HTTP methods\r\n */\r\nexport function FusionGet(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'GET', path });\r\n}\r\n\r\nexport function FusionPost(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'POST', path });\r\n}\r\n\r\nexport function FusionPut(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'PUT', path });\r\n}\r\n\r\nexport function FusionDelete(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'DELETE', path });\r\n}\r\n\r\n/**\r\n * Get Fusion metadata from a controller\r\n */\r\nexport function getFusionMetadata(controller: any): {\r\n controller: any;\r\n routes: any[];\r\n} {\r\n return {\r\n controller: Reflect.getMetadata('fusion:controller', controller),\r\n routes: Reflect.getMetadata(FUSION_METADATA_KEY, controller) || [],\r\n };\r\n}\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/nest/index.ts","../src/nest/decorators.ts"],"sourcesContent":["export * from './decorators';\r\n","// NestJS Integration - Decorators for wexts\r\n// These decorators add metadata for auto API client generation\r\n\r\nimport 'reflect-metadata';\r\n\r\nexport interface FusionRouteMetadata {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n path: string;\r\n responseType?: string;\r\n requestType?: string;\r\n}\r\n\r\nconst FUSION_METADATA_KEY = 'fusion:routes';\r\n\r\n/**\r\n * Mark a NestJS controller for Fusion codegen\r\n * Usage: @FusionController('users')\r\n */\r\nexport function FusionController(prefix: string = ''): ClassDecorator {\r\n return function (target: any) {\r\n Reflect.defineMetadata('fusion:controller', { prefix }, target);\r\n return target;\r\n };\r\n}\r\n\r\n/**\r\n * Mark a route for API client generation\r\n * Usage: @FusionRoute({ method: 'GET', path: '/:id' })\r\n */\r\nexport function FusionRoute(metadata: FusionRouteMetadata): MethodDecorator {\r\n return function (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\r\n const routes = Reflect.getMetadata(FUSION_METADATA_KEY, target.constructor) || [];\r\n routes.push({\r\n ...metadata,\r\n handler: propertyKey,\r\n });\r\n Reflect.defineMetadata(FUSION_METADATA_KEY, routes, target.constructor);\r\n return descriptor;\r\n };\r\n}\r\n\r\n/**\r\n * Helper decorators for common HTTP methods\r\n */\r\nexport function FusionGet(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'GET', path });\r\n}\r\n\r\nexport function FusionPost(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'POST', path });\r\n}\r\n\r\nexport function FusionPut(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'PUT', path });\r\n}\r\n\r\nexport function FusionDelete(path: string = ''): MethodDecorator {\r\n return FusionRoute({ method: 'DELETE', path });\r\n}\r\n\r\n/**\r\n * Get Fusion metadata from a controller\r\n */\r\nexport function getFusionMetadata(controller: any): {\r\n controller: any;\r\n routes: any[];\r\n} {\r\n return {\r\n controller: Reflect.getMetadata('fusion:controller', controller),\r\n routes: Reflect.getMetadata(FUSION_METADATA_KEY, controller) || [],\r\n };\r\n}\r\n"],"mappings":";;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,OAAO;AASP,IAAM,sBAAsB;AAMrB,SAAS,iBAAiB,SAAiB,IAAoB;AAClE,SAAO,SAAU,QAAa;AAC1B,YAAQ,eAAe,qBAAqB,EAAE,OAAO,GAAG,MAAM;AAC9D,WAAO;AAAA,EACX;AACJ;AAMO,SAAS,YAAY,UAAgD;AACxE,SAAO,SAAU,QAAa,aAA8B,YAAgC;AACxF,UAAM,SAAS,QAAQ,YAAY,qBAAqB,OAAO,WAAW,KAAK,CAAC;AAChF,WAAO,KAAK;AAAA,MACR,GAAG;AAAA,MACH,SAAS;AAAA,IACb,CAAC;AACD,YAAQ,eAAe,qBAAqB,QAAQ,OAAO,WAAW;AACtE,WAAO;AAAA,EACX;AACJ;AAKO,SAAS,UAAU,OAAe,IAAqB;AAC1D,SAAO,YAAY,EAAE,QAAQ,OAAO,KAAK,CAAC;AAC9C;AAEO,SAAS,WAAW,OAAe,IAAqB;AAC3D,SAAO,YAAY,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAC/C;AAEO,SAAS,UAAU,OAAe,IAAqB;AAC1D,SAAO,YAAY,EAAE,QAAQ,OAAO,KAAK,CAAC;AAC9C;AAEO,SAAS,aAAa,OAAe,IAAqB;AAC7D,SAAO,YAAY,EAAE,QAAQ,UAAU,KAAK,CAAC;AACjD;AAKO,SAAS,kBAAkB,YAGhC;AACE,SAAO;AAAA,IACH,YAAY,QAAQ,YAAY,qBAAqB,UAAU;AAAA,IAC/D,QAAQ,QAAQ,YAAY,qBAAqB,UAAU,KAAK,CAAC;AAAA,EACrE;AACJ;","names":[]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var __defProp = Object.defineProperty;
|
|
3
2
|
var __export = (target, all) => {
|
|
4
3
|
for (var name in all)
|
|
@@ -8,4 +7,4 @@ var __export = (target, all) => {
|
|
|
8
7
|
|
|
9
8
|
|
|
10
9
|
exports.__export = __export;
|
|
11
|
-
//# sourceMappingURL=chunk-
|
|
10
|
+
//# sourceMappingURL=chunk-PZ5AY32C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\chunk-PZ5AY32C.js"],"names":[],"mappings":"AAAA,6EAAI,UAAU,EAAE,MAAM,CAAC,cAAc;AACrC,IAAI,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG;AAChC,EAAE,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG;AACtB,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AACjE,CAAC;AACD;AACA;AACE;AACF,4BAAC","file":"C:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\chunk-PZ5AY32C.js"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
3
|
-
// src/core/logger.ts
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/core/logger.ts
|
|
4
2
|
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
5
3
|
LogLevel2[LogLevel2["DEBUG"] = 0] = "DEBUG";
|
|
6
4
|
LogLevel2[LogLevel2["INFO"] = 1] = "INFO";
|
|
@@ -9,6 +7,9 @@ var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
|
9
7
|
return LogLevel2;
|
|
10
8
|
})(LogLevel || {});
|
|
11
9
|
var Logger = class {
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
12
13
|
constructor(options = {}) {
|
|
13
14
|
this.level = _nullishCoalesce(options.level, () => ( 1)) /* INFO */;
|
|
14
15
|
this.prefix = _nullishCoalesce(options.prefix, () => ( "[Fusion]"));
|
|
@@ -53,4 +54,4 @@ function createLogger(options) {
|
|
|
53
54
|
|
|
54
55
|
|
|
55
56
|
exports.LogLevel = LogLevel; exports.Logger = Logger; exports.logger = logger; exports.createLogger = createLogger;
|
|
56
|
-
//# sourceMappingURL=chunk-
|
|
57
|
+
//# sourceMappingURL=chunk-QP2TMRLG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\chunk-QP2TMRLG.js"],"names":[],"mappings":"AAAA;AACA,IAAI,SAAS,kBAAkB,CAAC,CAAC,SAAS,EAAE,GAAG;AAC/C,EAAE,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO;AAC7C,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM;AAC3C,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM;AAC3C,EAAE,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO;AAC7C,EAAE,OAAO,SAAS;AAClB,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AAClB,IAAI,OAAO,EAAE,MAAM;AACnB,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;AAC5B,IAAI,IAAI,CAAC,MAAM,mBAAE,OAAO,CAAC,KAAM,UAAG,cAAY;AAC9C,IAAI,IAAI,CAAC,OAAO,mBAAE,OAAO,CAAC,MAAO,UAAG,YAAU;AAC9C,IAAI,IAAI,CAAC,UAAU,mBAAE,OAAO,CAAC,SAAU,UAAG,MAAI;AAC9C,EAAE;AACF,EAAE,aAAa,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE;AAChC,IAAI,MAAM,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE;AAC7F,IAAI,OAAO,CAAC,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"C:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\chunk-QP2TMRLG.js","sourcesContent":[null]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
import {
|
|
3
2
|
FusionFetcher
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-6SVQEGEX.mjs";
|
|
5
4
|
import {
|
|
6
5
|
__export
|
|
7
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-J5LGTIGS.mjs";
|
|
8
7
|
|
|
9
8
|
// src/next/index.ts
|
|
10
9
|
var next_exports = {};
|
|
@@ -80,4 +79,4 @@ export {
|
|
|
80
79
|
useAuth,
|
|
81
80
|
next_exports
|
|
82
81
|
};
|
|
83
|
-
//# sourceMappingURL=chunk-
|
|
82
|
+
//# sourceMappingURL=chunk-RS23R3ZQ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/next/index.ts","../src/next/provider.tsx","../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","'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/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","'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":";;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,OAAO,SAAS,eAAe,kBAA6B;AAO5D,IAAM,gBAAgB,cAAwC,IAAI;AAgB3D,SAAS,eAAe,EAAE,UAAU,UAAU,OAAO,GAAwB;AAChF,QAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,cAAc,OAAO,GAAG,CAAC,OAAO,CAAC;AAExE,SACI,oCAAC,cAAc,UAAd,EAAuB,OAAO,EAAE,OAAO,KACnC,QACL;AAER;AAUO,SAAS,YAA+B;AAC3C,QAAM,UAAU,WAAW,aAAa;AACxC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAClE;AACA,SAAO;AACX;;;AC/CA,SAAS,UAAU,iBAAiB;AAwB7B,SAAS,UAAyB;AACrC,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,CAAC,MAAM,OAAO,IAAI,SAA0B,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAE3C,YAAU,MAAM;AAEZ,UAAM,QAAQ,aAAa,QAAQ,cAAc;AACjD,QAAI,OAAO;AAEP,eAAS;AAAA,IACb,OAAO;AACH,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,YAAY;AACzB,QAAI;AACA,YAAM,WAAW,MAAM,OAAO,IAAc,UAAU;AACtD,cAAQ,QAAQ;AAAA,IACpB,SAAS,OAAO;AACZ,mBAAa,WAAW,cAAc;AAAA,IAC1C,UAAE;AACE,iBAAW,KAAK;AAAA,IACpB;AAAA,EACJ;AAEA,QAAM,QAAQ,OAAO,OAAe,aAAqB;AACrD,UAAM,WAAW,MAAM,OAAO,KAAwC,eAAe;AAAA,MACjF;AAAA,MACA;AAAA,IACJ,CAAC;AACD,iBAAa,QAAQ,gBAAgB,SAAS,KAAK;AACnD,YAAQ,SAAS,IAAI;AAAA,EACzB;AAEA,QAAM,SAAS,YAAY;AACvB,iBAAa,WAAW,cAAc;AACtC,YAAQ,IAAI;AAAA,EAChB;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,CAAC,CAAC;AAAA,EACvB;AACJ;","names":[]}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
3
2
|
|
|
4
|
-
var
|
|
3
|
+
var _chunkPZ5AY32Cjs = require('./chunk-PZ5AY32C.js');
|
|
5
4
|
|
|
6
5
|
// src/nest/index.ts
|
|
7
6
|
var nest_exports = {};
|
|
8
|
-
|
|
7
|
+
_chunkPZ5AY32Cjs.__export.call(void 0, nest_exports, {
|
|
9
8
|
FusionController: () => FusionController,
|
|
10
9
|
FusionDelete: () => FusionDelete,
|
|
11
10
|
FusionGet: () => FusionGet,
|
|
@@ -64,4 +63,4 @@ function getFusionMetadata(controller) {
|
|
|
64
63
|
|
|
65
64
|
|
|
66
65
|
exports.FusionController = FusionController; exports.FusionRoute = FusionRoute; exports.FusionGet = FusionGet; exports.FusionPost = FusionPost; exports.FusionPut = FusionPut; exports.FusionDelete = FusionDelete; exports.getFusionMetadata = getFusionMetadata; exports.nest_exports = nest_exports;
|
|
67
|
-
//# sourceMappingURL=chunk-
|
|
66
|
+
//# sourceMappingURL=chunk-W3YRVEFQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\chunk-W3YRVEFQ.js"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;AACA,IAAI,aAAa,EAAE,CAAC,CAAC;AACrB,uCAAQ,YAAa,EAAE;AACvB,EAAE,gBAAgB,EAAE,CAAC,EAAE,GAAG,gBAAgB;AAC1C,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,YAAY;AAClC,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,SAAS;AAC5B,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,UAAU;AAC9B,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,SAAS;AAC5B,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,WAAW;AAChC,EAAE,iBAAiB,EAAE,CAAC,EAAE,GAAG;AAC3B,CAAC,CAAC;AACF;AACA;AACA,4BAAyB;AACzB,IAAI,oBAAoB,EAAE,eAAe;AACzC,SAAS,gBAAgB,CAAC,OAAO,EAAE,EAAE,EAAE;AACvC,EAAE,OAAO,QAAQ,CAAC,MAAM,EAAE;AAC1B,IAAI,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC;AACnE,IAAI,OAAO,MAAM;AACjB,EAAE,CAAC;AACH;AACA,SAAS,WAAW,CAAC,QAAQ,EAAE;AAC/B,EAAE,OAAO,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE;AACnD,IAAI,MAAM,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACrF,IAAI,MAAM,CAAC,IAAI,CAAC;AAChB,MAAM,GAAG,QAAQ;AACjB,MAAM,OAAO,EAAE;AACf,IAAI,CAAC,CAAC;AACN,IAAI,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;AAC3E,IAAI,OAAO,UAAU;AACrB,EAAE,CAAC;AACH;AACA,SAAS,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE;AAC9B,EAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7C;AACA,SAAS,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE;AAC/B,EAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAC9C;AACA,SAAS,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE;AAC9B,EAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7C;AACA,SAAS,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE;AACjC,EAAE,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAChD;AACA,SAAS,iBAAiB,CAAC,UAAU,EAAE;AACvC,EAAE,OAAO;AACT,IAAI,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,UAAU,CAAC;AACpE,IAAI,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,UAAU,EAAE,GAAG,CAAC;AACrE,EAAE,CAAC;AACH;AACA;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,uSAAC","file":"C:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\chunk-W3YRVEFQ.js","sourcesContent":[null]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict"; function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }
|
|
3
|
+
|
|
4
|
+
var _chunkQP2TMRLGjs = require('../chunk-QP2TMRLG.js');
|
|
5
|
+
require('../chunk-PZ5AY32C.js');
|
|
6
|
+
|
|
7
|
+
// src/cli/index.ts
|
|
8
|
+
var _commander = require('commander');
|
|
9
|
+
var _picocolors = require('picocolors'); var pc = _interopRequireWildcard(_picocolors);
|
|
10
|
+
var program = new (0, _commander.Command)();
|
|
11
|
+
program.name("fusion").description("wexts - Full-stack framework CLI").version("1.0.0");
|
|
12
|
+
program.command("create <project-name>").description("Create a new wexts project").option("-t, --template <template>", "Template to use (monorepo|api|web)", "monorepo").action(async (projectName, options) => {
|
|
13
|
+
_chunkQP2TMRLGjs.logger.info(pc.cyan(`Creating wexts project: ${pc.bold(projectName)}`));
|
|
14
|
+
_chunkQP2TMRLGjs.logger.info(`Template: ${options.template}`);
|
|
15
|
+
_chunkQP2TMRLGjs.logger.warn("Project scaffolding not yet implemented");
|
|
16
|
+
_chunkQP2TMRLGjs.logger.info("Will create:");
|
|
17
|
+
_chunkQP2TMRLGjs.logger.info(" \u2022 apps/api/ (NestJS 10)");
|
|
18
|
+
_chunkQP2TMRLGjs.logger.info(" \u2022 apps/web/ (Next.js 16)");
|
|
19
|
+
_chunkQP2TMRLGjs.logger.info(" \u2022 packages/types/");
|
|
20
|
+
_chunkQP2TMRLGjs.logger.info(" \u2022 packages/api-client/");
|
|
21
|
+
});
|
|
22
|
+
program.command("dev").description("Start development servers").option("-a, --api <path>", "Path to API project", "./apps/api").option("-w, --web <path>", "Path to Web project", "./apps/web").option("-p, --port <port>", "Port for web server", "3000").option("--api-port <port>", "Port for API server", "5050").option("--no-proxy", "Disable proxy server").action(async (options) => {
|
|
23
|
+
_chunkQP2TMRLGjs.logger.info(pc.green("\u{1F680} Starting Fusion development servers...\n"));
|
|
24
|
+
const { FusionDevServer } = await Promise.resolve().then(() => _interopRequireWildcard(require("../dev-server-TLL7UQMR.js")));
|
|
25
|
+
const server = new FusionDevServer();
|
|
26
|
+
try {
|
|
27
|
+
await server.start({
|
|
28
|
+
apiPath: options.api,
|
|
29
|
+
webPath: options.web,
|
|
30
|
+
webPort: parseInt(options.port),
|
|
31
|
+
apiPort: parseInt(options.apiPort),
|
|
32
|
+
useProxy: options.proxy
|
|
33
|
+
});
|
|
34
|
+
} catch (error) {
|
|
35
|
+
_chunkQP2TMRLGjs.logger.error("Failed to start dev server:", error.message);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
program.command("build").description("Build for production").action(async () => {
|
|
40
|
+
_chunkQP2TMRLGjs.logger.info(pc.blue("Building Fusion project..."));
|
|
41
|
+
_chunkQP2TMRLGjs.logger.warn("Build not yet implemented");
|
|
42
|
+
});
|
|
43
|
+
program.command("generate <type> <name>").alias("g").description("Generate code (controller|module|page)").action(async (type, name) => {
|
|
44
|
+
_chunkQP2TMRLGjs.logger.info(pc.magenta(`Generating ${type}: ${name}`));
|
|
45
|
+
_chunkQP2TMRLGjs.logger.warn("Code generation not yet implemented");
|
|
46
|
+
});
|
|
47
|
+
program.command("codegen").description("Generate API client from NestJS controllers").option("-w, --watch", "Watch mode - regenerate on changes").option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output path for generated client", "./packages/api-client/src").action(async (options) => {
|
|
48
|
+
const { NestJSParser, ClientGenerator, CodegenWatcher } = await Promise.resolve().then(() => _interopRequireWildcard(require("../codegen-MRZDLCYI.js")));
|
|
49
|
+
if (options.watch) {
|
|
50
|
+
_chunkQP2TMRLGjs.logger.info(pc.cyan("Starting codegen in watch mode..."));
|
|
51
|
+
const watcher = new CodegenWatcher();
|
|
52
|
+
await watcher.watch({
|
|
53
|
+
projectPath: options.project,
|
|
54
|
+
outputPath: options.output
|
|
55
|
+
});
|
|
56
|
+
} else {
|
|
57
|
+
_chunkQP2TMRLGjs.logger.info(pc.cyan("Generating API client..."));
|
|
58
|
+
const parser = new NestJSParser(options.project);
|
|
59
|
+
const controllers = parser.findFusionControllers();
|
|
60
|
+
const generator = new ClientGenerator();
|
|
61
|
+
await generator.generate({
|
|
62
|
+
controllers,
|
|
63
|
+
outputPath: options.output
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
program.parse();
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\cli\\index.js"],"names":[],"mappings":"AAAA;AACA;AACE;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACA;AACA,sCAAmC;AACnC,uFAAgC;AAChC,IAAI,QAAQ,EAAE,IAAI,uBAAO,CAAC,CAAC;AAC3B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;AACvF,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC,MAAM,CAAC,2BAA2B,EAAE,oCAAoC,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG;AAChN,EAAE,uBAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,wBAAwB,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA","file":"C:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\cli\\index.js","sourcesContent":[null]}
|
package/dist/cli/index.mjs
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
#!/usr/bin/env node
|
|
3
2
|
import {
|
|
4
3
|
logger
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-NULGSZFE.mjs";
|
|
5
|
+
import "../chunk-J5LGTIGS.mjs";
|
|
7
6
|
|
|
8
7
|
// src/cli/index.ts
|
|
9
8
|
import { Command } from "commander";
|
|
@@ -22,8 +21,8 @@ program.command("create <project-name>").description("Create a new wexts project
|
|
|
22
21
|
});
|
|
23
22
|
program.command("dev").description("Start development servers").option("-a, --api <path>", "Path to API project", "./apps/api").option("-w, --web <path>", "Path to Web project", "./apps/web").option("-p, --port <port>", "Port for web server", "3000").option("--api-port <port>", "Port for API server", "5050").option("--no-proxy", "Disable proxy server").action(async (options) => {
|
|
24
23
|
logger.info(pc.green("\u{1F680} Starting Fusion development servers...\n"));
|
|
25
|
-
const {
|
|
26
|
-
const server = new
|
|
24
|
+
const { FusionDevServer } = await import("../dev-server-JKRVBWPY.mjs");
|
|
25
|
+
const server = new FusionDevServer();
|
|
27
26
|
try {
|
|
28
27
|
await server.start({
|
|
29
28
|
apiPath: options.api,
|
|
@@ -46,19 +45,19 @@ program.command("generate <type> <name>").alias("g").description("Generate code
|
|
|
46
45
|
logger.warn("Code generation not yet implemented");
|
|
47
46
|
});
|
|
48
47
|
program.command("codegen").description("Generate API client from NestJS controllers").option("-w, --watch", "Watch mode - regenerate on changes").option("-p, --project <path>", "Path to NestJS project", "./apps/api").option("-o, --output <path>", "Output path for generated client", "./packages/api-client/src").action(async (options) => {
|
|
49
|
-
const {
|
|
48
|
+
const { NestJSParser, ClientGenerator, CodegenWatcher } = await import("../codegen-UI5HTMXE.mjs");
|
|
50
49
|
if (options.watch) {
|
|
51
50
|
logger.info(pc.cyan("Starting codegen in watch mode..."));
|
|
52
|
-
const watcher = new
|
|
51
|
+
const watcher = new CodegenWatcher();
|
|
53
52
|
await watcher.watch({
|
|
54
53
|
projectPath: options.project,
|
|
55
54
|
outputPath: options.output
|
|
56
55
|
});
|
|
57
56
|
} else {
|
|
58
57
|
logger.info(pc.cyan("Generating API client..."));
|
|
59
|
-
const parser = new
|
|
58
|
+
const parser = new NestJSParser(options.project);
|
|
60
59
|
const controllers = parser.findFusionControllers();
|
|
61
|
-
const generator = new
|
|
60
|
+
const generator = new ClientGenerator();
|
|
62
61
|
await generator.generate({
|
|
63
62
|
controllers,
|
|
64
63
|
outputPath: options.output
|
package/dist/cli/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport { logger } from '../core/logger';\r\nimport * as pc from 'picocolors';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('fusion')\r\n .description('wexts - Full-stack framework CLI')\r\n .version('1.0.0');\r\n\r\n// Create Command\r\nprogram\r\n .command('create <project-name>')\r\n .description('Create a new wexts project')\r\n .option('-t, --template <template>', 'Template to use (monorepo|api|web)', 'monorepo')\r\n .action(async (projectName: string, options: any) => {\r\n logger.info(pc.cyan(`Creating wexts project: ${pc.bold(projectName)}`));\r\n logger.info(`Template: ${options.template}`);\r\n\r\n // TODO: Implement project scaffolding\r\n logger.warn('Project scaffolding not yet implemented');\r\n logger.info('Will create:');\r\n logger.info(' • apps/api/ (NestJS 10)');\r\n logger.info(' • apps/web/ (Next.js 16)');\r\n logger.info(' • packages/types/');\r\n logger.info(' • packages/api-client/');\r\n });\r\n\r\n// Dev Command\r\nprogram\r\n .command('dev')\r\n .description('Start development servers')\r\n .option('-a, --api <path>', 'Path to API project', './apps/api')\r\n .option('-w, --web <path>', 'Path to Web project', './apps/web')\r\n .option('-p, --port <port>', 'Port for web server', '3000')\r\n .option('--api-port <port>', 'Port for API server', '5050')\r\n .option('--no-proxy', 'Disable proxy server')\r\n .action(async (options: any) => {\r\n logger.info(pc.green('🚀 Starting Fusion development servers...\\n'));\r\n\r\n const {
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport { logger } from '../core/logger';\r\nimport * as pc from 'picocolors';\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('fusion')\r\n .description('wexts - Full-stack framework CLI')\r\n .version('1.0.0');\r\n\r\n// Create Command\r\nprogram\r\n .command('create <project-name>')\r\n .description('Create a new wexts project')\r\n .option('-t, --template <template>', 'Template to use (monorepo|api|web)', 'monorepo')\r\n .action(async (projectName: string, options: any) => {\r\n logger.info(pc.cyan(`Creating wexts project: ${pc.bold(projectName)}`));\r\n logger.info(`Template: ${options.template}`);\r\n\r\n // TODO: Implement project scaffolding\r\n logger.warn('Project scaffolding not yet implemented');\r\n logger.info('Will create:');\r\n logger.info(' • apps/api/ (NestJS 10)');\r\n logger.info(' • apps/web/ (Next.js 16)');\r\n logger.info(' • packages/types/');\r\n logger.info(' • packages/api-client/');\r\n });\r\n\r\n// Dev Command\r\nprogram\r\n .command('dev')\r\n .description('Start development servers')\r\n .option('-a, --api <path>', 'Path to API project', './apps/api')\r\n .option('-w, --web <path>', 'Path to Web project', './apps/web')\r\n .option('-p, --port <port>', 'Port for web server', '3000')\r\n .option('--api-port <port>', 'Port for API server', '5050')\r\n .option('--no-proxy', 'Disable proxy server')\r\n .action(async (options: any) => {\r\n logger.info(pc.green('🚀 Starting Fusion development servers...\\n'));\r\n\r\n const { FusionDevServer } = await import('../dev-server/index.js');\r\n const server = new FusionDevServer();\r\n\r\n try {\r\n await server.start({\r\n apiPath: options.api,\r\n webPath: options.web,\r\n webPort: parseInt(options.port),\r\n apiPort: parseInt(options.apiPort),\r\n useProxy: options.proxy,\r\n });\r\n } catch (error: any) {\r\n logger.error('Failed to start dev server:', error.message);\r\n process.exit(1);\r\n }\r\n });\r\n\r\n// Build Command\r\nprogram\r\n .command('build')\r\n .description('Build for production')\r\n .action(async () => {\r\n logger.info(pc.blue('Building Fusion project...'));\r\n\r\n // TODO: Build logic\r\n logger.warn('Build not yet implemented');\r\n });\r\n\r\n// Generate Command\r\nprogram\r\n .command('generate <type> <name>')\r\n .alias('g')\r\n .description('Generate code (controller|module|page)')\r\n .action(async (type: string, name: string) => {\r\n logger.info(pc.magenta(`Generating ${type}: ${name}`));\r\n\r\n // TODO: Code generation\r\n logger.warn('Code generation not yet implemented');\r\n });\r\n\r\n// Codegen Command\r\nprogram\r\n .command('codegen')\r\n .description('Generate API client from NestJS controllers')\r\n .option('-w, --watch', 'Watch mode - regenerate on changes')\r\n .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\r\n .option('-o, --output <path>', 'Output path for generated client', './packages/api-client/src')\r\n .action(async (options: any) => {\r\n const { NestJSParser, ClientGenerator, CodegenWatcher } = await import('../codegen/index.js');\r\n\r\n if (options.watch) {\r\n logger.info(pc.cyan('Starting codegen in watch mode...'));\r\n const watcher = new CodegenWatcher();\r\n await watcher.watch({\r\n projectPath: options.project,\r\n outputPath: options.output,\r\n });\r\n } else {\r\n logger.info(pc.cyan('Generating API client...'));\r\n const parser = new NestJSParser(options.project);\r\n const controllers = parser.findFusionControllers();\r\n\r\n const generator = new ClientGenerator();\r\n await generator.generate({\r\n controllers,\r\n outputPath: options.output,\r\n });\r\n }\r\n });\r\n\r\nprogram.parse();\r\n"],"mappings":";;;;;;;AAEA,SAAS,eAAe;AAExB,YAAY,QAAQ;AAEpB,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACK,KAAK,QAAQ,EACb,YAAY,kCAAkC,EAC9C,QAAQ,OAAO;AAGpB,QACK,QAAQ,uBAAuB,EAC/B,YAAY,4BAA4B,EACxC,OAAO,6BAA6B,sCAAsC,UAAU,EACpF,OAAO,OAAO,aAAqB,YAAiB;AACjD,SAAO,KAAQ,QAAK,2BAA8B,QAAK,WAAW,CAAC,EAAE,CAAC;AACtE,SAAO,KAAK,aAAa,QAAQ,QAAQ,EAAE;AAG3C,SAAO,KAAK,yCAAyC;AACrD,SAAO,KAAK,cAAc;AAC1B,SAAO,KAAK,gCAA2B;AACvC,SAAO,KAAK,iCAA4B;AACxC,SAAO,KAAK,0BAAqB;AACjC,SAAO,KAAK,+BAA0B;AAC1C,CAAC;AAGL,QACK,QAAQ,KAAK,EACb,YAAY,2BAA2B,EACvC,OAAO,oBAAoB,uBAAuB,YAAY,EAC9D,OAAO,oBAAoB,uBAAuB,YAAY,EAC9D,OAAO,qBAAqB,uBAAuB,MAAM,EACzD,OAAO,qBAAqB,uBAAuB,MAAM,EACzD,OAAO,cAAc,sBAAsB,EAC3C,OAAO,OAAO,YAAiB;AAC5B,SAAO,KAAQ,SAAM,oDAA6C,CAAC;AAEnE,QAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,4BAAwB;AACjE,QAAM,SAAS,IAAI,gBAAgB;AAEnC,MAAI;AACA,UAAM,OAAO,MAAM;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,SAAS,QAAQ;AAAA,MACjB,SAAS,SAAS,QAAQ,IAAI;AAAA,MAC9B,SAAS,SAAS,QAAQ,OAAO;AAAA,MACjC,UAAU,QAAQ;AAAA,IACtB,CAAC;AAAA,EACL,SAAS,OAAY;AACjB,WAAO,MAAM,+BAA+B,MAAM,OAAO;AACzD,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAGL,QACK,QAAQ,OAAO,EACf,YAAY,sBAAsB,EAClC,OAAO,YAAY;AAChB,SAAO,KAAQ,QAAK,4BAA4B,CAAC;AAGjD,SAAO,KAAK,2BAA2B;AAC3C,CAAC;AAGL,QACK,QAAQ,wBAAwB,EAChC,MAAM,GAAG,EACT,YAAY,wCAAwC,EACpD,OAAO,OAAO,MAAc,SAAiB;AAC1C,SAAO,KAAQ,WAAQ,cAAc,IAAI,KAAK,IAAI,EAAE,CAAC;AAGrD,SAAO,KAAK,qCAAqC;AACrD,CAAC;AAGL,QACK,QAAQ,SAAS,EACjB,YAAY,6CAA6C,EACzD,OAAO,eAAe,oCAAoC,EAC1D,OAAO,wBAAwB,0BAA0B,YAAY,EACrE,OAAO,uBAAuB,oCAAoC,2BAA2B,EAC7F,OAAO,OAAO,YAAiB;AAC5B,QAAM,EAAE,cAAc,iBAAiB,eAAe,IAAI,MAAM,OAAO,yBAAqB;AAE5F,MAAI,QAAQ,OAAO;AACf,WAAO,KAAQ,QAAK,mCAAmC,CAAC;AACxD,UAAM,UAAU,IAAI,eAAe;AACnC,UAAM,QAAQ,MAAM;AAAA,MAChB,aAAa,QAAQ;AAAA,MACrB,YAAY,QAAQ;AAAA,IACxB,CAAC;AAAA,EACL,OAAO;AACH,WAAO,KAAQ,QAAK,0BAA0B,CAAC;AAC/C,UAAM,SAAS,IAAI,aAAa,QAAQ,OAAO;AAC/C,UAAM,cAAc,OAAO,sBAAsB;AAEjD,UAAM,YAAY,IAAI,gBAAgB;AACtC,UAAM,UAAU,SAAS;AAAA,MACrB;AAAA,MACA,YAAY,QAAQ;AAAA,IACxB,CAAC;AAAA,EACL;AACJ,CAAC;AAEL,QAAQ,MAAM;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare class FusionFetcher {
|
|
2
|
+
private baseUrl;
|
|
3
|
+
constructor(baseUrl?: string);
|
|
4
|
+
private request;
|
|
5
|
+
get<T>(path: string): Promise<T>;
|
|
6
|
+
post<T>(path: string, body: any): Promise<T>;
|
|
7
|
+
put<T>(path: string, body: any): Promise<T>;
|
|
8
|
+
delete<T>(path: string): Promise<T>;
|
|
9
|
+
}
|
|
10
|
+
declare const apiFetcher: FusionFetcher;
|
|
11
|
+
|
|
12
|
+
export { FusionFetcher, apiFetcher };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare class FusionFetcher {
|
|
2
|
+
private baseUrl;
|
|
3
|
+
constructor(baseUrl?: string);
|
|
4
|
+
private request;
|
|
5
|
+
get<T>(path: string): Promise<T>;
|
|
6
|
+
post<T>(path: string, body: any): Promise<T>;
|
|
7
|
+
put<T>(path: string, body: any): Promise<T>;
|
|
8
|
+
delete<T>(path: string): Promise<T>;
|
|
9
|
+
}
|
|
10
|
+
declare const apiFetcher: FusionFetcher;
|
|
11
|
+
|
|
12
|
+
export { FusionFetcher, apiFetcher };
|
package/dist/client/index.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
3
2
|
|
|
4
3
|
|
|
5
|
-
var
|
|
6
|
-
require('../chunk-
|
|
4
|
+
var _chunkMTHKZO55js = require('../chunk-MTHKZO55.js');
|
|
5
|
+
require('../chunk-PZ5AY32C.js');
|
|
7
6
|
|
|
8
7
|
|
|
9
8
|
|
|
10
|
-
exports.FusionFetcher =
|
|
9
|
+
exports.FusionFetcher = _chunkMTHKZO55js.FusionFetcher; exports.apiFetcher = _chunkMTHKZO55js.apiFetcher;
|
|
11
10
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\client\\index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,yGAAC","file":"C:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\client\\index.js"}
|
package/dist/client/index.mjs
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkFYGXL4V7js = require('./chunk-FYGXL4V7.js');
|
|
6
|
+
require('./chunk-QP2TMRLG.js');
|
|
7
|
+
require('./chunk-PZ5AY32C.js');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
exports.ClientGenerator = _chunkFYGXL4V7js.ClientGenerator; exports.CodegenWatcher = _chunkFYGXL4V7js.CodegenWatcher; exports.NestJSParser = _chunkFYGXL4V7js.NestJSParser;
|
|
13
|
+
//# sourceMappingURL=codegen-MRZDLCYI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["c:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\codegen-MRZDLCYI.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACF,2KAAC","file":"C:\\Users\\ziad\\Desktop\\wexts\\packages\\fusionjs\\dist\\codegen-MRZDLCYI.js"}
|