Skip to content

Commit 89b43f4

Browse files
committed
feat: add FrontendCodeHandler and integrate it into the build sequence test
1 parent 5338103 commit 89b43f4

File tree

3 files changed

+18
-109
lines changed

3 files changed

+18
-109
lines changed

backend/src/build-system/__tests__/fullstack-gen.spec.ts

+5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { BackendCodeHandler } from '../handlers/backend/code-generate';
1414
import { BackendFileReviewHandler } from '../handlers/backend/file-review/file-review';
1515
import { UXDMDHandler } from '../handlers/ux/datamap';
1616
import { BuilderContext } from '../context';
17+
import { FrontendCodeHandler } from '../handlers/frontend-code-generate';
1718

1819
(isIntegrationTest ? describe : describe.skip)('Build Sequence Test', () => {
1920
it('should execute build sequence successfully', async () => {
@@ -86,6 +87,10 @@ import { BuilderContext } from '../context';
8687
handler: BackendFileReviewHandler,
8788
name: 'Backend File Review Node',
8889
},
90+
{
91+
handler: FrontendCodeHandler,
92+
name: 'Frontend Code Generator Node',
93+
},
8994
],
9095
};
9196
const context = new BuilderContext(sequence, 'fullstack-code-gen');
+6-109
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Logger } from '@nestjs/common';
22
import * as fs from 'fs';
33
import * as path from 'path';
4-
import { BuildSequence, BuildHandlerConstructor } from '../types';
4+
import { BuildSequence } from '../types';
55
import { BuilderContext } from '../context';
66
import { BuildMonitor } from '../monitor';
77

@@ -89,113 +89,10 @@ export async function executeBuildSequence(
8989
const context = new BuilderContext(sequence, 'test-env');
9090
const monitor = BuildMonitor.getInstance();
9191

92-
try {
93-
console.time('Total Execution Time');
94-
await context.execute();
95-
console.timeEnd('Total Execution Time');
96-
97-
const monitorReport = monitor.generateTextReport(sequence.id);
98-
fs.writeFileSync(
99-
path.join(logFolderPath, 'execution-metrics.txt'),
100-
monitorReport,
101-
'utf8',
102-
);
103-
104-
const sequenceMetrics = monitor.getSequenceMetrics(sequence.id);
105-
if (sequenceMetrics) {
106-
const metricsJson = {
107-
totalDuration: `${sequenceMetrics.duration}ms`,
108-
successRate: `${sequenceMetrics.successRate.toFixed(2)}%`,
109-
totalNodes: sequenceMetrics.totalNodes,
110-
completedNodes: sequenceMetrics.completedNodes,
111-
failedNodes: sequenceMetrics.failedNodes,
112-
startTime: new Date(sequenceMetrics.startTime).toISOString(),
113-
endTime: new Date(sequenceMetrics.endTime).toISOString(),
114-
};
115-
116-
fs.writeFileSync(
117-
path.join(logFolderPath, 'metrics.json'),
118-
JSON.stringify(metricsJson, null, 2),
119-
'utf8',
120-
);
121-
122-
Logger.log('\nSequence Metrics:');
123-
console.table(metricsJson);
124-
}
125-
126-
// Log node results
127-
for (const node of sequence.nodes) {
128-
const handlerClass = node.handler as BuildHandlerConstructor;
129-
const resultData = context.getNodeData(handlerClass);
130-
const nodeMetrics = sequenceMetrics?.nodeMetrics.get(handlerClass.name);
131-
132-
if (resultData) {
133-
const content =
134-
typeof resultData === 'object'
135-
? objectToMarkdown(resultData)
136-
: resultData;
137-
writeToFile(logFolderPath, node.name || handlerClass.name, content);
138-
} else {
139-
Logger.error(
140-
`Error: Handler ${node.name || handlerClass.name} failed to produce result data`,
141-
);
142-
writeToFile(
143-
logFolderPath,
144-
`${node.name || handlerClass.name}-error`,
145-
objectToMarkdown({
146-
error: 'No result data',
147-
metrics: nodeMetrics,
148-
}),
149-
);
150-
}
151-
}
152-
153-
const summary = {
154-
timestamp: new Date().toISOString(),
155-
sequenceId: sequence.id,
156-
sequenceName: sequence.name,
157-
totalExecutionTime: `${sequenceMetrics?.duration}ms`,
158-
successRate: `${sequenceMetrics?.successRate.toFixed(2)}%`,
159-
totalNodes: sequenceMetrics?.totalNodes,
160-
completedNodes: sequenceMetrics?.completedNodes,
161-
logFolder: logFolderPath,
162-
};
163-
164-
fs.writeFileSync(
165-
path.join(logFolderPath, 'execution-summary.json'),
166-
JSON.stringify(summary, null, 2),
167-
'utf8',
168-
);
169-
170-
return {
171-
success: true,
172-
logFolderPath,
173-
metrics: sequenceMetrics,
174-
};
175-
} catch (error) {
176-
const errorReport = {
177-
error: {
178-
message: error.message,
179-
stack: error.stack,
180-
},
181-
metrics: monitor.getSequenceMetrics(sequence.id),
182-
timestamp: new Date().toISOString(),
183-
};
184-
185-
fs.writeFileSync(
186-
path.join(logFolderPath, 'error-with-metrics.json'),
187-
JSON.stringify(errorReport, null, 2),
188-
'utf8',
189-
);
92+
await context.execute();
19093

191-
Logger.error('\nError during sequence execution:');
192-
Logger.error(error);
193-
194-
return {
195-
success: false,
196-
logFolderPath,
197-
error: error as Error,
198-
metrics: monitor.getSequenceMetrics(sequence.id),
199-
};
200-
}
94+
return {
95+
success: true,
96+
logFolderPath: '',
97+
};
20198
}

backend/src/build-system/handlers/frontend-code-generate/index.ts

+7
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ import { MessageInterface } from 'src/common/model-provider/types';
3030
BackendRequirementHandler,
3131
FileFAHandler,
3232
])
33+
@BuildNode()
34+
@BuildNodeRequire([
35+
UXSMSHandler,
36+
UXDMDHandler,
37+
BackendRequirementHandler,
38+
FileFAHandler,
39+
])
3340
export class FrontendCodeHandler implements BuildHandler<string> {
3441
readonly logger: Logger = new Logger('FrontendCodeHandler');
3542
private virtualDir: VirtualDirectory;

0 commit comments

Comments
 (0)