feat(watch mode): Add watch mode support with CLI options and enhanced documentation
This commit is contained in:
parent
7aaeed0dc6
commit
82757c4abc
@ -1,5 +1,14 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2025-05-26 - 2.2.0 - feat(watch mode)
|
||||||
|
Add watch mode support with CLI options and enhanced documentation
|
||||||
|
|
||||||
|
- Introduce '--watch' (or '-w') and '--watch-ignore' CLI flags for automatic test re-runs
|
||||||
|
- Integrate @push.rocks/smartchok for file watching with 300ms debouncing
|
||||||
|
- Update readme.md and readme.hints.md with detailed instructions and examples for watch mode
|
||||||
|
- Add a demo test file (test/watch-demo/test.demo.ts) to illustrate the new feature
|
||||||
|
- Add smartchok dependency in package.json
|
||||||
|
|
||||||
## 2025-05-26 - 2.1.0 - feat(core)
|
## 2025-05-26 - 2.1.0 - feat(core)
|
||||||
Implement Protocol V2 with enhanced settings and lifecycle hooks
|
Implement Protocol V2 with enhanced settings and lifecycle hooks
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
"@push.rocks/consolecolor": "^2.0.2",
|
"@push.rocks/consolecolor": "^2.0.2",
|
||||||
"@push.rocks/qenv": "^6.1.0",
|
"@push.rocks/qenv": "^6.1.0",
|
||||||
"@push.rocks/smartbrowser": "^2.0.8",
|
"@push.rocks/smartbrowser": "^2.0.8",
|
||||||
|
"@push.rocks/smartchok": "^1.0.34",
|
||||||
"@push.rocks/smartcrypto": "^2.0.4",
|
"@push.rocks/smartcrypto": "^2.0.4",
|
||||||
"@push.rocks/smartdelay": "^3.0.5",
|
"@push.rocks/smartdelay": "^3.0.5",
|
||||||
"@push.rocks/smartenv": "^5.0.12",
|
"@push.rocks/smartenv": "^5.0.12",
|
||||||
|
3
pnpm-lock.yaml
generated
3
pnpm-lock.yaml
generated
@ -26,6 +26,9 @@ importers:
|
|||||||
'@push.rocks/smartbrowser':
|
'@push.rocks/smartbrowser':
|
||||||
specifier: ^2.0.8
|
specifier: ^2.0.8
|
||||||
version: 2.0.8
|
version: 2.0.8
|
||||||
|
'@push.rocks/smartchok':
|
||||||
|
specifier: ^1.0.34
|
||||||
|
version: 1.0.34
|
||||||
'@push.rocks/smartcrypto':
|
'@push.rocks/smartcrypto':
|
||||||
specifier: ^2.0.4
|
specifier: ^2.0.4
|
||||||
version: 2.0.4
|
version: 2.0.4
|
||||||
|
@ -217,6 +217,33 @@ The Enhanced Communication system has been implemented to provide rich, real-tim
|
|||||||
- Parser handles events asynchronously for real-time updates
|
- Parser handles events asynchronously for real-time updates
|
||||||
- Visual diffs are generated using custom diff algorithms for each data type
|
- Visual diffs are generated using custom diff algorithms for each data type
|
||||||
|
|
||||||
|
## Watch Mode (Phase 4)
|
||||||
|
|
||||||
|
tstest now supports watch mode for automatic test re-runs on file changes.
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
```bash
|
||||||
|
tstest test/**/*.ts --watch
|
||||||
|
tstest test/specific.ts -w
|
||||||
|
```
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- **Automatic Re-runs**: Tests re-run when any watched file changes
|
||||||
|
- **Debouncing**: Multiple rapid changes are batched (300ms delay)
|
||||||
|
- **Clear Output**: Console is cleared before each run for clean results
|
||||||
|
- **Status Updates**: Shows which files triggered the re-run
|
||||||
|
- **Graceful Exit**: Press Ctrl+C to stop watching
|
||||||
|
|
||||||
|
### Options
|
||||||
|
- `--watch` or `-w`: Enable watch mode
|
||||||
|
- `--watch-ignore`: Comma-separated patterns to ignore (e.g., `--watch-ignore node_modules,dist`)
|
||||||
|
|
||||||
|
### Implementation Details
|
||||||
|
- Uses `@push.rocks/smartchok` for cross-platform file watching
|
||||||
|
- Watches the entire project directory from where tests are run
|
||||||
|
- Ignores changes matching the ignore patterns
|
||||||
|
- Shows "Waiting for file changes..." between runs
|
||||||
|
|
||||||
## Fixed Issues
|
## Fixed Issues
|
||||||
|
|
||||||
### tap.skip.test(), tap.todo(), and tap.only.test() (Fixed)
|
### tap.skip.test(), tap.todo(), and tap.only.test() (Fixed)
|
||||||
|
137
readme.md
137
readme.md
@ -27,6 +27,12 @@
|
|||||||
- 🔁 **Retry Logic** - Automatically retry failing tests
|
- 🔁 **Retry Logic** - Automatically retry failing tests
|
||||||
- 🛠️ **Test Fixtures** - Create reusable test data
|
- 🛠️ **Test Fixtures** - Create reusable test data
|
||||||
- 📦 **Browser-Compatible** - Full browser support with embedded tapbundle
|
- 📦 **Browser-Compatible** - Full browser support with embedded tapbundle
|
||||||
|
- 👀 **Watch Mode** - Automatically re-run tests on file changes
|
||||||
|
- 📊 **Real-time Progress** - Live test execution progress updates
|
||||||
|
- 🎨 **Visual Diffs** - Beautiful side-by-side diffs for failed assertions
|
||||||
|
- 🔄 **Event-based Reporting** - Real-time test lifecycle events
|
||||||
|
- ⚙️ **Test Configuration** - Flexible test settings with .tstest.json files
|
||||||
|
- 🚀 **Protocol V2** - Enhanced TAP protocol with Unicode delimiters
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@ -73,6 +79,9 @@ tstest "test/unit/*.ts"
|
|||||||
| `--timeout <seconds>` | Timeout test files after specified seconds |
|
| `--timeout <seconds>` | Timeout test files after specified seconds |
|
||||||
| `--startFrom <n>` | Start running from test file number n |
|
| `--startFrom <n>` | Start running from test file number n |
|
||||||
| `--stopAt <n>` | Stop running at test file number n |
|
| `--stopAt <n>` | Stop running at test file number n |
|
||||||
|
| `--watch`, `-w` | Watch for file changes and re-run tests |
|
||||||
|
| `--watch-ignore <patterns>` | Ignore patterns in watch mode (comma-separated) |
|
||||||
|
| `--only` | Run only tests marked with .only |
|
||||||
|
|
||||||
### Example Outputs
|
### Example Outputs
|
||||||
|
|
||||||
@ -203,9 +212,9 @@ tap.only.test('focus on this', async () => {
|
|||||||
// Only this test will run
|
// Only this test will run
|
||||||
});
|
});
|
||||||
|
|
||||||
// Todo test
|
// Todo test - creates actual test object marked as todo
|
||||||
tap.todo('implement later', async () => {
|
tap.todo.test('implement later', async () => {
|
||||||
// Marked as todo
|
// This test will be counted but marked as todo
|
||||||
});
|
});
|
||||||
|
|
||||||
// Chaining modifiers
|
// Chaining modifiers
|
||||||
@ -558,6 +567,115 @@ tapWrap.tap.test('wrapped test', async () => {
|
|||||||
|
|
||||||
## Advanced Features
|
## Advanced Features
|
||||||
|
|
||||||
|
### Watch Mode
|
||||||
|
|
||||||
|
Automatically re-run tests when files change:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Watch all files in the project
|
||||||
|
tstest test/ --watch
|
||||||
|
|
||||||
|
# Watch with custom ignore patterns
|
||||||
|
tstest test/ --watch --watch-ignore "dist/**,coverage/**"
|
||||||
|
|
||||||
|
# Short form
|
||||||
|
tstest test/ -w
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- 👀 Shows which files triggered the re-run
|
||||||
|
- ⏱️ 300ms debouncing to batch rapid changes
|
||||||
|
- 🔄 Clears console between runs for clean output
|
||||||
|
- 📁 Intelligently ignores common non-source files
|
||||||
|
|
||||||
|
### Real-time Test Progress
|
||||||
|
|
||||||
|
tstest provides real-time updates during test execution:
|
||||||
|
|
||||||
|
```
|
||||||
|
▶️ test/api.test.ts (1/4)
|
||||||
|
Runtime: node.js
|
||||||
|
⏳ Running: api endpoint validation...
|
||||||
|
✅ api endpoint validation (145ms)
|
||||||
|
⏳ Running: error handling...
|
||||||
|
✅ error handling (23ms)
|
||||||
|
Summary: 2/2 PASSED
|
||||||
|
```
|
||||||
|
|
||||||
|
### Visual Diffs for Failed Assertions
|
||||||
|
|
||||||
|
When assertions fail, tstest shows beautiful side-by-side diffs:
|
||||||
|
|
||||||
|
```
|
||||||
|
❌ should return correct user data
|
||||||
|
|
||||||
|
String Diff:
|
||||||
|
- Expected
|
||||||
|
+ Received
|
||||||
|
|
||||||
|
- Hello World
|
||||||
|
+ Hello Universe
|
||||||
|
|
||||||
|
Object Diff:
|
||||||
|
{
|
||||||
|
name: "John",
|
||||||
|
- age: 30,
|
||||||
|
+ age: 31,
|
||||||
|
email: "john@example.com"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test Configuration (.tstest.json)
|
||||||
|
|
||||||
|
Configure test behavior with `.tstest.json` files:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"timeout": 30000,
|
||||||
|
"retries": 2,
|
||||||
|
"bail": false,
|
||||||
|
"parallel": true,
|
||||||
|
"tags": ["unit", "fast"],
|
||||||
|
"env": {
|
||||||
|
"NODE_ENV": "test"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Configuration files are discovered in:
|
||||||
|
1. Test file directory
|
||||||
|
2. Parent directories (up to project root)
|
||||||
|
3. Project root
|
||||||
|
4. Home directory (`~/.tstest.json`)
|
||||||
|
|
||||||
|
Settings cascade and merge, with closer files taking precedence.
|
||||||
|
|
||||||
|
### Event-based Test Reporting
|
||||||
|
|
||||||
|
tstest emits detailed events during test execution for integration with CI/CD tools:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{"event":"suite:started","file":"test/api.test.ts","timestamp":"2025-05-26T10:30:00.000Z"}
|
||||||
|
{"event":"test:started","name":"api endpoint validation","timestamp":"2025-05-26T10:30:00.100Z"}
|
||||||
|
{"event":"test:progress","name":"api endpoint validation","message":"Validating response schema"}
|
||||||
|
{"event":"test:completed","name":"api endpoint validation","passed":true,"duration":145}
|
||||||
|
{"event":"suite:completed","file":"test/api.test.ts","passed":true,"total":2,"failed":0}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Enhanced TAP Protocol (Protocol V2)
|
||||||
|
|
||||||
|
tstest uses an enhanced TAP protocol with Unicode delimiters for better parsing:
|
||||||
|
|
||||||
|
```
|
||||||
|
⟦TSTEST:EVENT:test:started⟧{"name":"my test","timestamp":"2025-05-26T10:30:00.000Z"}
|
||||||
|
ok 1 my test
|
||||||
|
⟦TSTEST:EVENT:test:completed⟧{"name":"my test","passed":true,"duration":145}
|
||||||
|
```
|
||||||
|
|
||||||
|
This prevents conflicts with test output that might contain TAP-like formatting.
|
||||||
|
|
||||||
|
## Advanced Features
|
||||||
|
|
||||||
### Glob Pattern Support
|
### Glob Pattern Support
|
||||||
|
|
||||||
Run specific test patterns:
|
Run specific test patterns:
|
||||||
@ -731,6 +849,19 @@ tstest test/api/endpoints.test.ts --verbose --timeout 60
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### Version 1.11.0
|
||||||
|
- 👀 Added Watch Mode with `--watch`/`-w` flag for automatic test re-runs
|
||||||
|
- 📊 Implemented real-time test progress updates with event streaming
|
||||||
|
- 🎨 Added visual diffs for failed assertions with side-by-side comparison
|
||||||
|
- 🔄 Enhanced event-based test lifecycle reporting
|
||||||
|
- ⚙️ Added test configuration system with `.tstest.json` files
|
||||||
|
- 🚀 Implemented Protocol V2 with Unicode delimiters for better TAP parsing
|
||||||
|
- 🐛 Fixed `tap.todo()` to create proper test objects
|
||||||
|
- 🐛 Fixed `tap.skip.test()` to correctly create and count test objects
|
||||||
|
- 🐛 Fixed `tap.only.test()` implementation with `--only` flag support
|
||||||
|
- 📁 Added settings inheritance for cascading test configuration
|
||||||
|
- ⏱️ Added debouncing for file change events in watch mode
|
||||||
|
|
||||||
### Version 1.10.0
|
### Version 1.10.0
|
||||||
- ⏱️ Added `--timeout <seconds>` option for test file timeout protection
|
- ⏱️ Added `--timeout <seconds>` option for test file timeout protection
|
||||||
- 🎯 Added `--startFrom <n>` and `--stopAt <n>` options for test file range control
|
- 🎯 Added `--startFrom <n>` and `--stopAt <n>` options for test file range control
|
||||||
|
@ -149,11 +149,13 @@ tap.test('performance test', async (toolsArg) => {
|
|||||||
## 5. Test Execution Improvements
|
## 5. Test Execution Improvements
|
||||||
|
|
||||||
|
|
||||||
### 5.2 Watch Mode
|
### 5.2 Watch Mode ✅ COMPLETED
|
||||||
- Automatically re-run tests on file changes
|
- Automatically re-run tests on file changes
|
||||||
- Intelligent test selection based on changed files
|
- Debounced file change detection (300ms)
|
||||||
- Fast feedback loop for development
|
- Clear console output between runs
|
||||||
- Integration with IDE/editor plugins
|
- Shows which files triggered re-runs
|
||||||
|
- Graceful exit with Ctrl+C
|
||||||
|
- `--watch-ignore` option for excluding patterns
|
||||||
|
|
||||||
### 5.3 Advanced Test Filtering (Partial) ⚠️
|
### 5.3 Advanced Test Filtering (Partial) ⚠️
|
||||||
```typescript
|
```typescript
|
||||||
|
17
test/watch-demo/test.demo.ts
Normal file
17
test/watch-demo/test.demo.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { tap, expect } from '../../ts_tapbundle/index.js';
|
||||||
|
|
||||||
|
// This test file demonstrates watch mode
|
||||||
|
// Try modifying this file while running: tstest test/watch-demo --watch
|
||||||
|
|
||||||
|
let counter = 1;
|
||||||
|
|
||||||
|
tap.test('demo test that changes', async () => {
|
||||||
|
expect(counter).toEqual(1);
|
||||||
|
console.log(`Test run at: ${new Date().toISOString()}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('another test', async () => {
|
||||||
|
expect('hello').toEqual('hello');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.start();
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@git.zone/tstest',
|
name: '@git.zone/tstest',
|
||||||
version: '2.1.0',
|
version: '2.2.0',
|
||||||
description: 'a test utility to run tests that match test/**/*.ts'
|
description: 'a test utility to run tests that match test/**/*.ts'
|
||||||
}
|
}
|
||||||
|
23
ts/index.ts
23
ts/index.ts
@ -16,6 +16,8 @@ export const runCli = async () => {
|
|||||||
let startFromFile: number | null = null;
|
let startFromFile: number | null = null;
|
||||||
let stopAtFile: number | null = null;
|
let stopAtFile: number | null = null;
|
||||||
let timeoutSeconds: number | null = null;
|
let timeoutSeconds: number | null = null;
|
||||||
|
let watchMode: boolean = false;
|
||||||
|
let watchIgnorePatterns: string[] = [];
|
||||||
|
|
||||||
// Parse options
|
// Parse options
|
||||||
for (let i = 0; i < args.length; i++) {
|
for (let i = 0; i < args.length; i++) {
|
||||||
@ -84,6 +86,18 @@ export const runCli = async () => {
|
|||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case '--watch':
|
||||||
|
case '-w':
|
||||||
|
watchMode = true;
|
||||||
|
break;
|
||||||
|
case '--watch-ignore':
|
||||||
|
if (i + 1 < args.length) {
|
||||||
|
watchIgnorePatterns = args[++i].split(',');
|
||||||
|
} else {
|
||||||
|
console.error('Error: --watch-ignore requires a comma-separated list of patterns');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (!arg.startsWith('-')) {
|
if (!arg.startsWith('-')) {
|
||||||
testPath = arg;
|
testPath = arg;
|
||||||
@ -110,6 +124,8 @@ export const runCli = async () => {
|
|||||||
console.error(' --startFrom <n> Start running from test file number n');
|
console.error(' --startFrom <n> Start running from test file number n');
|
||||||
console.error(' --stopAt <n> Stop running at test file number n');
|
console.error(' --stopAt <n> Stop running at test file number n');
|
||||||
console.error(' --timeout <s> Timeout test files after s seconds');
|
console.error(' --timeout <s> Timeout test files after s seconds');
|
||||||
|
console.error(' --watch, -w Watch for file changes and re-run tests');
|
||||||
|
console.error(' --watch-ignore Patterns to ignore in watch mode (comma-separated)');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +141,12 @@ export const runCli = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const tsTestInstance = new TsTest(process.cwd(), testPath, executionMode, logOptions, tags, startFromFile, stopAtFile, timeoutSeconds);
|
const tsTestInstance = new TsTest(process.cwd(), testPath, executionMode, logOptions, tags, startFromFile, stopAtFile, timeoutSeconds);
|
||||||
await tsTestInstance.run();
|
|
||||||
|
if (watchMode) {
|
||||||
|
await tsTestInstance.runWatch(watchIgnorePatterns);
|
||||||
|
} else {
|
||||||
|
await tsTestInstance.run();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Execute CLI when this file is run directly
|
// Execute CLI when this file is run directly
|
||||||
|
@ -101,6 +101,77 @@ export class TsTest {
|
|||||||
tapCombinator.evaluate();
|
tapCombinator.evaluate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async runWatch(ignorePatterns: string[] = []) {
|
||||||
|
const smartchokInstance = new plugins.smartchok.Smartchok([this.testDir.cwd]);
|
||||||
|
|
||||||
|
console.clear();
|
||||||
|
this.logger.watchModeStart();
|
||||||
|
|
||||||
|
// Initial run
|
||||||
|
await this.run();
|
||||||
|
|
||||||
|
// Set up file watcher
|
||||||
|
const fileChanges = new Map<string, NodeJS.Timeout>();
|
||||||
|
const debounceTime = 300; // 300ms debounce
|
||||||
|
|
||||||
|
const runTestsAfterChange = async () => {
|
||||||
|
console.clear();
|
||||||
|
const changedFiles = Array.from(fileChanges.keys());
|
||||||
|
fileChanges.clear();
|
||||||
|
|
||||||
|
this.logger.watchModeRerun(changedFiles);
|
||||||
|
await this.run();
|
||||||
|
this.logger.watchModeWaiting();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Start watching before subscribing to events
|
||||||
|
await smartchokInstance.start();
|
||||||
|
|
||||||
|
// Subscribe to file change events
|
||||||
|
const changeObservable = await smartchokInstance.getObservableFor('change');
|
||||||
|
const addObservable = await smartchokInstance.getObservableFor('add');
|
||||||
|
const unlinkObservable = await smartchokInstance.getObservableFor('unlink');
|
||||||
|
|
||||||
|
const handleFileChange = (changedPath: string) => {
|
||||||
|
// Skip if path matches ignore patterns
|
||||||
|
if (ignorePatterns.some(pattern => changedPath.includes(pattern))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear existing timeout for this file if any
|
||||||
|
if (fileChanges.has(changedPath)) {
|
||||||
|
clearTimeout(fileChanges.get(changedPath));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set new timeout for this file
|
||||||
|
const timeout = setTimeout(() => {
|
||||||
|
fileChanges.delete(changedPath);
|
||||||
|
if (fileChanges.size === 0) {
|
||||||
|
runTestsAfterChange();
|
||||||
|
}
|
||||||
|
}, debounceTime);
|
||||||
|
|
||||||
|
fileChanges.set(changedPath, timeout);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Subscribe to all relevant events
|
||||||
|
changeObservable.subscribe(([path]) => handleFileChange(path));
|
||||||
|
addObservable.subscribe(([path]) => handleFileChange(path));
|
||||||
|
unlinkObservable.subscribe(([path]) => handleFileChange(path));
|
||||||
|
|
||||||
|
this.logger.watchModeWaiting();
|
||||||
|
|
||||||
|
// Handle Ctrl+C to exit gracefully
|
||||||
|
process.on('SIGINT', async () => {
|
||||||
|
this.logger.watchModeStop();
|
||||||
|
await smartchokInstance.stop();
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Keep the process running
|
||||||
|
await new Promise(() => {}); // This promise never resolves
|
||||||
|
}
|
||||||
|
|
||||||
private async runSingleTestOrSkip(fileNameArg: string, fileIndex: number, totalFiles: number, tapCombinator: TapCombinator) {
|
private async runSingleTestOrSkip(fileNameArg: string, fileIndex: number, totalFiles: number, tapCombinator: TapCombinator) {
|
||||||
// Check if this file should be skipped based on range
|
// Check if this file should be skipped based on range
|
||||||
if (this.startFromFile !== null && fileIndex < this.startFromFile) {
|
if (this.startFromFile !== null && fileIndex < this.startFromFile) {
|
||||||
|
@ -520,4 +520,47 @@ export class TsTestLogger {
|
|||||||
|
|
||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Watch mode methods
|
||||||
|
watchModeStart() {
|
||||||
|
if (this.options.json) {
|
||||||
|
this.logJson({ event: 'watchModeStart' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.log(this.format('\n👀 Watch Mode', 'cyan'));
|
||||||
|
this.log(this.format(' Running tests in watch mode...', 'dim'));
|
||||||
|
this.log(this.format(' Press Ctrl+C to exit\n', 'dim'));
|
||||||
|
}
|
||||||
|
|
||||||
|
watchModeWaiting() {
|
||||||
|
if (this.options.json) {
|
||||||
|
this.logJson({ event: 'watchModeWaiting' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.log(this.format('\n Waiting for file changes...', 'dim'));
|
||||||
|
}
|
||||||
|
|
||||||
|
watchModeRerun(changedFiles: string[]) {
|
||||||
|
if (this.options.json) {
|
||||||
|
this.logJson({ event: 'watchModeRerun', changedFiles });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.log(this.format('\n🔄 File changes detected:', 'cyan'));
|
||||||
|
changedFiles.forEach(file => {
|
||||||
|
this.log(this.format(` • ${file}`, 'yellow'));
|
||||||
|
});
|
||||||
|
this.log(this.format('\n Re-running tests...\n', 'dim'));
|
||||||
|
}
|
||||||
|
|
||||||
|
watchModeStop() {
|
||||||
|
if (this.options.json) {
|
||||||
|
this.logJson({ event: 'watchModeStop' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.log(this.format('\n\n👋 Stopping watch mode...', 'cyan'));
|
||||||
|
}
|
||||||
}
|
}
|
@ -13,6 +13,7 @@ export {
|
|||||||
// @push.rocks scope
|
// @push.rocks scope
|
||||||
import * as consolecolor from '@push.rocks/consolecolor';
|
import * as consolecolor from '@push.rocks/consolecolor';
|
||||||
import * as smartbrowser from '@push.rocks/smartbrowser';
|
import * as smartbrowser from '@push.rocks/smartbrowser';
|
||||||
|
import * as smartchok from '@push.rocks/smartchok';
|
||||||
import * as smartdelay from '@push.rocks/smartdelay';
|
import * as smartdelay from '@push.rocks/smartdelay';
|
||||||
import * as smartfile from '@push.rocks/smartfile';
|
import * as smartfile from '@push.rocks/smartfile';
|
||||||
import * as smartlog from '@push.rocks/smartlog';
|
import * as smartlog from '@push.rocks/smartlog';
|
||||||
@ -23,6 +24,7 @@ import * as tapbundle from '../dist_ts_tapbundle/index.js';
|
|||||||
export {
|
export {
|
||||||
consolecolor,
|
consolecolor,
|
||||||
smartbrowser,
|
smartbrowser,
|
||||||
|
smartchok,
|
||||||
smartdelay,
|
smartdelay,
|
||||||
smartfile,
|
smartfile,
|
||||||
smartlog,
|
smartlog,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user