@git.zone/tstest

Documentation for @git.zone/tstest

readme.md for @git.zone/tstest

๐Ÿงช A powerful, modern test runner for TypeScript โ€” beautiful output, multi-runtime support, and a batteries-included test framework that makes testing actually enjoyable.

Availability and Links

Issue Reporting and Security

For reporting bugs, issues, or security vulnerabilities, please visit community.foss.global/. This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a code.foss.global/ account to submit Pull Requests directly.

Why tstest?

Most TypeScript test runners feel like an afterthought โ€” clunky configuration, ugly output, and poor TypeScript support. tstest was built from the ground up for TypeScript developers who want:

Installation

pnpm install --save-dev @git.zone/tstest

Module Exports

tstest ships as four modules, each optimized for a different use case:

Export Path Environment Purpose
@git.zone/tstest CLI Test runner โ€” discovers and executes test files
@git.zone/tstest/tapbundle Browser + Node Core test framework โ€” tap, expect, lifecycle hooks
@git.zone/tstest/tapbundle_serverside Node.js only Server-side utilities โ€” ports, certs, databases, shell
@git.zone/tstest/tapbundle_protocol Isomorphic TAP Protocol V2 โ€” structured metadata, events, diffs

Quick Start

1. Write a test

// test/test.math.ts
import { tap, expect } from '@git.zone/tstest/tapbundle';

tap.test('should add numbers', async () => {
  expect(2 + 2).toEqual(4);
});

tap.test('should handle async operations', async (tools) => {
  await tools.delayFor(100);
  const result = await fetchData();
  expect(result).toBeTruthy();
});

export default tap.start();

2. Run it

# Run all tests
tstest test/

# Run a specific file
tstest test/test.math.ts

# Use glob patterns
tstest "test/**/*.ts"

# Verbose mode (shows console output)
tstest test/ --verbose

# Watch mode
tstest test/ --watch

3. See beautiful output

๐Ÿ” Test Discovery
   Mode: directory
   Pattern: test
   Found: 4 test file(s)

โ–ถ๏ธ  test/test.math.ts (1/4)
   Runtime: Node.js
   โœ… should add numbers (2ms)
   โœ… should handle async operations (105ms)
   Summary: 2/2 PASSED in 1.2s

๐Ÿ“Š Test Summary
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Total Files:                 4 โ”‚
โ”‚ Total Tests:                 8 โ”‚
โ”‚ Passed:                      8 โ”‚
โ”‚ Failed:                      0 โ”‚
โ”‚ Duration:                 2.4s โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ALL TESTS PASSED! ๐ŸŽ‰

Multi-Runtime Architecture

tstest supports running your tests across four JavaScript runtimes, letting you verify cross-platform compatibility with zero extra effort.

Test File Naming Convention

Name your test files with runtime specifiers to control where they run:

Pattern Runtimes Example
*.ts Node.js (default) test.api.ts
*.node.ts Node.js only test.server.node.ts
*.chromium.ts Chromium browser test.dom.chromium.ts
*.deno.ts Deno test.http.deno.ts
*.bun.ts Bun test.fast.bun.ts
*.all.ts All runtimes test.universal.all.ts
*.node+chromium.ts Node.js + Chromium test.isomorphic.node+chromium.ts
*.node+deno.ts Node.js + Deno test.cross.node+deno.ts
*.chromium.nonci.ts Chromium, skip in CI test.visual.chromium.nonci.ts

Runtime Execution Order

When multiple runtimes are specified, tests execute in this order: Node.js โ†’ Bun โ†’ Deno โ†’ Chromium

Migration from Legacy Naming

# Dry run โ€” see what would change
tstest migrate --dry-run

# Apply migrations (uses git mv to preserve history)
tstest migrate --write
Legacy Pattern Modern Equivalent
*.browser.ts *.chromium.ts
*.both.ts *.node+chromium.ts

CLI Options

Option Description
--quiet, -q Minimal output โ€” perfect for CI
--verbose, -v Show all console output from tests
--no-color Disable colored output
--json Output results as JSON (CI/CD pipelines)
--logfile Save detailed logs with error/diff tracking
--tags <tags> Run only tests with specific tags
--timeout <seconds> Timeout test files after N seconds
--startFrom <n> Start from test file number N
--stopAt <n> Stop at test file number N
--watch, -w Re-run tests on file changes
--watch-ignore <patterns> Ignore patterns in watch mode
--only Run only tests marked with .only

