sxy-test-runner 2.2.1 → 2.2.2
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/AGENTS.md +5 -0
- package/dist/cli/lib/watchFilesChokidar.d.ts.map +1 -1
- package/dist/cli/lib/watchFilesChokidar.js +10 -0
- package/dist/cli/lib/watchFilesChokidar.js.map +1 -1
- package/dist/cli/lib/watchFilesChokidar.unitTest.js +41 -0
- package/dist/cli/lib/watchFilesChokidar.unitTest.js.map +1 -1
- package/dist/cli/lib/watchFilesNodeWatch.d.ts.map +1 -1
- package/dist/cli/lib/watchFilesNodeWatch.js +9 -4
- package/dist/cli/lib/watchFilesNodeWatch.js.map +1 -1
- package/dist/cli/lib/watchFilesNodeWatch.unitTest.js +42 -0
- package/dist/cli/lib/watchFilesNodeWatch.unitTest.js.map +1 -1
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -4,6 +4,11 @@ This document is the practical source of truth for agents that need to add, run,
|
|
|
4
4
|
maintain tests using `sxy-test-runner`. It describes the current TypeScript implementation.
|
|
5
5
|
For introductory human-facing usage, also see `readme.md`.
|
|
6
6
|
|
|
7
|
+
> **Building this repo:** use `npm run build-once`, not `npm run build` — `build` runs
|
|
8
|
+
> `tsc --watch` and never exits. The same applies to the test scripts: most `unit-test-*`
|
|
9
|
+
> scripts run mocha in watch mode, so prefer the `*-once` variants, or invoke mocha
|
|
10
|
+
> directly without `--watch`.
|
|
11
|
+
|
|
7
12
|
## Safe default workflow
|
|
8
13
|
|
|
9
14
|
1. Confirm the project uses Node.js 24 or newer and ES modules.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchFilesChokidar.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesChokidar.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watchFilesChokidar.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesChokidar.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAI1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,UAAU,EAAE,SAAS,CAAC,CA6ClH"}
|
|
@@ -2,8 +2,10 @@ import { createTimeProfiler } from '../../packages/timeProfiler.js';
|
|
|
2
2
|
import { showTimeProfiling } from '../../config.js';
|
|
3
3
|
import slash from '../../packages/slash.js';
|
|
4
4
|
import chokidar from 'chokidar';
|
|
5
|
+
import minimatch from 'minimatch';
|
|
5
6
|
import { out, debug } from '../../output.js';
|
|
6
7
|
import { addBasePath } from './addBasePath.js';
|
|
8
|
+
import { globArgCombine } from './globArgCombine.js';
|
|
7
9
|
const { timeProfileAsync } = createTimeProfiler(showTimeProfiling);
|
|
8
10
|
export function watchFilesChokidar(config, onEvent) {
|
|
9
11
|
return timeProfileAsync('start watching', () => {
|
|
@@ -11,15 +13,23 @@ export function watchFilesChokidar(config, onEvent) {
|
|
|
11
13
|
out('No config.watch.watchFilesBase provided, defaulting to \'.\'');
|
|
12
14
|
config.watch.watchFilesBase = '.';
|
|
13
15
|
}
|
|
16
|
+
// watch globs are relative to watchFilesBase, and chokidar reports paths
|
|
17
|
+
// including the base, so bring the globs up to the same base
|
|
18
|
+
const watchGlobs = addBasePath(config.watch.watchFilesBase, config.watch.watchFiles);
|
|
14
19
|
const ignoreGlob = config.watch.watchFilesIgnore.length > 0
|
|
15
20
|
? addBasePath(config.watch.watchFilesBase, config.watch.watchFilesIgnore)
|
|
16
21
|
: undefined;
|
|
22
|
+
// chokidar has no include option, and ignoring non-matching paths would stop it
|
|
23
|
+
// descending into directories, so watchFiles is applied to the events instead
|
|
24
|
+
const included = (file) => watchGlobs.length === 0 || minimatch(file, globArgCombine(watchGlobs));
|
|
17
25
|
const watcher = chokidar.watch(config.watch.watchFilesBase, {
|
|
18
26
|
ignored: ignoreGlob,
|
|
19
27
|
ignoreInitial: true
|
|
20
28
|
});
|
|
21
29
|
watcher.on('all', (event, filename) => {
|
|
22
30
|
filename = slash(filename);
|
|
31
|
+
if (!included(filename))
|
|
32
|
+
return;
|
|
23
33
|
debug('[watch event]', filename, event);
|
|
24
34
|
onEvent(filename, (event === 'unlink') ? 'remove' : event);
|
|
25
35
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchFilesChokidar.js","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesChokidar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,MAAM,yBAAyB,CAAA;AAC3C,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"watchFilesChokidar.js","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesChokidar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,MAAM,yBAAyB,CAAA;AAC3C,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,SAAS,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAKpD,MAAM,EAAE,gBAAgB,EAAE,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;AAElE,MAAM,UAAU,kBAAkB,CAAC,MAAmB,EAAE,OAAmB;IACvE,OAAO,gBAAgB,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC;YACrC,GAAG,CAAC,8DAA8D,CAAC,CAAA;YACnE,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAA;QACrC,CAAC;QAED,yEAAyE;QACzE,6DAA6D;QAC7D,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAEpF,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;YACvD,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;YACzE,CAAC,CAAC,SAAS,CAAA;QAEf,gFAAgF;QAChF,8EAA8E;QAC9E,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAW,EAAE,CACvC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;QAE1E,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAC1B,MAAM,CAAC,KAAK,CAAC,cAAc,EAC3B;YACI,OAAO,EAAE,UAAU;YACnB,aAAa,EAAE,IAAI;SACtB,CACJ,CAAA;QAED,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAClC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC1B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAM;YAC/B,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;YACvC,OAAO,CACH,QAAQ,EACR,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAC1C,CAAA;QACL,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrB,KAAK,CAAC,wBAAwB,CAAC,CAAA;gBAC/B,OAAO,CAAC,OAAO,CAAC,CAAA;YACpB,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -43,6 +43,47 @@ mochaDescribe('watchFilesChokidar() function', function () {
|
|
|
43
43
|
});
|
|
44
44
|
eventComplete.should.equal(true);
|
|
45
45
|
});
|
|
46
|
+
mochaIt('matches a watch glob that is relative to the watch base', async function () {
|
|
47
|
+
this.timeout(12000);
|
|
48
|
+
const config = applyConfigDefaults({
|
|
49
|
+
watch: {
|
|
50
|
+
watchFilesBase: 'watchTests/watchFilesChokidar',
|
|
51
|
+
watchFiles: '*.js' // relative to the base, no leading **/
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
let eventComplete = false;
|
|
55
|
+
await watchFilesChokidar(config, () => {
|
|
56
|
+
eventComplete = true;
|
|
57
|
+
});
|
|
58
|
+
void fs.writeFile('watchTests/watchFilesChokidar/base-relative-file.js', 'abc');
|
|
59
|
+
await new Promise(resolve => {
|
|
60
|
+
const interval = setInterval(() => {
|
|
61
|
+
if (eventComplete) {
|
|
62
|
+
clearInterval(interval);
|
|
63
|
+
resolve();
|
|
64
|
+
}
|
|
65
|
+
}, 50);
|
|
66
|
+
});
|
|
67
|
+
eventComplete.should.equal(true);
|
|
68
|
+
});
|
|
69
|
+
mochaIt('does not call back for a file outside the watch glob', async function () {
|
|
70
|
+
this.timeout(12000);
|
|
71
|
+
const config = applyConfigDefaults({
|
|
72
|
+
watch: {
|
|
73
|
+
watchFilesBase: 'watchTests/watchFilesChokidar',
|
|
74
|
+
watchFiles: '**/*.js'
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
let eventComplete = false;
|
|
78
|
+
await watchFilesChokidar(config, () => {
|
|
79
|
+
eventComplete = true;
|
|
80
|
+
});
|
|
81
|
+
void fs.writeFile('watchTests/watchFilesChokidar/not-watched-file.txt', 'abc');
|
|
82
|
+
await new Promise(resolve => {
|
|
83
|
+
setTimeout(resolve, 1000);
|
|
84
|
+
});
|
|
85
|
+
eventComplete.should.not.equal(true);
|
|
86
|
+
});
|
|
46
87
|
mochaIt('ignores a file based on ignore glob', async function () {
|
|
47
88
|
this.timeout(12000);
|
|
48
89
|
const config = applyConfigDefaults({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchFilesChokidar.unitTest.js","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesChokidar.unitTest.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"watchFilesChokidar.unitTest.js","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesChokidar.unitTest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchFilesNodeWatch.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesNodeWatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watchFilesNodeWatch.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesNodeWatch.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAIjD,MAAM,WAAW,gBAAgB;IAC7B,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CACjD;AAWD,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;AAElE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwCvG"}
|
|
@@ -5,18 +5,23 @@ import slash from '../../packages/slash.js';
|
|
|
5
5
|
import * as nodeWatchNS from 'node-watch';
|
|
6
6
|
import { out, debug } from '../../output.js';
|
|
7
7
|
import { globArgCombine } from './globArgCombine.js';
|
|
8
|
+
import { addBasePath } from './addBasePath.js';
|
|
8
9
|
const { timeProfileAsync } = createTimeProfiler(showTimeProfiling);
|
|
9
10
|
const nodeWatch = nodeWatchNS.default;
|
|
10
11
|
export function watchFilesNodeWatch(config, onEvent) {
|
|
11
12
|
return timeProfileAsync('start watching', async () => {
|
|
12
|
-
// identify a file we should be watching and responding to
|
|
13
|
-
const watchFilter = (file) => (config.watch.watchFiles.length === 0 || minimatch(file, globArgCombine(config.watch.watchFiles)))
|
|
14
|
-
&& (config.watch.watchFilesIgnore.length === 0
|
|
15
|
-
|| !minimatch(file, globArgCombine(config.watch.watchFilesIgnore)));
|
|
16
13
|
if (config.watch.watchFilesBase === '') {
|
|
17
14
|
out('No config.watch.watchFilesBase provided, defaulting to \'.\'');
|
|
18
15
|
config.watch.watchFilesBase = '.';
|
|
19
16
|
}
|
|
17
|
+
// watch globs are relative to watchFilesBase, but node-watch's filter is given
|
|
18
|
+
// paths including the base, so bring the globs up to the same base
|
|
19
|
+
const watchGlobs = addBasePath(config.watch.watchFilesBase, config.watch.watchFiles);
|
|
20
|
+
const watchIgnoreGlobs = addBasePath(config.watch.watchFilesBase, config.watch.watchFilesIgnore);
|
|
21
|
+
// identify a file we should be watching and responding to
|
|
22
|
+
const watchFilter = (file) => (watchGlobs.length === 0 || minimatch(slash(file), globArgCombine(watchGlobs)))
|
|
23
|
+
&& (watchIgnoreGlobs.length === 0
|
|
24
|
+
|| !minimatch(slash(file), globArgCombine(watchIgnoreGlobs)));
|
|
20
25
|
const watcher = nodeWatch(config.watch.watchFilesBase, {
|
|
21
26
|
recursive: true,
|
|
22
27
|
filter: watchFilter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchFilesNodeWatch.js","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesNodeWatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,SAAS,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,MAAM,yBAAyB,CAAA;AAC3C,OAAO,KAAK,WAAW,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"watchFilesNodeWatch.js","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesNodeWatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,SAAS,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,MAAM,yBAAyB,CAAA;AAC3C,OAAO,KAAK,WAAW,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAI9C,MAAM,EAAE,gBAAgB,EAAE,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;AAalE,MAAM,SAAS,GAAG,WAAW,CAAC,OAAiC,CAAA;AAI/D,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,OAAmB;IACxE,OAAO,gBAAgB,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QACjD,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC;YACrC,GAAG,CAAC,8DAA8D,CAAC,CAAA;YACnE,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAA;QACrC,CAAC;QAED,+EAA+E;QAC/E,mEAAmE;QACnE,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACpF,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAEhG,0DAA0D;QAC1D,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE,CAC1C,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;eAC5E,CACC,gBAAgB,CAAC,MAAM,KAAK,CAAC;mBAC1B,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAC/D,CAAA;QAEL,MAAM,OAAO,GAAG,SAAS,CACrB,MAAM,CAAC,KAAK,CAAC,cAAc,EAC3B;YACI,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,WAAW;SACtB,EACD,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAChB,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;YAC1B,KAAK,CAAC,aAAa,CAAC,CAAA;YACpB,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC5B,CAAC,CACJ,CAAA;QAED,kCAAkC;QAClC,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAC9B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;QAEF,OAAO,OAAO,CAAA;IAClB,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -42,5 +42,47 @@ mochaDescribe('watchFilesNodeWatch() function', function () {
|
|
|
42
42
|
});
|
|
43
43
|
eventComplete.should.equal(true);
|
|
44
44
|
});
|
|
45
|
+
mochaIt('matches a watch glob that is relative to the watch base', async function () {
|
|
46
|
+
const tempFolder = 'watchTests/watchFilesNodeWatcher';
|
|
47
|
+
const config = applyConfigDefaults({
|
|
48
|
+
watch: {
|
|
49
|
+
watchFilesBase: tempFolder,
|
|
50
|
+
watchFiles: '*.js' // relative to the base, no leading **/
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
let eventComplete = false;
|
|
54
|
+
await watchFilesNodeWatch(config, () => {
|
|
55
|
+
eventComplete = true;
|
|
56
|
+
});
|
|
57
|
+
void fs.writeFile(`${tempFolder}/base-relative-file.js`, 'abc');
|
|
58
|
+
await new Promise(resolve => {
|
|
59
|
+
const interval = setInterval(() => {
|
|
60
|
+
if (eventComplete) {
|
|
61
|
+
clearInterval(interval);
|
|
62
|
+
resolve();
|
|
63
|
+
}
|
|
64
|
+
}, 50);
|
|
65
|
+
});
|
|
66
|
+
eventComplete.should.equal(true);
|
|
67
|
+
});
|
|
68
|
+
mochaIt('ignores a file based on an ignore glob relative to the watch base', async function () {
|
|
69
|
+
const tempFolder = 'watchTests/watchFilesNodeWatcher';
|
|
70
|
+
const config = applyConfigDefaults({
|
|
71
|
+
watch: {
|
|
72
|
+
watchFilesBase: tempFolder,
|
|
73
|
+
watchFiles: '**/*.js',
|
|
74
|
+
watchFilesIgnore: 'ignore-file.js'
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
let eventComplete = false;
|
|
78
|
+
await watchFilesNodeWatch(config, () => {
|
|
79
|
+
eventComplete = true;
|
|
80
|
+
});
|
|
81
|
+
void fs.writeFile(`${tempFolder}/ignore-file.js`, 'abc');
|
|
82
|
+
await new Promise(resolve => {
|
|
83
|
+
setTimeout(resolve, 1000);
|
|
84
|
+
});
|
|
85
|
+
eventComplete.should.not.equal(true);
|
|
86
|
+
});
|
|
45
87
|
});
|
|
46
88
|
//# sourceMappingURL=watchFilesNodeWatch.unitTest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchFilesNodeWatch.unitTest.js","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesNodeWatch.unitTest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAA;AAEnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,aAAa,CAAC,gCAAgC,EAAE;IAC5C,OAAO,CAAC,iDAAiD,EAAE,KAAK;QAC5D,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;QAEtC,IAAI,aAAa,GAAG,KAAK,CAAA;QAEzB,MAAM,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE;YACnC,aAAa,GAAG,IAAI,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,KAAK,EAAE,CAAC,SAAS,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAA;QAEzD,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAC9B,MAAM,QAAQ,GAAG,WAAW,CACxB,GAAG,EAAE;gBACD,IAAI,aAAa,EAAE,CAAC;oBAChB,aAAa,CAAC,QAAQ,CAAC,CAAA;oBACvB,OAAO,EAAE,CAAA;gBACb,CAAC;YACL,CAAC,EACD,EAAE,CACL,CAAA;QACL,CAAC,CAAC,CAAA;QAEF,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,qEAAqE,EAAE,KAAK;QAChF,MAAM,UAAU,GAAG,kCAAkC,CAAA;QAErD,MAAM,MAAM,GAAG,mBAAmB,CAAC;YAC/B,KAAK,EAAE;gBACH,cAAc,EAAE,UAAU;gBAC1B,UAAU,EAAE,SAAS;aACxB;SACJ,CAAC,CAAA;QAEF,IAAI,aAAa,GAAG,KAAK,CAAA;QAEzB,MAAM,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE;YACnC,aAAa,GAAG,IAAI,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,KAAK,EAAE,CAAC,SAAS,CAAC,GAAG,UAAU,YAAY,EAAE,KAAK,CAAC,CAAA;QAEnD,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAC9B,MAAM,QAAQ,GAAG,WAAW,CACxB,GAAG,EAAE;gBACD,IAAI,aAAa,EAAE,CAAC;oBAChB,aAAa,CAAC,QAAQ,CAAC,CAAA;oBACvB,OAAO,EAAE,CAAA;gBACb,CAAC;YACL,CAAC,EACD,EAAE,CACL,CAAA;QACL,CAAC,CAAC,CAAA;QAEF,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"watchFilesNodeWatch.unitTest.js","sourceRoot":"","sources":["../../../src/cli/lib/watchFilesNodeWatch.unitTest.ts"],"names":[],"mappings":"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"}
|