@hexaijs/plugin-application-builder 0.2.3 → 0.2.4
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/dist/application-builder-generator.d.ts +15 -0
- package/dist/application-builder-generator.d.ts.map +1 -0
- package/dist/application-builder-generator.js +44 -0
- package/dist/application-builder-generator.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +20 -572
- package/dist/cli.js.map +1 -1
- package/dist/code-generator.d.ts +30 -0
- package/dist/code-generator.d.ts.map +1 -0
- package/dist/code-generator.js +127 -0
- package/dist/code-generator.js.map +1 -0
- package/dist/config-loader.d.ts +3 -0
- package/dist/config-loader.d.ts.map +1 -0
- package/dist/config-loader.js +31 -0
- package/dist/config-loader.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +27 -0
- package/dist/config.js.map +1 -0
- package/dist/decorators/index.d.ts +6 -14
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +28 -14
- package/dist/decorators/index.js.map +1 -1
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +25 -0
- package/dist/errors.js.map +1 -0
- package/dist/hexai-plugin.d.ts +30 -0
- package/dist/hexai-plugin.d.ts.map +1 -0
- package/dist/hexai-plugin.js +45 -0
- package/dist/hexai-plugin.js.map +1 -0
- package/dist/index.d.ts +5 -48
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -596
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +6 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +15 -0
- package/dist/main.js.map +1 -0
- package/dist/metadata-extractor.d.ts +25 -0
- package/dist/metadata-extractor.d.ts.map +1 -0
- package/dist/metadata-extractor.js +210 -0
- package/dist/metadata-extractor.js.map +1 -0
- package/dist/test.d.ts +15 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +67 -0
- package/dist/test.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +7 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/metadata-extractor.ts","../src/code-generator.ts","../src/application-builder-generator.ts","../src/config.ts","../src/config-loader.ts","../src/main.ts","../src/decorators/index.ts","../src/hexai-plugin.ts"],"names":["relative","handlers","path2","fs2","fs3","ts2","path3","path4"],"mappings":"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","file":"index.js","sourcesContent":["export class DuplicateCommandHandlerError extends Error {\n constructor(commandClassName: string, handlers: string[]) {\n super(\n `Duplicate command handlers for \"${commandClassName}\": ${handlers.join(\", \")}`\n );\n this.name = \"DuplicateCommandHandlerError\";\n }\n}\n\nexport class DuplicateEventHandlerError extends Error {\n constructor(eventName: string, handlers: string[]) {\n super(\n `Duplicate event handlers for event \"${eventName}\": ${handlers.join(\", \")}`\n );\n this.name = \"DuplicateEventHandlerError\";\n }\n}\n\nexport class DuplicateQueryHandlerError extends Error {\n constructor(queryClassName: string, handlers: string[]) {\n super(\n `Duplicate query handlers for \"${queryClassName}\": ${handlers.join(\", \")}`\n );\n this.name = \"DuplicateQueryHandlerError\";\n }\n}\n\nexport class MessageClassNotFoundError extends Error {\n constructor(messageClassName: string, filePath: string) {\n super(\n `Cannot find \"${messageClassName}\" - not imported and not defined in \"${filePath}\"`\n );\n this.name = \"MessageClassNotFoundError\";\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as ts from \"typescript\";\nimport {\n HandlerMetadata,\n CommandHandlerMetadata,\n EventHandlerMetadata,\n QueryHandlerMetadata,\n} from \"./types\";\nimport { MessageClassNotFoundError } from \"./errors\";\n\n/**\n * Extracts handler metadata from TypeScript files using AST parsing\n */\nexport class HandlerMetadataExtractor {\n private config: {\n commandHandlerDecorator: string;\n eventHandlerDecorator: string;\n } = {\n commandHandlerDecorator: \"CommandHandlerMarker\",\n eventHandlerDecorator: \"EventHandlerMarker\",\n };\n\n constructor(\n private contextPath: string,\n private outputFile: string,\n config: {\n commandHandlerDecorator?: string;\n eventHandlerDecorator?: string;\n } = {}\n ) {\n if (config.commandHandlerDecorator) {\n this.config.commandHandlerDecorator =\n config.commandHandlerDecorator;\n }\n if (config.eventHandlerDecorator) {\n this.config.eventHandlerDecorator = config.eventHandlerDecorator;\n }\n }\n\n extractHandlersMetadata(files: string[]): HandlerMetadata[] {\n const handlers: HandlerMetadata[] = [];\n\n for (const file of files) {\n const sourceCode = fs.readFileSync(file, \"utf-8\");\n const sourceFile = ts.createSourceFile(\n file,\n sourceCode,\n ts.ScriptTarget.Latest,\n true\n );\n\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isClassDeclaration(node)) {\n const metadata = this.extractFromClass(\n node,\n file,\n sourceFile\n );\n if (metadata) {\n handlers.push(metadata);\n }\n }\n });\n }\n\n return handlers;\n }\n\n private extractFromClass(\n classNode: ts.ClassDeclaration,\n filePath: string,\n sourceFile: ts.SourceFile\n ): HandlerMetadata | null {\n const className = classNode.name?.text;\n if (!className) return null;\n\n // Get decorators using TypeScript 5.0+ API\n const decorators = ts.canHaveDecorators(classNode)\n ? ts.getDecorators(classNode)\n : undefined;\n if (!decorators) return null;\n\n for (const decorator of decorators) {\n const expression = decorator.expression;\n if (!ts.isCallExpression(expression)) continue;\n\n const decoratorName = expression.expression.getText();\n\n if (decoratorName === \"CommandHandlerMarker\") {\n return this.extractCommandHandlerMetadata(\n className,\n expression,\n filePath,\n sourceFile\n );\n }\n\n if (decoratorName === \"EventHandlerMarker\") {\n return this.extractEventHandlerMetadata(\n className,\n expression,\n filePath\n );\n }\n\n if (decoratorName === \"QueryHandlerMarker\") {\n return this.extractQueryHandlerMetadata(\n className,\n expression,\n filePath,\n sourceFile\n );\n }\n }\n\n return null;\n }\n\n private extractMessageHandlerMetadata(\n className: string,\n expression: ts.CallExpression,\n filePath: string,\n sourceFile: ts.SourceFile\n ): { messagePath: string; messageClassName: string } {\n const messageClassArg = expression.arguments[0];\n const messageClassName = messageClassArg!.getText();\n const messageImport = this.findImportForSymbol(\n messageClassName,\n sourceFile\n );\n\n let messagePath = \"\";\n let resolvedMessageClassName = messageClassName;\n\n if (messageImport) {\n const handlerDir = path.dirname(filePath);\n const resolvedImportPath = this.resolvePathAlias(messageImport.path);\n const messageAbsolutePath = path.resolve(\n handlerDir,\n resolvedImportPath + \".ts\"\n );\n messagePath = this.toRelativeImport(messageAbsolutePath);\n resolvedMessageClassName = messageImport.symbol;\n } else if (this.isClassDefinedInFile(messageClassName, sourceFile)) {\n messagePath = this.toRelativeImport(filePath);\n } else {\n throw new MessageClassNotFoundError(messageClassName, filePath);\n }\n\n return {\n messagePath,\n messageClassName: resolvedMessageClassName,\n };\n }\n\n private isClassDefinedInFile(\n className: string,\n sourceFile: ts.SourceFile\n ): boolean {\n for (const statement of sourceFile.statements) {\n if (\n ts.isClassDeclaration(statement) &&\n statement.name?.text === className\n ) {\n return true;\n }\n }\n return false;\n }\n\n private extractCommandHandlerMetadata(\n className: string,\n expression: ts.CallExpression,\n filePath: string,\n sourceFile: ts.SourceFile\n ): CommandHandlerMetadata {\n const { messagePath, messageClassName } = this.extractMessageHandlerMetadata(\n className,\n expression,\n filePath,\n sourceFile\n );\n\n return {\n type: \"command\",\n handlerPath: this.toRelativeImport(filePath),\n handlerClassName: className,\n commandPath: messagePath,\n commandClassName: messageClassName,\n };\n }\n\n private extractEventHandlerMetadata(\n className: string,\n expression: ts.CallExpression,\n filePath: string\n ): EventHandlerMetadata {\n let options = {};\n if (expression.arguments.length > 0) {\n const optionsArg = expression.arguments[0];\n options = this.parseObjectLiteral(optionsArg);\n }\n\n return {\n type: \"event\",\n handlerPath: this.toRelativeImport(filePath),\n handlerClassName: className,\n eventHandlerOptions: options,\n };\n }\n\n private extractQueryHandlerMetadata(\n className: string,\n expression: ts.CallExpression,\n filePath: string,\n sourceFile: ts.SourceFile\n ): QueryHandlerMetadata {\n const { messagePath, messageClassName } = this.extractMessageHandlerMetadata(\n className,\n expression,\n filePath,\n sourceFile\n );\n\n return {\n type: \"query\",\n handlerPath: this.toRelativeImport(filePath),\n handlerClassName: className,\n queryPath: messagePath,\n queryClassName: messageClassName,\n };\n }\n\n private findImportForSymbol(\n symbol: string,\n sourceFile: ts.SourceFile\n ): { path: string; symbol: string } | null {\n for (const statement of sourceFile.statements) {\n if (ts.isImportDeclaration(statement)) {\n const importClause = statement.importClause;\n const moduleSpecifier = (\n statement.moduleSpecifier as ts.StringLiteral\n ).text;\n\n if (\n importClause?.namedBindings &&\n ts.isNamedImports(importClause.namedBindings)\n ) {\n for (const element of importClause.namedBindings.elements) {\n if (element.name.text === symbol) {\n return {\n path: moduleSpecifier,\n symbol: element.name.text,\n };\n }\n }\n }\n }\n }\n\n return null;\n }\n\n private toRelativeImport(absolutePath: string): string {\n const outputFileAbsolutePath = path.join(\n this.contextPath,\n this.outputFile\n );\n const outputDir = path.dirname(outputFileAbsolutePath);\n\n const relative = path.relative(outputDir, absolutePath);\n const withoutExtension = relative.replace(/\\.ts$/, \"\");\n // Ensure relative path has proper prefix\n return withoutExtension.startsWith(\".\")\n ? withoutExtension\n : \"./\" + withoutExtension;\n }\n\n private parseObjectLiteral(node: ts.Node): Record<string, any> {\n if (!ts.isObjectLiteralExpression(node)) {\n return {};\n }\n\n const result: Record<string, any> = {};\n\n for (const property of node.properties) {\n if (ts.isPropertyAssignment(property)) {\n const name = property.name.getText();\n const value = property.initializer;\n\n if (ts.isStringLiteral(value)) {\n result[name] = value.text;\n } else if (ts.isNumericLiteral(value)) {\n result[name] = Number(value.text);\n } else if (value.kind === ts.SyntaxKind.TrueKeyword) {\n result[name] = true;\n } else if (value.kind === ts.SyntaxKind.FalseKeyword) {\n result[name] = false;\n }\n }\n }\n\n return result;\n }\n\n private resolvePathAlias(importPath: string): string {\n const tsconfigPath = path.join(this.contextPath, \"tsconfig.json\");\n if (!fs.existsSync(tsconfigPath)) return importPath;\n\n const tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, \"utf-8\"));\n const paths = tsconfig.compilerOptions?.paths;\n const baseUrl = tsconfig.compilerOptions?.baseUrl || \".\";\n\n if (!paths) return importPath;\n\n for (const [alias, targets] of Object.entries(paths)) {\n const aliasPrefix = alias.replace(\"/*\", \"\");\n if (importPath.startsWith(aliasPrefix)) {\n const targetBase = (targets as string[])[0].replace(\"/*\", \"\");\n const resolvedBase = path.join(this.contextPath, baseUrl, targetBase);\n return importPath.replace(aliasPrefix, resolvedBase);\n }\n }\n\n return importPath;\n }\n}\n","import { BuildPluginConfig } from \"./config\";\nimport {\n DuplicateCommandHandlerError,\n DuplicateEventHandlerError,\n DuplicateQueryHandlerError,\n} from \"./errors\";\nimport {\n HandlerMetadata,\n CommandHandlerMetadata,\n EventHandlerMetadata,\n QueryHandlerMetadata,\n} from \"./types\";\n\n/**\n * Generates TypeScript code for ApplicationBuilder\n */\nexport class ApplicationCodeGenerator {\n constructor(private config: BuildPluginConfig) {}\n\n generateCode(handlers: HandlerMetadata[]): string {\n this.validateNoDuplicates(handlers);\n const imports = this.collectImports(handlers);\n const registrations = this.generateRegistrations(handlers);\n return this.assembleGeneratedCode(imports, registrations);\n }\n\n private validateNoDuplicates(handlers: HandlerMetadata[]): void {\n this.validateNoDuplicateCommandHandlers(handlers);\n this.validateNoDuplicateEventHandlers(handlers);\n this.validateNoDuplicateQueryHandlers(handlers);\n }\n\n private validateNoDuplicateHandlers<T extends HandlerMetadata>(\n handlers: HandlerMetadata[],\n typeFilter: (h: HandlerMetadata) => h is T,\n keyExtractor: (h: T) => string,\n errorFactory: (key: string, handlers: string[]) => Error\n ): void {\n const filteredHandlers = handlers.filter(typeFilter);\n\n const keyToHandlers = new Map<string, string[]>();\n for (const handler of filteredHandlers) {\n const key = keyExtractor(handler);\n const existing = keyToHandlers.get(key) ?? [];\n existing.push(handler.handlerClassName);\n keyToHandlers.set(key, existing);\n }\n\n for (const [key, handlerList] of keyToHandlers) {\n if (handlerList.length > 1) {\n throw errorFactory(key, handlerList);\n }\n }\n }\n\n private validateNoDuplicateCommandHandlers(\n handlers: HandlerMetadata[]\n ): void {\n this.validateNoDuplicateHandlers(\n handlers,\n (h): h is CommandHandlerMetadata => h.type === \"command\",\n (h) => h.commandClassName,\n (key, handlers) => new DuplicateCommandHandlerError(key, handlers)\n );\n }\n\n private validateNoDuplicateEventHandlers(\n handlers: HandlerMetadata[]\n ): void {\n const eventHandlers = handlers.filter(\n (h): h is EventHandlerMetadata => h.type === \"event\"\n );\n\n const namedEventHandlers = eventHandlers.filter(\n (h) => h.eventHandlerOptions.name !== undefined\n );\n\n this.validateNoDuplicateHandlers(\n namedEventHandlers,\n (h): h is EventHandlerMetadata => true,\n (h) => h.eventHandlerOptions.name!,\n (key, handlers) => new DuplicateEventHandlerError(key, handlers)\n );\n }\n\n private validateNoDuplicateQueryHandlers(\n handlers: HandlerMetadata[]\n ): void {\n this.validateNoDuplicateHandlers(\n handlers,\n (h): h is QueryHandlerMetadata => h.type === \"query\",\n (h) => h.queryClassName,\n (key, handlers) => new DuplicateQueryHandlerError(key, handlers)\n );\n }\n\n private createImportStatement(\n symbolName: string,\n importPath: string\n ): string {\n return `import { ${symbolName} } from '${importPath}';`;\n }\n\n private createCommandHandlerRegistration(\n commandClassName: string,\n handlerClassName: string\n ): string {\n return ` .withCommandHandler(${commandClassName}, () => new ${handlerClassName}())`;\n }\n\n private createEventHandlerRegistration(\n handlerClassName: string,\n eventName?: string\n ): string {\n const nameArg = eventName ? `, '${eventName}'` : \"\";\n return ` .withEventHandler(() => new ${handlerClassName}()${nameArg})`;\n }\n\n private createQueryHandlerRegistration(\n queryClassName: string,\n handlerClassName: string\n ): string {\n return ` .withQueryHandler(${queryClassName}, () => new ${handlerClassName}())`;\n }\n\n private isCommandHandler(\n handler: HandlerMetadata\n ): handler is CommandHandlerMetadata {\n return handler.type === \"command\";\n }\n\n private isEventHandler(\n handler: HandlerMetadata\n ): handler is EventHandlerMetadata {\n return handler.type === \"event\";\n }\n\n private isQueryHandler(\n handler: HandlerMetadata\n ): handler is QueryHandlerMetadata {\n return handler.type === \"query\";\n }\n\n private collectImports(handlers: HandlerMetadata[]): Set<string> {\n const imports = new Set<string>();\n imports.add(\n this.createImportStatement(\n \"ApplicationBuilder\",\n this.config.applicationBuilderImportPath\n )\n );\n\n for (const handler of handlers) {\n imports.add(\n this.createImportStatement(\n handler.handlerClassName,\n handler.handlerPath\n )\n );\n\n if (this.isCommandHandler(handler) && handler.commandPath) {\n imports.add(\n this.createImportStatement(\n handler.commandClassName,\n handler.commandPath\n )\n );\n }\n\n if (this.isQueryHandler(handler) && handler.queryPath) {\n imports.add(\n this.createImportStatement(\n handler.queryClassName,\n handler.queryPath\n )\n );\n }\n }\n\n return imports;\n }\n\n private generateRegistrations(handlers: HandlerMetadata[]): string[] {\n const commandRegistrations =\n this.generateCommandRegistrations(handlers);\n const queryRegistrations = this.generateQueryRegistrations(handlers);\n const eventRegistrations = this.generateEventRegistrations(handlers);\n return [...commandRegistrations, ...queryRegistrations, ...eventRegistrations];\n }\n\n private generateCommandRegistrations(\n handlers: HandlerMetadata[]\n ): string[] {\n return handlers\n .filter((h): h is CommandHandlerMetadata =>\n this.isCommandHandler(h)\n )\n .map((h) =>\n this.createCommandHandlerRegistration(\n h.commandClassName,\n h.handlerClassName\n )\n );\n }\n\n private generateQueryRegistrations(\n handlers: HandlerMetadata[]\n ): string[] {\n return handlers\n .filter((h): h is QueryHandlerMetadata =>\n this.isQueryHandler(h)\n )\n .map((h) =>\n this.createQueryHandlerRegistration(\n h.queryClassName,\n h.handlerClassName\n )\n );\n }\n\n private generateEventRegistrations(handlers: HandlerMetadata[]): string[] {\n return handlers\n .filter((h): h is EventHandlerMetadata => this.isEventHandler(h))\n .map((handler) => {\n this.validateEventHandlerOptions(handler);\n const eventName = handler.eventHandlerOptions.name;\n return this.createEventHandlerRegistration(\n handler.handlerClassName,\n eventName\n );\n });\n }\n\n private validateEventHandlerOptions(handler: EventHandlerMetadata): void {\n const options = handler.eventHandlerOptions;\n const invalidKeys = Object.keys(options).filter(\n (key) => key !== \"name\"\n );\n\n if (invalidKeys.length > 0) {\n throw new Error(\n `EventHandler for ${handler.handlerClassName} has invalid options: ${invalidKeys.join(\", \")}.\\n` +\n `Only 'name' option is supported. Use @EventHandler({ name: 'event-name' })`\n );\n }\n }\n\n private assembleGeneratedCode(\n imports: Set<string>,\n registrations: string[]\n ): string {\n const registrationCode =\n registrations.length > 0 ? \"\\n\" + registrations.join(\"\\n\") : \"\";\n\n return `\n${Array.from(imports).join(\"\\n\")}\n\nexport function createApplicationBuilder(): ApplicationBuilder {\n return new ApplicationBuilder()${registrationCode};\n}\n`;\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { glob } from \"glob\";\nimport { BuildPluginConfig } from \"./config\";\nimport { HandlerMetadataExtractor } from \"./metadata-extractor\";\nimport { ApplicationCodeGenerator } from \"./code-generator\";\n\n/**\n * Orchestrates the application builder generation process\n */\nexport class ApplicationBuilderGenerator {\n private metadataExtractor: HandlerMetadataExtractor;\n private codeGenerator: ApplicationCodeGenerator;\n\n constructor(\n private contextPath: string,\n private config: BuildPluginConfig\n ) {\n this.metadataExtractor = new HandlerMetadataExtractor(\n contextPath,\n config.outputFile\n );\n this.codeGenerator = new ApplicationCodeGenerator(config);\n }\n\n async generate(): Promise<void> {\n const handlerFiles = await this.scanHandlerFiles();\n const handlers = this.metadataExtractor.extractHandlersMetadata(handlerFiles);\n const code = this.codeGenerator.generateCode(handlers);\n this.writeToFile(code);\n }\n\n private async scanHandlerFiles(): Promise<string[]> {\n const allFiles: string[] = [];\n\n for (const pattern of this.config.handlers) {\n const files = await glob(pattern, {\n cwd: this.contextPath,\n absolute: true,\n });\n allFiles.push(...files);\n }\n\n return allFiles.sort();\n }\n\n private writeToFile(code: string): void {\n const outputFile = path.join(this.contextPath, this.config.outputFile);\n const outputDir = path.dirname(outputFile);\n\n fs.mkdirSync(outputDir, { recursive: true });\n fs.writeFileSync(outputFile, code, \"utf-8\");\n }\n}\n","export interface RawBuildPluginConfig {\n handlers: string[];\n outputFile?: string;\n applicationBuilderImportPath: string;\n}\n\nexport class BuildPluginConfig {\n public readonly handlers: string[];\n public readonly outputFile: string;\n public readonly applicationBuilderImportPath: string;\n\n private constructor(config: {\n handlers: string[];\n outputFile: string;\n applicationBuilderImportPath: string;\n }) {\n this.handlers = config.handlers;\n this.outputFile = config.outputFile;\n this.applicationBuilderImportPath = config.applicationBuilderImportPath;\n }\n\n static fromRawConfig(raw: RawBuildPluginConfig): BuildPluginConfig {\n // Validate required fields\n if (!raw.applicationBuilderImportPath) {\n throw new Error(\n \"applicationBuilderImportPath is required in hexai.config.ts\\n\" +\n \"Example: { applicationBuilderImportPath: '@/application', ... }\"\n );\n }\n\n if (!raw.handlers || raw.handlers.length === 0) {\n throw new Error(\n \"handlers array is required and must not be empty in hexai.config.ts\"\n );\n }\n\n // Provide defaults\n return new BuildPluginConfig({\n handlers: raw.handlers,\n outputFile:\n raw.outputFile ?? \"src/.generated/application-builder.ts\",\n applicationBuilderImportPath: raw.applicationBuilderImportPath,\n });\n }\n}\n","import * as fs from \"fs\";\nimport * as ts from \"typescript\";\nimport { BuildPluginConfig, RawBuildPluginConfig } from \"./config\";\n\nexport async function loadConfig(configPath: string): Promise<BuildPluginConfig> {\n const configSource = fs.readFileSync(configPath, \"utf-8\");\n const transpiledCode = transpileConfigFile(configSource);\n const moduleExports = evaluateConfigModule(transpiledCode);\n const rawConfig = extractConfigFromModule(moduleExports);\n return BuildPluginConfig.fromRawConfig(rawConfig);\n}\n\nfunction transpileConfigFile(source: string): string {\n const result = ts.transpileModule(source, {\n compilerOptions: {\n module: ts.ModuleKind.CommonJS,\n target: ts.ScriptTarget.ES2020,\n },\n });\n return result.outputText;\n}\n\nfunction evaluateConfigModule(code: string): any {\n const tempModule = { exports: {} };\n const fn = new Function(\"module\", \"exports\", \"require\", code);\n fn(tempModule, tempModule.exports, require);\n return tempModule.exports;\n}\n\nfunction extractConfigFromModule(moduleExports: any): RawBuildPluginConfig {\n return moduleExports.default || moduleExports;\n}\n","import * as path from \"path\";\nimport { ApplicationBuilderGenerator } from \"./application-builder-generator\";\nimport { loadConfig } from \"./config-loader\";\n\n// Re-export types for external use\nexport type {\n HandlerMetadata,\n CommandHandlerMetadata,\n EventHandlerMetadata,\n} from \"./types\";\nexport { HandlerMetadataExtractor } from \"./metadata-extractor\";\n\nexport async function generateApplicationBuilder(\n contextPath: string,\n options: {\n configFile?: string;\n } = {}\n): Promise<void> {\n let configFile = \"hexai.config.ts\";\n if (options.configFile) {\n configFile = options.configFile;\n }\n\n const configPath = path.join(contextPath, configFile);\n const config = await loadConfig(configPath);\n\n const generator = new ApplicationBuilderGenerator(contextPath, config);\n await generator.generate();\n}\n","import type { MessageClass } from \"@hexaijs/core\";\n\nexport interface EventHandlerOptions {\n name?: string;\n}\n\n/**\n * Creates a marker decorator for message handlers (command/query)\n * These are purely markers for build-time code generation with no runtime behavior\n */\nfunction createMessageHandlerMarker() {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return function (messageClass: MessageClass) {\n return function <T extends { new (...args: any[]): any }>(target: T) {\n return target;\n };\n };\n}\n\n/**\n * Decorator to mark a class as a command handler\n * This is purely a marker for build-time code generation\n */\nexport const CommandHandlerMarker = createMessageHandlerMarker();\n\n/**\n * Decorator to mark a class as a query handler\n * This is purely a marker for build-time code generation\n */\nexport const QueryHandlerMarker = createMessageHandlerMarker();\n\n/**\n * Decorator to mark a class as an event handler\n * This is purely a marker for build-time code generation\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function EventHandlerMarker(options?: EventHandlerOptions) {\n return function <T extends { new (...args: any[]): any }>(target: T) {\n return target;\n };\n}\n","import type { HexaiCliPlugin, CliOption } from \"@hexaijs/cli\";\nimport * as path from \"path\";\nimport { generateApplicationBuilder } from \"./index\";\n\n/**\n * Configuration for the application-builder plugin.\n * Since this plugin uses per-context config files (hexai.config.ts),\n * the root hexai.config.ts config is minimal.\n */\nexport interface ApplicationBuilderPluginConfig {\n /**\n * Default config file name to look for in each context.\n * Defaults to \"hexai.config.ts\".\n */\n configFile?: string;\n}\n\n/**\n * CLI plugin definition for hexai integration.\n *\n * This allows the application builder to be invoked via `pnpm hexai generate-app-builder`.\n * Each bounded context should have its own `hexai.config.ts` file.\n *\n * @example\n * ```bash\n * # Generate for a specific context\n * pnpm hexai generate-app-builder --context-path packages/assignment\n *\n * # Use a custom config file name\n * pnpm hexai generate-app-builder --context-path packages/assignment --config-file custom.config.ts\n * ```\n */\nexport const cliPlugin: HexaiCliPlugin<ApplicationBuilderPluginConfig> = {\n name: \"generate-app-builder\",\n description: \"Generate ApplicationBuilder code from decorated handlers\",\n options: [\n {\n flags: \"-p, --context-path <path>\",\n description: \"Path to the bounded context directory\",\n required: true,\n },\n {\n flags: \"-f, --config-file <name>\",\n description: \"Config file name to use (default: hexai.config.ts)\",\n },\n ] satisfies CliOption[],\n run: async (\n args: Record<string, unknown>,\n config: ApplicationBuilderPluginConfig\n ): Promise<void> => {\n const contextPath = path.resolve(String(args.contextPath));\n\n // Priority: CLI arg > hexai.config.ts plugin config > default\n const configFile =\n args.configFile !== undefined\n ? String(args.configFile)\n : config.configFile;\n\n console.log(`Generating application builder for: ${contextPath}`);\n\n await generateApplicationBuilder(contextPath, {\n configFile,\n });\n\n console.log(\"✓ Application builder generated successfully\");\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EACH,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GAErB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACH,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAuC,MAAM,mBAAmB,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { HandlerMetadata, CommandHandlerMetadata, EventHandlerMetadata, } from "./types.js";
|
|
2
|
+
export { HandlerMetadataExtractor } from "./metadata-extractor.js";
|
|
3
|
+
export declare function generateApplicationBuilder(contextPath: string, options?: {
|
|
4
|
+
configFile?: string;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAKA,YAAY,EACR,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,wBAAsB,0BAA0B,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IACL,UAAU,CAAC,EAAE,MAAM,CAAC;CAClB,GACP,OAAO,CAAC,IAAI,CAAC,CAWf"}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { ApplicationBuilderGenerator } from "./application-builder-generator.js";
|
|
3
|
+
import { loadConfig } from "./config-loader.js";
|
|
4
|
+
export { HandlerMetadataExtractor } from "./metadata-extractor.js";
|
|
5
|
+
export async function generateApplicationBuilder(contextPath, options = {}) {
|
|
6
|
+
let configFile = "hexai.config.ts";
|
|
7
|
+
if (options.configFile) {
|
|
8
|
+
configFile = options.configFile;
|
|
9
|
+
}
|
|
10
|
+
const configPath = path.join(contextPath, configFile);
|
|
11
|
+
const config = await loadConfig(configPath);
|
|
12
|
+
const generator = new ApplicationBuilderGenerator(contextPath, config);
|
|
13
|
+
await generator.generate();
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC5C,WAAmB,EACnB,OAAO,GAEH,EAAE;IAEN,IAAI,UAAU,GAAG,iBAAiB,CAAC;IACnC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACpC,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAG,IAAI,2BAA2B,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACvE,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { HandlerMetadata } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Extracts handler metadata from TypeScript files using AST parsing
|
|
4
|
+
*/
|
|
5
|
+
export declare class HandlerMetadataExtractor {
|
|
6
|
+
private contextPath;
|
|
7
|
+
private outputFile;
|
|
8
|
+
private config;
|
|
9
|
+
constructor(contextPath: string, outputFile: string, config?: {
|
|
10
|
+
commandHandlerDecorator?: string;
|
|
11
|
+
eventHandlerDecorator?: string;
|
|
12
|
+
});
|
|
13
|
+
extractHandlersMetadata(files: string[]): HandlerMetadata[];
|
|
14
|
+
private extractFromClass;
|
|
15
|
+
private extractMessageHandlerMetadata;
|
|
16
|
+
private isClassDefinedInFile;
|
|
17
|
+
private extractCommandHandlerMetadata;
|
|
18
|
+
private extractEventHandlerMetadata;
|
|
19
|
+
private extractQueryHandlerMetadata;
|
|
20
|
+
private findImportForSymbol;
|
|
21
|
+
private toRelativeImport;
|
|
22
|
+
private parseObjectLiteral;
|
|
23
|
+
private resolvePathAlias;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=metadata-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-extractor.d.ts","sourceRoot":"","sources":["../src/metadata-extractor.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,eAAe,EAIlB,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,qBAAa,wBAAwB;IAU7B,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,UAAU;IAVtB,OAAO,CAAC,MAAM,CAMZ;IAEF,YACY,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAC1B,MAAM,GAAE;QACJ,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,qBAAqB,CAAC,EAAE,MAAM,CAAC;KAC7B,EAST;IAED,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CA2B1D;IAED,OAAO,CAAC,gBAAgB;IAkDxB,OAAO,CAAC,6BAA6B;IAqCrC,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,6BAA6B;IAsBrC,OAAO,CAAC,2BAA2B;IAmBnC,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,gBAAgB;CAqB3B"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as ts from "typescript";
|
|
4
|
+
import { MessageClassNotFoundError } from "./errors.js";
|
|
5
|
+
/**
|
|
6
|
+
* Extracts handler metadata from TypeScript files using AST parsing
|
|
7
|
+
*/
|
|
8
|
+
export class HandlerMetadataExtractor {
|
|
9
|
+
contextPath;
|
|
10
|
+
outputFile;
|
|
11
|
+
config = {
|
|
12
|
+
commandHandlerDecorator: "CommandHandlerMarker",
|
|
13
|
+
eventHandlerDecorator: "EventHandlerMarker",
|
|
14
|
+
};
|
|
15
|
+
constructor(contextPath, outputFile, config = {}) {
|
|
16
|
+
this.contextPath = contextPath;
|
|
17
|
+
this.outputFile = outputFile;
|
|
18
|
+
if (config.commandHandlerDecorator) {
|
|
19
|
+
this.config.commandHandlerDecorator =
|
|
20
|
+
config.commandHandlerDecorator;
|
|
21
|
+
}
|
|
22
|
+
if (config.eventHandlerDecorator) {
|
|
23
|
+
this.config.eventHandlerDecorator = config.eventHandlerDecorator;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
extractHandlersMetadata(files) {
|
|
27
|
+
const handlers = [];
|
|
28
|
+
for (const file of files) {
|
|
29
|
+
const sourceCode = fs.readFileSync(file, "utf-8");
|
|
30
|
+
const sourceFile = ts.createSourceFile(file, sourceCode, ts.ScriptTarget.Latest, true);
|
|
31
|
+
ts.forEachChild(sourceFile, (node) => {
|
|
32
|
+
if (ts.isClassDeclaration(node)) {
|
|
33
|
+
const metadata = this.extractFromClass(node, file, sourceFile);
|
|
34
|
+
if (metadata) {
|
|
35
|
+
handlers.push(metadata);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return handlers;
|
|
41
|
+
}
|
|
42
|
+
extractFromClass(classNode, filePath, sourceFile) {
|
|
43
|
+
const className = classNode.name?.text;
|
|
44
|
+
if (!className)
|
|
45
|
+
return null;
|
|
46
|
+
// Get decorators using TypeScript 5.0+ API
|
|
47
|
+
const decorators = ts.canHaveDecorators(classNode)
|
|
48
|
+
? ts.getDecorators(classNode)
|
|
49
|
+
: undefined;
|
|
50
|
+
if (!decorators)
|
|
51
|
+
return null;
|
|
52
|
+
for (const decorator of decorators) {
|
|
53
|
+
const expression = decorator.expression;
|
|
54
|
+
if (!ts.isCallExpression(expression))
|
|
55
|
+
continue;
|
|
56
|
+
const decoratorName = expression.expression.getText();
|
|
57
|
+
if (decoratorName === "CommandHandlerMarker") {
|
|
58
|
+
return this.extractCommandHandlerMetadata(className, expression, filePath, sourceFile);
|
|
59
|
+
}
|
|
60
|
+
if (decoratorName === "EventHandlerMarker") {
|
|
61
|
+
return this.extractEventHandlerMetadata(className, expression, filePath);
|
|
62
|
+
}
|
|
63
|
+
if (decoratorName === "QueryHandlerMarker") {
|
|
64
|
+
return this.extractQueryHandlerMetadata(className, expression, filePath, sourceFile);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
extractMessageHandlerMetadata(className, expression, filePath, sourceFile) {
|
|
70
|
+
const messageClassArg = expression.arguments[0];
|
|
71
|
+
const messageClassName = messageClassArg.getText();
|
|
72
|
+
const messageImport = this.findImportForSymbol(messageClassName, sourceFile);
|
|
73
|
+
let messagePath = "";
|
|
74
|
+
let resolvedMessageClassName = messageClassName;
|
|
75
|
+
if (messageImport) {
|
|
76
|
+
const handlerDir = path.dirname(filePath);
|
|
77
|
+
const resolvedImportPath = this.resolvePathAlias(messageImport.path);
|
|
78
|
+
const messageAbsolutePath = path.resolve(handlerDir, resolvedImportPath + ".ts");
|
|
79
|
+
messagePath = this.toRelativeImport(messageAbsolutePath);
|
|
80
|
+
resolvedMessageClassName = messageImport.symbol;
|
|
81
|
+
}
|
|
82
|
+
else if (this.isClassDefinedInFile(messageClassName, sourceFile)) {
|
|
83
|
+
messagePath = this.toRelativeImport(filePath);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
throw new MessageClassNotFoundError(messageClassName, filePath);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
messagePath,
|
|
90
|
+
messageClassName: resolvedMessageClassName,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
isClassDefinedInFile(className, sourceFile) {
|
|
94
|
+
for (const statement of sourceFile.statements) {
|
|
95
|
+
if (ts.isClassDeclaration(statement) &&
|
|
96
|
+
statement.name?.text === className) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
extractCommandHandlerMetadata(className, expression, filePath, sourceFile) {
|
|
103
|
+
const { messagePath, messageClassName } = this.extractMessageHandlerMetadata(className, expression, filePath, sourceFile);
|
|
104
|
+
return {
|
|
105
|
+
type: "command",
|
|
106
|
+
handlerPath: this.toRelativeImport(filePath),
|
|
107
|
+
handlerClassName: className,
|
|
108
|
+
commandPath: messagePath,
|
|
109
|
+
commandClassName: messageClassName,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
extractEventHandlerMetadata(className, expression, filePath) {
|
|
113
|
+
let options = {};
|
|
114
|
+
if (expression.arguments.length > 0) {
|
|
115
|
+
const optionsArg = expression.arguments[0];
|
|
116
|
+
options = this.parseObjectLiteral(optionsArg);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
type: "event",
|
|
120
|
+
handlerPath: this.toRelativeImport(filePath),
|
|
121
|
+
handlerClassName: className,
|
|
122
|
+
eventHandlerOptions: options,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
extractQueryHandlerMetadata(className, expression, filePath, sourceFile) {
|
|
126
|
+
const { messagePath, messageClassName } = this.extractMessageHandlerMetadata(className, expression, filePath, sourceFile);
|
|
127
|
+
return {
|
|
128
|
+
type: "query",
|
|
129
|
+
handlerPath: this.toRelativeImport(filePath),
|
|
130
|
+
handlerClassName: className,
|
|
131
|
+
queryPath: messagePath,
|
|
132
|
+
queryClassName: messageClassName,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
findImportForSymbol(symbol, sourceFile) {
|
|
136
|
+
for (const statement of sourceFile.statements) {
|
|
137
|
+
if (ts.isImportDeclaration(statement)) {
|
|
138
|
+
const importClause = statement.importClause;
|
|
139
|
+
const moduleSpecifier = statement.moduleSpecifier.text;
|
|
140
|
+
if (importClause?.namedBindings &&
|
|
141
|
+
ts.isNamedImports(importClause.namedBindings)) {
|
|
142
|
+
for (const element of importClause.namedBindings.elements) {
|
|
143
|
+
if (element.name.text === symbol) {
|
|
144
|
+
return {
|
|
145
|
+
path: moduleSpecifier,
|
|
146
|
+
symbol: element.name.text,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
toRelativeImport(absolutePath) {
|
|
156
|
+
const outputFileAbsolutePath = path.join(this.contextPath, this.outputFile);
|
|
157
|
+
const outputDir = path.dirname(outputFileAbsolutePath);
|
|
158
|
+
const relative = path.relative(outputDir, absolutePath);
|
|
159
|
+
const withoutExtension = relative.replace(/\.ts$/, "");
|
|
160
|
+
// Ensure relative path has proper prefix
|
|
161
|
+
return withoutExtension.startsWith(".")
|
|
162
|
+
? withoutExtension
|
|
163
|
+
: "./" + withoutExtension;
|
|
164
|
+
}
|
|
165
|
+
parseObjectLiteral(node) {
|
|
166
|
+
if (!ts.isObjectLiteralExpression(node)) {
|
|
167
|
+
return {};
|
|
168
|
+
}
|
|
169
|
+
const result = {};
|
|
170
|
+
for (const property of node.properties) {
|
|
171
|
+
if (ts.isPropertyAssignment(property)) {
|
|
172
|
+
const name = property.name.getText();
|
|
173
|
+
const value = property.initializer;
|
|
174
|
+
if (ts.isStringLiteral(value)) {
|
|
175
|
+
result[name] = value.text;
|
|
176
|
+
}
|
|
177
|
+
else if (ts.isNumericLiteral(value)) {
|
|
178
|
+
result[name] = Number(value.text);
|
|
179
|
+
}
|
|
180
|
+
else if (value.kind === ts.SyntaxKind.TrueKeyword) {
|
|
181
|
+
result[name] = true;
|
|
182
|
+
}
|
|
183
|
+
else if (value.kind === ts.SyntaxKind.FalseKeyword) {
|
|
184
|
+
result[name] = false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
resolvePathAlias(importPath) {
|
|
191
|
+
const tsconfigPath = path.join(this.contextPath, "tsconfig.json");
|
|
192
|
+
if (!fs.existsSync(tsconfigPath))
|
|
193
|
+
return importPath;
|
|
194
|
+
const tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, "utf-8"));
|
|
195
|
+
const paths = tsconfig.compilerOptions?.paths;
|
|
196
|
+
const baseUrl = tsconfig.compilerOptions?.baseUrl || ".";
|
|
197
|
+
if (!paths)
|
|
198
|
+
return importPath;
|
|
199
|
+
for (const [alias, targets] of Object.entries(paths)) {
|
|
200
|
+
const aliasPrefix = alias.replace("/*", "");
|
|
201
|
+
if (importPath.startsWith(aliasPrefix)) {
|
|
202
|
+
const targetBase = targets[0].replace("/*", "");
|
|
203
|
+
const resolvedBase = path.join(this.contextPath, baseUrl, targetBase);
|
|
204
|
+
return importPath.replace(aliasPrefix, resolvedBase);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return importPath;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=metadata-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-extractor.js","sourceRoot":"","sources":["../src/metadata-extractor.ts"],"names":[],"mappings":"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"}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface TestContext {
|
|
2
|
+
readonly path: string;
|
|
3
|
+
readonly outputDir: string;
|
|
4
|
+
readonly outputFile: string;
|
|
5
|
+
generate(): Promise<void>;
|
|
6
|
+
cleanUp(): void;
|
|
7
|
+
isOutputFilePresent(): boolean;
|
|
8
|
+
expectOutputFileToExist(): void;
|
|
9
|
+
expectOutputFileToContain(...strings: string[]): void;
|
|
10
|
+
expectOutputFileNotToContain(...strings: string[]): void;
|
|
11
|
+
getOutputFileContent(): string;
|
|
12
|
+
}
|
|
13
|
+
export declare function makeContext(name: string): TestContext;
|
|
14
|
+
export declare function useContext(name: string): TestContext;
|
|
15
|
+
//# sourceMappingURL=test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,IAAI,CAAC;IAChB,mBAAmB,IAAI,OAAO,CAAC;IAC/B,uBAAuB,IAAI,IAAI,CAAC;IAChC,yBAAyB,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtD,4BAA4B,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACzD,oBAAoB,IAAI,MAAM,CAAC;CAClC;AAcD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CA2CrD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAYpD"}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import { beforeEach, expect } from "vitest";
|
|
4
|
+
import { generateApplicationBuilder } from "./main.js";
|
|
5
|
+
const FIXTURES_DIR = path.join(__dirname, "fixtures");
|
|
6
|
+
const GENERATED_DIR = "src/.generated";
|
|
7
|
+
const OUTPUT_FILENAME = "application-builder.ts";
|
|
8
|
+
const DEFAULT_CONFIG_FILE = "hexai.config.ts";
|
|
9
|
+
function getContextPath(contextName) {
|
|
10
|
+
return path.join(FIXTURES_DIR, contextName);
|
|
11
|
+
}
|
|
12
|
+
function getOutputDir(contextPath) {
|
|
13
|
+
return path.join(contextPath, GENERATED_DIR);
|
|
14
|
+
}
|
|
15
|
+
function getOutputFile(contextPath) {
|
|
16
|
+
return path.join(getOutputDir(contextPath), OUTPUT_FILENAME);
|
|
17
|
+
}
|
|
18
|
+
export function makeContext(name) {
|
|
19
|
+
return {
|
|
20
|
+
path: getContextPath(name),
|
|
21
|
+
outputDir: getOutputDir(getContextPath(name)),
|
|
22
|
+
outputFile: getOutputFile(getContextPath(name)),
|
|
23
|
+
generate() {
|
|
24
|
+
return generateApplicationBuilder(this.path, {
|
|
25
|
+
configFile: DEFAULT_CONFIG_FILE,
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
cleanUp() {
|
|
29
|
+
if (fs.existsSync(this.outputFile)) {
|
|
30
|
+
fs.unlinkSync(this.outputFile);
|
|
31
|
+
}
|
|
32
|
+
if (fs.existsSync(this.outputDir)) {
|
|
33
|
+
fs.rmdirSync(this.outputDir);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
isOutputFilePresent() {
|
|
37
|
+
return fs.existsSync(this.outputFile);
|
|
38
|
+
},
|
|
39
|
+
expectOutputFileToExist() {
|
|
40
|
+
expect(this.isOutputFilePresent(), `Output file ${this.outputFile} does not exist`).toBe(true);
|
|
41
|
+
},
|
|
42
|
+
expectOutputFileToContain(...strings) {
|
|
43
|
+
this.expectOutputFileToExist();
|
|
44
|
+
const content = this.getOutputFileContent();
|
|
45
|
+
strings.forEach((s) => expect(content).toContain(s));
|
|
46
|
+
},
|
|
47
|
+
expectOutputFileNotToContain(...strings) {
|
|
48
|
+
this.expectOutputFileToExist();
|
|
49
|
+
const content = this.getOutputFileContent();
|
|
50
|
+
strings.forEach((s) => expect(content).not.toContain(s));
|
|
51
|
+
},
|
|
52
|
+
getOutputFileContent() {
|
|
53
|
+
return fs.readFileSync(this.outputFile, "utf-8");
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function useContext(name) {
|
|
58
|
+
const context = makeContext(name);
|
|
59
|
+
beforeEach(() => {
|
|
60
|
+
context.cleanUp();
|
|
61
|
+
return () => {
|
|
62
|
+
context.cleanUp();
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
return context;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface HandlerMetadataBase {
|
|
2
|
+
type: string;
|
|
3
|
+
handlerPath: string;
|
|
4
|
+
handlerClassName: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CommandHandlerMetadata extends HandlerMetadataBase {
|
|
7
|
+
type: "command";
|
|
8
|
+
commandPath: string;
|
|
9
|
+
commandClassName: string;
|
|
10
|
+
}
|
|
11
|
+
export interface EventHandlerMetadata extends HandlerMetadataBase {
|
|
12
|
+
type: "event";
|
|
13
|
+
eventHandlerOptions: Record<string, any>;
|
|
14
|
+
}
|
|
15
|
+
export interface QueryHandlerMetadata extends HandlerMetadataBase {
|
|
16
|
+
type: "query";
|
|
17
|
+
queryPath: string;
|
|
18
|
+
queryClassName: string;
|
|
19
|
+
}
|
|
20
|
+
export type HandlerMetadata = CommandHandlerMetadata | EventHandlerMetadata | QueryHandlerMetadata;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,UAAU,mBAAmB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IAC/D,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC7D,IAAI,EAAE,OAAO,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC7D,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,eAAe,GAAG,sBAAsB,GAAG,oBAAoB,GAAG,oBAAoB,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.2.
|
|
6
|
+
"version": "0.2.4",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"description": "Build plugin for generating ApplicationBuilder code from decorated handlers",
|
|
9
9
|
"license": "MIT",
|
|
@@ -53,20 +53,21 @@
|
|
|
53
53
|
"glob": "^10.0.0"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@hexaijs/core": "^0.
|
|
56
|
+
"@hexaijs/core": "^0.9.0",
|
|
57
57
|
"@hexaijs/application": "^0.5.0",
|
|
58
58
|
"@hexaijs/cli": "^0.2.0",
|
|
59
59
|
"typescript": "^5.0.0"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
+
"@typescript/native-preview": "^7.0.0-dev",
|
|
62
63
|
"@types/node": "^20.0.0",
|
|
63
|
-
"@hexaijs/
|
|
64
|
-
"@hexaijs/
|
|
64
|
+
"@hexaijs/core": "^0.9.1",
|
|
65
|
+
"@hexaijs/application": "^0.5.3",
|
|
65
66
|
"@hexaijs/tooling": "0.1.0",
|
|
66
|
-
"@hexaijs/
|
|
67
|
+
"@hexaijs/cli": "^0.2.2"
|
|
67
68
|
},
|
|
68
69
|
"scripts": {
|
|
69
70
|
"test": "vitest run",
|
|
70
|
-
"build": "
|
|
71
|
+
"build": "tsgo -p tsconfig.build.json"
|
|
71
72
|
}
|
|
72
73
|
}
|