@auto-engineer/component-implementor-react 1.95.0
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/.turbo/turbo-build.log +5 -0
- package/.turbo/turbo-test.log +14 -0
- package/.turbo/turbo-type-check.log +4 -0
- package/CHANGELOG.md +109 -0
- package/LICENSE +10 -0
- package/dist/src/commands/implement-component.d.ts +45 -0
- package/dist/src/commands/implement-component.d.ts.map +1 -0
- package/dist/src/commands/implement-component.js +124 -0
- package/dist/src/commands/implement-component.js.map +1 -0
- package/dist/src/commands/implement-component.test.d.ts +2 -0
- package/dist/src/commands/implement-component.test.d.ts.map +1 -0
- package/dist/src/commands/implement-component.test.js +130 -0
- package/dist/src/commands/implement-component.test.js.map +1 -0
- package/dist/src/extract-code-block.d.ts +2 -0
- package/dist/src/extract-code-block.d.ts.map +1 -0
- package/dist/src/extract-code-block.js +7 -0
- package/dist/src/extract-code-block.js.map +1 -0
- package/dist/src/extract-code-block.test.d.ts +2 -0
- package/dist/src/extract-code-block.test.d.ts.map +1 -0
- package/dist/src/extract-code-block.test.js +28 -0
- package/dist/src/extract-code-block.test.js.map +1 -0
- package/dist/src/generate-component.d.ts +15 -0
- package/dist/src/generate-component.d.ts.map +1 -0
- package/dist/src/generate-component.js +39 -0
- package/dist/src/generate-component.js.map +1 -0
- package/dist/src/generate-component.test.d.ts +2 -0
- package/dist/src/generate-component.test.d.ts.map +1 -0
- package/dist/src/generate-component.test.js +77 -0
- package/dist/src/generate-component.test.js.map +1 -0
- package/dist/src/generate-story.d.ts +14 -0
- package/dist/src/generate-story.d.ts.map +1 -0
- package/dist/src/generate-story.js +35 -0
- package/dist/src/generate-story.js.map +1 -0
- package/dist/src/generate-story.test.d.ts +2 -0
- package/dist/src/generate-story.test.d.ts.map +1 -0
- package/dist/src/generate-story.test.js +62 -0
- package/dist/src/generate-story.test.js.map +1 -0
- package/dist/src/generate-test.d.ts +14 -0
- package/dist/src/generate-test.d.ts.map +1 -0
- package/dist/src/generate-test.js +38 -0
- package/dist/src/generate-test.js.map +1 -0
- package/dist/src/generate-test.test.d.ts +2 -0
- package/dist/src/generate-test.test.d.ts.map +1 -0
- package/dist/src/generate-test.test.js +66 -0
- package/dist/src/generate-test.test.js.map +1 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/ketchup-plan.md +13 -0
- package/package.json +25 -0
- package/src/commands/implement-component.test.ts +151 -0
- package/src/commands/implement-component.ts +190 -0
- package/src/extract-code-block.test.ts +33 -0
- package/src/extract-code-block.ts +6 -0
- package/src/generate-component.test.ts +93 -0
- package/src/generate-component.ts +57 -0
- package/src/generate-story.test.ts +75 -0
- package/src/generate-story.ts +51 -0
- package/src/generate-test.test.ts +78 -0
- package/src/generate-test.ts +55 -0
- package/src/index.ts +11 -0
- package/tsconfig.json +10 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { generateComponentFile } from './generate-component.js';
|
|
3
|
+
vi.mock('ai', () => ({
|
|
4
|
+
generateText: vi.fn(),
|
|
5
|
+
}));
|
|
6
|
+
vi.mock('@auto-engineer/model-factory', () => ({
|
|
7
|
+
createModelFromEnv: vi.fn(() => 'mock-model'),
|
|
8
|
+
}));
|
|
9
|
+
import { generateText } from 'ai';
|
|
10
|
+
const specDeltas = {
|
|
11
|
+
structure: ['renders a Button element'],
|
|
12
|
+
rendering: ['shows loading spinner when loading=true'],
|
|
13
|
+
interaction: ['calls onClick when clicked'],
|
|
14
|
+
styling: ['applies primary variant by default'],
|
|
15
|
+
};
|
|
16
|
+
describe('generateComponentFile', () => {
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
vi.clearAllMocks();
|
|
19
|
+
});
|
|
20
|
+
it('returns generated component code from AI', async () => {
|
|
21
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
22
|
+
mockGenerateText.mockResolvedValue({
|
|
23
|
+
text: '```tsx\nexport function Button() { return <button />; }\n```',
|
|
24
|
+
});
|
|
25
|
+
const result = await generateComponentFile({
|
|
26
|
+
componentName: 'Button',
|
|
27
|
+
specDeltas,
|
|
28
|
+
testCode: 'import { render } from "@testing-library/react";',
|
|
29
|
+
});
|
|
30
|
+
expect(result).toBe('export function Button() { return <button />; }');
|
|
31
|
+
});
|
|
32
|
+
it('includes spec deltas and test code in the prompt', async () => {
|
|
33
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
34
|
+
mockGenerateText.mockResolvedValue({
|
|
35
|
+
text: 'component code',
|
|
36
|
+
});
|
|
37
|
+
await generateComponentFile({
|
|
38
|
+
componentName: 'Button',
|
|
39
|
+
specDeltas,
|
|
40
|
+
testCode: 'describe("Button", () => {})',
|
|
41
|
+
});
|
|
42
|
+
const prompt = mockGenerateText.mock.calls[0][0].prompt;
|
|
43
|
+
expect(prompt).toContain('## Structure');
|
|
44
|
+
expect(prompt).toContain('renders a Button element');
|
|
45
|
+
expect(prompt).toContain('## Test File');
|
|
46
|
+
expect(prompt).toContain('describe("Button", () => {})');
|
|
47
|
+
});
|
|
48
|
+
it('includes existing component code when provided', async () => {
|
|
49
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
50
|
+
mockGenerateText.mockResolvedValue({
|
|
51
|
+
text: 'updated code',
|
|
52
|
+
});
|
|
53
|
+
await generateComponentFile({
|
|
54
|
+
componentName: 'Button',
|
|
55
|
+
specDeltas,
|
|
56
|
+
testCode: 'test code',
|
|
57
|
+
existingComponent: 'export function Button() {}',
|
|
58
|
+
});
|
|
59
|
+
const prompt = mockGenerateText.mock.calls[0][0].prompt;
|
|
60
|
+
expect(prompt).toContain('## Existing Component');
|
|
61
|
+
expect(prompt).toContain('export function Button() {}');
|
|
62
|
+
});
|
|
63
|
+
it('uses system prompt referencing React component generation', async () => {
|
|
64
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
65
|
+
mockGenerateText.mockResolvedValue({
|
|
66
|
+
text: 'code',
|
|
67
|
+
});
|
|
68
|
+
await generateComponentFile({
|
|
69
|
+
componentName: 'Button',
|
|
70
|
+
specDeltas,
|
|
71
|
+
testCode: 'test',
|
|
72
|
+
});
|
|
73
|
+
const system = mockGenerateText.mock.calls[0][0].system;
|
|
74
|
+
expect(system).toContain('React');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=generate-component.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-component.test.js","sourceRoot":"","sources":["../../src/generate-component.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type SpecDeltas = {
|
|
2
|
+
structure: string[];
|
|
3
|
+
rendering: string[];
|
|
4
|
+
interaction: string[];
|
|
5
|
+
styling: string[];
|
|
6
|
+
};
|
|
7
|
+
type GenerateStoryInput = {
|
|
8
|
+
componentName: string;
|
|
9
|
+
specDeltas: SpecDeltas;
|
|
10
|
+
componentCode: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function generateStoryFile(input: GenerateStoryInput): Promise<string>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=generate-story.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-story.d.ts","sourceRoot":"","sources":["../../src/generate-story.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AA4BF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createModelFromEnv } from '@auto-engineer/model-factory';
|
|
2
|
+
import { generateText } from 'ai';
|
|
3
|
+
import { extractCodeBlock } from './extract-code-block.js';
|
|
4
|
+
function buildSpecSection(heading, items) {
|
|
5
|
+
if (items.length === 0)
|
|
6
|
+
return '';
|
|
7
|
+
return `## ${heading}\n${items.map((i) => `- ${i}`).join('\n')}`;
|
|
8
|
+
}
|
|
9
|
+
function buildPrompt(input) {
|
|
10
|
+
const sections = [
|
|
11
|
+
buildSpecSection('Structure', input.specDeltas.structure),
|
|
12
|
+
buildSpecSection('Rendering', input.specDeltas.rendering),
|
|
13
|
+
buildSpecSection('Interaction', input.specDeltas.interaction),
|
|
14
|
+
buildSpecSection('Styling', input.specDeltas.styling),
|
|
15
|
+
]
|
|
16
|
+
.filter(Boolean)
|
|
17
|
+
.join('\n\n');
|
|
18
|
+
return `Component: ${input.componentName}\n\n${sections}\n\n## Component Code\n\`\`\`tsx\n${input.componentCode}\n\`\`\``;
|
|
19
|
+
}
|
|
20
|
+
const SYSTEM_PROMPT = `You are a Storybook expert. Write a Storybook story file (.stories.tsx) for the described React component.
|
|
21
|
+
|
|
22
|
+
Rules:
|
|
23
|
+
- Use CSF3 format (export default meta, named story exports)
|
|
24
|
+
- Import Meta and StoryObj from @storybook/react
|
|
25
|
+
- Create stories that showcase different states from the spec
|
|
26
|
+
- Return ONLY the story file code, no commentary`;
|
|
27
|
+
export async function generateStoryFile(input) {
|
|
28
|
+
const { text } = await generateText({
|
|
29
|
+
model: createModelFromEnv(),
|
|
30
|
+
system: SYSTEM_PROMPT,
|
|
31
|
+
prompt: buildPrompt(input),
|
|
32
|
+
});
|
|
33
|
+
return extractCodeBlock(text);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=generate-story.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-story.js","sourceRoot":"","sources":["../../src/generate-story.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAexD,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAe;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,MAAM,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB;IAC5C,MAAM,QAAQ,GAAG;QACf,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QACzD,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QACzD,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;QAC7D,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;KACtD;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,OAAO,cAAc,KAAK,CAAC,aAAa,OAAO,QAAQ,qCAAqC,KAAK,CAAC,aAAa,UAAU,CAAC;AAC5H,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;iDAM2B,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAyB;IAC/D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,kBAAkB,EAAE;QAC3B,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-story.test.d.ts","sourceRoot":"","sources":["../../src/generate-story.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { generateStoryFile } from './generate-story.js';
|
|
3
|
+
vi.mock('ai', () => ({
|
|
4
|
+
generateText: vi.fn(),
|
|
5
|
+
}));
|
|
6
|
+
vi.mock('@auto-engineer/model-factory', () => ({
|
|
7
|
+
createModelFromEnv: vi.fn(() => 'mock-model'),
|
|
8
|
+
}));
|
|
9
|
+
import { generateText } from 'ai';
|
|
10
|
+
const specDeltas = {
|
|
11
|
+
structure: ['renders a Button element'],
|
|
12
|
+
rendering: ['shows loading spinner when loading=true'],
|
|
13
|
+
interaction: ['calls onClick when clicked'],
|
|
14
|
+
styling: ['applies primary variant by default'],
|
|
15
|
+
};
|
|
16
|
+
describe('generateStoryFile', () => {
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
vi.clearAllMocks();
|
|
19
|
+
});
|
|
20
|
+
it('returns generated story code from AI', async () => {
|
|
21
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
22
|
+
mockGenerateText.mockResolvedValue({
|
|
23
|
+
text: '```tsx\nimport type { Meta } from "@storybook/react";\n```',
|
|
24
|
+
});
|
|
25
|
+
const result = await generateStoryFile({
|
|
26
|
+
componentName: 'Button',
|
|
27
|
+
specDeltas,
|
|
28
|
+
componentCode: 'export function Button() { return <button />; }',
|
|
29
|
+
});
|
|
30
|
+
expect(result).toBe('import type { Meta } from "@storybook/react";');
|
|
31
|
+
});
|
|
32
|
+
it('includes spec deltas and component code in the prompt', async () => {
|
|
33
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
34
|
+
mockGenerateText.mockResolvedValue({
|
|
35
|
+
text: 'story code',
|
|
36
|
+
});
|
|
37
|
+
await generateStoryFile({
|
|
38
|
+
componentName: 'Button',
|
|
39
|
+
specDeltas,
|
|
40
|
+
componentCode: 'export function Button() {}',
|
|
41
|
+
});
|
|
42
|
+
const prompt = mockGenerateText.mock.calls[0][0].prompt;
|
|
43
|
+
expect(prompt).toContain('## Structure');
|
|
44
|
+
expect(prompt).toContain('renders a Button element');
|
|
45
|
+
expect(prompt).toContain('## Component Code');
|
|
46
|
+
expect(prompt).toContain('export function Button() {}');
|
|
47
|
+
});
|
|
48
|
+
it('uses system prompt referencing Storybook', async () => {
|
|
49
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
50
|
+
mockGenerateText.mockResolvedValue({
|
|
51
|
+
text: 'code',
|
|
52
|
+
});
|
|
53
|
+
await generateStoryFile({
|
|
54
|
+
componentName: 'Button',
|
|
55
|
+
specDeltas,
|
|
56
|
+
componentCode: 'code',
|
|
57
|
+
});
|
|
58
|
+
const system = mockGenerateText.mock.calls[0][0].system;
|
|
59
|
+
expect(system).toContain('Storybook');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=generate-story.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-story.test.js","sourceRoot":"","sources":["../../src/generate-story.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;CAC9C,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,MAAM,UAAU,GAAG;IACjB,SAAS,EAAE,CAAC,0BAA0B,CAAC;IACvC,SAAS,EAAE,CAAC,yCAAyC,CAAC;IACtD,WAAW,EAAE,CAAC,4BAA4B,CAAC;IAC3C,OAAO,EAAE,CAAC,oCAAoC,CAAC;CAChD,CAAC;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,gBAAgB,CAAC,iBAAiB,CAAC;YACjC,IAAI,EAAE,4DAA4D;SACvB,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;YACrC,aAAa,EAAE,QAAQ;YACvB,UAAU;YACV,aAAa,EAAE,iDAAiD;SACjE,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,gBAAgB,CAAC,iBAAiB,CAAC;YACjC,IAAI,EAAE,YAAY;SACyB,CAAC,CAAC;QAE/C,MAAM,iBAAiB,CAAC;YACtB,aAAa,EAAE,QAAQ;YACvB,UAAU;YACV,aAAa,EAAE,6BAA6B;SAC7C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAgB,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,gBAAgB,CAAC,iBAAiB,CAAC;YACjC,IAAI,EAAE,MAAM;SAC+B,CAAC,CAAC;QAE/C,MAAM,iBAAiB,CAAC;YACtB,aAAa,EAAE,QAAQ;YACvB,UAAU;YACV,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAgB,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type SpecDeltas = {
|
|
2
|
+
structure: string[];
|
|
3
|
+
rendering: string[];
|
|
4
|
+
interaction: string[];
|
|
5
|
+
styling: string[];
|
|
6
|
+
};
|
|
7
|
+
type GenerateTestInput = {
|
|
8
|
+
componentName: string;
|
|
9
|
+
specDeltas: SpecDeltas;
|
|
10
|
+
existingComponent?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function generateTestFile(input: GenerateTestInput): Promise<string>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=generate-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-test.d.ts","sourceRoot":"","sources":["../../src/generate-test.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAgCF,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createModelFromEnv } from '@auto-engineer/model-factory';
|
|
2
|
+
import { generateText } from 'ai';
|
|
3
|
+
import { extractCodeBlock } from './extract-code-block.js';
|
|
4
|
+
function buildSpecSection(heading, items) {
|
|
5
|
+
if (items.length === 0)
|
|
6
|
+
return '';
|
|
7
|
+
return `## ${heading}\n${items.map((i) => `- ${i}`).join('\n')}`;
|
|
8
|
+
}
|
|
9
|
+
function buildPrompt(input) {
|
|
10
|
+
const sections = [
|
|
11
|
+
buildSpecSection('Structure', input.specDeltas.structure),
|
|
12
|
+
buildSpecSection('Rendering', input.specDeltas.rendering),
|
|
13
|
+
buildSpecSection('Interaction', input.specDeltas.interaction),
|
|
14
|
+
buildSpecSection('Styling', input.specDeltas.styling),
|
|
15
|
+
]
|
|
16
|
+
.filter(Boolean)
|
|
17
|
+
.join('\n\n');
|
|
18
|
+
const existingContext = input.existingComponent
|
|
19
|
+
? `\n\n## Existing Component\n\`\`\`tsx\n${input.existingComponent}\n\`\`\``
|
|
20
|
+
: '';
|
|
21
|
+
return `Component: ${input.componentName}\n\n${sections}${existingContext}`;
|
|
22
|
+
}
|
|
23
|
+
const SYSTEM_PROMPT = `You are a React testing expert. Write a vitest test file for the described component using @testing-library/react.
|
|
24
|
+
|
|
25
|
+
Rules:
|
|
26
|
+
- Import from vitest (describe, it, expect) and @testing-library/react (render, screen, fireEvent)
|
|
27
|
+
- Use describe/it blocks
|
|
28
|
+
- Test each specified behavior
|
|
29
|
+
- Return ONLY the test file code, no commentary`;
|
|
30
|
+
export async function generateTestFile(input) {
|
|
31
|
+
const { text } = await generateText({
|
|
32
|
+
model: createModelFromEnv(),
|
|
33
|
+
system: SYSTEM_PROMPT,
|
|
34
|
+
prompt: buildPrompt(input),
|
|
35
|
+
});
|
|
36
|
+
return extractCodeBlock(text);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=generate-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-test.js","sourceRoot":"","sources":["../../src/generate-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAexD,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAe;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,MAAM,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,WAAW,CAAC,KAAwB;IAC3C,MAAM,QAAQ,GAAG;QACf,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QACzD,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QACzD,gBAAgB,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;QAC7D,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;KACtD;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,eAAe,GAAG,KAAK,CAAC,iBAAiB;QAC7C,CAAC,CAAC,yCAAyC,KAAK,CAAC,iBAAiB,UAAU;QAC5E,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,cAAc,KAAK,CAAC,aAAa,OAAO,QAAQ,GAAG,eAAe,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;gDAM0B,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAwB;IAC7D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,kBAAkB,EAAE;QAC3B,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC;KAC3B,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-test.test.d.ts","sourceRoot":"","sources":["../../src/generate-test.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { generateTestFile } from './generate-test.js';
|
|
3
|
+
vi.mock('ai', () => ({
|
|
4
|
+
generateText: vi.fn(),
|
|
5
|
+
}));
|
|
6
|
+
vi.mock('@auto-engineer/model-factory', () => ({
|
|
7
|
+
createModelFromEnv: vi.fn(() => 'mock-model'),
|
|
8
|
+
}));
|
|
9
|
+
import { generateText } from 'ai';
|
|
10
|
+
const specDeltas = {
|
|
11
|
+
structure: ['renders a Button element', 'accepts children prop'],
|
|
12
|
+
rendering: ['shows loading spinner when loading=true'],
|
|
13
|
+
interaction: ['calls onClick when clicked'],
|
|
14
|
+
styling: ['applies primary variant by default'],
|
|
15
|
+
};
|
|
16
|
+
describe('generateTestFile', () => {
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
vi.clearAllMocks();
|
|
19
|
+
});
|
|
20
|
+
it('returns generated test code from AI with spec deltas in prompt', async () => {
|
|
21
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
22
|
+
mockGenerateText.mockResolvedValue({
|
|
23
|
+
text: '```tsx\nimport { render } from "@testing-library/react";\n```',
|
|
24
|
+
});
|
|
25
|
+
const result = await generateTestFile({
|
|
26
|
+
componentName: 'Button',
|
|
27
|
+
specDeltas,
|
|
28
|
+
});
|
|
29
|
+
expect(result).toBe('import { render } from "@testing-library/react";');
|
|
30
|
+
expect(mockGenerateText).toHaveBeenCalledWith({
|
|
31
|
+
model: 'mock-model',
|
|
32
|
+
system: expect.stringContaining('vitest'),
|
|
33
|
+
prompt: expect.stringContaining('renders a Button element'),
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('includes all spec delta sections in the prompt', async () => {
|
|
37
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
38
|
+
mockGenerateText.mockResolvedValue({
|
|
39
|
+
text: 'test code',
|
|
40
|
+
});
|
|
41
|
+
await generateTestFile({ componentName: 'Button', specDeltas });
|
|
42
|
+
const prompt = mockGenerateText.mock.calls[0][0].prompt;
|
|
43
|
+
expect(prompt).toContain('## Structure');
|
|
44
|
+
expect(prompt).toContain('renders a Button element');
|
|
45
|
+
expect(prompt).toContain('## Rendering');
|
|
46
|
+
expect(prompt).toContain('shows loading spinner when loading=true');
|
|
47
|
+
expect(prompt).toContain('## Interaction');
|
|
48
|
+
expect(prompt).toContain('calls onClick when clicked');
|
|
49
|
+
expect(prompt).toContain('## Styling');
|
|
50
|
+
expect(prompt).toContain('applies primary variant by default');
|
|
51
|
+
});
|
|
52
|
+
it('includes existing component code as context when provided', async () => {
|
|
53
|
+
const mockGenerateText = vi.mocked(generateText);
|
|
54
|
+
mockGenerateText.mockResolvedValue({
|
|
55
|
+
text: 'test code',
|
|
56
|
+
});
|
|
57
|
+
await generateTestFile({
|
|
58
|
+
componentName: 'Button',
|
|
59
|
+
specDeltas,
|
|
60
|
+
existingComponent: 'export function Button() { return <button />; }',
|
|
61
|
+
});
|
|
62
|
+
const prompt = mockGenerateText.mock.calls[0][0].prompt;
|
|
63
|
+
expect(prompt).toContain('export function Button() { return <button />; }');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=generate-test.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-test.test.js","sourceRoot":"","sources":["../../src/generate-test.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { commandHandler as implementComponentHandler } from './commands/implement-component';
|
|
2
|
+
export declare const COMMANDS: import("@auto-engineer/message-bus").UnifiedCommandHandler<Readonly<{
|
|
3
|
+
type: string;
|
|
4
|
+
data: Readonly<Record<string, unknown>>;
|
|
5
|
+
timestamp?: Date;
|
|
6
|
+
requestId?: string;
|
|
7
|
+
correlationId?: string;
|
|
8
|
+
}>>[];
|
|
9
|
+
export { implementComponentHandler };
|
|
10
|
+
export type { ComponentImplementationFailedEvent, ComponentImplementedEvent, ImplementComponentCommand, ImplementComponentEvents, } from './commands/implement-component';
|
|
11
|
+
export { handleImplementComponent } from './commands/implement-component';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE7F,eAAO,MAAM,QAAQ;;;;;;KAA8B,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,CAAC;AACrC,YAAY,EACV,kCAAkC,EAClC,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { commandHandler as implementComponentHandler } from './commands/implement-component.js';
|
|
2
|
+
export const COMMANDS = [implementComponentHandler];
|
|
3
|
+
export { implementComponentHandler };
|
|
4
|
+
export { handleImplementComponent } from './commands/implement-component.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE7F,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAOrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC"}
|