@auto-engineer/component-implementor-react 1.108.0 → 1.109.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.
Files changed (96) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +6 -6
  3. package/.turbo/turbo-type-check.log +1 -1
  4. package/CHANGELOG.md +49 -0
  5. package/dist/src/commands/implement-component.d.ts +3 -0
  6. package/dist/src/commands/implement-component.d.ts.map +1 -1
  7. package/dist/src/commands/implement-component.js +11 -33
  8. package/dist/src/commands/implement-component.js.map +1 -1
  9. package/dist/src/commands/implement-component.test.js +6 -66
  10. package/dist/src/commands/implement-component.test.js.map +1 -1
  11. package/dist/src/pipeline/run-pipeline.d.ts +5 -25
  12. package/dist/src/pipeline/run-pipeline.d.ts.map +1 -1
  13. package/dist/src/pipeline/run-pipeline.js +17 -47
  14. package/dist/src/pipeline/run-pipeline.js.map +1 -1
  15. package/dist/src/pipeline/run-pipeline.test.js +29 -132
  16. package/dist/src/pipeline/run-pipeline.test.js.map +1 -1
  17. package/dist/src/pipeline/steps/fix-from-feedback.d.ts +4 -0
  18. package/dist/src/pipeline/steps/fix-from-feedback.d.ts.map +1 -0
  19. package/dist/src/pipeline/steps/fix-from-feedback.js +94 -0
  20. package/dist/src/pipeline/steps/fix-from-feedback.js.map +1 -0
  21. package/dist/src/pipeline/steps/generate-component.test.js +1 -5
  22. package/dist/src/pipeline/steps/generate-component.test.js.map +1 -1
  23. package/dist/src/pipeline/steps/generate-story.test.js +1 -5
  24. package/dist/src/pipeline/steps/generate-story.test.js.map +1 -1
  25. package/dist/src/pipeline/steps/generate-test.test.js +1 -5
  26. package/dist/src/pipeline/steps/generate-test.test.js.map +1 -1
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +3 -3
  29. package/src/commands/implement-component.test.ts +6 -66
  30. package/src/commands/implement-component.ts +16 -47
  31. package/src/pipeline/run-pipeline.test.ts +32 -141
  32. package/src/pipeline/run-pipeline.ts +22 -74
  33. package/src/pipeline/steps/fix-from-feedback.ts +105 -0
  34. package/src/pipeline/steps/generate-component.test.ts +1 -5
  35. package/src/pipeline/steps/generate-story.test.ts +1 -5
  36. package/src/pipeline/steps/generate-test.test.ts +1 -5
  37. package/dist/src/pipeline/steps/lint-fix-loop.d.ts +0 -4
  38. package/dist/src/pipeline/steps/lint-fix-loop.d.ts.map +0 -1
  39. package/dist/src/pipeline/steps/lint-fix-loop.js +0 -46
  40. package/dist/src/pipeline/steps/lint-fix-loop.js.map +0 -1
  41. package/dist/src/pipeline/steps/lint-fix-loop.test.d.ts +0 -2
  42. package/dist/src/pipeline/steps/lint-fix-loop.test.d.ts.map +0 -1
  43. package/dist/src/pipeline/steps/lint-fix-loop.test.js +0 -136
  44. package/dist/src/pipeline/steps/lint-fix-loop.test.js.map +0 -1
  45. package/dist/src/pipeline/steps/story-fix-loop.d.ts +0 -4
  46. package/dist/src/pipeline/steps/story-fix-loop.d.ts.map +0 -1
  47. package/dist/src/pipeline/steps/story-fix-loop.js +0 -35
  48. package/dist/src/pipeline/steps/story-fix-loop.js.map +0 -1
  49. package/dist/src/pipeline/steps/story-fix-loop.test.d.ts +0 -2
  50. package/dist/src/pipeline/steps/story-fix-loop.test.d.ts.map +0 -1
  51. package/dist/src/pipeline/steps/story-fix-loop.test.js +0 -98
  52. package/dist/src/pipeline/steps/story-fix-loop.test.js.map +0 -1
  53. package/dist/src/pipeline/steps/storybook-test.d.ts +0 -3
  54. package/dist/src/pipeline/steps/storybook-test.d.ts.map +0 -1
  55. package/dist/src/pipeline/steps/storybook-test.js +0 -22
  56. package/dist/src/pipeline/steps/storybook-test.js.map +0 -1
  57. package/dist/src/pipeline/steps/storybook-test.test.d.ts +0 -2
  58. package/dist/src/pipeline/steps/storybook-test.test.d.ts.map +0 -1
  59. package/dist/src/pipeline/steps/storybook-test.test.js +0 -70
  60. package/dist/src/pipeline/steps/storybook-test.test.js.map +0 -1
  61. package/dist/src/pipeline/steps/test-fix-loop.d.ts +0 -4
  62. package/dist/src/pipeline/steps/test-fix-loop.d.ts.map +0 -1
  63. package/dist/src/pipeline/steps/test-fix-loop.js +0 -45
  64. package/dist/src/pipeline/steps/test-fix-loop.js.map +0 -1
  65. package/dist/src/pipeline/steps/test-fix-loop.test.d.ts +0 -2
  66. package/dist/src/pipeline/steps/test-fix-loop.test.d.ts.map +0 -1
  67. package/dist/src/pipeline/steps/test-fix-loop.test.js +0 -172
  68. package/dist/src/pipeline/steps/test-fix-loop.test.js.map +0 -1
  69. package/dist/src/pipeline/steps/type-fix-loop.d.ts +0 -4
  70. package/dist/src/pipeline/steps/type-fix-loop.d.ts.map +0 -1
  71. package/dist/src/pipeline/steps/type-fix-loop.js +0 -44
  72. package/dist/src/pipeline/steps/type-fix-loop.js.map +0 -1
  73. package/dist/src/pipeline/steps/type-fix-loop.test.d.ts +0 -2
  74. package/dist/src/pipeline/steps/type-fix-loop.test.d.ts.map +0 -1
  75. package/dist/src/pipeline/steps/type-fix-loop.test.js +0 -116
  76. package/dist/src/pipeline/steps/type-fix-loop.test.js.map +0 -1
  77. package/dist/src/pipeline/steps/visual-test.d.ts +0 -3
  78. package/dist/src/pipeline/steps/visual-test.d.ts.map +0 -1
  79. package/dist/src/pipeline/steps/visual-test.js +0 -4
  80. package/dist/src/pipeline/steps/visual-test.js.map +0 -1
  81. package/dist/src/pipeline/steps/visual-test.test.d.ts +0 -2
  82. package/dist/src/pipeline/steps/visual-test.test.d.ts.map +0 -1
  83. package/dist/src/pipeline/steps/visual-test.test.js +0 -9
  84. package/dist/src/pipeline/steps/visual-test.test.js.map +0 -1
  85. package/src/pipeline/steps/lint-fix-loop.test.ts +0 -176
  86. package/src/pipeline/steps/lint-fix-loop.ts +0 -61
  87. package/src/pipeline/steps/story-fix-loop.test.ts +0 -127
  88. package/src/pipeline/steps/story-fix-loop.ts +0 -48
  89. package/src/pipeline/steps/storybook-test.test.ts +0 -86
  90. package/src/pipeline/steps/storybook-test.ts +0 -27
  91. package/src/pipeline/steps/test-fix-loop.test.ts +0 -205
  92. package/src/pipeline/steps/test-fix-loop.ts +0 -57
  93. package/src/pipeline/steps/type-fix-loop.test.ts +0 -149
  94. package/src/pipeline/steps/type-fix-loop.ts +0 -56
  95. package/src/pipeline/steps/visual-test.test.ts +0 -10
  96. package/src/pipeline/steps/visual-test.ts +0 -5