Writing Tests with tapbundle

Basic Syntax

import { tap, expect } from '@git.zone/tstest/tapbundle';

tap.test('basic test', async () => {
  expect(2 + 2).toEqual(4);
});

tap.test('with tools', async (tools) => {
  await tools.delayFor(100);
  tools.timeout(5000);
  expect(true).toBeTrue();
});

export default tap.start();

Test Modifiers

// Skip
tap.skip.test('not ready yet', async () => { /* skipped */ });

// Only (exclusive)
tap.only.test('focus on this', async () => { /* only this runs */ });

// Todo
tap.todo.test('implement later', async () => { /* marked as todo */ });

// Fluent chaining
tap.timeout(5000)
   .retry(3)
   .tags('api', 'integration')
   .test('complex test', async (tools) => { /* configured */ });

Test Organization with describe()

tap.describe('User Management', () => {
  tap.beforeEach(async () => {
    // setup before each test
  });

  tap.afterEach(async () => {
    // cleanup after each test
  });

  tap.test('should create user', async () => { /* ... */ });
  tap.test('should delete user', async () => { /* ... */ });

  tap.describe('Permissions', () => {
    tap.test('should set admin role', async () => { /* ... */ });
  });
});

Pre-Tasks and Post-Tasks

tap.preTask('setup database', async () => {
  await initializeDatabase();
});

tap.test('uses the database', async () => { /* ... */ });

tap.postTask('cleanup database', async () => {
  await cleanupDatabase();
});

Test Tools

Every test function receives a tools parameter packed with utilities:

tap.test('tools demo', async (tools) => {
  // โฑ๏ธ Delays
  await tools.delayFor(1000);
  await tools.delayForRandom(100, 500);

  // โญ๏ธ Skip
  tools.skipIf(process.env.CI === 'true', 'Skipping in CI');
  tools.skip('reason');

  // ๐Ÿ” Retry & timeout
  tools.retry(3);
  tools.timeout(10000);

  // ๐Ÿ“ฆ Context sharing between tests
  tools.context.set('userId', 12345);
  const userId = tools.context.get('userId');

  // ๐Ÿ”ฎ Deferred promises
  const deferred = tools.defer();
  setTimeout(() => deferred.resolve('done'), 100);
  await deferred.promise;

  // ๐ŸŽฏ Error capture
  const error = await tools.returnError(async () => {
    throw new Error('Expected error');
  });
  expect(error).toBeInstanceOf(Error);

  // โœ… Allow failure (test won't fail the suite)
  tools.allowFailure();
});

Snapshot Testing

tap.test('snapshot test', async (tools) => {
  const output = generateComplexOutput();
  await tools.matchSnapshot(output);
  await tools.matchSnapshot(output.header, 'header');
});

// Update snapshots: UPDATE_SNAPSHOTS=true tstest test/

Test Fixtures

tap.defineFixture('testUser', async (data) => ({
  id: Date.now(),
  name: data?.name || 'Test User',
  email: data?.email || 'test@example.com',
}));

tap.test('fixture test', async (tools) => {
  const user = await tools.fixture('testUser', { name: 'John' });
  expect(user.name).toEqual('John');

  // Factory pattern for multiple instances
  const users = await tools.factory('testUser').createMany(5);
  expect(users).toHaveLength(5);
});

Parallel Execution

// Within a file
tap.parallel().test('parallel test 1', async () => { /* ... */ });
tap.parallel().test('parallel test 2', async () => { /* ... */ });

// Across files โ€” same suffix = parallel group
// test.api.para__1.ts  โ†โ”€ run together
// test.db.para__1.ts   โ†โ”€ run together
// test.auth.para__2.ts โ†โ”€ runs after para__1 completes

Assertions (expect)

tapbundle uses @push.rocks/smartexpect for assertions with automatic diff generation on failures:

// Equality
expect(value).toEqual(5);
expect(obj).toDeepEqual({ a: 1, b: 2 });

// Types
expect('hello').toBeTypeofString();
expect(42).toBeTypeofNumber();
expect([]).toBeArray();

// Comparisons
expect(5).toBeGreaterThan(3);
expect(0.1 + 0.2).toBeCloseTo(0.3, 10);

// Truthiness
expect(true).toBeTrue();
expect(null).toBeNull();
expect(undefined).toBeUndefined();

