test-gen-js 0.1.2 โ†’ 0.2.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/CHANGELOG.md CHANGED
@@ -9,9 +9,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ### Planned
11
11
  - Directory scanning (`scan` command)
12
- - Configuration file support (`.testgenrc.js`)
13
12
  - Node.js backend support
14
13
  - Custom templates
14
+ - Watch mode
15
+ - Prettier/ESLint integration
16
+
17
+ ---
18
+
19
+ ## [0.2.0] - 2024-01-07
20
+
21
+ ### Added
22
+ - ๐ŸŽ‰ `init` command - Initialize test-gen-js configuration
23
+ - Creates `.testgenrc.js` configuration file
24
+ - Sets up Git hooks with husky and lint-staged
25
+ - Pre-commit hook runs tests automatically before each commit
26
+ - Configuration file support (`.testgenrc.js`)
27
+
28
+ ### Commands
29
+ - `test-gen-js init` - Initialize configuration and Git hooks
30
+ - `--no-hooks` - Skip Git hooks setup
31
+ - `--force` - Overwrite existing configuration
32
+
33
+ ### How Pre-commit Testing Works
34
+ 1. Run `npx test-gen-js init` in your project
35
+ 2. Husky and lint-staged are automatically installed
36
+ 3. When you run `git commit`, tests run for staged files
37
+ 4. If tests pass, commit proceeds; if tests fail, commit is blocked
15
38
 
16
39
  ---
17
40
 
@@ -65,7 +88,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
65
88
 
66
89
  ---
67
90
 
68
- [Unreleased]: https://github.com/liveforownhappiness/test-gen-js/compare/v0.1.0...HEAD
91
+ [Unreleased]: https://github.com/liveforownhappiness/test-gen-js/compare/v0.2.0...HEAD
92
+ [0.2.0]: https://github.com/liveforownhappiness/test-gen-js/compare/v0.1.0...v0.2.0
69
93
  [0.1.0]: https://github.com/liveforownhappiness/test-gen-js/releases/tag/v0.1.0
70
94
  [0.0.1]: https://github.com/liveforownhappiness/test-gen-js/releases/tag/v0.0.1
71
95
 
package/README.md CHANGED
@@ -8,50 +8,88 @@
8
8
 
9
9
  ---
10
10
 
11
- ## ๐ŸŽฏ ๋ชฉํ‘œ (Goal)
11
+ ## ๐ŸŽฏ Goal
12
12
 
13
- > **"ํ…Œ์ŠคํŠธ 0๊ฐœ โ†’ ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ๋ผ๋„ ์žˆ๋Š” ์ƒํƒœ"**
13
+ > **"From zero tests to having basic tests"**
14
14
 
15
- ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์™„๋ฒฝํ•œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๊ฐ€ ์•„๋‹Œ, **ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์˜ ์ง„์ž… ์žฅ๋ฒฝ์„ ๋‚ฎ์ถ”๋Š” ๊ฒƒ**์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
15
+ This library is not about perfect test automation, but about **lowering the barrier to writing tests**.
16
16
 
17
- ### ์ด ๋„๊ตฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ
17
+ ### Problems This Tool Solves
18
18
 
19
- | ๋ฌธ์ œ | ํ•ด๊ฒฐ |
20
- |------|------|
21
- | ๐Ÿ˜ซ "ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ ๊ท€์ฐฎ์•„์š”" | โœ… ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ž๋™ ์ƒ์„ฑ |
22
- | ๐Ÿค” "์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”" | โœ… ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์‹œ์ž‘์  ์ œ๊ณต |
23
- | ๐Ÿ˜ฐ "๋ Œ๋”๋ง ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ๋„ ์—†์–ด์š”" | โœ… ์ตœ์†Œํ•œ์˜ ์•ˆ์ „๋ง ์ œ๊ณต |
24
- | ๐Ÿ“š "ํ…Œ์ŠคํŠธ ์ž‘์„ฑ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์–ด์š”" | โœ… ํ•™์Šต ๋„๊ตฌ๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅ |
19
+ | Problem | Solution |
20
+ |---------|----------|
21
+ | ๐Ÿ˜ซ "Creating test files is tedious" | โœ… Auto-generate boilerplate |
22
+ | ๐Ÿค” "I don't know how to start" | โœ… Provide a working starting point |
23
+ | ๐Ÿ˜ฐ "I don't even have basic render tests" | โœ… Provide minimal safety net |
24
+ | ๐Ÿ“š "I want to learn how to write tests" | โœ… Use as a learning tool |
25
25
 
26
- ### ์ด ๋„๊ตฌ์˜ ํ•œ๊ณ„
26
+ ### Limitations
27
27
 
28
28
  ```
29
- โŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ…Œ์ŠคํŠธ ์ž๋™ ์ƒ์„ฑ โ†’ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑ ํ•„์š”
30
- โŒ ์™„๋ฒฝํ•œ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ โ†’ ๋ถˆ๊ฐ€๋Šฅ (80% ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ, 20% ์ง์ ‘ ์ž‘์„ฑ)
29
+ โŒ Auto-generate business logic tests โ†’ Developers must write these
30
+ โŒ Perfect test coverage โ†’ Not possible (80% boilerplate, 20% manual)
31
31
  ```
32
32
 
33
33
  ---
34
34
 
35
- ## ๐Ÿ“ฆ ์„ค์น˜ (Installation)
35
+ ## ๐Ÿ“ฆ Installation
36
36
 
37
37
  ```bash
38
- # ์ „์—ญ ์„ค์น˜
38
+ # Global installation
39
39
  npm install -g test-gen-js
40
40
 
41
- # ๋˜๋Š” npx๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉ (์„ค์น˜ ์—†์ด)
41
+ # Or use with npx (no installation required)
42
42
  npx test-gen-js generate src/components/Button.tsx
43
43
 
44
- # ๋˜๋Š” ํ”„๋กœ์ ํŠธ devDependency๋กœ ์„ค์น˜
44
+ # Or install as devDependency
45
45
  npm install -D test-gen-js
46
46
  ```
47
47
 
48
48
  ---
49
49
 
50
- ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ (Quick Start)
50
+ ## ๐Ÿ› ๏ธ Setup with Git Hooks (Recommended)
51
51
 