@@ -1,98 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- vi.mock('ai', () => ({
3
- generateText: vi.fn(),
4
- }));
5
- vi.mock('node:fs/promises', () => ({
6
- readFile: vi.fn(),
7
- writeFile: vi.fn(),
8
- }));
9
- vi.mock('../../tools/type-checker', () => ({
10
- runTypeCheck: vi.fn(),
11
- }));
12
- import { readFile, writeFile } from 'node:fs/promises';
13
- import { generateText } from 'ai';
14
- import { runTypeCheck } from '../../tools/type-checker.js';
15
- import { storyFixLoop } from './story-fix-loop.js';
16
- afterEach(() => {
17
- vi.clearAllMocks();
18
- });
19
- function makeCtx(overrides = {}) {
20
- return {
21
- componentName: 'MyButton',
22
- componentPath: '/project/src/MyButton.tsx',
23
- testPath: '/project/src/MyButton.test.tsx',
24
- storyPath: '/project/src/MyButton.stories.tsx',
25
- componentImportPath: '@/components/ui/MyButton',
26
- targetDir: '/project',
27
- specDeltas: { structure: [], rendering: [], interaction: [], styling: [] },
28
- projectSection: '',
29
- composes: [],
30
- isModify: false,
31
- llmCalls: 0,
32
- fixIterations: 0,
33
- typeFixIterations: 0,
34
- testFixIterations: 0,
35
- lintFixIterations: 0,
36
- storyFixIterations: 0,
37
- storyCode: 'original story',
38
- componentCode: 'original component',
39
- ...overrides,
40
- };
41
- }
42
- describe('storyFixLoop', () => {
43
- it('returns success immediately when story type-checks', async () => {
44
- vi.mocked(runTypeCheck).mockReturnValue({ passed: true, errors: [] });
45
- const result = await storyFixLoop('mock-model', makeCtx(), 2);
46
- expect(result).toEqual({ success: true });
47
- expect(generateText).not.toHaveBeenCalled();
48
- });
49
- it('calls LLM to fix story type errors and writes fixed story', async () => {
50
- vi.mocked(runTypeCheck)
51
- .mockReturnValueOnce({ passed: false, errors: ['error in story'] })
52
- .mockReturnValueOnce({ passed: true, errors: [] });
53
- vi.mocked(generateText).mockResolvedValue({
54
- text: '```tsx\nfixed story code\n```',
55
- });
56
- vi.mocked(writeFile).mockResolvedValue(undefined);
57
- const result = await storyFixLoop('mock-model', makeCtx(), 2);
58
- expect(result).toEqual({ success: true });
59
- expect(generateText).toHaveBeenCalledTimes(1);
60
- expect(writeFile).toHaveBeenCalledWith('/project/src/MyButton.stories.tsx', 'fixed story code', 'utf-8');
61
- });
62
- it('returns failure after exhausting max iterations', async () => {
63
- vi.mocked(runTypeCheck).mockReturnValue({ passed: false, errors: ['persistent story error'] });
64
- vi.mocked(generateText).mockResolvedValue({
65
- text: '```tsx\nstill broken story\n```',
66
- });
67
- vi.mocked(writeFile).mockResolvedValue(undefined);
68
- vi.mocked(readFile).mockResolvedValue('still broken story');
69
- const result = await storyFixLoop('mock-model', makeCtx(), 1);
70
- expect(result).toEqual({
71
- success: false,
72
- error: expect.stringContaining('Story type errors remain after 1 iterations'),
73
- });
74
- });
75
- it('returns success when final check passes after last iteration fix', async () => {
76
- vi.mocked(runTypeCheck)
77
- .mockReturnValueOnce({ passed: false, errors: ['error'] })
78
- .mockReturnValueOnce({ passed: true, errors: [] });
79
- vi.mocked(generateText).mockResolvedValue({
80
- text: '```tsx\nfixed story\n```',
81
- });
82
- vi.mocked(writeFile).mockResolvedValue(undefined);
83
- const result = await storyFixLoop('mock-model', makeCtx(), 1);
84
- expect(result).toEqual({ success: true });
85
- });
86
- it('uses empty string fallback when storyCode and componentCode are undefined', async () => {
87
- vi.mocked(runTypeCheck)
88
- .mockReturnValueOnce({ passed: false, errors: ['error'] })
89
- .mockReturnValueOnce({ passed: true, errors: [] });
90
- vi.mocked(generateText).mockResolvedValue({
91
- text: '```tsx\nfixed story\n```',
92
- });
93
- vi.mocked(writeFile).mockResolvedValue(undefined);
94
- const result = await storyFixLoop('mock-model', makeCtx({ storyCode: undefined, componentCode: undefined }), 1);
95
- expect(result).toEqual({ success: true });
96
- });
97
- });
98
- //# sourceMappingURL=story-fix-loop.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"story-fix-loop.test.js","sourceRoot":"","sources":["../../../../src/pipeline/steps/story-fix-loop.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE7D,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,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;IACjB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;CACnB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,SAAS,OAAO,CAAC,YAAsC,EAAE;IACvD,OAAO;QACL,aAAa,EAAE,UAAU;QACzB,aAAa,EAAE,2BAA2B;QAC1C,QAAQ,EAAE,gCAAgC;QAC1C,SAAS,EAAE,mCAAmC;QAC9C,mBAAmB,EAAE,0BAA0B;QAC/C,SAAS,EAAE,UAAU;QACrB,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1E,cAAc,EAAE,EAAE;QAClB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,CAAC;QACX,aAAa,EAAE,CAAC;QAChB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,kBAAkB,EAAE,CAAC;QACrB,SAAS,EAAE,gBAAgB;QAC3B,aAAa,EAAE,oBAAoB;QACnC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAqB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;aACpB,mBAAmB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;aAClE,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAErD,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC;YACxC,IAAI,EAAE,+BAA+B;SACM,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAqB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,mCAAmC,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAE/F,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC;YACxC,IAAI,EAAE,iCAAiC;SACI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,oBAA6B,CAAC,CAAC;QAErE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAqB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,6CAA6C,CAAC;SAC9E,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;aACpB,mBAAmB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;aACzD,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAErD,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC;YACxC,IAAI,EAAE,0BAA0B;SACW,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAqB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;aACpB,mBAAmB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;aACzD,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAErD,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC;YACxC,IAAI,EAAE,0BAA0B;SACW,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,YAAqB,EACrB,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,EAC3D,CAAC,CACF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { PipelineContext, StepResult } from '../run-pipeline';
2
- export declare function storybookTestStep(ctx: PipelineContext, enableStorybookCli: boolean): Promise<StepResult>;
3
- //# sourceMappingURL=storybook-test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storybook-test.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/steps/storybook-test.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAsB9G"}
@@ -1,22 +0,0 @@
1
- import { runStorybookTest } from '../../tools/storybook-runner.js';
2
- import { runTypeCheck } from '../../tools/type-checker.js';
3
- export async function storybookTestStep(ctx, enableStorybookCli) {
4
- const typeResult = runTypeCheck(ctx.targetDir, [ctx.storyPath]);
5
- if (!typeResult.passed) {
6
- return {
7
- success: false,
8
- error: `Story type errors: ${typeResult.errors.join('; ')}`,
9
- };
10
- }
11
- if (enableStorybookCli) {
12
- const testResult = runStorybookTest(ctx.storyPath, ctx.targetDir);
13
- if (!testResult.passed) {
14
- return {
15
- success: false,
16
- error: `Storybook test failures: ${testResult.errors.join('; ')}`,
17
- };
18
- }
19
- }
20
- return { success: true };
21
- }
22
- //# sourceMappingURL=storybook-test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storybook-test.js","sourceRoot":"","sources":["../../../../src/pipeline/steps/storybook-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAoB,EAAE,kBAA2B;IACvF,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,sBAAsB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC5D,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAElE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,4BAA4B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAClE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=storybook-test.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storybook-test.test.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/steps/storybook-test.test.ts"],"names":[],"mappings":""}
@@ -1,70 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- vi.mock('../../tools/type-checker', () => ({
3
- runTypeCheck: vi.fn(),
4
- }));
5
- vi.mock('../../tools/storybook-runner', () => ({
6
- runStorybookTest: vi.fn(),
7
- }));
8
- import { runStorybookTest } from '../../tools/storybook-runner.js';
9
- import { runTypeCheck } from '../../tools/type-checker.js';
10
- import { storybookTestStep } from './storybook-test.js';
11
- function makeCtx(overrides = {}) {
12
- return {
13
- componentName: 'MyButton',
14
- componentPath: '/project/src/MyButton.tsx',
15
- testPath: '/project/src/MyButton.test.tsx',
16
- storyPath: '/project/src/MyButton.stories.tsx',
17
- componentImportPath: '@/components/ui/MyButton',
18
- targetDir: '/project',
19
- specDeltas: { structure: [], rendering: [], interaction: [], styling: [] },
20
- projectSection: '',
21
- composes: [],
22
- isModify: false,
23
- llmCalls: 0,
24
- fixIterations: 0,
25
- typeFixIterations: 0,
26
- testFixIterations: 0,
27
- lintFixIterations: 0,
28
- storyFixIterations: 0,
29
- ...overrides,
30
- };
31
- }
32
- describe('storybookTestStep', () => {
33
- it('returns success when type check passes and storybook cli disabled', async () => {
34
- vi.mocked(runTypeCheck).mockReturnValue({ passed: true, errors: [] });
35
- const result = await storybookTestStep(makeCtx(), false);
36
- expect(result).toEqual({ success: true });
37
- expect(runStorybookTest).not.toHaveBeenCalled();
38
- });
39
- it('returns failure when story type check fails', async () => {
40
- vi.mocked(runTypeCheck).mockReturnValue({
41
- passed: false,
42
- errors: ['error in story'],
43
- });
44
- const result = await storybookTestStep(makeCtx(), false);
45
- expect(result).toEqual({
46
- success: false,
47
- error: expect.stringContaining('Story type errors'),
48
- });
49
- });
50
- it('runs storybook CLI test when enabled and type check passes', async () => {
51
- vi.mocked(runTypeCheck).mockReturnValue({ passed: true, errors: [] });
52
- vi.mocked(runStorybookTest).mockReturnValue({ passed: true, errors: [] });
53
- const result = await storybookTestStep(makeCtx(), true);
54
- expect(result).toEqual({ success: true });
55
- expect(runStorybookTest).toHaveBeenCalledWith('/project/src/MyButton.stories.tsx', '/project');
56
- });
57
- it('returns failure when storybook CLI test fails', async () => {
58
- vi.mocked(runTypeCheck).mockReturnValue({ passed: true, errors: [] });
59
- vi.mocked(runStorybookTest).mockReturnValue({
60
- passed: false,
61
- errors: ['Story failed'],
62
- });
63
- const result = await storybookTestStep(makeCtx(), true);
64
- expect(result).toEqual({
65
- success: false,
66
- error: expect.stringContaining('Storybook test failures'),
67
- });
68
- });
69
- });
70
- //# sourceMappingURL=storybook-test.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storybook-test.test.js","sourceRoot":"","sources":["../../../../src/pipeline/steps/storybook-test.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { LanguageModel } from 'ai';
2
- import type { PipelineContext, StepResult } from '../run-pipeline';
3
- export declare function testFixLoop(model: LanguageModel, ctx: PipelineContext, maxIterations: number): Promise<StepResult>;
4
- //# sourceMappingURL=test-fix-loop.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-fix-loop.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/steps/test-fix-loop.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAKxC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,wBAAsB,WAAW,CAC/B,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,eAAe,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,CAAC,CA4CrB"}
@@ -1,45 +0,0 @@
1
- import { readFile, writeFile } from 'node:fs/promises';
2
- import { generateText } from 'ai';
3
- import { extractCodeBlocks } from '../../extract-code-block.js';
4
- import { buildTestFixPrompt } from '../../prompt.js';
5
- import { runTests } from '../../tools/test-runner.js';
6
- export async function testFixLoop(model, ctx, maxIterations) {
7
- for (let i = 0; i < maxIterations; i++) {
8
- const result = runTests(ctx.testPath, ctx.targetDir);
9
- if (result.passed) {
10
- return { success: true };
11
- }
12
- const { system, prompt } = buildTestFixPrompt({
13
- componentCode: ctx.componentCode ?? '',
14
- testCode: ctx.testCode ?? '',
15
- failures: result.failures,
16
- testOutput: result.output,
17
- });
18
- const { text } = await generateText({ model, system, prompt });
19
- ctx.llmCalls++;
20
- ctx.fixIterations++;
21
- ctx.testFixIterations++;
22
- const blocks = extractCodeBlocks(text);
23
- if (blocks.length >= 2) {
24
- ctx.componentCode = blocks[0];
25
- ctx.testCode = blocks[1];
26
- await writeFile(ctx.componentPath, blocks[0], 'utf-8');
27
- await writeFile(ctx.testPath, blocks[1], 'utf-8');
28
- }
29
- else if (blocks.length === 1) {
30
- ctx.componentCode = blocks[0];
31
- await writeFile(ctx.componentPath, blocks[0], 'utf-8');
32
- }
33
- }
34
- const finalResult = runTests(ctx.testPath, ctx.targetDir);
35
- if (finalResult.passed) {
36
- return { success: true };
37
- }
38
- ctx.componentCode = await readFile(ctx.componentPath, 'utf-8');
39
- ctx.testCode = await readFile(ctx.testPath, 'utf-8');
40
- return {
41
- success: false,
42
- error: `Test failures remain after ${maxIterations} iterations: ${finalResult.failures.join('; ')}`,
43
- };
44
- }
45
- //# sourceMappingURL=test-fix-loop.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-fix-loop.js","sourceRoot":"","sources":["../../../../src/pipeline/steps/test-fix-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAoB,EACpB,GAAoB,EACpB,aAAqB;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAErD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC;YAC5C,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;YACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;YAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/D,GAAG,CAAC,QAAQ,EAAE,CAAC;QACf,GAAG,CAAC,aAAa,EAAE,CAAC;QACpB,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAExB,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,aAAa,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC/D,GAAG,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,8BAA8B,aAAa,gBAAgB,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACpG,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=test-fix-loop.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-fix-loop.test.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/steps/test-fix-loop.test.ts"],"names":[],"mappings":""}
@@ -1,172 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- vi.mock('ai', () => ({
3
- generateText: vi.fn(),
4
- }));
5
- vi.mock('node:fs/promises', () => ({
6
- readFile: vi.fn(),
7
- writeFile: vi.fn(),
8
- }));
9
- vi.mock('../../tools/test-runner', () => ({
10
- runTests: vi.fn(),
11
- }));
12
- import { readFile, writeFile } from 'node:fs/promises';
13
- import { generateText } from 'ai';
14
- import { runTests } from '../../tools/test-runner.js';
15
- import { testFixLoop } from './test-fix-loop.js';
16
- afterEach(() => {
17
- vi.clearAllMocks();
18
- });
19
- function makeCtx(overrides = {}) {
20
- return {
21
- componentName: 'MyButton',
22
- componentPath: '/project/src/MyButton.tsx',
23
- testPath: '/project/src/MyButton.test.tsx',
24
- storyPath: '/project/src/MyButton.stories.tsx',
25
- componentImportPath: '@/components/ui/MyButton',
26
- targetDir: '/project',
27
- specDeltas: { structure: [], rendering: [], interaction: [], styling: [] },
28
- projectSection: '',
29
- composes: [],
30
- isModify: false,
31
- llmCalls: 0,
32
- fixIterations: 0,
33
- typeFixIterations: 0,
34
- testFixIterations: 0,
35
- lintFixIterations: 0,
36
- storyFixIterations: 0,
37
- componentCode: 'original component',
38
- testCode: 'original test',
39
- ...overrides,
40
- };
41
- }
42
- describe('testFixLoop', () => {
43
- it('returns success immediately when all tests pass', async () => {
44
- vi.mocked(runTests).mockReturnValue({
45
- passed: true,
46
- numPassed: 3,
47
- numFailed: 0,
48
- failures: [],
49
- output: '',
50
- });
51
- const result = await testFixLoop('mock-model', makeCtx(), 3);
52
- expect(result).toEqual({ success: true });
53
- expect(generateText).not.toHaveBeenCalled();
54
- });
55
- it('calls LLM to fix failures and writes fixed files', async () => {
56
- vi.mocked(runTests)
57
- .mockReturnValueOnce({
58
- passed: false,
59
- numPassed: 1,
60
- numFailed: 1,
61
- failures: ['renders button: element not found'],
62
- output: 'FAIL',
63
- })
64
- .mockReturnValueOnce({
65
- passed: true,
66
- numPassed: 2,
67
- numFailed: 0,
68
- failures: [],
69
- output: 'PASS',
70
- });
71
- vi.mocked(generateText).mockResolvedValue({
72
- text: '```tsx\nfixed component\n```\n```tsx\nfixed test\n```',
73
- });
74
- vi.mocked(writeFile).mockResolvedValue(undefined);
75
- const result = await testFixLoop('mock-model', makeCtx(), 3);
76
- expect(result).toEqual({ success: true });
77
- expect(generateText).toHaveBeenCalledTimes(1);
78
- expect(writeFile).toHaveBeenCalledWith('/project/src/MyButton.tsx', 'fixed component', 'utf-8');
79
- expect(writeFile).toHaveBeenCalledWith('/project/src/MyButton.test.tsx', 'fixed test', 'utf-8');
80
- });
81
- it('returns failure after exhausting max iterations', async () => {
82
- vi.mocked(runTests).mockReturnValue({
83
- passed: false,
84
- numPassed: 0,
85
- numFailed: 1,
86
- failures: ['persistent failure'],
87
- output: 'FAIL',
88
- });
89
- vi.mocked(generateText).mockResolvedValue({
90
- text: '```tsx\nstill broken\n```\n```tsx\nstill broken test\n```',
91
- });
92
- vi.mocked(writeFile).mockResolvedValue(undefined);
93
- vi.mocked(readFile).mockResolvedValue('still broken');
94
- const result = await testFixLoop('mock-model', makeCtx(), 1);
95
- expect(result).toEqual({
96
- success: false,
97
- error: expect.stringContaining('Test failures remain after 1 iterations'),
98
- });
99
- });
100
- it('handles single code block response by updating only component', async () => {
101
- vi.mocked(runTests)
102
- .mockReturnValueOnce({
103
- passed: false,
104
- numPassed: 0,
105
- numFailed: 1,
106
- failures: ['failure'],
107
- output: 'FAIL',
108
- })
109
- .mockReturnValueOnce({
110
- passed: true,
111
- numPassed: 1,
112
- numFailed: 0,
113
- failures: [],
114
- output: 'PASS',
115
- });
116
- vi.mocked(generateText).mockResolvedValue({
117
- text: '```tsx\nfixed component only\n```',
118
- });
119
- vi.mocked(writeFile).mockResolvedValue(undefined);
120
- const result = await testFixLoop('mock-model', makeCtx(), 3);
121
- expect(result).toEqual({ success: true });
122
- expect(writeFile).toHaveBeenCalledWith('/project/src/MyButton.tsx', 'fixed component only', 'utf-8');
123
- expect(writeFile).toHaveBeenCalledTimes(1);
124
- });
125
- it('returns success when final check passes after last iteration fix', async () => {
126
- vi.mocked(runTests)
127
- .mockReturnValueOnce({
128
- passed: false,
129
- numPassed: 0,
130
- numFailed: 1,
131
- failures: ['failure'],
132
- output: 'FAIL',
133
- })
134
- .mockReturnValueOnce({
135
- passed: true,
136
- numPassed: 1,
137
- numFailed: 0,
138
- failures: [],
139
- output: 'PASS',
140
- });
141
- vi.mocked(generateText).mockResolvedValue({
142
- text: '```tsx\nfixed\n```\n```tsx\nfixed test\n```',
143
- });
144
- vi.mocked(writeFile).mockResolvedValue(undefined);
145
- const result = await testFixLoop('mock-model', makeCtx(), 1);
146
- expect(result).toEqual({ success: true });
147
- });
148
- it('uses empty string fallback when componentCode and testCode are undefined', async () => {
149
- vi.mocked(runTests)
150
- .mockReturnValueOnce({
151
- passed: false,
152
- numPassed: 0,
153
- numFailed: 1,
154
- failures: ['failure'],
155
- output: 'FAIL',
156
- })
157
- .mockReturnValueOnce({
158
- passed: true,
159
- numPassed: 1,
160
- numFailed: 0,
161
- failures: [],
162
- output: 'PASS',
163
- });
164
- vi.mocked(generateText).mockResolvedValue({
165
- text: '```tsx\nfixed\n```\n```tsx\nfixed test\n```',
166
- });
167
- vi.mocked(writeFile).mockResolvedValue(undefined);
168
- const result = await testFixLoop('mock-model', makeCtx({ componentCode: undefined, testCode: undefined }), 1);
169
- expect(result).toEqual({ success: true });
170
- });
171
- });
172
- //# sourceMappingURL=test-fix-loop.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-fix-loop.test.js","sourceRoot":"","sources":["../../../../src/pipeline/steps/test-fix-loop.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { LanguageModel } from 'ai';
2
- import type { PipelineContext, StepResult } from '../run-pipeline';
3
- export declare function typeFixLoop(model: LanguageModel, ctx: PipelineContext, maxIterations: number): Promise<StepResult>;
4
- //# sourceMappingURL=type-fix-loop.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"type-fix-loop.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/steps/type-fix-loop.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAKxC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,wBAAsB,WAAW,CAC/B,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,eAAe,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,CAAC,CA2CrB"}
@@ -1,44 +0,0 @@
1
- import { readFile, writeFile } from 'node:fs/promises';
2
- import { generateText } from 'ai';
3
- import { extractCodeBlocks } from '../../extract-code-block.js';
4
- import { buildTypeFixPrompt } from '../../prompt.js';
5
- import { runTypeCheck } from '../../tools/type-checker.js';
6
- export async function typeFixLoop(model, ctx, maxIterations) {
7
- for (let i = 0; i < maxIterations; i++) {
8
- const result = runTypeCheck(ctx.targetDir, [ctx.componentPath, ctx.testPath]);
9
- if (result.passed) {
10
- return { success: true };
11
- }
12
- const { system, prompt } = buildTypeFixPrompt({
13
- componentCode: ctx.componentCode ?? '',
14
- testCode: ctx.testCode ?? '',
15
- errors: result.errors,
16
- });
17
- const { text } = await generateText({ model, system, prompt });
18
- ctx.llmCalls++;
19
- ctx.fixIterations++;
20
- ctx.typeFixIterations++;
21
- const blocks = extractCodeBlocks(text);
22
- if (blocks.length >= 2) {
23
- ctx.componentCode = blocks[0];
24
- ctx.testCode = blocks[1];
25
- await writeFile(ctx.componentPath, blocks[0], 'utf-8');
26
- await writeFile(ctx.testPath, blocks[1], 'utf-8');
27
- }
28
- else if (blocks.length === 1) {
29
- ctx.componentCode = blocks[0];
30
- await writeFile(ctx.componentPath, blocks[0], 'utf-8');
31
- }
32
- }
33
- const finalResult = runTypeCheck(ctx.targetDir, [ctx.componentPath, ctx.testPath]);
34
- if (finalResult.passed) {
35
- return { success: true };
36
- }
37
- ctx.componentCode = await readFile(ctx.componentPath, 'utf-8');
38
- ctx.testCode = await readFile(ctx.testPath, 'utf-8');
39
- return {
40
- success: false,
41
- error: `Type errors remain after ${maxIterations} iterations: ${finalResult.errors.join('; ')}`,
42
- };
43
- }
44
- //# sourceMappingURL=type-fix-loop.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"type-fix-loop.js","sourceRoot":"","sources":["../../../../src/pipeline/steps/type-fix-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAoB,EACpB,GAAoB,EACpB,aAAqB;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC;YAC5C,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;YACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;YAC5B,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/D,GAAG,CAAC,QAAQ,EAAE,CAAC;QACf,GAAG,CAAC,aAAa,EAAE,CAAC;QACpB,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAExB,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnF,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,aAAa,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC/D,GAAG,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,4BAA4B,aAAa,gBAAgB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KAChG,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=type-fix-loop.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"type-fix-loop.test.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/steps/type-fix-loop.test.ts"],"names":[],"mappings":""}