// Strings
expect('hello world').toStartWith('hello');
expect('hello world').toEndWith('world');
expect('hello world').toInclude('lo wo');
expect('hello world').toMatch(/^hello/);

// Arrays
expect([1, 2, 3]).toContain(2);
expect([1, 2, 3]).toContainAll([1, 3]);
expect([1, 2, 3]).toHaveLength(3);

// Objects
expect(obj).toHaveProperty('name');
expect(obj).toMatchObject({ name: 'John' });

// Functions & Promises
expect(() => { throw new Error(); }).toThrow();
await expect(Promise.resolve('val')).resolves.toEqual('val');
await expect(Promise.reject(new Error())).rejects.toThrow();

// Custom
expect(7).customAssertion(v => v % 2 === 1, 'Value is not odd');

Server-Side Tools (tapbundle_serverside)

For Node.js-only tests, import server-side utilities:

import { tapNodeTools } from '@git.zone/tstest/tapbundle_serverside';
import { tap, expect } from '@git.zone/tstest/tapbundle';

๐ŸŒ Network Utilities

Find free local ports for test servers โ€” no more port conflicts:

tap.test('should start server on free port', async () => {
  // Single free port (random in range 3000โ€“60000)
  const port = await tapNodeTools.findFreePort();

  // Custom range
  const port2 = await tapNodeTools.findFreePort({ startPort: 8000, endPort: 9000 });

  // With exclusions
  const port3 = await tapNodeTools.findFreePort({ exclude: [8080, 8443] });
});

tap.test('should allocate multiple ports', async () => {
  // Multiple distinct ports
  const [httpPort, wsPort, adminPort] = await tapNodeTools.findFreePorts(3);

  // Consecutive port range (e.g., 4000, 4001, 4002)
  const portRange = await tapNodeTools.findFreePortRange(3, {
    startPort: 20000,
    endPort: 30000,
  });
});

๐Ÿ”’ HTTPS Certificates

Generate self-signed certs for testing secure connections:

tap.test('should serve over HTTPS', async () => {
  const { key, cert } = await tapNodeTools.createHttpsCert('localhost');
  const server = https.createServer({ key, cert }, handler);
  server.listen(port);
});

๐Ÿ’ป Shell Commands

const result = await tapNodeTools.runCommand('ls -la');
console.log(result.exitCode); // 0

๐Ÿ” Environment Variables

const apiKey = await tapNodeTools.getEnvVarOnDemand('GITHUB_API_KEY');
// Prompts if not set, stores in .nogit/.env for future use

๐Ÿ—„๏ธ Ephemeral MongoDB

const mongo = await tapNodeTools.createSmartmongo();
// ... run database tests ...
await mongo.stop();

๐Ÿ“ฆ Local S3 Storage

const s3 = await tapNodeTools.createSmarts3();
// ... run object storage tests ...
await s3.stop();

Test File Directives

Control runtime behavior directly from your test files using special comment directives at the top of the file. Directives must appear before any import statements.

Deno Permissions

By default, Deno tests run with --allow-read, --allow-env, --allow-net, --allow-write, --allow-sys, and --allow-import. Add directives to request additional permissions:

// tstest:deno:allowAll
import { tap, expect } from '@git.zone/tstest/tapbundle';

tap.test('test with full Deno permissions', async () => {
  // Runs with --allow-all (e.g., for FFI, subprocess spawning, etc.)
});

export default tap.start();

Available Directives

Directive Effect
// tstest:deno:allowAll Grants all Deno permissions (--allow-all)
// tstest:deno:allowRun Adds --allow-run for subprocess spawning
// tstest:deno:allowFfi Adds --allow-ffi for native library calls
// tstest:deno:allowHrtime Adds --allow-hrtime for high-res timers
// tstest:deno:flag:--unstable-ffi Passes any arbitrary Deno flag
// tstest:node:flag:--max-old-space-size=4096 Passes flags to Node.js
// tstest:bun:flag:--smol Passes flags to Bun

Multiple Directives

Combine as many directives as needed:

// tstest:deno:allowRun
// tstest:deno:allowFfi
// tstest:deno:flag:--unstable-ffi
import { tap, expect } from '@git.zone/tstest/tapbundle';

tap.test('test with Rust FFI', async () => {
  // Has --allow-run, --allow-ffi, and --unstable-ffi in addition to defaults
});

