@tayo-dev/rtl 1.0.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 (150) hide show
  1. package/README.md +250 -0
  2. package/dist/analyzer/mocks/detector.d.ts +59 -0
  3. package/dist/analyzer/mocks/detector.d.ts.map +1 -0
  4. package/dist/analyzer/mocks/detector.js +264 -0
  5. package/dist/analyzer/mocks/detector.js.map +1 -0
  6. package/dist/analyzer/mocks/target-analyzer.d.ts +92 -0
  7. package/dist/analyzer/mocks/target-analyzer.d.ts.map +1 -0
  8. package/dist/analyzer/mocks/target-analyzer.js +305 -0
  9. package/dist/analyzer/mocks/target-analyzer.js.map +1 -0
  10. package/dist/analyzer/visual/element-analyzer.d.ts +44 -0
  11. package/dist/analyzer/visual/element-analyzer.d.ts.map +1 -0
  12. package/dist/analyzer/visual/element-analyzer.js +176 -0
  13. package/dist/analyzer/visual/element-analyzer.js.map +1 -0
  14. package/dist/analyzer/visual/inspector.d.ts +49 -0
  15. package/dist/analyzer/visual/inspector.d.ts.map +1 -0
  16. package/dist/analyzer/visual/inspector.js +109 -0
  17. package/dist/analyzer/visual/inspector.js.map +1 -0
  18. package/dist/cli/commands/generate.d.ts +13 -0
  19. package/dist/cli/commands/generate.d.ts.map +1 -0
  20. package/dist/cli/commands/generate.js +417 -0
  21. package/dist/cli/commands/generate.js.map +1 -0
  22. package/dist/core/generator.d.ts +32 -0
  23. package/dist/core/generator.d.ts.map +1 -0
  24. package/dist/core/generator.js +173 -0
  25. package/dist/core/generator.js.map +1 -0
  26. package/dist/core/js-parser.d.ts +48 -0
  27. package/dist/core/js-parser.d.ts.map +1 -0
  28. package/dist/core/js-parser.js +244 -0
  29. package/dist/core/js-parser.js.map +1 -0
  30. package/dist/core/mock-intelligence.d.ts +14 -0
  31. package/dist/core/mock-intelligence.d.ts.map +1 -0
  32. package/dist/core/mock-intelligence.js +140 -0
  33. package/dist/core/mock-intelligence.js.map +1 -0
  34. package/dist/core/orchestrator.d.ts +49 -0
  35. package/dist/core/orchestrator.d.ts.map +1 -0
  36. package/dist/core/orchestrator.js +315 -0
  37. package/dist/core/orchestrator.js.map +1 -0
  38. package/dist/core/parser.d.ts +9 -0
  39. package/dist/core/parser.d.ts.map +1 -0
  40. package/dist/core/parser.js +120 -0
  41. package/dist/core/parser.js.map +1 -0
  42. package/dist/core/recording-intelligence.d.ts +15 -0
  43. package/dist/core/recording-intelligence.d.ts.map +1 -0
  44. package/dist/core/recording-intelligence.js +178 -0
  45. package/dist/core/recording-intelligence.js.map +1 -0
  46. package/dist/core/resolver.d.ts +58 -0
  47. package/dist/core/resolver.d.ts.map +1 -0
  48. package/dist/core/resolver.js +291 -0
  49. package/dist/core/resolver.js.map +1 -0
  50. package/dist/core/scanner.d.ts +51 -0
  51. package/dist/core/scanner.d.ts.map +1 -0
  52. package/dist/core/scanner.js +310 -0
  53. package/dist/core/scanner.js.map +1 -0
  54. package/dist/core/scorer.d.ts +8 -0
  55. package/dist/core/scorer.d.ts.map +1 -0
  56. package/dist/core/scorer.js +76 -0
  57. package/dist/core/scorer.js.map +1 -0
  58. package/dist/core/validator.d.ts +134 -0
  59. package/dist/core/validator.d.ts.map +1 -0
  60. package/dist/core/validator.js +44 -0
  61. package/dist/core/validator.js.map +1 -0
  62. package/dist/core/verifier.d.ts +10 -0
  63. package/dist/core/verifier.d.ts.map +1 -0
  64. package/dist/core/verifier.js +30 -0
  65. package/dist/core/verifier.js.map +1 -0
  66. package/dist/core/writer.d.ts +15 -0
  67. package/dist/core/writer.d.ts.map +1 -0
  68. package/dist/core/writer.js +43 -0
  69. package/dist/core/writer.js.map +1 -0
  70. package/dist/generator/mocks/builder.d.ts +47 -0
  71. package/dist/generator/mocks/builder.d.ts.map +1 -0
  72. package/dist/generator/mocks/builder.js +335 -0
  73. package/dist/generator/mocks/builder.js.map +1 -0
  74. package/dist/generator/transforms/dialog-transform.d.ts +35 -0
  75. package/dist/generator/transforms/dialog-transform.d.ts.map +1 -0
  76. package/dist/generator/transforms/dialog-transform.js +293 -0
  77. package/dist/generator/transforms/dialog-transform.js.map +1 -0
  78. package/dist/index.d.ts +7 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +18 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/learner/analyzer.d.ts +13 -0
  83. package/dist/learner/analyzer.d.ts.map +1 -0
  84. package/dist/learner/analyzer.js +484 -0
  85. package/dist/learner/analyzer.js.map +1 -0
  86. package/dist/learner/index.d.ts +66 -0
  87. package/dist/learner/index.d.ts.map +1 -0
  88. package/dist/learner/index.js +247 -0
  89. package/dist/learner/index.js.map +1 -0
  90. package/dist/learner/storage.d.ts +68 -0
  91. package/dist/learner/storage.d.ts.map +1 -0
  92. package/dist/learner/storage.js +201 -0
  93. package/dist/learner/storage.js.map +1 -0
  94. package/dist/learner/types.d.ts +41 -0
  95. package/dist/learner/types.d.ts.map +1 -0
  96. package/dist/learner/types.js +31 -0
  97. package/dist/learner/types.js.map +1 -0
  98. package/dist/parser/recorder-parser.d.ts +40 -0
  99. package/dist/parser/recorder-parser.d.ts.map +1 -0
  100. package/dist/parser/recorder-parser.js +139 -0
  101. package/dist/parser/recorder-parser.js.map +1 -0
  102. package/dist/parser/steps/deduplicator.d.ts +19 -0
  103. package/dist/parser/steps/deduplicator.d.ts.map +1 -0
  104. package/dist/parser/steps/deduplicator.js +75 -0
  105. package/dist/parser/steps/deduplicator.js.map +1 -0
  106. package/dist/parser/steps/dialog-detector.d.ts +38 -0
  107. package/dist/parser/steps/dialog-detector.d.ts.map +1 -0
  108. package/dist/parser/steps/dialog-detector.js +290 -0
  109. package/dist/parser/steps/dialog-detector.js.map +1 -0
  110. package/dist/parser/steps/noise-filter.d.ts +21 -0
  111. package/dist/parser/steps/noise-filter.d.ts.map +1 -0
  112. package/dist/parser/steps/noise-filter.js +138 -0
  113. package/dist/parser/steps/noise-filter.js.map +1 -0
  114. package/dist/scorer/index.d.ts +43 -0
  115. package/dist/scorer/index.d.ts.map +1 -0
  116. package/dist/scorer/index.js +82 -0
  117. package/dist/scorer/index.js.map +1 -0
  118. package/dist/scorer/post-verify.d.ts +17 -0
  119. package/dist/scorer/post-verify.d.ts.map +1 -0
  120. package/dist/scorer/post-verify.js +163 -0
  121. package/dist/scorer/post-verify.js.map +1 -0
  122. package/dist/scorer/pre-audit.d.ts +32 -0
  123. package/dist/scorer/pre-audit.d.ts.map +1 -0
  124. package/dist/scorer/pre-audit.js +99 -0
  125. package/dist/scorer/pre-audit.js.map +1 -0
  126. package/dist/scorer/quality-gates.d.ts +17 -0
  127. package/dist/scorer/quality-gates.d.ts.map +1 -0
  128. package/dist/scorer/quality-gates.js +304 -0
  129. package/dist/scorer/quality-gates.js.map +1 -0
  130. package/dist/scorer/types.d.ts +27 -0
  131. package/dist/scorer/types.d.ts.map +1 -0
  132. package/dist/scorer/types.js +5 -0
  133. package/dist/scorer/types.js.map +1 -0
  134. package/dist/templates/test-template.d.ts +21 -0
  135. package/dist/templates/test-template.d.ts.map +1 -0
  136. package/dist/templates/test-template.js +92 -0
  137. package/dist/templates/test-template.js.map +1 -0
  138. package/dist/types/conventions.d.ts +49 -0
  139. package/dist/types/conventions.d.ts.map +1 -0
  140. package/dist/types/conventions.js +13 -0
  141. package/dist/types/conventions.js.map +1 -0
  142. package/dist/types/recording.d.ts +143 -0
  143. package/dist/types/recording.d.ts.map +1 -0
  144. package/dist/types/recording.js +5 -0
  145. package/dist/types/recording.js.map +1 -0
  146. package/dist/types/score.d.ts +18 -0
  147. package/dist/types/score.d.ts.map +1 -0
  148. package/dist/types/score.js +2 -0
  149. package/dist/types/score.js.map +1 -0
  150. package/package.json +51 -0
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Test file filesystem writing
3
+ * Writes generated test code to the filesystem with proper naming and safety checks.
4
+ */
5
+ export interface WriteOptions {
6
+ force?: boolean;
7
+ createDir?: boolean;
8
+ }
9
+ export interface WriteResult {
10
+ filePath: string;
11
+ created: boolean;
12
+ overwritten: boolean;
13
+ }
14
+ export declare function writeTestFile(content: string, outputPath: string, options?: WriteOptions): Promise<WriteResult>;
15
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,OAAO,CAAA;CACrB;AAYD,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAqCtB"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Test file filesystem writing
3
+ * Writes generated test code to the filesystem with proper naming and safety checks.
4
+ */
5
+ import { access, mkdir, writeFile } from 'node:fs/promises';
6
+ import { dirname, extname, resolve } from 'node:path';
7
+ function isValidTestPath(filePath) {
8
+ const base = filePath.replace(/\?.*$/, '');
9
+ return (base.endsWith('.test.ts') ||
10
+ base.endsWith('.test.tsx') ||
11
+ base.endsWith('.spec.ts') ||
12
+ base.endsWith('.spec.tsx'));
13
+ }
14
+ export async function writeTestFile(content, outputPath, options = {}) {
15
+ const { force = false, createDir = true } = options;
16
+ const resolvedPath = resolve(outputPath);
17
+ if (!isValidTestPath(resolvedPath)) {
18
+ const ext = extname(resolvedPath);
19
+ throw new Error(`Output file must have a test extension (.test.ts, .test.tsx, .spec.ts, .spec.tsx). Got: "${ext || '(no extension)'}"`);
20
+ }
21
+ const dir = dirname(resolvedPath);
22
+ if (createDir) {
23
+ await mkdir(dir, { recursive: true });
24
+ }
25
+ let fileExists = false;
26
+ try {
27
+ await access(resolvedPath);
28
+ fileExists = true;
29
+ }
30
+ catch {
31
+ // ENOENT — file does not exist, proceed
32
+ }
33
+ if (fileExists && !force) {
34
+ throw new Error(`Output file already exists: ${resolvedPath}\nUse --force to overwrite.`);
35
+ }
36
+ await writeFile(resolvedPath, content, 'utf-8');
37
+ return {
38
+ filePath: resolvedPath,
39
+ created: !fileExists,
40
+ overwritten: fileExists,
41
+ };
42
+ }
43
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAarD,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC1C,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC3B,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,UAAkB,EAClB,UAAwB,EAAE;IAE1B,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAExC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;QACjC,MAAM,IAAI,KAAK,CACb,4FAA4F,GAAG,IAAI,gBAAgB,GAAG,CACvH,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IACjC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;QAC1B,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IAED,IAAI,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,+BAA+B,YAAY,6BAA6B,CACzE,CAAA;IACH,CAAC;IAED,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAE/C,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,CAAC,UAAU;QACpB,WAAW,EAAE,UAAU;KACxB,CAAA;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Mock Code Builder - Generates valid mock code for tests
3
+ *
4
+ * Takes mock targets and generates appropriate mock code based on the
5
+ * selected mock library (MSW, jest.fn, sinon, etc.)
6
+ */
7
+ import type { MockTarget } from '../../analyzer/mocks/target-analyzer.js';
8
+ import type { ApiCallInfo } from '../../analyzer/mocks/detector.js';
9
+ /**
10
+ * Decision about how to generate the mock
11
+ */
12
+ export interface MockDecision {
13
+ /** The mock target this decision applies to */
14
+ target: MockTarget;
15
+ /** The generated mock code */
16
+ code: string;
17
+ /** Whether this should be an inline or file mock */
18
+ isInline: boolean;
19
+ /** Import statements needed */
20
+ imports: string[];
21
+ /** Any setup required before using the mock */
22
+ setupCode?: string;
23
+ /** Cleanup code required */
24
+ teardownCode?: string;
25
+ }
26
+ /**
27
+ * Main function to build mock code from a mock target
28
+ */
29
+ export declare function buildMock(target: MockTarget, apiCall: ApiCallInfo): MockDecision;
30
+ /**
31
+ * Build mocks for multiple targets
32
+ */
33
+ export declare function buildMocks(targets: MockTarget[], apiCalls: Map<string, ApiCallInfo>): MockDecision[];
34
+ /**
35
+ * Generate complete mock file content
36
+ */
37
+ export declare function generateMockFile(decisions: MockDecision[], options?: {
38
+ framework?: 'vitest' | 'jest';
39
+ filename?: string;
40
+ }): string;
41
+ /**
42
+ * Generate inline mock code for a single test
43
+ */
44
+ export declare function generateInlineMock(decision: MockDecision, options?: {
45
+ framework?: 'vitest' | 'jest';
46
+ }): string;
47
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/generator/mocks/builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,MAAM,EAAE,UAAU,CAAC;IACnB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAgPD;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,YAAY,CAkBhF;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,UAAU,EAAE,EACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACjC,YAAY,EAAE,CAYhB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,YAAY,EAAE,EACzB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,MAAM,CAuDR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC/B,GACA,MAAM,CAwBR"}
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Mock Code Builder - Generates valid mock code for tests
3
+ *
4
+ * Takes mock targets and generates appropriate mock code based on the
5
+ * selected mock library (MSW, jest.fn, sinon, etc.)
6
+ */
7
+ /**
8
+ * Sample response data for common API patterns
9
+ */
10
+ const SAMPLE_RESPONSES = {
11
+ // Generic success
12
+ success: { ok: true, message: 'Success' },
13
+ // JSON API
14
+ json: { data: {}, meta: { page: 1, total: 0 } },
15
+ // User data
16
+ user: { id: '1', email: 'user@example.com', name: 'Test User' },
17
+ // List data
18
+ list: { items: [], total: 0, page: 1, pageSize: 10 },
19
+ // Error
20
+ error: { error: { code: 'UNKNOWN', message: 'An error occurred' } },
21
+ };
22
+ /**
23
+ * Generate mock code for MSW (Mock Service Worker)
24
+ */
25
+ function buildMswMock(target, apiCall) {
26
+ const imports = ['http', 'HttpResponse'];
27
+ const method = target.method.toLowerCase();
28
+ // Determine response type based on URL
29
+ const responseType = inferResponseType(target.url);
30
+ const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
31
+ let handlerCode = '';
32
+ switch (method) {
33
+ case 'get':
34
+ handlerCode = `http.get('${target.url}', () => {
35
+ return HttpResponse.json(${JSON.stringify(sampleResponse, null, 2)});
36
+ })`;
37
+ break;
38
+ case 'post':
39
+ handlerCode = `http.post('${target.url}', () => {
40
+ return HttpResponse.json(${JSON.stringify(sampleResponse, null, 2)}, { status: 201 });
41
+ })`;
42
+ break;
43
+ case 'put':
44
+ case 'patch':
45
+ handlerCode = `http.${method}('${target.url}', () => {
46
+ return HttpResponse.json(${JSON.stringify(sampleResponse, null, 2)});
47
+ })`;
48
+ break;
49
+ case 'delete':
50
+ handlerCode = `http.delete('${target.url}', () => {
51
+ return HttpResponse.json({ ok: true });
52
+ })`;
53
+ break;
54
+ default:
55
+ handlerCode = `http.all('${target.url}', () => {
56
+ return HttpResponse.json(${JSON.stringify(sampleResponse, null, 2)});
57
+ })`;
58
+ }
59
+ return {
60
+ target,
61
+ code: handlerCode,
62
+ isInline: target.extractionRecommendation === 'inline',
63
+ imports,
64
+ setupCode: `// Add handlers to server in your test setup
65
+ // const server = setupServer(...handlers);`,
66
+ teardownCode: `// server.close(); // In afterAll hook`,
67
+ };
68
+ }
69
+ /**
70
+ * Generate mock code for jest.fn()
71
+ */
72
+ function buildJestFnMock(target, apiCall) {
73
+ const responseType = inferResponseType(target.url);
74
+ const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
75
+ let mockCode = '';
76
+ let setupCode = '';
77
+ if (target.method === 'GET') {
78
+ mockCode = `jest.fn().mockResolvedValue(${JSON.stringify(sampleResponse, null, 2)})`;
79
+ setupCode = `global.fetch = ${mockCode};`;
80
+ }
81
+ else if (target.method === 'POST' || target.method === 'PUT' || target.method === 'PATCH') {
82
+ mockCode = `jest.fn().mockResolvedValue(${JSON.stringify(sampleResponse, null, 2)})`;
83
+ setupCode = `global.fetch = ${mockCode};`;
84
+ }
85
+ else if (target.method === 'DELETE') {
86
+ mockCode = `jest.fn().mockResolvedValue({ ok: true })`;
87
+ setupCode = `global.fetch = ${mockCode};`;
88
+ }
89
+ else {
90
+ mockCode = `jest.fn().mockResolvedValue(${JSON.stringify(sampleResponse, null, 2)})`;
91
+ setupCode = `global.fetch = ${mockCode};`;
92
+ }
93
+ return {
94
+ target,
95
+ code: mockCode,
96
+ isInline: true,
97
+ imports: [],
98
+ setupCode,
99
+ teardownCode: `global.fetch = jest.fn(); // Restore in afterEach`,
100
+ };
101
+ }
102
+ /**
103
+ * Generate mock code for sinon
104
+ */
105
+ function buildSinonMock(target, apiCall) {
106
+ const responseType = inferResponseType(target.url);
107
+ const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
108
+ const mockCode = `sinon.stub().resolves(${JSON.stringify(sampleResponse, null, 2)})`;
109
+ return {
110
+ target,
111
+ code: mockCode,
112
+ isInline: true,
113
+ imports: ['sinon'],
114
+ setupCode: `// In beforeEach:
115
+ const fetchStub = ${mockCode};
116
+ sinon.stub(global, 'fetch').returns(fetchStub);`,
117
+ teardownCode: `// In afterEach:
118
+ sinon.restore();`,
119
+ };
120
+ }
121
+ /**
122
+ * Generate mock code for fetch-mock
123
+ */
124
+ function buildFetchMockMock(target, apiCall) {
125
+ const responseType = inferResponseType(target.url);
126
+ const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
127
+ const mockCode = `fetchMock.${target.method.toLowerCase()}('${target.url}', ${JSON.stringify(sampleResponse, null, 2)})`;
128
+ return {
129
+ target,
130
+ code: mockCode,
131
+ isInline: false,
132
+ imports: ['fetch-mock'],
133
+ setupCode: `fetchMock.restore(); // Reset before each test
134
+ ${mockCode};`,
135
+ teardownCode: `fetchMock.restore(); // After each test`,
136
+ };
137
+ }
138
+ /**
139
+ * Generate mock code for nock
140
+ */
141
+ function buildNockMock(target, apiCall) {
142
+ const responseType = inferResponseType(target.url);
143
+ const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
144
+ const mockCode = `nock('${getBaseUrl(target.url)}')
145
+ .${target.method.toLowerCase()}('${getPath(target.url)}')
146
+ .reply(200, ${JSON.stringify(sampleResponse, null, 2)})`;
147
+ return {
148
+ target,
149
+ code: mockCode,
150
+ isInline: false,
151
+ imports: ['nock'],
152
+ setupCode: `// Before tests:
153
+ const scope = ${mockCode};`,
154
+ teardownCode: `// After tests:
155
+ nock.cleanAll();`,
156
+ };
157
+ }
158
+ /**
159
+ * Generate mock code for undici MockAgent
160
+ */
161
+ function buildUndiciMock(target, apiCall) {
162
+ const responseType = inferResponseType(target.url);
163
+ const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
164
+ const mockCode = `const mockAgent = new MockAgent();
165
+ mockAgent.disableNetConnect();
166
+ const pool = mockAgent.get('${getBaseUrl(target.url)}');
167
+ pool.intercept({
168
+ method: '${target.method}',
169
+ path: '${getPath(target.url)}',
170
+ }).reply(200, ${JSON.stringify(sampleResponse, null, 2)});`;
171
+ return {
172
+ target,
173
+ code: mockCode,
174
+ isInline: false,
175
+ imports: ['undici'],
176
+ setupCode: mockCode,
177
+ teardownCode: `await mockAgent.close();`,
178
+ };
179
+ }
180
+ /**
181
+ * Infer the response type from URL patterns
182
+ */
183
+ function inferResponseType(url) {
184
+ const lowerUrl = url.toLowerCase();
185
+ if (lowerUrl.includes('/user') || lowerUrl.includes('/profile')) {
186
+ return 'user';
187
+ }
188
+ if (lowerUrl.includes('/list') || lowerUrl.includes('/all') || lowerUrl.includes('/search')) {
189
+ return 'list';
190
+ }
191
+ if (lowerUrl.includes('/error') || lowerUrl.includes('/fail')) {
192
+ return 'error';
193
+ }
194
+ if (lowerUrl.includes('/api')) {
195
+ return 'json';
196
+ }
197
+ return 'success';
198
+ }
199
+ /**
200
+ * Extract base URL from full URL
201
+ */
202
+ function getBaseUrl(url) {
203
+ try {
204
+ const parsed = new URL(url);
205
+ return parsed.origin;
206
+ }
207
+ catch {
208
+ return 'http://localhost:3000';
209
+ }
210
+ }
211
+ /**
212
+ * Extract path from URL
213
+ */
214
+ function getPath(url) {
215
+ try {
216
+ const parsed = new URL(url);
217
+ return parsed.pathname;
218
+ }
219
+ catch {
220
+ return url;
221
+ }
222
+ }
223
+ /**
224
+ * Main function to build mock code from a mock target
225
+ */
226
+ export function buildMock(target, apiCall) {
227
+ switch (target.mockLibrary) {
228
+ case 'msw':
229
+ return buildMswMock(target, apiCall);
230
+ case 'jest.fn':
231
+ return buildJestFnMock(target, apiCall);
232
+ case 'sinon':
233
+ return buildSinonMock(target, apiCall);
234
+ case 'fetch-mock':
235
+ return buildFetchMockMock(target, apiCall);
236
+ case 'nock':
237
+ return buildNockMock(target, apiCall);
238
+ case 'undici':
239
+ return buildUndiciMock(target, apiCall);
240
+ default:
241
+ // Default to jest.fn
242
+ return buildJestFnMock(target, apiCall);
243
+ }
244
+ }
245
+ /**
246
+ * Build mocks for multiple targets
247
+ */
248
+ export function buildMocks(targets, apiCalls) {
249
+ return targets.map(target => {
250
+ const apiCall = apiCalls.get(target.apiCallId);
251
+ return buildMock(target, apiCall || {
252
+ id: target.apiCallId,
253
+ method: 'fetch',
254
+ url: target.url,
255
+ isExternal: true,
256
+ source: 'codebase',
257
+ httpMethod: target.method,
258
+ });
259
+ });
260
+ }
261
+ /**
262
+ * Generate complete mock file content
263
+ */
264
+ export function generateMockFile(decisions, options) {
265
+ const framework = options?.framework || 'jest';
266
+ const allImports = new Set();
267
+ const allSetupCode = [];
268
+ const allTeardownCode = [];
269
+ const mockExports = [];
270
+ // Collect imports and code from all decisions
271
+ for (const decision of decisions) {
272
+ decision.imports.forEach(i => allImports.add(i));
273
+ if (decision.setupCode) {
274
+ allSetupCode.push(`// ${decision.target.url}\n${decision.setupCode}`);
275
+ }
276
+ if (decision.teardownCode) {
277
+ allTeardownCode.push(`// ${decision.target.url}\n${decision.teardownCode}`);
278
+ }
279
+ if (!decision.isInline) {
280
+ mockExports.push(decision.code);
281
+ }
282
+ }
283
+ // Build the file content
284
+ let content = '';
285
+ // Imports
286
+ if (allImports.size > 0) {
287
+ content += `import { ${Array.from(allImports).join(', ')} } from 'msw';\n`;
288
+ }
289
+ if (mockExports.length > 0) {
290
+ content += '\n// API handlers\n';
291
+ content += mockExports.join('\n\n');
292
+ }
293
+ // Setup function
294
+ content += '\n\n';
295
+ content += `export function setupMocks() {\n`;
296
+ content += allSetupCode.join('\n\n');
297
+ content += '\n}';
298
+ // Teardown function
299
+ content += '\n\n';
300
+ content += `export function teardownMocks() {\n`;
301
+ content += allTeardownCode.join('\n\n');
302
+ content += '\n}';
303
+ // For vitest, add auto-setup via beforeAll/afterAll
304
+ if (framework === 'vitest') {
305
+ content += '\n\n';
306
+ content += `// Vitest hooks (optional - use if not calling setupMocks manually)\n`;
307
+ content += `beforeAll(() => setupMocks());\n`;
308
+ content += `afterAll(() => teardownMocks());`;
309
+ }
310
+ return content;
311
+ }
312
+ /**
313
+ * Generate inline mock code for a single test
314
+ */
315
+ export function generateInlineMock(decision, options) {
316
+ const framework = options?.framework || 'jest';
317
+ let code = '';
318
+ // Add imports if inline
319
+ if (decision.imports.length > 0) {
320
+ code += `import { ${decision.imports.join(', ')} } from '${decision.target.mockLibrary === 'msw' ? 'msw' : decision.target.mockLibrary}';\n\n`;
321
+ }
322
+ // Setup code
323
+ if (decision.setupCode) {
324
+ code += `// Setup mock for ${decision.target.url}\n`;
325
+ code += decision.setupCode;
326
+ code += '\n\n';
327
+ }
328
+ // Teardown hint
329
+ if (decision.teardownCode) {
330
+ code += `// Cleanup after test\n`;
331
+ code += decision.teardownCode;
332
+ }
333
+ return code.trim();
334
+ }
335
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/generator/mocks/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Dialog transform - converts dialog flows into optimized test code
3
+ *
4
+ * This module transforms detected DialogFlow objects into cleaner,
5
+ * more maintainable test code with helper functions.
6
+ *
7
+ * Output:
8
+ * - openDialog() helper function
9
+ * - Test steps that call helper + fill fields
10
+ * - Optional close verification
11
+ */
12
+ import type { DialogFlow } from '../../parser/steps/dialog-detector.js';
13
+ export interface TransformedStep {
14
+ type: 'helper' | 'action' | 'assertion';
15
+ code: string;
16
+ description: string;
17
+ }
18
+ export interface DialogTestTemplate {
19
+ helpers: TransformedStep[];
20
+ testSteps: TransformedStep[];
21
+ cleanup?: TransformedStep[];
22
+ }
23
+ /**
24
+ * Transform dialog flows into optimized test code
25
+ *
26
+ * @param flows - Array of detected dialog flows
27
+ * @returns Transformed steps ready for code generation
28
+ */
29
+ export declare function transformDialogFlows(flows: DialogFlow[]): DialogTestTemplate[];
30
+ /**
31
+ * Generate complete test code from a dialog template
32
+ */
33
+ export declare function generateDialogTestCode(template: DialogTestTemplate): string;
34
+ export default transformDialogFlows;
35
+ //# sourceMappingURL=dialog-transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog-transform.d.ts","sourceRoot":"","sources":["../../../src/generator/transforms/dialog-transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,uCAAuC,CAAC;AAEpF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;CAC7B;AAqRD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,CAM9E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAuB3E;AAED,eAAe,oBAAoB,CAAC"}