52
- ### 1. React ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ
52
+ Set up automatic testing before each commit:
53
53
 
54
- **์ž…๋ ฅ: `src/components/Button.tsx`**
54
+ ```bash
55
+ # 1. Install as dev dependency
56
+ npm install -D test-gen-js
57
+
58
+ # 2. Initialize (creates config + sets up Git hooks)
59
+ npx test-gen-js init
60
+
61
+ # 3. Generate tests for your components
62
+ npx test-gen-js generate src/components/Button.tsx
63
+
64
+ # 4. Now when you commit, tests run automatically!
65
+ git add .
66
+ git commit -m "feat: add Button component"
67
+ # ๐Ÿงช Running tests before commit...
68
+ # โœ… Tests passed!
69
+ ```
70
+
71
+ ### What `init` Does
72
+
73
+ | Item | Description |
74
+ |------|-------------|
75
+ | `.testgenrc.js` | Creates configuration file |
76
+ | `husky` | Installs Git hooks manager |
77
+ | `lint-staged` | Runs tests on staged files only |
78
+ | `pre-commit` | Tests run before each commit |
79
+
80
+ ### Pre-commit Behavior
81
+
82
+ - โœ… Tests pass โ†’ Commit proceeds
83
+ - โŒ Tests fail โ†’ Commit is **blocked**
84
+ - โญ๏ธ Skip with `git commit --no-verify` (not recommended)
85
+
86
+ ---
87
+
88
+ ## ๐Ÿš€ Quick Start
89
+
90
+ ### 1. Generate React Component Tests
91
+
92
+ **Input: `src/components/Button.tsx`**
55
93
 
56
94
  ```tsx
57
95
  import React from 'react';
@@ -72,13 +110,13 @@ export const Button = ({ title, onPress, disabled = false, loading = false }: Bu
72
110
  };
73
111
  ```
74
112
 
75
- **๋ช…๋ น์–ด ์‹คํ–‰:**
113
+ **Run command:**
76
114
 
77
115
  ```bash
78
116
  npx test-gen-js generate src/components/Button.tsx
79
117
  ```
80
118
 
81
- **์ถœ๋ ฅ: `src/components/Button.test.tsx`**
119
+ **Output: `src/components/Button.test.tsx`**
82
120
 
83
121
  ```tsx
84
122
  import React from 'react';
@@ -120,9 +158,9 @@ describe('Button', () => {
120
158
 
121
159
  ---
122
160
 
123
- ### 2. React Native ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ
161
+ ### 2. Generate React Native Component Tests
124
162
 
125
- **์ž…๋ ฅ: `src/components/Card.tsx`**
163
+ **Input: `src/components/Card.tsx`**
126
164
 
127
165
  ```tsx
128
166
  import React, { useState } from 'react';
@@ -152,13 +190,13 @@ const styles = StyleSheet.create({
152
190
  });
153
191
  ```
154
192
 
155
- **๋ช…๋ น์–ด ์‹คํ–‰:**
193
+ **Run command:**
156
194
 
157
195
  ```bash
158
196
  npx test-gen-js generate src/components/Card.tsx --snapshot
159
197
  ```
160
198
 
161
- **์ถœ๋ ฅ: `src/components/Card.test.tsx`**
199
+ **Output: `src/components/Card.test.tsx`**
162
200
 
163
201
  ```tsx
164
202
  import React from 'react';