export default tap.start();

Shared Directives via 00init.ts

Directives in a 00init.ts file apply to all test files in that directory. Test file directives are merged with (and extend) init file directives.

// test/00init.ts
// tstest:deno:allowRun
// test/test.mytest.deno.ts
// tstest:deno:allowFfi
// Both --allow-run (from 00init.ts) and --allow-ffi are active
import { tap, expect } from '@git.zone/tstest/tapbundle';

Advanced Features

Watch Mode

tstest test/ --watch
tstest test/ --watch --watch-ignore "dist/**,coverage/**"

Visual Diffs

When assertions fail, you get beautiful diffs:

โŒ should return correct user data

   Object Diff:
   {
     name: "John",
   - age: 30,
   + age: 31,
     email: "john@example.com"
   }

Enhanced Logging

tstest test/ --logfile
Folder Contents
.nogit/testlogs/ Current run logs
.nogit/testlogs/previous/ Previous run logs
.nogit/testlogs/00err/ Failed test logs
.nogit/testlogs/00diff/ Changed output diffs

JSON Output (CI/CD)

tstest test/ --json > test-results.json
{"event":"discovery","count":4,"pattern":"test","executionMode":"directory"}
{"event":"testResult","testName":"prepare test","passed":true,"duration":1}
{"event":"summary","summary":{"totalFiles":4,"totalTests":4,"totalPassed":4,"totalFailed":0}}

Tag Filtering

tap.tags('unit', 'api').test('api unit test', async () => { /* ... */ });
tstest test/ --tags unit,api

Test File Range

tstest test/ --startFrom 5 --stopAt 10  # Run files 5-10 only

Browser Testing with webhelpers

import { tap, webhelpers } from '@git.zone/tstest/tapbundle';

tap.test('DOM test', async () => {
  const element = await webhelpers.fixture(webhelpers.html`
    <div class="container">
      <h1>Hello</h1>
    </div>
  `);
  expect(element.querySelector('h1').textContent).toEqual('Hello');
});

TapWrap (Global Lifecycle)

import { TapWrap } from '@git.zone/tstest/tapbundle';

const tapWrap = new TapWrap({
  before: async () => { await globalSetup(); },
  after: async () => { await globalCleanup(); },
});

tapbundle Protocol V2

tstest includes an enhanced TAP protocol that extends TAP 13 with structured metadata while staying backwards compatible. Protocol markers (โŸฆTSTEST:...โŸง) are invisible to standard TAP parsers.

import { ProtocolEmitter, ProtocolParser } from '@git.zone/tstest/tapbundle_protocol';

// Emit
const emitter = new ProtocolEmitter();
console.log(emitter.emitProtocolHeader());  // โŸฆTSTEST:PROTOCOL:2.0.0โŸง
console.log(emitter.emitTest({
  ok: true, testNumber: 1, description: 'test',
  metadata: { time: 42, tags: ['unit'] }
}).join('\n'));

// Parse
const parser = new ProtocolParser();
const messages = parser.parseLine('ok 1 - test โŸฆTSTEST:time:42โŸง');

This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the license file.

Please note: The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.

Trademarks

This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.

Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.

Company Information

Task Venture Capital GmbH Registered at District Court Bremen HRB 35230 HB, Germany

By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

changelog.md for @git.zone/tstest

2026-03-27 - 3.6.3 - fix(tapbundle_serverside)

add TapNodeTools cleanup hooks to stop SmartNetwork processes after tests

2026-03-27 - 3.6.2 - fix(cli,chromium-runtime)

clean up long-lived test runner resources after runs to prevent hanging processes

2026-03-26 - 3.6.1 - fix(chromium runtime)

encode Chromium test bundle names correctly for nested file paths

2026-03-24 - 3.6.0 - feat(config)

migrate project metadata to .smartconfig and refresh build configuration

2026-03-23 - 3.5.1 - fix(runtime)

handle expected exitCode rejection after terminating timed out test processes

2026-03-19 - 3.5.0 - feat(tstest)

add support for package.json before scripts during test execution

2026-03-18 - 3.4.0 - feat(tapbundle,deno)

replace smarts3 test tooling with smartstorage and pre-resolve Deno test dependencies

2026-03-09 - 3.3.2 - fix(deps)

bump dependency versions and reorder smartserve in package.json

2026-03-09 - 3.3.1 - fix(serve)

