test-gen-js 0.1.1

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 (72) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/LICENSE +22 -0
  3. package/README.md +538 -0
  4. package/bin/cli.js +4 -0
  5. package/dist/analyzer/componentAnalyzer.d.ts +12 -0
  6. package/dist/analyzer/componentAnalyzer.d.ts.map +1 -0
  7. package/dist/analyzer/componentAnalyzer.js +223 -0
  8. package/dist/analyzer/componentAnalyzer.js.map +1 -0
  9. package/dist/analyzer/fileAnalyzer.d.ts +17 -0
  10. package/dist/analyzer/fileAnalyzer.d.ts.map +1 -0
  11. package/dist/analyzer/fileAnalyzer.js +201 -0
  12. package/dist/analyzer/fileAnalyzer.js.map +1 -0
  13. package/dist/analyzer/functionAnalyzer.d.ts +12 -0
  14. package/dist/analyzer/functionAnalyzer.d.ts.map +1 -0
  15. package/dist/analyzer/functionAnalyzer.js +184 -0
  16. package/dist/analyzer/functionAnalyzer.js.map +1 -0
  17. package/dist/analyzer/index.d.ts +7 -0
  18. package/dist/analyzer/index.d.ts.map +1 -0
  19. package/dist/analyzer/index.js +14 -0
  20. package/dist/analyzer/index.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +113 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/generator/index.d.ts +6 -0
  26. package/dist/generator/index.d.ts.map +1 -0
  27. package/dist/generator/index.js +12 -0
  28. package/dist/generator/index.js.map +1 -0
  29. package/dist/generator/mockGenerator.d.ts +14 -0
  30. package/dist/generator/mockGenerator.d.ts.map +1 -0
  31. package/dist/generator/mockGenerator.js +123 -0
  32. package/dist/generator/mockGenerator.js.map +1 -0
  33. package/dist/generator/testGenerator.d.ts +14 -0
  34. package/dist/generator/testGenerator.d.ts.map +1 -0
  35. package/dist/generator/testGenerator.js +301 -0
  36. package/dist/generator/testGenerator.js.map +1 -0
  37. package/dist/index.d.ts +9 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +32 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/parser/astParser.d.ts +15 -0
  42. package/dist/parser/astParser.d.ts.map +1 -0
  43. package/dist/parser/astParser.js +100 -0
  44. package/dist/parser/astParser.js.map +1 -0
  45. package/dist/parser/index.d.ts +6 -0
  46. package/dist/parser/index.d.ts.map +1 -0
  47. package/dist/parser/index.js +12 -0
  48. package/dist/parser/index.js.map +1 -0
  49. package/dist/parser/typeExtractor.d.ts +14 -0
  50. package/dist/parser/typeExtractor.d.ts.map +1 -0
  51. package/dist/parser/typeExtractor.js +165 -0
  52. package/dist/parser/typeExtractor.js.map +1 -0
  53. package/dist/templates/component.ejs +67 -0
  54. package/dist/templates/function.ejs +59 -0
  55. package/dist/templates/snapshot.ejs +48 -0
  56. package/dist/types.d.ts +95 -0
  57. package/dist/types.d.ts.map +1 -0
  58. package/dist/types.js +6 -0
  59. package/dist/types.js.map +1 -0
  60. package/dist/utils/fileUtils.d.ts +43 -0
  61. package/dist/utils/fileUtils.d.ts.map +1 -0
  62. package/dist/utils/fileUtils.js +109 -0
  63. package/dist/utils/fileUtils.js.map +1 -0
  64. package/dist/utils/index.d.ts +6 -0
  65. package/dist/utils/index.d.ts.map +1 -0
  66. package/dist/utils/index.js +22 -0
  67. package/dist/utils/index.js.map +1 -0
  68. package/dist/utils/naming.d.ts +37 -0
  69. package/dist/utils/naming.d.ts.map +1 -0
  70. package/dist/utils/naming.js +73 -0
  71. package/dist/utils/naming.js.map +1 -0
  72. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testGenerator.js","sourceRoot":"","sources":["../../src/generator/testGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * test-gen-js