@@ -203,9 +241,9 @@ describe('Card', () => {
203
241
 
204
242
  ---
205
243
 
206
- ### 3. ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ
244
+ ### 3. Generate Function Tests
207
245
 
208
- **์ž…๋ ฅ: `src/utils/calculate.ts`**
246
+ **Input: `src/utils/calculate.ts`**
209
247
 
210
248
  ```typescript
211
249
  export function calculateDiscount(price: number, discountRate: number): number {
@@ -221,13 +259,13 @@ export async function fetchUserData(userId: string): Promise<User> {
221
259
  }
222
260
  ```
223
261
 
224
- **๋ช…๋ น์–ด ์‹คํ–‰:**
262
+ **Run command:**
225
263
 
226
264
  ```bash
227
265
  npx test-gen-js generate src/utils/calculate.ts
228
266
  ```
229
267
 
230
- **์ถœ๋ ฅ: `src/utils/calculate.test.ts`**
268
+ **Output: `src/utils/calculate.test.ts`**
231
269
 
232
270
  ```typescript
233
271
  import { calculateDiscount, fetchUserData } from './calculate';
@@ -279,88 +317,122 @@ describe('fetchUserData', () => {
279
317
 
280
318
  ---
281
319
 
282
- ## ๐Ÿ“‹ CLI ๋ช…๋ น์–ด
320
+ ## ๐Ÿ“‹ CLI Commands
283
321
 
284
- ### `generate` (๋ณ„์นญ: `g`)
322
+ ### `generate` (alias: `g`)
285
323
 
286
- ๋‹จ์ผ ํŒŒ์ผ์—์„œ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ
324
+ Generate tests for a single file
287
325
 
288
326
  ```bash
289
- # ๊ธฐ๋ณธ ์‚ฌ์šฉ
327
+ # Basic usage
290
328
  test-gen-js generate <file>
291
329
  tgjs g <file>
292
330
 
293
- # ์˜ต์…˜
294
- --output, -o <path> # ์ถœ๋ ฅ ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ •
295
- --template, -t <type> # ํ…œํ”Œ๋ฆฟ ํƒ€์ž… (component | function | hook)
296
- --snapshot # ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ ํฌํ•จ
297
- --mock # Mock ์ž๋™ ์ƒ์„ฑ (๊ธฐ๋ณธ: true)
298
- --overwrite # ๊ธฐ์กด ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ
331
+ # Options
332
+ --output, -o <path> # Specify output file path
333
+ --template, -t <type> # Template type (component | function | hook)
334
+ --snapshot # Include snapshot tests
335
+ --mock # Auto-generate mocks (default: true)
336
+ --overwrite # Overwrite existing file
299
337
  ```
300
338
 
301
- **์˜ˆ์‹œ:**
339
+ **Examples:**
302
340
 
303
341
  ```bash
304
- # ๊ธฐ๋ณธ ์ƒ์„ฑ
342
+ # Basic generation
305
343
  tgjs g src/components/Header.tsx
306
344
 
307
- # ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ ํฌํ•จ
345
+ # Include snapshot tests
308
346
  tgjs g src/components/Header.tsx --snapshot
309
347
 
310
- # ์ปค์Šคํ…€ ์ถœ๋ ฅ ๊ฒฝ๋กœ
348
+ # Custom output path
311
349
  tgjs g src/components/Header.tsx -o __tests__/Header.test.tsx
312
350
 
313
- # ๊ธฐ์กด ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ
351
+ # Overwrite existing file
314
352
  tgjs g src/components/Header.tsx --overwrite
315
353
  ```
316
354
 
317
- ### `scan` (๋ณ„์นญ: `s`) - v0.2.0 ์˜ˆ์ •
355
+ ### `scan` (alias: `s`) - Coming in v0.2.0
318
356
 
319
- ๋””๋ ‰ํ† ๋ฆฌ ์ „์ฒด ์Šค์บ” ๋ฐ ์ผ๊ด„ ์ƒ์„ฑ
357
+ Scan directory and generate tests for all files
320
358
 
321
359
  ```bash
322
- # ๊ธฐ๋ณธ ์‚ฌ์šฉ
360
+ # Basic usage
323
361
  test-gen-js scan <directory>
324
362
 
325
- # ์˜ต์…˜
326
- --dry-run # ๋ฏธ๋ฆฌ๋ณด๊ธฐ (ํŒŒ์ผ ์ƒ์„ฑ ์•ˆ ํ•จ)
327
- --pattern <glob> # ํŒŒ์ผ ํŒจํ„ด (๊ธฐ๋ณธ: **/*.{ts,tsx,js,jsx})
328
- --exclude <patterns> # ์ œ์™ธ ํŒจํ„ด
363
+ # Options
364
+ --dry-run # Preview without creating files
365
+ --pattern <glob> # File pattern (default: **/*.{ts,tsx,js,jsx})
366
+ --exclude <patterns> # Patterns to exclude
329
367
  ```
330
368
 
331
- ### `init` - v0.2.0 ์˜ˆ์ •
369
+ ### `init`
332
370
 
333
- ์„ค์ • ํŒŒ์ผ ์ดˆ๊ธฐํ™”
371
+ Initialize test-gen-js configuration and set up Git hooks for pre-commit testing.
334
372
 
335
373
  ```bash
374
+ # Basic usage - creates config and sets up Git hooks
336
375
  test-gen-js init
376
+
377
+ # Options
378
+ --no-hooks # Skip Git hooks setup
379
+ --force # Overwrite existing configuration
380
+ ```
381
+
382
+ **What it does:**
383
+
384
+ 1. Creates `.testgenrc.js` configuration file
385
+ 2. Installs `husky` and `lint-staged` (if not present)
386
+ 3. Sets up pre-commit hook to run tests before each commit
387
+
388
+ **Example:**
389
+
390
+ ```bash
391
+ # Install test-gen-js as dev dependency
392
+ npm install -D test-gen-js
393
+
394
+ # Initialize (sets up Git hooks)
395
+ npx test-gen-js init
396
+
397
+ # Now when you commit, tests will run automatically!
398
+ git add .
399
+ git commit -m "feat: add new component"
400
+ # ๐Ÿงช Running tests before commit...
401
+ # โœ… Tests passed, commit successful!
337
402
  ```
338
403
 
404
+ **Pre-commit behavior:**
405
+
406
+ - Tests run only for **staged files** (files you're committing)
407
+ - If tests fail, commit is **blocked**
408
+ - If tests pass, commit proceeds normally
409
+ - Use `git commit --no-verify` to skip tests (not recommended)
410
+
339
411
  ---
340
412
 
341
- ## ๐Ÿ“Š ์ง€์› ๋ฒ”์œ„
413
+ ## ๐Ÿ“Š Supported Types
342
414
 
343
- | ํƒ€์ž… | ์ง€์› ์—ฌ๋ถ€ | ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ | ๋น„๊ณ  |
344
- |------|----------|-----------------|------|
345
- | JavaScript ํ•จ์ˆ˜ | โœ… | Jest | |
346
- | TypeScript ํ•จ์ˆ˜ | โœ… | Jest | ํƒ€์ž… ๋ถ„์„ ์ง€์› |
347
- | React ์ปดํฌ๋„ŒํŠธ | โœ… | Jest + @testing-library/react | |
348
- | React Native ์ปดํฌ๋„ŒํŠธ | โœ… | Jest + @testing-library/react-native | |
415
+ | Type | Support | Test Framework | Notes |
416
+ |------|---------|----------------|-------|
417
+ | JavaScript functions | โœ… | Jest | |
418
+ | TypeScript functions | โœ… | Jest | Type analysis supported |
419
+ | React components | โœ… | Jest + @testing-library/react | |
420
+ | React Native components | โœ… | Jest + @testing-library/react-native | |
349
421
  | Custom Hooks | โœ… | Jest + @testing-library/react-hooks | |
350
- | Node.js ๋ชจ๋“ˆ | ๐Ÿ”œ v0.2 | Jest | |
351
- | Express ํ•ธ๋“ค๋Ÿฌ | ๐Ÿ”œ v0.2 | Jest + supertest | |
352
- | Vue ์ปดํฌ๋„ŒํŠธ | ๐Ÿ”œ ํ”Œ๋Ÿฌ๊ทธ์ธ | Vitest | |
353
- | Angular ์ปดํฌ๋„ŒํŠธ | ๐Ÿ”œ ํ”Œ๋Ÿฌ๊ทธ์ธ | Jasmine | |
422
+ | Node.js modules | ๐Ÿ”œ v0.2 | Jest | |
423
+ | Express handlers | ๐Ÿ”œ v0.2 | Jest + supertest | |
424
+ | Vue components | ๐Ÿ”œ Plugin | Vitest | |
425
+ | Angular components | ๐Ÿ”œ Plugin | Jasmine | |
354
426
 
355
427
  ---
356
428
 
357
- ## ๐Ÿ”ง ์ž‘๋™ ์›๋ฆฌ
429
+ ## ๐Ÿ”ง How It Works
358
430
 
359
- ### AST (Abstract Syntax Tree) ๋ถ„์„
431
+ ### AST (Abstract Syntax Tree) Analysis
360
432
 
361
433
  ```
362
434
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
363
- โ”‚ 1. ์ž…๋ ฅ: Button.tsx โ”‚
435
+ โ”‚ 1. Input: Button.tsx โ”‚
364
436
  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
365
437
  โ”‚ export const Button = ({ title, onPress, disabled }) => { โ”‚
366
438
  โ”‚ const [loading, setLoading] = useState(false); โ”‚
@@ -374,7 +446,7 @@ test-gen-js init
374
446
  โ”‚
375
447
  โ–ผ Babel Parser
376
448
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
377
- โ”‚ 2. AST ๋ถ„์„ ๊ฒฐ๊ณผ โ”‚
449
+ โ”‚ 2. AST Analysis Result โ”‚
378
450
  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
379
451
  โ”‚ { โ”‚
380
452
  โ”‚ name: "Button", โ”‚
@@ -392,7 +464,7 @@ test-gen-js init
392
464
  โ”‚
393
465
  โ–ผ EJS Template
394
466
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
395
- โ”‚ 3. ์ถœ๋ ฅ: Button.test.tsx โ”‚
467
+ โ”‚ 3. Output: Button.test.tsx โ”‚
396
468
  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
397
469
  โ”‚ describe('Button', () => { โ”‚
398
470
  โ”‚ const defaultProps = { title: '...', onPress: jest.fn() }; โ”‚
@@ -403,90 +475,91 @@ test-gen-js init
403
475
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
404
476
  ```
405
477
 
406
- ### ์ž๋™ํ™” ๋ฒ”์œ„
478
+ ### Automation Coverage
407
479
 
408
- | ์˜์—ญ | ์ž๋™ํ™” ์ˆ˜์ค€ | ์„ค๋ช… |
409
- |------|------------|------|
410
- | import ๋ฌธ | โœ… 100% | ํ”„๋ ˆ์ž„์›Œํฌ ์ž๋™ ๊ฐ์ง€ |
411
- | describe/it ๊ตฌ์กฐ | โœ… 100% | ์ปดํฌ๋„ŒํŠธ/ํ•จ์ˆ˜๋ช… ๊ธฐ๋ฐ˜ |
412
- | defaultProps ์ƒ์„ฑ | โœ… 80% | TypeScript ํƒ€์ž… ๋ถ„์„ |
413
- | Mock ์„ค์ • | โœ… 70% | ์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž๋™ ๊ฐ์ง€ |
414
- | ๋ Œ๋”๋ง ํ…Œ์ŠคํŠธ | โœ… 100% | ๊ธฐ๋ณธ ์ œ๊ณต |
415
- | ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ…Œ์ŠคํŠธ | โœ… 60% | onPress, onClick ๋“ฑ ๊ฐ์ง€ |
416
- | Hook ํ…Œ์ŠคํŠธ | โœ… 50% | useState, useEffect ๋“ฑ ๊ฐ์ง€ |
417
- | **๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ…Œ์ŠคํŠธ** | โŒ 0% | **๊ฐœ๋ฐœ์ž ์ง์ ‘ ์ž‘์„ฑ ํ•„์š”** |
480
+ | Area | Automation Level | Description |
481
+ |------|------------------|-------------|
482
+ | Import statements | โœ… 100% | Auto-detect framework |
483
+ | describe/it structure | โœ… 100% | Based on component/function name |
484
+ | defaultProps generation | โœ… 80% | TypeScript type analysis |
485
+ | Mock setup | โœ… 70% | Auto-detect major libraries |
486
+ | Render tests | โœ… 100% | Always provided |
487
+ | Event handler tests | โœ… 60% | Detect onPress, onClick, etc. |
488
+ | Hook tests | โœ… 50% | Detect useState, useEffect, etc. |
489
+ | **Business logic tests** | โŒ 0% | **Developer must write** |
418
490
 
419
491
  ---
420
492
 
421
- ## ๐Ÿ—บ๏ธ ๋กœ๋“œ๋งต (Roadmap)
493
+ ## ๐Ÿ—บ๏ธ Roadmap
422
494
 
423
- ### โœ… 1๋‹จ๊ณ„: MVP (v0.1.x) - ํ˜„์žฌ
495
+ ### โœ… Phase 1: MVP (v0.1.x) - Current
424
496
 
425
- - [x] ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์„ค์ •
426
- - [x] AST ํŒŒ์„œ ๊ตฌํ˜„ (Babel ๊ธฐ๋ฐ˜)
427
- - [x] CLI ์ธํ„ฐํŽ˜์ด์Šค (commander)
428
- - [x] ๊ธฐ๋ณธ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ๊ธฐ
429
- - [x] React ์ปดํฌ๋„ŒํŠธ
430
- - [x] React Native ์ปดํฌ๋„ŒํŠธ
431
- - [x] JavaScript/TypeScript ํ•จ์ˆ˜
432
- - [x] EJS ํ…œํ”Œ๋ฆฟ ์‹œ์Šคํ…œ
497
+ - [x] Project structure setup
498
+ - [x] AST parser implementation (Babel-based)
499
+ - [x] CLI interface (commander)
500
+ - [x] Basic test generator
501
+ - [x] React components
502
+ - [x] React Native components
503
+ - [x] JavaScript/TypeScript functions
504
+ - [x] EJS template system
433
505
  - [x] GitHub Actions CI/CD
434
- - [x] npm ์ž๋™ ํผ๋ธ”๋ฆฌ์‹œ
506
+ - [x] Automated npm publishing
435
507
 
436
- ### ๐Ÿ”œ 2๋‹จ๊ณ„: ํ™•์žฅ (v0.2.x)
508
+ ### ๐Ÿ”œ Phase 2: Extended Features (v0.2.x)
437
509
 
438
- - [ ] ๋””๋ ‰ํ† ๋ฆฌ ์Šค์บ” ๋ฐ ์ผ๊ด„ ์ƒ์„ฑ (`scan` ๋ช…๋ น์–ด)
439
- - [ ] ์„ค์ • ํŒŒ์ผ ์ง€์› (`.testgenrc.js`)
440
- - [ ] Node.js ๋ฐฑ์—”๋“œ ์ง€์›
441
- - [ ] Mock ์ž๋™ ์ƒ์„ฑ ๊ฐœ์„ 
442
- - [ ] Prettier/ESLint ์—ฐ๋™
443
- - [ ] Watch ๋ชจ๋“œ
444
- - [ ] ์ปค์Šคํ…€ ํ…œํ”Œ๋ฆฟ ์ง€์›
510
+ - [ ] Directory scanning and batch generation (`scan` command)
511
+ - [x] Configuration file support (`.testgenrc.js`)
512
+ - [x] Git hooks for pre-commit testing (`init` command)
513
+ - [ ] Node.js backend support
514
+ - [ ] Improved mock generation
515
+ - [ ] Prettier/ESLint integration
516
+ - [ ] Watch mode
517
+ - [ ] Custom template support
445
518
 
446
- ### ๐Ÿ”ฎ 3๋‹จ๊ณ„: ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ (v0.3.x+)
519
+ ### ๐Ÿ”ฎ Phase 3: Plugin System (v0.3.x+)
447
520
 
448
- - [ ] ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜
449
- - [ ] Vue.js ํ”Œ๋Ÿฌ๊ทธ์ธ
450
- - [ ] Angular ํ”Œ๋Ÿฌ๊ทธ์ธ
451
- - [ ] VS Code ํ™•์žฅ
452
- - [ ] AI ํ†ตํ•ฉ (์„ ํƒ์ )
521
+ - [ ] Plugin architecture
522
+ - [ ] Vue.js plugin
523
+ - [ ] Angular plugin
524
+ - [ ] VS Code extension
525
+ - [ ] AI integration (optional)
453
526
 
454
527
  ---
455
528
 
456
- ## ๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
529
+ ## ๐Ÿ“ Project Structure
457
530
 
458
531
  ```
459
532
  test-gen-js/
460
533
  โ”œโ”€โ”€ bin/
461
- โ”‚ โ””โ”€โ”€ cli.js # CLI ์ง„์ž…์ 
534
+ โ”‚ โ””โ”€โ”€ cli.js # CLI entry point
462
535
  โ”œโ”€โ”€ src/
463
- โ”‚ โ”œโ”€โ”€ index.ts # ๋ฉ”์ธ export
464
- โ”‚ โ”œโ”€โ”€ cli.ts # CLI ๋กœ์ง (commander)
465
- โ”‚ โ”œโ”€โ”€ types.ts # TypeScript ํƒ€์ž… ์ •์˜
536
+ โ”‚ โ”œโ”€โ”€ index.ts # Main exports
537
+ โ”‚ โ”œโ”€โ”€ cli.ts # CLI logic (commander)
538
+ โ”‚ โ”œโ”€โ”€ types.ts # TypeScript type definitions
466
539
  โ”‚ โ”œโ”€โ”€ analyzer/
467
540
  โ”‚ โ”‚ โ”œโ”€โ”€ index.ts
468
- โ”‚ โ”‚ โ”œโ”€โ”€ fileAnalyzer.ts # ํŒŒ์ผ ๋ถ„์„ ๋ฉ”์ธ
469
- โ”‚ โ”‚ โ”œโ”€โ”€ componentAnalyzer.ts # React ์ปดํฌ๋„ŒํŠธ ๋ถ„์„
470
- โ”‚ โ”‚ โ””โ”€โ”€ functionAnalyzer.ts # ํ•จ์ˆ˜ ๋ถ„์„
541
+ โ”‚ โ”‚ โ”œโ”€โ”€ fileAnalyzer.ts # Main file analysis
542
+ โ”‚ โ”‚ โ”œโ”€โ”€ componentAnalyzer.ts # React component analysis
543
+ โ”‚ โ”‚ โ””โ”€โ”€ functionAnalyzer.ts # Function analysis
471
544
  โ”‚ โ”œโ”€โ”€ parser/
472
545
  โ”‚ โ”‚ โ”œโ”€โ”€ index.ts
473
- โ”‚ โ”‚ โ”œโ”€โ”€ astParser.ts # Babel AST ํŒŒ์‹ฑ
474
- โ”‚ โ”‚ โ””โ”€โ”€ typeExtractor.ts # TypeScript ํƒ€์ž… ์ถ”์ถœ
546
+ โ”‚ โ”‚ โ”œโ”€โ”€ astParser.ts # Babel AST parsing
547
+ โ”‚ โ”‚ โ””โ”€โ”€ typeExtractor.ts # TypeScript type extraction
475
548
  โ”‚ โ”œโ”€โ”€ generator/
476
549
  โ”‚ โ”‚ โ”œโ”€โ”€ index.ts
477
- โ”‚ โ”‚ โ”œโ”€โ”€ testGenerator.ts # ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ƒ์„ฑ
478
- โ”‚ โ”‚ โ””โ”€โ”€ mockGenerator.ts # Mock ์ฝ”๋“œ ์ƒ์„ฑ
550
+ โ”‚ โ”‚ โ”œโ”€โ”€ testGenerator.ts # Test code generation
551
+ โ”‚ โ”‚ โ””โ”€โ”€ mockGenerator.ts # Mock code generation
479
552
  โ”‚ โ”œโ”€โ”€ templates/
480
- โ”‚ โ”‚ โ”œโ”€โ”€ component.ejs # ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ ํ…œํ”Œ๋ฆฟ
481
- โ”‚ โ”‚ โ”œโ”€โ”€ function.ejs # ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ ํ…œํ”Œ๋ฆฟ
482
- โ”‚ โ”‚ โ””โ”€โ”€ snapshot.ejs # ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ ํ…œํ”Œ๋ฆฟ
553
+ โ”‚ โ”‚ โ”œโ”€โ”€ component.ejs # Component test template
554
+ โ”‚ โ”‚ โ”œโ”€โ”€ function.ejs # Function test template
555
+ โ”‚ โ”‚ โ””โ”€โ”€ snapshot.ejs # Snapshot test template
483
556
  โ”‚ โ””โ”€โ”€ utils/
484
- โ”‚ โ”œโ”€โ”€ fileUtils.ts # ํŒŒ์ผ ์œ ํ‹ธ๋ฆฌํ‹ฐ
485
- โ”‚ โ””โ”€โ”€ naming.ts # ๋„ค์ด๋ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ
557
+ โ”‚ โ”œโ”€โ”€ fileUtils.ts # File utilities
558
+ โ”‚ โ””โ”€โ”€ naming.ts # Naming utilities
486
559
  โ”œโ”€โ”€ .github/
487
560
  โ”‚ โ””โ”€โ”€ workflows/
488
- โ”‚ โ”œโ”€โ”€ ci.yml # CI (๋นŒ๋“œ/ํ…Œ์ŠคํŠธ)
489
- โ”‚ โ””โ”€โ”€ publish.yml # npm ์ž๋™ ํผ๋ธ”๋ฆฌ์‹œ
561
+ โ”‚ โ”œโ”€โ”€ ci.yml # CI (build/test)
562
+ โ”‚ โ””โ”€โ”€ publish.yml # Automated npm publish
490
563
  โ”œโ”€โ”€ package.json
491
564
  โ”œโ”€โ”€ tsconfig.json
492
565
  โ””โ”€โ”€ README.md
@@ -494,11 +567,11 @@ test-gen-js/
494
567
 
495
568
  ---
496
569
 
497
- ## ๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ (Contributing)
570
+ ## ๐Ÿค Contributing
498
571
 
499
- ๊ธฐ์—ฌ๋Š” ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!
572
+ Contributions are always welcome!
500
573
 
501
- ### ๊ธฐ์—ฌ ๋ฐฉ๋ฒ•
574
+ ### How to Contribute
502
575
 
503
576
  1. ๐Ÿด Fork the repository
504
577
  2. ๐ŸŒฟ Create your feature branch (`git checkout -b feature/amazing-feature`)
@@ -506,33 +579,33 @@ test-gen-js/
506
579
  4. ๐Ÿ“ค Push to the branch (`git push origin feature/amazing-feature`)
507
580
  5. ๐Ÿ”ƒ Open a Pull Request
508
581
 
509
- ### ๊ธฐ์—ฌ ์œ ํ˜•
582
+ ### Types of Contributions
510
583
 
511
- - ๐Ÿ› ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ
512
- - ๐Ÿ’ก ๊ธฐ๋Šฅ ์ œ์•ˆ
513
- - ๐Ÿ“ ๋ฌธ์„œ ๊ฐœ์„ 
514
- - ๐Ÿ”ง ์ฝ”๋“œ ๊ธฐ์—ฌ
515
- - ๐ŸŒ ๋ฒˆ์—ญ
584
+ - ๐Ÿ› Bug reports
585
+ - ๐Ÿ’ก Feature requests
586
+ - ๐Ÿ“ Documentation improvements
587
+ - ๐Ÿ”ง Code contributions
588
+ - ๐ŸŒ Translations
516
589
 
517
590
  ---
518
591
 
519
- ## ๐Ÿ“„ ๋ผ์ด์„ ์Šค (License)
592
+ ## ๐Ÿ“„ License
520
593
 
521
- MIT License - ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ, ์ˆ˜์ •, ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
594
+ MIT License - Feel free to use, modify, and distribute.
522
595
 
523
596
  ---
524
597
 
525
- ## ๐Ÿ™ ๊ฐ์‚ฌ์˜ ๊ธ€ (Acknowledgments)
598
+ ## ๐Ÿ™ Acknowledgments
526
599
 
527
- - [Babel](https://babeljs.io/) - JavaScript AST ํŒŒ์‹ฑ
528
- - [Jest](https://jestjs.io/) - ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ
529
- - [Testing Library](https://testing-library.com/) - ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ
530
- - [Commander.js](https://github.com/tj/commander.js) - CLI ํ”„๋ ˆ์ž„์›Œํฌ
531
- - [EJS](https://ejs.co/) - ํ…œํ”Œ๋ฆฟ ์—”์ง„
600
+ - [Babel](https://babeljs.io/) - JavaScript AST parsing
601
+ - [Jest](https://jestjs.io/) - Testing framework
602
+ - [Testing Library](https://testing-library.com/) - Testing utilities
603
+ - [Commander.js](https://github.com/tj/commander.js) - CLI framework
604
+ - [EJS](https://ejs.co/) - Template engine
532
605
 
533
606
  ---
534
607
 
535
- ## ๐Ÿ“ž ๋ฌธ์˜ (Contact)
608
+ ## ๐Ÿ“ž Contact
536
609
 
537
610
  - GitHub Issues: [https://github.com/liveforownhappiness/test-gen-js/issues](https://github.com/liveforownhappiness/test-gen-js/issues)
538
611
  - npm: [https://www.npmjs.com/package/test-gen-js](https://www.npmjs.com/package/test-gen-js)
package/dist/cli.js CHANGED
@@ -9,6 +9,7 @@ const chalk_1 = __importDefault(require("chalk"));
9
9
  const ora_1 = __importDefault(require("ora"));
10
10
  const analyzer_1 = require("./analyzer");
11
11
  const generator_1 = require("./generator");
12
+ const commands_1 = require("./commands");
12
13
  const program = new commander_1.Command();
13
14
  program
14
15
  .name('test-gen-js')
@@ -94,17 +95,19 @@ program
94
95
  // Init command
95
96
  program
96
97
  .command('init')
97
- .description('Initialize test-gen-js configuration')
98
- .action(async () => {
99
- const spinner = (0, ora_1.default)('Creating configuration...').start();
98
+ .description('Initialize test-gen-js configuration and Git hooks')
99
+ .option('--no-hooks', 'Skip Git hooks setup')
100
+ .option('--force', 'Overwrite existing configuration', false)
101
+ .action(async (options) => {
100
102
  try {
101
- // TODO: Implement config initialization
102
- spinner.info(chalk_1.default.yellow('Configuration file is coming in v0.2.0'));
103
+ await (0, commands_1.initCommand)({
104
+ hooks: options.hooks,
105
+ force: options.force,
106
+ });
103
107
  }
104
108
  catch (error) {
105
- spinner.fail(chalk_1.default.red('Failed to create configuration'));
106
109
  if (error instanceof Error) {
107
- console.error(chalk_1.default.red(error.message));
110
+ console.error(chalk_1.default.red('Error: ' + error.message));
108
111
  }
109
112
  process.exit(1);
110
113
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAsB;AACtB,yCAAyC;AACzC,2CAA2C;AAC3C,yCAAyC;AAGzC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,wEAAwE,CAAC;KACrF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;KAC1D,MAAM,CAAC,uBAAuB,EAAE,4CAA4C,EAAE,MAAM,CAAC;KACrF,MAAM,CAAC,YAAY,EAAE,wBAAwB,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,QAAQ,EAAE,sCAAsC,EAAE,IAAI,CAAC;KAC9D,MAAM,CAAC,aAAa,EAAE,8BAA8B,EAAE,KAAK,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAgD,EAAE,EAAE;IAC/E,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjD,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAErC,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAY,EAAC,QAAQ,EAAE;YAC1C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAErD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC/C,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC9C,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,WAAW,EAAE,gCAAgC,EAAE,KAAK,CAAC;KAC5D,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,sBAAsB,CAAC;KAC3E,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;KAC1G,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAAO,EAAE,EAAE;IAC3C,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,IAAI,CAAC;QACH,qCAAqC;QACrC,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,YAAY,EAAE,sBAAsB,CAAC;KAC5C,MAAM,CAAC,SAAS,EAAE,kCAAkC,EAAE,KAAK,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,OAA2C,EAAE,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,IAAA,sBAAW,EAAC;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Commands module
3
+ */
4
+ export { initCommand } from './init';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Commands module
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initCommand = void 0;
7
+ var init_1 = require("./init");
8
+ Object.defineProperty(exports, "initCommand", { enumerable: true, get: function () { return init_1.initCommand; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,+BAAqC;AAA5B,mGAAA,WAAW,OAAA"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Init Command
3
+ * Sets up test-gen-js configuration and Git hooks for pre-commit testing
4
+ */
5
+ interface InitOptions {
6
+ hooks?: boolean;
7
+ force?: boolean;
8
+ }
9
+ /**
10
+ * Initialize test-gen-js in a project
11
+ */
12
+ export declare function initCommand(options?: InitOptions): Promise<void>;
13
+ export default initCommand;
14
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B1E;AA8MD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ /**
3
+ * Init Command
4
+ * Sets up test-gen-js configuration and Git hooks for pre-commit testing
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.initCommand = initCommand;
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const chalk_1 = __importDefault(require("chalk"));
14
+ const ora_1 = __importDefault(require("ora"));
15
+ const child_process_1 = require("child_process");
16
+ /**
17
+ * Initialize test-gen-js in a project
18
+ */
19
+ async function initCommand(options = {}) {
20
+ const { hooks = true, force = false } = options;
21
+ const cwd = process.cwd();
22
+ console.log('');
23
+ console.log(chalk_1.default.cyan('๐Ÿงช Initializing test-gen-js...'));
24
+ console.log('');
25
+ // Check if package.json exists
26
+ const packageJsonPath = path_1.default.join(cwd, 'package.json');
27
+ if (!(await fs_extra_1.default.pathExists(packageJsonPath))) {
28
+ throw new Error('package.json not found. Please run this command in a Node.js project.');
29
+ }
30
+ // Create configuration file
31
+ await createConfigFile(cwd, force);
32
+ // Setup Git hooks if requested
33
+ if (hooks) {
34
+ await setupGitHooks(cwd);
35
+ }
36
+ console.log('');
37
+ console.log(chalk_1.default.green('โœ… test-gen-js initialized successfully!'));
38
+ console.log('');
39
+ console.log(chalk_1.default.cyan('Next steps:'));
40
+ console.log(' 1. Generate tests: ' + chalk_1.default.yellow('npx test-gen-js generate src/components/Button.tsx'));
41
+ console.log(' 2. Run tests: ' + chalk_1.default.yellow('npm test'));
42
+ console.log(' 3. Commit your code - tests will run automatically!');
43
+ console.log('');
44
+ }
45
+ /**
46
+ * Create .testgenrc.js configuration file
47
+ */
48
+ async function createConfigFile(cwd, force) {
49
+ const spinner = (0, ora_1.default)('Creating configuration file...').start();
50
+ const configPath = path_1.default.join(cwd, '.testgenrc.js');
51
+ if ((await fs_extra_1.default.pathExists(configPath)) && !force) {
52
+ spinner.info(chalk_1.default.yellow('.testgenrc.js already exists. Use --force to overwrite.'));
53
+ return;
54
+ }
55
+ const configContent = `/**
56
+ * test-gen-js configuration
57
+ * @see https://github.com/liveforownhappiness/test-gen-js
58
+ */
59
+ module.exports = {
60
+ // File patterns to include
61
+ include: ['src/**/*.{ts,tsx,js,jsx}'],
62
+
63
+ // File patterns to exclude
64
+ exclude: [
65
+ 'node_modules',
66
+ 'dist',
67
+ 'build',
68
+ '**/*.test.*',
69
+ '**/*.spec.*',
70
+ '**/__tests__/**',
71
+ '**/__mocks__/**',
72
+ ],
73
+
74
+ // Generator options
75
+ generator: {
76
+ // Include snapshot tests
77
+ snapshot: false,
78
+
79
+ // Auto-generate mocks
80
+ mock: true,
81
+
82
+ // Test file suffix (.test or .spec)
83
+ testSuffix: '.test',
84
+
85
+ // Overwrite existing test files
86
+ overwrite: false,
87
+ },
88
+
89
+ // Template options
90
+ templates: {
91
+ // Custom templates directory (optional)
92
+ // dir: './templates',
93
+ },
94
+ };
95
+ `;
96
+ await fs_extra_1.default.writeFile(configPath, configContent);
97
+ spinner.succeed(chalk_1.default.green('Created .testgenrc.js'));
98
+ }
99
+ /**
100
+ * Setup Git hooks with husky and lint-staged
101
+ */
102
+ async function setupGitHooks(cwd) {
103
+ const spinner = (0, ora_1.default)('Setting up Git hooks...').start();
104
+ const packageJsonPath = path_1.default.join(cwd, 'package.json');
105
+ try {
106
+ // Read package.json
107
+ const packageJson = await fs_extra_1.default.readJson(packageJsonPath);
108
+ // Check if husky is already installed
109
+ const hasHusky = packageJson.devDependencies?.husky || packageJson.dependencies?.husky;
110
+ const hasLintStaged = packageJson.devDependencies?.['lint-staged'] || packageJson.dependencies?.['lint-staged'];
111
+ // Install husky and lint-staged if not present
112
+ if (!hasHusky || !hasLintStaged) {
113
+ spinner.text = 'Installing husky and lint-staged...';
114
+ const packagesToInstall = [];
115
+ if (!hasHusky)
116
+ packagesToInstall.push('husky');
117
+ if (!hasLintStaged)
118
+ packagesToInstall.push('lint-staged');
119
+ try {
120
+ (0, child_process_1.execSync)(`npm install -D ${packagesToInstall.join(' ')}`, {
121
+ cwd,
122
+ stdio: 'pipe',
123
+ });
124
+ }
125
+ catch {
126
+ spinner.warn(chalk_1.default.yellow('Could not install packages automatically. Please run:'));
127
+ console.log(chalk_1.default.cyan(` npm install -D ${packagesToInstall.join(' ')}`));
128
+ }
129
+ }
130
+ // Re-read package.json after potential install
131
+ const updatedPackageJson = await fs_extra_1.default.readJson(packageJsonPath);
132
+ // Add lint-staged configuration
133
+ if (!updatedPackageJson['lint-staged']) {
134
+ updatedPackageJson['lint-staged'] = {
135
+ '*.{ts,tsx,js,jsx}': ['npm test -- --bail --findRelatedTests --passWithNoTests'],
136
+ };
137
+ }
138
+ // Add prepare script for husky
139
+ if (!updatedPackageJson.scripts) {
140
+ updatedPackageJson.scripts = {};
141
+ }
142
+ if (!updatedPackageJson.scripts.prepare) {
143
+ updatedPackageJson.scripts.prepare = 'husky install';
144
+ }
145
+ // Write updated package.json
146
+ await fs_extra_1.default.writeJson(packageJsonPath, updatedPackageJson, { spaces: 2 });
147
+ // Initialize husky
148
+ spinner.text = 'Initializing husky...';
149
+ const huskyDir = path_1.default.join(cwd, '.husky');
150
+ if (!(await fs_extra_1.default.pathExists(huskyDir))) {
151
+ try {
152
+ (0, child_process_1.execSync)('npx husky install', { cwd, stdio: 'pipe' });
153
+ }
154
+ catch {
155
+ // husky install might fail if .git doesn't exist, that's ok
156
+ }
157
+ }
158
+ // Create pre-commit hook
159
+ spinner.text = 'Creating pre-commit hook...';
160
+ await fs_extra_1.default.ensureDir(huskyDir);
161
+ const preCommitPath = path_1.default.join(huskyDir, 'pre-commit');
162
+ const preCommitContent = `#!/usr/bin/env sh
163
+ . "$(dirname -- "$0")/_/husky.sh"
164
+
165
+ echo "๐Ÿงช Running tests before commit..."
166
+ npx lint-staged
167
+ `;
168
+ await fs_extra_1.default.writeFile(preCommitPath, preCommitContent);
169
+ await fs_extra_1.default.chmod(preCommitPath, '755');
170
+ // Create husky.sh helper if it doesn't exist
171
+ const huskyHelperDir = path_1.default.join(huskyDir, '_');
172
+ await fs_extra_1.default.ensureDir(huskyHelperDir);
173
+ const huskyShPath = path_1.default.join(huskyHelperDir, 'husky.sh');
174
+ if (!(await fs_extra_1.default.pathExists(huskyShPath))) {
175
+ const huskyShContent = `#!/usr/bin/env sh
176
+ if [ -z "$husky_skip_init" ]; then
177
+ debug () {
178
+ if [ "$HUSKY_DEBUG" = "1" ]; then
179
+ echo "husky (debug) - $1"
180
+ fi
181
+ }
182
+
183
+ readonly hook_name="$(basename -- "$0")"
184
+ debug "starting $hook_name..."
185
+
186
+ if [ "$HUSKY" = "0" ]; then
187
+ debug "HUSKY env variable is set to 0, skipping hook"
188
+ exit 0
189
+ fi
190
+
191
+ if [ -f ~/.huskyrc ]; then
192
+ debug "sourcing ~/.huskyrc"
193
+ . ~/.huskyrc
194
+ fi
195
+
196
+ readonly husky_skip_init=1
197
+ export husky_skip_init
198
+ sh -e "$0" "$@"
199
+ exitCode="$?"
200
+
201
+ if [ $exitCode != 0 ]; then
202
+ echo "husky - $hook_name hook exited with code $exitCode (error)"
203
+ fi
204
+
205
+ if [ $exitCode = 127 ]; then
206
+ echo "husky - command not found in PATH=$PATH"
207
+ fi
208
+
209
+ exit $exitCode
210
+ fi
211
+ `;
212
+ await fs_extra_1.default.writeFile(huskyShPath, huskyShContent);
213
+ await fs_extra_1.default.chmod(huskyShPath, '755');
214
+ }
215
+ spinner.succeed(chalk_1.default.green('Git hooks configured!'));
216
+ console.log('');
217
+ console.log(chalk_1.default.cyan('๐Ÿ“‹ What was set up:'));
218
+ console.log(' โ€ข ' + chalk_1.default.yellow('husky') + ' - Git hooks manager');
219
+ console.log(' โ€ข ' + chalk_1.default.yellow('lint-staged') + ' - Run tests on staged files');
220
+ console.log(' โ€ข ' + chalk_1.default.yellow('pre-commit hook') + ' - Tests run before each commit');
221
+ console.log('');
222
+ console.log(chalk_1.default.cyan('๐Ÿ’ก How it works:'));
223
+ console.log(' When you run ' + chalk_1.default.yellow('git commit') + ', tests for changed files will run automatically.');
224
+ console.log(' If tests fail, the commit will be blocked.');
225
+ }
226
+ catch (error) {
227
+ spinner.fail(chalk_1.default.red('Failed to setup Git hooks'));
228
+ throw error;
229
+ }
230
+ }
231
+ exports.default = initCommand;
232
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "test-gen-js",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "Auto-generate test boilerplate code for JavaScript/TypeScript, React, and React Native projects",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",