migrate test HTTP server to @push.rocks/smartserve and update related dependencies

2026-03-06 - 3.3.0 - feat(testfile-directives)

Add per-test file directives to control runtime permissions and flags (Deno, Node, Bun, Chromium)

2026-03-03 - 3.2.0 - feat(tapbundle_serverside)

add network port discovery utilities and migrate file I/O to smartfs; refactor runtimes to use Node fs and SmartFs, update server APIs and bump dependencies

2026-01-25 - 3.1.8 - fix(tapbundle)

treat tests that call tools.allowFailure() as passing and update tests to use tools parameter

2026-01-25 - 3.1.7 - fix(tap-parser)

append newline to WebSocket tap log messages to ensure proper line-by-line processing

2026-01-19 - 3.1.6 - fix(logging)

handle mid-line streaming output in test logger and add streaming tests

2026-01-19 - 3.1.5 - fix(tstest)

preserve streaming console output and correctly buffer incomplete TAP lines

2025-12-30 - 3.1.4 - fix(webhelpers)

improve browser test fixture to append element and await custom element upgrade and Lit update completion; add generic return type; update npm packaging release config; remove pnpm onlyBuiltDependencies

2025-11-21 - 3.1.3 - fix(docs)

Update package author and expand license/legal and issue-reporting information in tapbundle docs

2025-11-21 - 3.1.2 - fix(docs)

Update README: add issue reporting/security guidance and expanded changelog (3.1.1/3.1.0)

2025-11-21 - 3.1.1 - fix(tapbundle)

Pass TapTools to suite lifecycle hooks (beforeAll/afterAll) and update @push.rocks/smarts3 to ^3.0.0

2025-11-20 - 3.1.0 - feat(tapbundle)

Add global postTask (teardown) and suite lifecycle hooks (beforeAll/afterAll) to tapbundle

2025-11-20 - 3.0.1 - fix(@push.rocks/smarts3)

Bump @push.rocks/smarts3 dependency to ^2.2.7

2025-11-19 - 3.0.0 - BREAKING CHANGE(tapbundle_serverside)

Rename Node-specific tapbundle module to tapbundle_serverside and migrate server-side utilities

2025-11-19 - 2.8.3 - fix(dependencies)

Update dependency versions

2025-11-17 - 2.8.2 - fix(logging)

Include runtime identifier in per-test logfile name and sanitize runtime string

2025-11-17 - 2.8.1 - fix(config)

Remove Bun config file and set deno.json useDefineForClassFields to false for compatibility

2025-11-17 - 2.8.0 - feat(runtime-adapters)

Enable TypeScript decorator support for Deno and Bun runtimes and add decorator tests

2025-10-26 - 2.7.0 - feat(tapbundle_protocol)

Add package export for tapbundle_protocol to expose protocol utilities

2025-10-17 - 2.6.2 - fix(@push.rocks/smartrequest)

Bump @push.rocks/smartrequest from ^4.3.1 to ^4.3.2

2025-10-17 - 2.6.1 - fix(runtime-adapters)

Silence shell version checks for Bun and Deno; add local Claude settings

2025-10-17 - 2.6.0 - feat(runtime-adapters)

Add runtime environment availability check and logger output; normalize runtime version strings

2025-10-17 - 2.5.2 - fix(runtime.node)

Improve Node runtime adapter to use tsrun.spawnPath, strengthen tsrun detection, and improve process lifecycle and loader handling; update tsrun dependency.

2025-10-16 - 2.5.1 - fix(deps)

Bump dependencies and add local tooling settings

2025-10-12 - 2.5.0 - feat(tstest.classes.runtime.parser)

Add support for "all" runtime token and update docs/tests; regenerate lockfile and add local settings

2025-10-11 - 2.4.3 - fix(docs)

Update documentation: expand README with multi-runtime architecture, add module READMEs, and add local dev settings

2025-10-10 - 2.4.2 - fix(deno)

Enable additional Deno permissions for runtime adapters and add local dev settings

2025-10-10 - 2.4.1 - fix(runtime/deno)

Enable Deno runtime tests by adding required permissions and local settings

2025-10-10 - 2.4.0 - feat(runtime)

Add runtime adapters, filename runtime parser and migration tool; integrate runtime selection into TsTest and add tests

2025-09-12 - 2.3.8 - fix(tstest)

Improve free port selection for Chrome runner and bump smartnetwork dependency

