Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ node_modules/
out/
test-dist/
test-esm/
browser/
types/
build/
build-es*/
Expand Down
841 changes: 356 additions & 485 deletions common/config/rush/npm-shrinkwrap.json

Large diffs are not rendered by default.

194 changes: 194 additions & 0 deletions common/test/worker-adapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
/*
* @nevware21/tripwire
* https://github.com/nevware21/tripwire
*
* Copyright (c) 2026 NevWare21 Solutions LLC
* Licensed under the MIT license.
*/

/**
* Worker Test Adapter - Runs in main page context
* Creates Web Worker, loads tests, and reports results to Karma
*/

(function() {
'use strict';

function initWorkerAdapter() {
var karma = window.__karma__;

if (!karma) {
console.log('[worker-adapter] __karma__ not available yet, will retry');
setTimeout(initWorkerAdapter, 50);
return;
}

console.log('[worker-adapter] Starting worker test setup');

// Override mocha.run to prevent normal test execution and run tests in worker instead
if (window.mocha && typeof window.mocha.run === 'function') {
window.mocha.run = function() {
console.log('[worker-adapter] Mocha.run intercepted - running tests in worker');
startWorkerTests();
// Return a mock runner to satisfy Mocha's expectations
return {
on: function() { return this; }
};
};
} else {
console.log('[worker-adapter] Mocha not found');
}

function startWorkerTests() {
console.log('[worker-adapter] Initializing worker tests');

var bundleFiles = [];
var moduleShims = [];
var jsFiles = [];
var files = karma.files;
var mochaFile = null;
var commonjsFile = null;

console.log('[worker-adapter] Total files from karma: ' + Object.keys(files).length);

for (var file in files) {
if (!files.hasOwnProperty(file)) {
continue;
}

// Collect karma-typescript bundles
if (/karma-typescript-bundle-.*\.js(\?|$)/.test(file)) {
bundleFiles.push(file);
continue;
}

// Detect Mocha runtime file
if (!mochaFile && /\/node_modules\/mocha\/mocha\.js(\?|$)/.test(file)) {
mochaFile = file;
continue;
}
// Detect karma-typescript commonjs runtime file
if (!commonjsFile && /\/node_modules\/karma-typescript\/dist\/client\/commonjs\.js(\?|$)/.test(file)) {
commonjsFile = file;
continue;
}
// Collect all JS files
if (/\.js(\?|$)/.test(file) && file.indexOf('/base/') === 0) {
jsFiles.push(file);
continue;
}

// Collect module shims
if (file.indexOf('/node_modules/@nevware21/ts-utils/dist/es5/main/ts-utils.js') !== -1) {
moduleShims.push({ name: 'ts-utils', file: file });
continue;
}

if (file.indexOf('/node_modules/@nevware21/ts-async/dist/es5/main/ts-async.js') !== -1) {
moduleShims.push({ name: 'ts-async', file: file });
continue;
}

if (file.indexOf('/node_modules/@nevware21/chromacon/dist/es5/main/chromacon.js') !== -1) {
moduleShims.push({ name: 'chromacon', file: file });
continue;
}
}

// Filter jsFiles to find test files, source files, and test support files
var testFiles = [];
var sourceFiles = [];
var testSupportFiles = [];
for (var i = 0; i < jsFiles.length; i++) {
if (/\/test\/src\/.*\.test\.js(\?|$)/.test(jsFiles[i])) {
testFiles.push(jsFiles[i]);
} else if (/^\/base\/src\/.*\.js(\?|$)/.test(jsFiles[i])) {
sourceFiles.push(jsFiles[i]);
} else if (/^\/base\/test\/src\/.*\.js(\?|$)/.test(jsFiles[i])) {
testSupportFiles.push(jsFiles[i]);
}
}

console.log('[worker-adapter] Found ' + bundleFiles.length + ' bundle files, ' + sourceFiles.length +
' source files, ' + testSupportFiles.length + ' support files, ' + testFiles.length + ' test files, and ' +
moduleShims.length + ' module shims');

// Find the worker runner
var workerScript = null;
for (var fileName in files) {
if (files.hasOwnProperty(fileName) && fileName.indexOf('worker-test-runner.js') !== -1) {
workerScript = fileName;
break;
}
}

if (!workerScript) {
console.error('[worker-adapter] Could not find worker-test-runner.js');
karma.error('[worker-test] Worker runner not found');
karma.complete({});
return;
}

console.log('[worker-adapter] Found worker script at: ' + workerScript);

// Create the worker
try {
var worker = new Worker(workerScript);
console.log('[worker-adapter] Worker created');

worker.onmessage = function(event) {
var msg = event.data;

switch (msg.type) {
case 'log':
console.log('[worker] ' + msg.message);
break;

case 'ready':
console.log('[worker-adapter] Worker ready, sending files');
// Send all files: bundle, source, support, and test files
var filesToSend = bundleFiles.concat(sourceFiles, testSupportFiles, testFiles);
console.log('[worker-adapter] Sending ' + filesToSend.length + ' total files to worker');
worker.postMessage({
type: 'loadTests',
files: filesToSend,
entrypoints: [],
moduleShims: moduleShims,
basePath: (karma.config && karma.config.basePath) ? karma.config.basePath : '',
mochaUrl: mochaFile || '/base/node_modules/mocha/mocha.js',
commonjsUrl: commonjsFile || '/base/node_modules/karma-typescript/dist/client/commonjs.js'
});
break;

case 'result':
karma.result(msg.result);
break;

case 'complete':
karma.complete(msg.coverage ? { coverage: msg.coverage } : {});
break;

case 'error':
console.error('[worker-adapter] Worker error: ' + msg.error);
karma.error('[worker-test] ' + msg.error);
karma.complete({});
break;
}
};

worker.onerror = function(error) {
console.error('[worker-adapter] Worker error event: ' + error.message);
karma.error('[worker-test] Worker error: ' + error.message);
karma.complete({});
};
} catch (err) {
console.error('[worker-adapter] Failed to create worker: ' + err.message);
karma.error('[worker-test] Failed to create worker: ' + err.message);
karma.complete({});
}
}
}

// Start worker adapter initialization
initWorkerAdapter();
})();
Loading