3
+ * Auto-generate test boilerplate code for JavaScript/TypeScript, React, and React Native
4
+ */
5
+ export { analyzeFile, analyzeDirectory } from './analyzer';
6
+ export { generateTest, generateTests } from './generator';
7
+ export { parseFile, parseCode } from './parser';
8
+ export * from './types';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAChD,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /**
3
+ * test-gen-js
4
+ * Auto-generate test boilerplate code for JavaScript/TypeScript, React, and React Native
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.parseCode = exports.parseFile = exports.generateTests = exports.generateTest = exports.analyzeDirectory = exports.analyzeFile = void 0;
22
+ var analyzer_1 = require("./analyzer");
23
+ Object.defineProperty(exports, "analyzeFile", { enumerable: true, get: function () { return analyzer_1.analyzeFile; } });
24
+ Object.defineProperty(exports, "analyzeDirectory", { enumerable: true, get: function () { return analyzer_1.analyzeDirectory; } });
25
+ var generator_1 = require("./generator");
26
+ Object.defineProperty(exports, "generateTest", { enumerable: true, get: function () { return generator_1.generateTest; } });
27
+ Object.defineProperty(exports, "generateTests", { enumerable: true, get: function () { return generator_1.generateTests; } });
28
+ var parser_1 = require("./parser");
29
+ Object.defineProperty(exports, "parseFile", { enumerable: true, get: function () { return parser_1.parseFile; } });
30
+ Object.defineProperty(exports, "parseCode", { enumerable: true, get: function () { return parser_1.parseCode; } });
31
+ __exportStar(require("./types"), exports);
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,uCAA2D;AAAlD,uGAAA,WAAW,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AACtC,yCAA0D;AAAjD,yGAAA,YAAY,OAAA;AAAE,0GAAA,aAAa,OAAA;AACpC,mCAAgD;AAAvC,mGAAA,SAAS,OAAA;AAAE,mGAAA,SAAS,OAAA;AAC7B,0CAAwB"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * AST Parser using Babel
3
+ * Parses JavaScript/TypeScript files into AST for analysis
4
+ */
5
+ import type { ParseResult } from '@babel/parser';
6
+ import type { File } from '@babel/types';
7
+ /**
8
+ * Parse a file and return the AST
9
+ */
10
+ export declare function parseFile(filePath: string): Promise<ParseResult<File>>;
11
+ /**
12
+ * Parse code string and return the AST
13
+ */
14
+ export declare function parseCode(code: string, filePath?: string): ParseResult<File>;
15
+ //# sourceMappingURL=astParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astParser.d.ts","sourceRoot":"","sources":["../../src/parser/astParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AA6BzC;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAa5E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAqB,GAAG,WAAW,CAAC,IAAI,CAAC,CAW1F"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * AST Parser using Babel
4
+ * Parses JavaScript/TypeScript files into AST for analysis
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.parseFile = parseFile;
44
+ exports.parseCode = parseCode;
45
+ const parser = __importStar(require("@babel/parser"));
46
+ const fs_extra_1 = __importDefault(require("fs-extra"));
47
+ const path_1 = __importDefault(require("path"));
48
+ /** Parser options for different file types */
49
+ const getParserOptions = (filePath) => {
50
+ const ext = path_1.default.extname(filePath).toLowerCase();
51
+ const isTypeScript = ext === '.ts' || ext === '.tsx';
52
+ const isJSX = ext === '.tsx' || ext === '.jsx';
53
+ return {
54
+ sourceType: 'module',
55
+ plugins: [
56
+ isTypeScript ? 'typescript' : null,
57
+ isJSX || isTypeScript ? 'jsx' : null,
58
+ 'decorators-legacy',
59
+ 'classProperties',
60
+ 'classPrivateProperties',
61
+ 'classPrivateMethods',
62
+ 'exportDefaultFrom',
63
+ 'exportNamespaceFrom',
64
+ 'dynamicImport',
65
+ 'nullishCoalescingOperator',
66
+ 'optionalChaining',
67
+ 'objectRestSpread',
68
+ ].filter(Boolean),
69
+ };
70
+ };
71
+ /**
72
+ * Parse a file and return the AST
73
+ */
74
+ async function parseFile(filePath) {
75
+ const absolutePath = path_1.default.resolve(filePath);
76
+ // Check if file exists
77
+ const exists = await fs_extra_1.default.pathExists(absolutePath);
78
+ if (!exists) {
79
+ throw new Error(`File not found: ${absolutePath}`);
80
+ }
81
+ // Read file content
82
+ const code = await fs_extra_1.default.readFile(absolutePath, 'utf-8');
83
+ return parseCode(code, filePath);
84
+ }
85
+ /**
86
+ * Parse code string and return the AST
87
+ */
88
+ function parseCode(code, filePath = 'unknown.ts') {
89
+ const options = getParserOptions(filePath);
90
+ try {
91
+ return parser.parse(code, options);
92
+ }
93
+ catch (error) {
94
+ if (error instanceof Error) {
95
+ throw new Error(`Failed to parse ${filePath}: ${error.message}`);
96
+ }
97
+ throw error;
98
+ }
99
+ }
100
+ //# sourceMappingURL=astParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astParser.js","sourceRoot":"","sources":["../../src/parser/astParser.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCH,8BAaC;AAKD,8BAWC;AA/DD,sDAAwC;AAGxC,wDAA0B;AAC1B,gDAAwB;AAExB,8CAA8C;AAC9C,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAiB,EAAE;IAC3D,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,YAAY,GAAG,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC;IAE/C,OAAO;QACL,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE;YACP,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;YAClC,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YACpC,mBAAmB;YACnB,iBAAiB;YACjB,wBAAwB;YACxB,qBAAqB;YACrB,mBAAmB;YACnB,qBAAqB;YACrB,eAAe;YACf,2BAA2B;YAC3B,kBAAkB;YAClB,kBAAkB;SACnB,CAAC,MAAM,CAAC,OAAO,CAA6B;KAC9C,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACI,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC9C,MAAM,YAAY,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5C,uBAAuB;IACvB,MAAM,MAAM,GAAG,MAAM,kBAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,oBAAoB;IACpB,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEtD,OAAO,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,WAAmB,YAAY;IACrE,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parser module - AST parsing using Babel
3
+ */
4
+ export { parseFile, parseCode } from './astParser';
5
+ export { extractTypes } from './typeExtractor';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Parser module - AST parsing using Babel
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.extractTypes = exports.parseCode = exports.parseFile = void 0;
7
+ var astParser_1 = require("./astParser");
8
+ Object.defineProperty(exports, "parseFile", { enumerable: true, get: function () { return astParser_1.parseFile; } });
9
+ Object.defineProperty(exports, "parseCode", { enumerable: true, get: function () { return astParser_1.parseCode; } });
10
+ var typeExtractor_1 = require("./typeExtractor");
11
+ Object.defineProperty(exports, "extractTypes", { enumerable: true, get: function () { return typeExtractor_1.extractTypes; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAAmD;AAA1C,sGAAA,SAAS,OAAA;AAAE,sGAAA,SAAS,OAAA;AAC7B,iDAA+C;AAAtC,6GAAA,YAAY,OAAA"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Type Extractor
3
+ * Extracts TypeScript type information from AST nodes
4
+ */
5
+ import * as t from '@babel/types';
6
+ /**
7
+ * Extract type string from a TypeScript type annotation
8
+ */
9
+ export declare function extractTypes(node: t.Node | null | undefined): string;
10
+ /**
11
+ * Generate a mock value based on type
12
+ */
13
+ export declare function generateMockValue(type: string): string;
14
+ //# sourceMappingURL=typeExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeExtractor.d.ts","sourceRoot":"","sources":["../../src/parser/typeExtractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CA8EpE;AAmBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BtD"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * Type Extractor
4
+ * Extracts TypeScript type information from AST nodes
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.extractTypes = extractTypes;
41
+ exports.generateMockValue = generateMockValue;
42
+ const t = __importStar(require("@babel/types"));
43
+ /**
44
+ * Extract type string from a TypeScript type annotation
45
+ */
46
+ function extractTypes(node) {
47
+ if (!node) {
48
+ return 'any';
49
+ }
50
+ // Type annotation wrapper
51
+ if (t.isTSTypeAnnotation(node)) {
52
+ return extractTypes(node.typeAnnotation);
53
+ }
54
+ // Basic types
55
+ if (t.isTSStringKeyword(node))
56
+ return 'string';
57
+ if (t.isTSNumberKeyword(node))
58
+ return 'number';
59
+ if (t.isTSBooleanKeyword(node))
60
+ return 'boolean';
61
+ if (t.isTSAnyKeyword(node))
62
+ return 'any';
63
+ if (t.isTSVoidKeyword(node))
64
+ return 'void';
65
+ if (t.isTSNullKeyword(node))
66
+ return 'null';
67
+ if (t.isTSUndefinedKeyword(node))
68
+ return 'undefined';
69
+ if (t.isTSNeverKeyword(node))
70
+ return 'never';
71
+ if (t.isTSUnknownKeyword(node))
72
+ return 'unknown';
73
+ if (t.isTSObjectKeyword(node))
74
+ return 'object';
75
+ // Array type
76
+ if (t.isTSArrayType(node)) {
77
+ return `${extractTypes(node.elementType)}[]`;
78
+ }
79
+ // Type reference (e.g., React.FC, CustomType)
80
+ if (t.isTSTypeReference(node)) {
81
+ if (t.isIdentifier(node.typeName)) {
82
+ return node.typeName.name;
83
+ }
84
+ if (t.isTSQualifiedName(node.typeName)) {
85
+ return `${extractQualifiedName(node.typeName)}`;
86
+ }
87
+ return 'unknown';
88
+ }
89
+ // Union type (e.g., string | number)
90
+ if (t.isTSUnionType(node)) {
91
+ return node.types.map(extractTypes).join(' | ');
92
+ }
93
+ // Intersection type (e.g., A & B)
94
+ if (t.isTSIntersectionType(node)) {
95
+ return node.types.map(extractTypes).join(' & ');
96
+ }
97
+ // Literal types (e.g., 'success' | 'error')
98
+ if (t.isTSLiteralType(node)) {
99
+ if (t.isStringLiteral(node.literal)) {
100
+ return `'${node.literal.value}'`;
101
+ }
102
+ if (t.isNumericLiteral(node.literal)) {
103
+ return String(node.literal.value);
104
+ }
105
+ if (t.isBooleanLiteral(node.literal)) {
106
+ return String(node.literal.value);
107
+ }
108
+ return 'literal';
109
+ }
110
+ // Function type
111
+ if (t.isTSFunctionType(node)) {
112
+ return 'Function';
113
+ }
114
+ // Tuple type
115
+ if (t.isTSTupleType(node)) {
116
+ return `[${node.elementTypes.map(extractTypes).join(', ')}]`;
117
+ }
118
+ // Object/Interface type
119
+ if (t.isTSTypeLiteral(node)) {
120
+ return 'object';
121
+ }
122
+ return 'any';
123
+ }
124
+ /**
125
+ * Extract qualified name (e.g., React.FC -> "React.FC")
126
+ */
127
+ function extractQualifiedName(node) {
128
+ const parts = [];
129
+ if (t.isIdentifier(node.left)) {
130
+ parts.push(node.left.name);
131
+ }
132
+ else if (t.isTSQualifiedName(node.left)) {
133
+ parts.push(extractQualifiedName(node.left));
134
+ }
135
+ parts.push(node.right.name);
136
+ return parts.join('.');
137
+ }
138
+ /**
139
+ * Generate a mock value based on type
140
+ */
141
+ function generateMockValue(type) {
142
+ const typeMap = {
143
+ string: "'test-string'",
144
+ number: '42',
145
+ boolean: 'true',
146
+ any: 'undefined',
147
+ unknown: 'undefined',
148
+ void: 'undefined',
149
+ null: 'null',
150
+ undefined: 'undefined',
151
+ object: '{}',
152
+ Function: 'jest.fn()',
153
+ array: '[]',
154
+ };
155
+ // Check for array types
156
+ if (type.endsWith('[]')) {
157
+ return '[]';
158
+ }
159
+ // Check for function types
160
+ if (type.includes('=>') || type === 'Function') {
161
+ return 'jest.fn()';
162
+ }
163
+ return typeMap[type] || '{}';
164
+ }
165
+ //# sourceMappingURL=typeExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeExtractor.js","sourceRoot":"","sources":["../../src/parser/typeExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ <%
2
+ const testLib = helpers.getTestingLibrary(analysis.framework);
3
+ const sourceImport = helpers.getRelativeImport(analysis.filePath.replace(/\.(tsx?|jsx?)$/, '.test.$1'), analysis.filePath);
4
+ %>
5
+ import React from 'react';
6
+ import { <%= testLib.imports.join(', ') %> } from '<%= testLib.package %>';
7
+ <% analysis.components.forEach(component => { %>
8
+ import { <%= component.name %> } from '<%= sourceImport %>';
9
+ <% }); %>
10
+
11
+ <% analysis.components.forEach(component => { %>
12
+ describe('<%= component.name %>', () => {
13
+ const defaultProps = {
14
+ <% component.props.forEach((prop, index) => { %>
15
+ <%= prop.name %>: <%= helpers.generatePropValue(prop) %><%= index < component.props.length - 1 ? ',' : '' %>
16
+ <% }); %>
17
+ };
18
+
19
+ beforeEach(() => {
20
+ jest.clearAllMocks();
21
+ });
22
+
23
+ it('renders without crashing', () => {
24
+ render(<<%= component.name %> {...defaultProps} />);
25
+ });
26
+
27
+ <% if (options.snapshot) { %>
28
+ it('matches snapshot', () => {
29
+ const { toJSON } = render(<<%= component.name %> {...defaultProps} />);
30
+ expect(toJSON()).toMatchSnapshot();
31
+ });
32
+
33
+ <% } %>
34
+ <% component.props.filter(p => p.required).forEach(prop => { %>
35
+ it('renders with <%= prop.name %> prop', () => {
36
+ render(<<%= component.name %> {...defaultProps} />);
37
+ // TODO: Add specific assertions for <%= prop.name %>
38
+ });
39
+
40
+ <% }); %>
41
+ <% component.events.forEach(event => { %>
42
+ it('calls <%= event %> when triggered', () => {
43
+ const handler = jest.fn();
44
+ render(<<%= component.name %> {...defaultProps} <%= event %>={handler} />);
45
+
46
+ // TODO: Trigger the <%= event %> event
47
+ // Example for React Native:
48
+ // fireEvent.press(screen.getByTestId('button'));
49
+ // Example for React:
50
+ // fireEvent.click(screen.getByRole('button'));
51
+
52
+ // expect(handler).toHaveBeenCalled();
53
+ });
54
+
55
+ <% }); %>
56
+ <% component.hooks.forEach(hook => { %>
57
+ // Hook: <%= hook %>
58
+ it('uses <%= hook %> correctly', () => {
59
+ render(<<%= component.name %> {...defaultProps} />);
60
+ // TODO: Add assertions for <%= hook %> behavior
61
+ });
62
+
63
+ <% }); %>
64
+ });
65
+
66
+ <% }); %>
67
+
@@ -0,0 +1,59 @@
1
+ <%
2
+ const sourceImport = helpers.getRelativeImport(analysis.filePath.replace(/\.(tsx?|jsx?)$/, '.test.$1'), analysis.filePath);
3
+ %>
4
+ <% analysis.functions.forEach(func => { %>
5
+ import { <%= func.name %> } from '<%= sourceImport %>';
6
+ <% }); %>
7
+
8
+ <% analysis.functions.forEach(func => { %>
9
+ describe('<%= func.name %>', () => {
10
+ beforeEach(() => {
11
+ jest.clearAllMocks();
12
+ });
13
+
14
+ <% if (func.isAsync) { %>
15
+ it('should resolve successfully', async () => {
16
+ const result = await <%= func.name %>(<%= func.params.map(p => helpers.generateMockValue(p.type)).join(', ') %>);
17
+
18
+ // TODO: Add assertions
19
+ expect(result).toBeDefined();
20
+ });
21
+
22
+ it('should handle errors gracefully', async () => {
23
+ // TODO: Mock error scenario
24
+ // Example:
25
+ // jest.spyOn(someModule, 'someMethod').mockRejectedValue(new Error('Test error'));
26
+ // await expect(<%= func.name %>()).rejects.toThrow('Test error');
27
+ });
28
+ <% } else { %>
29
+ it('should return expected result', () => {
30
+ const result = <%= func.name %>(<%= func.params.map(p => helpers.generateMockValue(p.type)).join(', ') %>);
31
+
32
+ // TODO: Add assertions
33
+ expect(result).toBeDefined();
34
+ });
35
+
36
+ it('should handle edge cases', () => {
37
+ // TODO: Test with edge case values
38
+ // Example: empty strings, zero, null, undefined, etc.
39
+ });
40
+ <% } %>
41
+
42
+ <% func.params.forEach(param => { %>
43
+ describe('<%= param.name %> parameter', () => {
44
+ it('should handle valid <%= param.name %>', () => {
45
+ // TODO: Test with valid <%= param.name %> values
46
+ });
47
+
48
+ <% if (!param.optional) { %>
49
+ it('should handle missing <%= param.name %>', () => {
50
+ // TODO: Test behavior when <%= param.name %> is missing
51
+ });
52
+ <% } %>
53
+ });
54
+
55
+ <% }); %>
56
+ });
57
+
58
+ <% }); %>
59
+
@@ -0,0 +1,48 @@
1
+ <%
2
+ const testLib = helpers.getTestingLibrary(analysis.framework);
3
+ const sourceImport = helpers.getRelativeImport(analysis.filePath.replace(/\.(tsx?|jsx?)$/, '.test.$1'), analysis.filePath);
4
+ %>
5
+ import React from 'react';
6
+ import { render } from '<%= testLib.package %>';
7
+ <% analysis.components.forEach(component => { %>
8
+ import { <%= component.name %> } from '<%= sourceImport %>';
9
+ <% }); %>
10
+
11
+ <% analysis.components.forEach(component => { %>
12
+ describe('<%= component.name %> Snapshots', () => {
13
+ const defaultProps = {
14
+ <% component.props.forEach((prop, index) => { %>
15
+ <%= prop.name %>: <%= helpers.generatePropValue(prop) %><%= index < component.props.length - 1 ? ',' : '' %>
16
+ <% }); %>
17
+ };
18
+
19
+ it('renders correctly with default props', () => {
20
+ const { toJSON } = render(<<%= component.name %> {...defaultProps} />);
21
+ expect(toJSON()).toMatchSnapshot();
22
+ });
23
+
24
+ <% component.props.filter(p => p.type === 'boolean').forEach(prop => { %>
25
+ it('renders correctly with <%= prop.name %>=true', () => {
26
+ const { toJSON } = render(<<%= component.name %> {...defaultProps} <%= prop.name %>={true} />);
27
+ expect(toJSON()).toMatchSnapshot();
28
+ });
29
+
30
+ it('renders correctly with <%= prop.name %>=false', () => {
31
+ const { toJSON } = render(<<%= component.name %> {...defaultProps} <%= prop.name %>={false} />);
32
+ expect(toJSON()).toMatchSnapshot();
33
+ });
34
+
35
+ <% }); %>
36
+ <% component.props.filter(p => !p.required).forEach(prop => { %>
37
+ it('renders correctly without <%= prop.name %>', () => {
38
+ const propsWithout<%= prop.name.charAt(0).toUpperCase() + prop.name.slice(1) %> = { ...defaultProps };
39
+ delete propsWithout<%= prop.name.charAt(0).toUpperCase() + prop.name.slice(1) %>.<%= prop.name %>;
40
+ const { toJSON } = render(<<%= component.name %> {...propsWithout<%= prop.name.charAt(0).toUpperCase() + prop.name.slice(1) %>} />);
41
+ expect(toJSON()).toMatchSnapshot();
42
+ });
43
+
44
+ <% }); %>
45
+ });
46
+
47
+ <% }); %>
48
+