2025-09-12 - 2.3.7 - fix(tests)

Remove flaky dynamic-ports browser test and add local dev tool settings

2025-09-03 - 2.3.6 - fix(tstest)

Update deps, fix chrome server route for static bundles, add local tool settings and CI ignore

2025-08-18 - 2.3.5 - fix(core)

Use SmartRequest with Buffer for binary downloads, tighten static route handling, bump dependencies and add workspace/config files

2025-08-16 - 2.3.4 - fix(ci)

Add local Claude settings to allow required WebFetch and Bash permissions for local tooling and tests

2025-08-16 - 2.3.3 - fix(dependencies)

Bump dependency versions and add local Claude settings

2025-07-24 - 2.3.2 - fix(tapbundle)

Fix TypeScript IDE warning about tapTools parameter possibly being undefined

2025-05-26 - 2.3.1 - fix(tapParser/logger)

Fix test duration reporting and summary formatting in TAP parser and logger

2025-05-26 - 2.3.0 - feat(cli)

Add '--version' option and warn against global tstest usage in the tstest project

2025-05-26 - 2.2.6 - fix(tstest)

Improve timeout warning timer management and summary output formatting in the test runner.

2025-05-26 - 2.2.5 - fix(protocol)

Fix inline timing metadata parsing and enhance test coverage for performance metrics and timing edge cases

2025-05-26 - 2.2.4 - fix(logging)

Improve performance metrics reporting and add local permissions configuration

2025-05-26 - 2.2.3 - fix(readme/ts/tstest.plugins)

Update npm package scope and documentation to use '@git.zone' instead of '@gitzone', and add local settings configuration.

2025-05-26 - 2.2.2 - fix(config)

Cleanup project configuration by adding local CLAUDE settings and removing redundant license files

2025-05-26 - 2.2.1 - fix(repo configuration)

Update repository metadata to use 'git.zone' naming and add local permission settings

2025-05-26 - 2.2.0 - feat(watch mode)

Add watch mode support with CLI options and enhanced documentation

2025-05-26 - 2.1.0 - feat(core)

Implement Protocol V2 with enhanced settings and lifecycle hooks

2025-05-25 - 2.0.0 - BREAKING CHANGE(protocol)

Introduce protocol v2 implementation and update build configuration with revised build order, new tspublish files, and enhanced documentation

2025-05-24 - 1.11.5 - fix(tstest)

Fix timeout handling to correctly evaluate TAP results after killing the test process.

2025-05-24 - 1.11.4 - fix(logging)

Improve warning logging and add permission settings file

2025-05-24 - 1.11.3 - fix(tstest)

Add timeout warning for long-running tests and introduce local settings configuration

2025-05-24 - 1.11.2 - fix(tstest)

Improve timeout and error handling in test execution along with TAP parser timeout logic improvements.

2025-05-24 - 1.11.1 - fix(tstest)

Clear timeout identifiers after successful test execution and add local CLAUDE settings

2025-05-24 - 1.11.0 - feat(cli)

Add new timeout and file range options with enhanced logfile diff logging

2025-05-24 - 1.10.2 - fix(tstest-logging)

Improve log file handling with log rotation and diff reporting

2025-05-23 - 1.10.1 - fix(tstest)

Improve file range filtering and summary logging by skipping test files outside the specified range and reporting them in the final summary.

2025-05-23 - 1.10.0 - feat(cli)

Add --startFrom and --stopAt options to filter test files by range

2025-05-23 - 1.9.4 - fix(docs)

Update documentation and configuration for legal notices and CI permissions. This commit adds a new local settings file for tool permissions, refines the legal and trademark sections in the readme, and improves glob test files with clearer log messages.

2025-05-23 - 1.9.3 - fix(tstest)

Fix test timing display issue and update TAP protocol documentation

2025-05-23 - 1.9.2 - fix(logging)

Fix log file naming to prevent collisions and update logging system documentation.

2025-05-23 - 1.9.1 - fix(dependencies)

Update dependency versions and add local configuration files

2025-05-16 - 1.9.0 - feat(docs)

Update documentation to embed tapbundle and clarify module exports for browser compatibility; also add CI permission settings.

2025-05-16 - 1.8.0 - feat(documentation)

Enhance README with detailed test features and update local settings for build permissions.

2025-05-16 - 1.7.0 - feat(tstest)

