tape-six 1.1.1 → 1.1.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/README.md CHANGED
@@ -236,6 +236,7 @@ See [set-up tests](https://github.com/uhop/tape-six/wiki/Set-up-tests) for detai
236
236
 
237
237
  The most recent releases:
238
238
 
239
+ - 1.1.2 _Updated dependencies._
239
240
  - 1.1.1 _Technical re-release with the missing `index.d.ts` file._
240
241
  - 1.1.0 _Added TypeScript support._
241
242
  - 1.0.4 _Bugfix for platform-specific tests, old platforms, minor updates to accommodate Deno 2, updated dev deps._
package/bin/tape6-bun.js CHANGED
@@ -2,11 +2,10 @@
2
2
 
3
3
  import {fileURLToPath} from 'node:url';
4
4
 
5
- import {resolveTests, resolvePatterns} from '../src/utils/config.js';
5
+ import {resolveTests, resolvePatterns, getReporter as getReporterType} from '../src/utils/config.js';
6
6
 
7
7
  import {getReporter, setReporter} from '../src/test.js';
8
8
  import State, {StopTest} from '../src/State.js';
9
- import TapReporter from '../src/TapReporter.js';
10
9
  import {selectTimer} from '../src/utils/timer.js';
11
10
 
12
11
  import TestWorker from '../src/bun/TestWorker.js';
@@ -88,25 +87,22 @@ const config = () => {
88
87
  if (!parallel) parallel = globalThis.navigator?.hardwareConcurrency || 1;
89
88
  };
90
89
 
90
+ const reporters = {
91
+ jsonl: 'JSONLReporter.js',
92
+ tap: 'TapReporter.js',
93
+ tty: 'TTYReporter.js'
94
+ };
95
+
91
96
  const init = async () => {
92
- let reporter = getReporter();
93
- if (!reporter) {
94
- if (Bun.env.TAPE6_JSONL) {
95
- const JSONLReporter = (await import('../src/JSONLReporter.js')).default,
96
- jsonlReporter = new JSONLReporter(options);
97
- reporter = jsonlReporter.report.bind(jsonlReporter);
98
- } else if (!Bun.env.TAPE6_TAP) {
99
- const TTYReporter = (await import('../src/TTYReporter.js')).default,
100
- ttyReporter = new TTYReporter(options);
101
- ttyReporter.testCounter = -2;
102
- ttyReporter.technicalDepth = 1;
103
- reporter = ttyReporter.report.bind(ttyReporter);
104
- }
105
- if (!reporter) {
106
- const tapReporter = new TapReporter({useJson: true, hasColors: !options.monochrome});
107
- reporter = tapReporter.report.bind(tapReporter);
108
- }
109
- setReporter(reporter);
97
+ const currentReporter = getReporter();
98
+ if (!currentReporter) {
99
+ const reporterType = getReporterType(),
100
+ reporterFile = reporters[reporterType] || reporters.tty,
101
+ CustomReporter = (await import('../src/' + reporterFile)).default,
102
+ customOptions =
103
+ reporterType === 'tap' ? {useJson: true, hasColors: !options.monochrome} : options,
104
+ customReporter = new CustomReporter(customOptions);
105
+ setReporter(customReporter.report.bind(customReporter));
110
106
  }
111
107
 
112
108
  if (files.length) {
package/bin/tape6-deno.js CHANGED
@@ -2,11 +2,10 @@
2
2
 
3
3
  import {fileURLToPath} from 'node:url';
4
4
 
5
- import {resolveTests, resolvePatterns} from '../src/utils/config.js';
5
+ import {resolveTests, resolvePatterns, getReporter as getReporterType} from '../src/utils/config.js';
6
6
 
7
7
  import {getReporter, setReporter} from '../src/test.js';
8
8
  import State, {StopTest} from '../src/State.js';
9
- import TapReporter from '../src/TapReporter.js';
10
9
  import {selectTimer} from '../src/utils/timer.js';
11
10
 
12
11
  import TestWorker from '../src/deno/TestWorker.js';
@@ -88,25 +87,22 @@ const config = () => {
88
87
  if (!parallel) parallel = globalThis.navigator?.hardwareConcurrency || 1;
89
88
  };
90
89
 
90
+ const reporters = {
91
+ jsonl: 'JSONLReporter.js',
92
+ tap: 'TapReporter.js',
93
+ tty: 'TTYReporter.js'
94
+ };
95
+
91
96
  const init = async () => {
92
- let reporter = getReporter();
93
- if (!reporter) {
94
- if (Deno.env.get('TAPE6_JSONL')) {
95
- const JSONLReporter = (await import('../src/JSONLReporter.js')).default,
96
- jsonlReporter = new JSONLReporter(options);
97
- reporter = jsonlReporter.report.bind(jsonlReporter);
98
- } else if (!Deno.env.get('TAPE6_TAP')) {
99
- const TTYReporter = (await import('../src/TTYReporter.js')).default,
100
- ttyReporter = new TTYReporter(options);
101
- ttyReporter.testCounter = -2;
102
- ttyReporter.technicalDepth = 1;
103
- reporter = ttyReporter.report.bind(ttyReporter);
104
- }
105
- if (!reporter) {
106
- const tapReporter = new TapReporter({useJson: true, hasColors: !options.monochrome});
107
- reporter = tapReporter.report.bind(tapReporter);
108
- }
109
- setReporter(reporter);
97
+ const currentReporter = getReporter();
98
+ if (!currentReporter) {
99
+ const reporterType = getReporterType(),
100
+ reporterFile = reporters[reporterType] || reporters.tty,
101
+ CustomReporter = (await import('../src/' + reporterFile)).default,
102
+ customOptions =
103
+ reporterType === 'tap' ? {useJson: true, hasColors: !options.monochrome} : options,
104
+ customReporter = new CustomReporter(customOptions);
105
+ setReporter(customReporter.report.bind(customReporter));
110
106
  }
111
107
 
112
108
  if (files.length) {
package/bin/tape6-node.js CHANGED
@@ -3,11 +3,14 @@
3
3
  import process from 'node:process';
4
4
  import {fileURLToPath} from 'node:url';
5
5
 
6
- import {resolveTests, resolvePatterns} from '../src/utils/config.js';
6
+ import {
7
+ resolveTests,
8
+ resolvePatterns,
9
+ getReporter as getReporterType
10
+ } from '../src/utils/config.js';
7
11
 
8
12
  import {getReporter, setReporter} from '../src/test.js';
9
13
  import State, {StopTest} from '../src/State.js';
10
- import TapReporter from '../src/TapReporter.js';
11
14
  import {selectTimer} from '../src/utils/timer.js';
12
15
 
13
16
  import TestWorker from '../src/node/TestWorker.js';
@@ -89,25 +92,22 @@ const config = () => {
89
92
  if (!parallel) parallel = globalThis.navigator?.hardwareConcurrency || 1;
90
93
  };
91
94
 
95
+ const reporters = {
96
+ jsonl: 'JSONLReporter.js',
97
+ tap: 'TapReporter.js',
98
+ tty: 'TTYReporter.js'
99
+ };
100
+
92
101
  const init = async () => {
93
- let reporter = getReporter();
94
- if (!reporter) {
95
- if (process.env.TAPE6_JSONL) {
96
- const JSONLReporter = (await import('../src/JSONLReporter.js')).default,
97
- jsonlReporter = new JSONLReporter(options);
98
- reporter = jsonlReporter.report.bind(jsonlReporter);
99
- } else if (!process.env.TAPE6_TAP) {
100
- const TTYReporter = (await import('../src/TTYReporter.js')).default,
101
- ttyReporter = new TTYReporter(options);
102
- ttyReporter.testCounter = -2;
103
- ttyReporter.technicalDepth = 1;
104
- reporter = ttyReporter.report.bind(ttyReporter);
105
- }
106
- if (!reporter) {
107
- const tapReporter = new TapReporter({useJson: true, hasColors: !options.monochrome});
108
- reporter = tapReporter.report.bind(tapReporter);
109
- }
110
- setReporter(reporter);
102
+ const currentReporter = getReporter();
103
+ if (!currentReporter) {
104
+ const reporterType = getReporterType(),
105
+ reporterFile = reporters[reporterType] || reporters.tty,
106
+ CustomReporter = (await import('../src/' + reporterFile)).default,
107
+ customOptions =
108
+ reporterType === 'tap' ? {useJson: true, hasColors: !options.monochrome} : options,
109
+ customReporter = new CustomReporter(customOptions);
110
+ setReporter(customReporter.report.bind(customReporter));
111
111
  }
112
112
 
113
113
  if (files.length) {
@@ -3,16 +3,17 @@
3
3
  import process from 'node:process';
4
4
  import {fileURLToPath} from 'node:url';
5
5
 
6
- const requestedRuntime = {
6
+ const runtimeFiles = {
7
7
  node: 'tape6-node.js',
8
8
  deno: 'tape6-deno.js',
9
9
  bun: 'tape6-bun.js',
10
10
  server: 'tape6-server.js',
11
11
  runner: 'tape6-runner.js',
12
12
  main: 'tape6.js'
13
- }[process.argv[2]];
13
+ };
14
+ const requestedRuntime = runtimeFiles[process.argv[2]] || runtimeFiles.main;
14
15
 
15
- const runtime = requestedRuntime || 'tape6.js',
16
+ const runtime = requestedRuntime,
16
17
  url = new URL('./' + runtime, import.meta.url),
17
18
  fileName = url.protocol === 'file:' ? fileURLToPath(url) : url.href;
18
19
 
package/bin/tape6.js CHANGED
@@ -11,11 +11,11 @@ if (process.argv.includes('--self')) {
11
11
  console.log(self);
12
12
  }
13
13
  } else {
14
- if (typeof Deno == 'object') {
14
+ if (typeof Deno == 'object' && Deno?.version) {
15
15
  await import('./tape6-deno.js');
16
- } else if (typeof Bun == 'object') {
16
+ } else if (typeof Bun == 'object' && Bun?.version) {
17
17
  await import('./tape6-bun.js');
18
- } else if (typeof process == 'object' && process.versions?.node) {
18
+ } else if (typeof process == 'object' && process?.versions?.node) {
19
19
  await import('./tape6-node.js');
20
20
  } else {
21
21
  throw new Error('tape6 is not supported in this environment');
package/index.js CHANGED
@@ -1,3 +1,5 @@
1
+ // @ts-self-types="./index.d.ts"
2
+
1
3
  import {
2
4
  test,
3
5
  getTests,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tape-six",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "TAP the test harness for the modern JavaScript (ES6).",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -71,8 +71,8 @@
71
71
  }
72
72
  },
73
73
  "devDependencies": {
74
- "@types/node": "^22.13.10",
75
- "puppeteer": "^24.4.0",
76
- "typescript": "^5.8.2"
74
+ "@types/node": "^25.0.3",
75
+ "puppeteer": "^24.34.0",
76
+ "typescript": "^5.9.3"
77
77
  }
78
78
  }
@@ -76,7 +76,40 @@ class TTYReporter {
76
76
  this.failure = this.paint(failureStyle, reset);
77
77
  this.skipped = this.paint(skippedStyle, reset);
78
78
 
79
- this.output.isTTY && this.out('');
79
+ // watching for console output
80
+
81
+ this.consoleWasUsed = false;
82
+ this.consoleLastNewLine = false;
83
+ this.consoleSkipChecks = false;
84
+
85
+ while (this.output.isTTY) {
86
+ this.out('');
87
+
88
+ const isCurrentTTY = this.output === process.stdout || this.output === process.stderr;
89
+ if (!isCurrentTTY) break;
90
+
91
+ const oldStdoutWrite = process.stdout.write;
92
+ process.stdout.write = process.stderr.write = (chunk, ...args) => {
93
+ if (!this.consoleSkipChecks && chunk) {
94
+ this.consoleWasUsed = true;
95
+ const text = chunk.toString();
96
+ this.consoleLastNewLine = text[text.length - 1] === '\n';
97
+ }
98
+ return oldStdoutWrite.call(process.stdout, chunk, ...args);
99
+ };
100
+
101
+ const oldStderrWrite = process.stderr.write;
102
+ process.stderr.write = (chunk, ...args) => {
103
+ if (!this.consoleSkipChecks && chunk) {
104
+ this.consoleWasUsed = true;
105
+ const text = chunk.toString();
106
+ this.consoleLastNewLine = text[text.length - 1] === '\n';
107
+ }
108
+ return oldStderrWrite.call(process.stderr, chunk, ...args);
109
+ };
110
+
111
+ break;
112
+ }
80
113
  }
81
114
  paint(prefix, suffix = '\x1B[39m') {
82
115
  return this.hasColors ? text => join(prefix, text, suffix) : text => text;
@@ -100,9 +133,22 @@ class TTYReporter {
100
133
  return this;
101
134
  }
102
135
  report(event) {
136
+ this.consoleSkipChecks = true;
137
+ try {
138
+ this.reportInternal(event);
139
+ } finally {
140
+ this.consoleSkipChecks = false;
141
+ }
142
+ }
143
+ reportInternal(event) {
103
144
  if (this.output.isTTY) {
104
- this.output.moveCursor(0, -1);
105
- this.output.clearLine(0);
145
+ if (this.consoleWasUsed) {
146
+ if (!this.consoleLastNewLine) this.output.write('\n');
147
+ this.consoleWasUsed = this.consoleLastNewLine = false;
148
+ } else {
149
+ this.output.moveCursor(0, -1);
150
+ this.output.clearLine(0);
151
+ }
106
152
  }
107
153
  let text;
108
154
  switch (event.type) {
@@ -64,3 +64,32 @@ export const resolveTests = async (rootFolder, type, traceFn) => {
64
64
  // resolve patterns
65
65
  return resolvePatterns(rootFolder, patterns);
66
66
  };
67
+
68
+ export const runtime = {name: 'unknown', env: null};
69
+
70
+ if (typeof Deno == 'object' && Deno?.version) {
71
+ runtime.name = 'deno';
72
+ runtime.env = Deno.env;
73
+ } else if (typeof Bun == 'object' && Bun?.version) {
74
+ runtime.name = 'bun';
75
+ runtime.env = Bun.env;
76
+ } else if (typeof process == 'object' && process?.versions?.node) {
77
+ runtime.name = 'node';
78
+ runtime.env = process.env;
79
+ } else if (typeof window == 'object' && window?.document) {
80
+ runtime.name = 'browser';
81
+ }
82
+
83
+ export const getReporter = () => {
84
+ if (!runtime.env) return null;
85
+ if (runtime.env.TAPE6_REPORTER) return runtime.env.TAPE6_REPORTER;
86
+ if (runtime.env.TAPE6_JSONL) return 'jsonl';
87
+ if (runtime.env.TAPE6_TAP) return 'tap';
88
+ return 'tty';
89
+ };
90
+
91
+ export const getRunner = () => {
92
+ if (!runtime.env) return null;
93
+ if (runtime.env.TAPE6_RUNNER) return runtime.env.TAPE6_RUNNER;
94
+ return 'thread';
95
+ };