Enhance tstest with fluent API, suite grouping, tag filtering, fixture & snapshot testing, and parallel execution improvements

2025-05-15 - 1.6.0 - feat(package)

Revamp package exports and update permissions with an extensive improvement plan for test runner enhancements.

2025-05-15 - 1.5.0 - feat(cli)

Improve test runner configuration: update test scripts, reorganize test directories, update dependencies and add local settings for command permissions.

2025-05-15 - 1.4.0 - feat(logging)

Display failed test console logs in default mode

2025-05-15 - 1.3.1 - fix(settings)

Add local permissions configuration and remove obsolete test output log

2025-05-15 - 1.3.0 - feat(logger)

Improve logging output and add --logfile support for persistent logs

2025-05-15 - 1.2.0 - feat(logging)

Improve logging output, CLI option parsing, and test report formatting.

2025-05-15 - 1.1.0 - feat(cli)

Enhance test discovery with support for single file and glob pattern execution using improved CLI argument detection

2025-01-23 - 1.0.96 - fix(TsTest)

Fixed improper type-check for promise-like testModule defaults

2025-01-23 - 1.0.95 - fix(core)

Fix delay handling in Chrome test execution

2025-01-23 - 1.0.94 - fix(TsTest)

Fix test module execution by ensuring promise resolution delay

2025-01-23 - 1.0.93 - fix(tstest)

Handle globalThis.tapPromise in browser runtime evaluation

2025-01-23 - 1.0.92 - fix(core)

Improve error logging for test modules without default promise

2025-01-23 - 1.0.91 - fix(core)

Refactored tstest class to enhance promise handling for test modules.

2024-04-18 - 1.0.89 to 1.0.90 - Enhancements and Bug Fixes

Multiple updates and fixes have been made.

2024-03-07 - 1.0.86 to 1.0.88 - Core Updates

Continued improvements and updates in the core module.

2024-01-19 - 1.0.85 to 1.0.89 - Bug Fixes

Series of core updates have been implemented.

2023-11-09 - 1.0.81 to 1.0.84 - Maintenance Updates

Maintenance updates focusing on core reliability.

2023-08-26 - 1.0.77 to 1.0.80 - Critical Fixes

Critical fixes implemented in core functionality.

2023-07-13 - 1.0.75 to 1.0.76 - Stability Improvements

Stability enhancements and minor improvements.

2022-11-08 - 1.0.73 to 1.0.74 - Routine Fixes

Routine core fixes to address reported issues.

2022-08-03 - 1.0.71 to 1.0.72 - Core Enhancements

Enhancements applied to core systems.

2022-05-04 - 1.0.69 to 1.0.70 - System Reliability Fixes

Fixes targeting the reliability of the core systems.

2022-03-17 - 1.0.65 to 1.0.68 - Major Core Updates

Major updates and bug fixes delivered for core components.

2022-02-15 - 1.0.60 to 1.0.64 - Core Stability Improvements

Focused updates on core stability and performance.

2021-11-07 - 1.0.54 to 1.0.59 - Core Fixes and Improvements

Multiple core updates aimed at fixing and improving the system.

2021-08-20 - 1.0.50 to 1.0.53 - Core Functionality Updates

Continued updates to improve core functionality and user experience.

2020-10-01 - 1.0.44 to 1.0.49 - Core System Enhancements

Critical enhancements to core systems.

2020-09-29 - 1.0.40 to 1.0.43 - Essential Fixes

Series of essential fixes for the core system.

2020-07-10 - 1.0.35 to 1.0.39 - Core Function Fixes

Focused improvements and fixes for critical components.

2020-06-01 - 1.0.31 to 1.0.34 - Core Updates

Updates to maintain core functionality efficacy.

2019-10-02 - 1.0.26 to 1.0.29 - Core Maintenance

Regular maintenance and updates for core reliability.

2019-05-28 - 1.0.20 to 1.0.25 - Core Improvements

General improvements targeting core functionalities.

2019-04-08 - 1.0.16 to 1.0.19 - Bug Squashing

Resolved numerous issues within core operations.

2018-12-06 - 1.0.15 - Dependency Updates

Updates aimed at improving dependency management.

2018-08-14 - 1.0.14 - Test Improvement

Major improvements in testing mechanisms and logging.

2018-08-04 - 1.0.1 to 1.0.13 - Initial Implementation and Fixes

Initial release and critical updates focusing on core stability and functionality.