Compare commits

...

74 Commits

Author SHA1 Message Date
033a0a806c 1.0.86 2024-01-19 20:59:02 +01:00
7f87c24ad8 fix(core): update 2024-01-19 20:59:01 +01:00
ac08bdffe5 1.0.85 2023-11-10 12:44:08 +01:00
eb64cb4f71 fix(core): update 2023-11-10 12:44:08 +01:00
3b56c6ce9f 1.0.84 2023-11-09 21:06:07 +01:00
722d777f80 fix(core): update 2023-11-09 21:06:06 +01:00
f1a0455662 1.0.83 2023-11-09 19:00:54 +01:00
3c62129e02 fix(core): update 2023-11-09 19:00:53 +01:00
ac5e036967 1.0.82 2023-11-09 17:55:27 +01:00
6ccd0281b9 fix(core): update 2023-11-09 17:55:26 +01:00
d0f85b026f 1.0.81 2023-09-09 23:22:07 +02:00
4376cafabb fix(core): update 2023-09-09 23:22:06 +02:00
1a6e449b8d 1.0.80 2023-08-26 15:42:19 +02:00
6ec99e7276 fix(core): update 2023-08-26 15:42:18 +02:00
e958417d47 1.0.79 2023-08-26 14:54:44 +02:00
24416c1b5c fix(core): update 2023-08-26 14:54:44 +02:00
d6c8fcc1cf 1.0.78 2023-08-26 14:39:48 +02:00
53bb97c6db fix(core): update 2023-08-26 14:39:47 +02:00
4f35b101ec 1.0.77 2023-07-13 09:42:18 +02:00
549ae53a00 fix(core): update 2023-07-13 09:42:18 +02:00
d9aa2984ef 1.0.76 2023-07-13 03:19:12 +02:00
37e6d94c9f fix(core): update 2023-07-13 03:19:11 +02:00
74e1df6824 1.0.75 2022-11-08 08:04:46 +01:00
6eb86c63c3 fix(core): update 2022-11-08 08:04:46 +01:00
e919a4a2e9 1.0.74 2022-11-08 08:03:17 +01:00
85f6703696 fix(core): update 2022-11-08 08:03:17 +01:00
4c2812f671 1.0.73 2022-08-03 19:48:20 +02:00
bab93448e8 fix(core): update 2022-08-03 19:48:19 +02:00
3db913eb59 1.0.72 2022-07-24 14:11:18 +02:00
28e0c32944 fix(core): update 2022-07-24 14:11:17 +02:00
0be6b3400a 1.0.71 2022-05-04 18:58:36 +02:00
eeba113e09 fix(core): update 2022-05-04 18:58:35 +02:00
19e45b305c 1.0.70 2022-03-25 01:30:34 +01:00
f9f4150cff fix(core): update 2022-03-25 01:30:33 +01:00
710548911e 1.0.69 2022-03-17 12:24:40 +01:00
23f9a28fa0 fix(core): update 2022-03-17 12:24:40 +01:00
e1d2f1fd68 1.0.68 2022-03-16 12:28:50 +01:00
3116c5a818 fix(core): update 2022-03-16 12:28:50 +01:00
568772734b 1.0.67 2022-03-14 11:49:39 +01:00
30525e7e55 fix(core): update 2022-03-14 11:49:38 +01:00
f7483ef995 1.0.66 2022-03-13 00:40:22 +01:00
1460f97c52 fix(core): update 2022-03-13 00:40:21 +01:00
dfac554303 1.0.65 2022-03-13 00:30:33 +01:00
1d751bdcdf fix(core): update 2022-03-13 00:30:32 +01:00
bd6713eee8 1.0.64 2022-02-15 11:28:34 +01:00
440b41611b fix(core): update 2022-02-15 11:28:34 +01:00
78a40de700 1.0.63 2022-02-15 00:27:21 +01:00
e0eb00d755 fix(core): update 2022-02-15 00:27:20 +01:00
dbbcbf4ea2 1.0.62 2022-02-14 23:50:07 +01:00
8c13b9db89 fix(core): update 2022-02-14 23:50:07 +01:00
f813a79124 1.0.61 2022-02-14 15:40:12 +01:00
766138aa25 fix(core): update 2022-02-14 15:40:11 +01:00
72880b4a2d 1.0.60 2021-11-07 20:54:40 +01:00
bd5731c439 fix(core): update 2021-11-07 20:54:39 +01:00
0caebb7448 1.0.59 2021-10-06 17:58:39 +02:00
ed896b7f1c fix(core): update 2021-10-06 17:58:38 +02:00
69ec5a98ab 1.0.58 2021-10-06 13:25:59 +02:00
3b93886147 fix(core): update 2021-10-06 13:25:59 +02:00
5949988293 1.0.57 2021-08-20 18:43:11 +02:00
04f7be07a3 fix(core): update 2021-08-20 18:43:11 +02:00
d331f90d24 1.0.56 2021-08-20 18:25:47 +02:00
224400dcb5 fix(core): update 2021-08-20 18:25:47 +02:00
7601ca599a 1.0.55 2021-08-20 18:23:39 +02:00
994a1bc98d fix(core): update 2021-08-20 18:23:39 +02:00
ca51c9e15b 1.0.54 2021-04-29 15:48:45 +00:00
4c4f08152b fix(core): update 2021-04-29 15:48:45 +00:00
39bd80106a 1.0.53 2021-04-29 15:33:54 +00:00
d6b94b534b fix(core): update 2021-04-29 15:33:53 +00:00
d19d3fc51e 1.0.52 2020-10-01 14:29:01 +00:00
f7f1bf25f6 fix(core): update 2020-10-01 14:29:01 +00:00
42fd414609 1.0.51 2020-10-01 14:22:07 +00:00
8f16f46c37 fix(core): update 2020-10-01 14:22:06 +00:00
f8afb2c7f6 1.0.50 2020-10-01 14:12:14 +00:00
a3d1fbb2da fix(core): update 2020-10-01 14:12:13 +00:00
25 changed files with 5859 additions and 10149 deletions

View File

@ -12,30 +12,38 @@ stages:
- release - release
- metadata - metadata
before_script:
- pnpm install -g pnpm
- pnpm install -g @shipzone/npmci
- npmci npm prepare
# ==================== # ====================
# security stage # security stage
# ==================== # ====================
mirror: # ====================
stage: security # security stage
script: # ====================
- npmci git mirror auditProductionDependencies:
tags:
- lossless
- docker
- notpriv
audit:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security stage: security
script: script:
- npmci npm prepare - npmci command npm config set registry https://registry.npmjs.org
- npmci command npm install --ignore-scripts - npmci command pnpm audit --audit-level=high --prod
- npmci command npm config set registry https://registry.npmjs.org
- npmci command npm audit --audit-level=high
tags: tags:
- lossless - lossless
- docker - docker
- notpriv allow_failure: true
auditDevDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security
script:
- npmci command npm config set registry https://registry.npmjs.org
- npmci command pnpm audit --audit-level=high --dev
tags:
- lossless
- docker
allow_failure: true
# ==================== # ====================
# test stage # test stage
@ -44,28 +52,22 @@ audit:
testStable: testStable:
stage: test stage: test
script: script:
- npmci npm prepare
- npmci node install stable - npmci node install stable
- npmci npm install - npmci npm install
- npmci npm test - npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- lossless
- docker - docker
- priv
testBuild: testBuild:
stage: test stage: test
script: script:
- npmci npm prepare
- npmci node install stable - npmci node install stable
- npmci npm install - npmci npm install
- npmci command npm run build - npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- lossless
- docker - docker
- notpriv
release: release:
stage: release stage: release
@ -85,11 +87,12 @@ release:
codequality: codequality:
stage: metadata stage: metadata
allow_failure: true allow_failure: true
only:
- tags
script: script:
- npmci command npm install -g tslint typescript - npmci command npm install -g typescript
- npmci npm prepare - npmci npm prepare
- npmci npm install - npmci npm install
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
tags: tags:
- lossless - lossless
- docker - docker
@ -109,11 +112,9 @@ trigger:
pages: pages:
stage: metadata stage: metadata
script: script:
- npmci node install lts - npmci node install stable
- npmci command npm install -g @gitzone/tsdoc
- npmci npm prepare
- npmci npm install - npmci npm install
- npmci command tsdoc - npmci command npm run buildDocs
tags: tags:
- lossless - lossless
- docker - docker

24
.vscode/launch.json vendored
View File

@ -2,28 +2,10 @@
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"name": "current file", "command": "npm test",
"type": "node", "name": "Run npm test",
"request": "launch", "request": "launch",
"args": [ "type": "node-terminal"
"${relativeFile}"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "test.ts",
"type": "node",
"request": "launch",
"args": [
"test/test.ts"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
} }
] ]
} }

View File

@ -15,7 +15,7 @@
"properties": { "properties": {
"projectType": { "projectType": {
"type": "string", "type": "string",
"enum": ["website", "element", "service", "npm"] "enum": ["website", "element", "service", "npm", "wcc"]
} }
} }
} }

4
cli.child.ts Normal file
View File

@ -0,0 +1,4 @@
#!/usr/bin/env node
process.env.CLI_CALL = 'true';
import * as cliTool from './ts/index.js';
cliTool.runCli();

2
cli.js
View File

@ -1,4 +1,4 @@
#!/usr/bin/env node #!/usr/bin/env node
process.env.CLI_CALL = 'true'; process.env.CLI_CALL = 'true';
const cliTool = require('./dist_ts/index'); const cliTool = await import('./dist_ts/index.js');
cliTool.runCli(); cliTool.runCli();

View File

@ -1,5 +1,5 @@
#!/usr/bin/env node #!/usr/bin/env node
process.env.CLI_CALL = 'true'; process.env.CLI_CALL = 'true';
require('@gitzone/tsrun');
const cliTool = require('./ts/index'); import * as tsrun from '@git.zone/tsrun';
cliTool.runCli(); tsrun.runPath('./cli.child.js', import.meta.url);

View File

@ -1,3 +0,0 @@
# How to contribute
Start with `tstest.classes.tstest.ts` to understand whats happening

View File

@ -9,7 +9,7 @@
"githost": "gitlab.com", "githost": "gitlab.com",
"gitscope": "gitzone", "gitscope": "gitzone",
"gitrepo": "tstest", "gitrepo": "tstest",
"shortDescription": "a test utility to run tests that match test/**/*.ts", "description": "a test utility to run tests that match test/**/*.ts",
"npmPackagename": "@gitzone/tstest", "npmPackagename": "@gitzone/tstest",
"license": "MIT" "license": "MIT"
} }

9926
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,11 @@
{ {
"name": "@gitzone/tstest", "name": "@git.zone/tstest",
"version": "1.0.49", "version": "1.0.86",
"private": false, "private": false,
"description": "a test utility to run tests that match test/**/*.ts", "description": "a test utility to run tests that match test/**/*.ts",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",
"typings": "dist_ts/index.d.ts", "typings": "dist_ts/index.d.ts",
"type": "module",
"author": "Lossless GmbH", "author": "Lossless GmbH",
"license": "MIT", "license": "MIT",
"bin": { "bin": {
@ -15,27 +16,28 @@
"prepareTest": "git clone https://gitlab.com/sandboxzone/sandbox-npmts.git .nogit/sandbox-npmts && cd .nogit/sandbox-npmts && npm install", "prepareTest": "git clone https://gitlab.com/sandboxzone/sandbox-npmts.git .nogit/sandbox-npmts && cd .nogit/sandbox-npmts && npm install",
"tstest": "cd .nogit/sandbox-npmts && node ../../cli.ts.js test/ --web", "tstest": "cd .nogit/sandbox-npmts && node ../../cli.ts.js test/ --web",
"cleanUp": "rm -rf .nogit/sandbox-npmts", "cleanUp": "rm -rf .nogit/sandbox-npmts",
"build": "(tsbuild --web)" "build": "(tsbuild --web --allowimplicitany --skiplibcheck)",
"buildDocs": "tsdoc"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.25", "@git.zone/tsbuild": "^2.1.72",
"tslint": "^6.1.3", "@types/node": "^20.11.5"
"tslint-config-prettier": "^1.18.0"
}, },
"dependencies": { "dependencies": {
"@gitzone/tsbundle": "^1.0.78", "@api.global/typedserver": "^3.0.20",
"@gitzone/tsrun": "^1.2.12", "@git.zone/tsbundle": "^2.0.15",
"@pushrocks/consolecolor": "^2.0.1", "@git.zone/tsrun": "^1.2.46",
"@pushrocks/smartbrowser": "^1.0.17", "@push.rocks/consolecolor": "^2.0.1",
"@pushrocks/smartdelay": "^2.0.10", "@push.rocks/smartbrowser": "^2.0.6",
"@pushrocks/smartexpress": "^3.0.76", "@push.rocks/smartdelay": "^3.0.5",
"@pushrocks/smartfile": "^8.0.0", "@push.rocks/smartfile": "^11.0.4",
"@pushrocks/smartlog": "^2.0.39", "@push.rocks/smartlog": "^3.0.3",
"@pushrocks/smartpromise": "^3.0.6", "@push.rocks/smartpromise": "^4.0.3",
"@pushrocks/smartshell": "^2.0.25", "@push.rocks/smartshell": "^3.0.3",
"@pushrocks/tapbundle": "^3.2.9", "@push.rocks/tapbundle": "^5.0.15",
"@types/figures": "^3.0.1", "@types/ws": "^8.5.10",
"figures": "^3.0.0" "figures": "^6.0.1",
"ws": "^8.16.0"
}, },
"files": [ "files": [
"ts/**/*", "ts/**/*",

5624
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -25,10 +25,29 @@ Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20W
## Usage ## Usage
## Contribution ## cli usage
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :) lets assume we have a directory called test/ where all our tests arae defined. Simply type
```
tstest test/
```
to run all tests.
## Syntax
tstest supports tap syntax. In other words your testfiles are run in a subprocess, and the console output contains trigger messages for tstest to determine test status. Inside your testfile you should use `@pushrocks/tapbundle` for the best results.
## Environments
tstest supports different environments:
- a testfile called `test-something.node.ts` will be run in node
- a testfile called `test-something.chrome.ts` will be run in chrome environment (bundled through parcel and run through puppeteer)
- a testfile called `test-something.both.ts` will be run in node an chrome, which is good for isomorphic packages.
> note: there is alpha support for the deno environment by naming a file test-something.deno.ts
## Contribution ## Contribution

View File

@ -1,5 +1,5 @@
import { expect, tap } from '@pushrocks/tapbundle'; import { expect, tap } from '@push.rocks/tapbundle';
import * as tstest from '../ts/index'; import * as tstest from '../ts/index.js';
tap.test('prepare test', async () => {}); tap.test('prepare test', async () => {});

8
ts/00_commitinfo_data.ts Normal file
View File

@ -0,0 +1,8 @@
/**
* autocreated commitinfo by @pushrocks/commitinfo
*/
export const commitinfo = {
name: '@git.zone/tstest',
version: '1.0.86',
description: 'a test utility to run tests that match test/**/*.ts'
}

View File

@ -1,6 +1,10 @@
import { TsTest } from './tstest.classes.tstest'; import { TsTest } from './tstest.classes.tstest.js';
export const runCli = async () => { export const runCli = async () => {
if (!process.argv[2]) {
console.error('You must specify a test directory as argument. Please try again.');
process.exit(1);
}
const tsTestInstance = new TsTest(process.cwd(), process.argv[2]); const tsTestInstance = new TsTest(process.cwd(), process.argv[2]);
await tsTestInstance.run(); await tsTestInstance.run();
}; };

View File

@ -1,11 +1,11 @@
// ============ // ============
// combines different tap test files to an overall result // combines different tap test files to an overall result
// ============ // ============
import * as plugins from './tstest.plugins'; import * as plugins from './tstest.plugins.js';
import { coloredString as cs } from '@pushrocks/consolecolor'; import { coloredString as cs } from '@push.rocks/consolecolor';
import { TapParser } from './tstest.classes.tap.parser'; import { TapParser } from './tstest.classes.tap.parser.js';
import * as logPrefixes from './tstest.logprefixes'; import * as logPrefixes from './tstest.logprefixes.js';
export class TapCombinator { export class TapCombinator {
tapParserStore: TapParser[] = []; tapParserStore: TapParser[] = [];

View File

@ -1,12 +1,12 @@
import { ChildProcess } from 'child_process'; import { ChildProcess } from 'child_process';
import { coloredString as cs } from '@pushrocks/consolecolor'; import { coloredString as cs } from '@push.rocks/consolecolor';
// ============ // ============
// combines different tap test files to an overall result // combines different tap test files to an overall result
// ============ // ============
import * as plugins from './tstest.plugins'; import * as plugins from './tstest.plugins.js';
import { TapTestResult } from './tstest.classes.tap.testresult'; import { TapTestResult } from './tstest.classes.tap.testresult.js';
import * as logPrefixes from './tstest.logprefixes'; import * as logPrefixes from './tstest.logprefixes.js';
export class TapParser { export class TapParser {
testStore: TapTestResult[] = []; testStore: TapTestResult[] = [];
@ -18,6 +18,8 @@ export class TapParser {
testStatusRegex = /(ok|not\sok)\s([0-9]+)\s-\s(.*)\s#\stime=(.*)ms$/; testStatusRegex = /(ok|not\sok)\s([0-9]+)\s-\s(.*)\s#\stime=(.*)ms$/;
activeTapTestResult: TapTestResult; activeTapTestResult: TapTestResult;
pretaskRegex = /^::__PRETASK:(.*)$/;
/** /**
* the constructor for TapParser * the constructor for TapParser
*/ */
@ -49,6 +51,12 @@ export class TapParser {
// initiating first TapResult // initiating first TapResult
this._getNewTapTestResult(); this._getNewTapTestResult();
} else if (this.pretaskRegex.test(logLine)) {
logLineIsTapProtocol = true;
const pretaskContentMatch = this.pretaskRegex.exec(logLine);
if (pretaskContentMatch && pretaskContentMatch[1]) {
console.log(`${logPrefixes.TapPretaskPrefix} Pretask ->${pretaskContentMatch[1]}: Success.`);
}
} else if (this.testStatusRegex.test(logLine)) { } else if (this.testStatusRegex.test(logLine)) {
logLineIsTapProtocol = true; logLineIsTapProtocol = true;
const regexResult = this.testStatusRegex.exec(logLine); const regexResult = this.testStatusRegex.exec(logLine);
@ -149,7 +157,7 @@ export class TapParser {
this._processLog(data); this._processLog(data);
}); });
childProcessArg.on('exit', async () => { childProcessArg.on('exit', async () => {
await this._evaluateResult(); await this.evaluateFinalResult();
done.resolve(); done.resolve();
}); });
await done.promise; await done.promise;
@ -157,10 +165,9 @@ export class TapParser {
public async handleTapLog(tapLog: string) { public async handleTapLog(tapLog: string) {
this._processLog(tapLog); this._processLog(tapLog);
await this._evaluateResult();
} }
private async _evaluateResult() { public async evaluateFinalResult() {
this.receivedTests = this.testStore.length; this.receivedTests = this.testStore.length;
// check wether all tests ran // check wether all tests ran

View File

@ -1,7 +1,7 @@
// ============ // ============
// combines different tap test files to an overall result // combines different tap test files to an overall result
// ============ // ============
import * as plugins from './tstest.plugins'; import * as plugins from './tstest.plugins.js';
export class TapTestResult { export class TapTestResult {
testLogBuffer = Buffer.from(''); testLogBuffer = Buffer.from('');

View File

@ -1,11 +1,11 @@
import * as plugins from './tstest.plugins'; import * as plugins from './tstest.plugins.js';
import * as paths from './tstest.paths'; import * as paths from './tstest.paths.js';
import { Smartfile } from '@pushrocks/smartfile'; import { SmartFile } from '@push.rocks/smartfile';
// tap related stuff // tap related stuff
import { TapCombinator } from './tstest.classes.tap.combinator'; import { TapCombinator } from './tstest.classes.tap.combinator.js';
import { TapParser } from './tstest.classes.tap.parser'; import { TapParser } from './tstest.classes.tap.parser.js';
import { TapTestResult } from './tstest.classes.tap.testresult'; import { TapTestResult } from './tstest.classes.tap.testresult.js';
export class TestDirectory { export class TestDirectory {
/** /**
@ -26,7 +26,7 @@ export class TestDirectory {
/** /**
* an array of Smartfiles * an array of Smartfiles
*/ */
testfileArray: Smartfile[] = []; testfileArray: SmartFile[] = [];
/** /**
* the constructor for TestDirectory * the constructor for TestDirectory

View File

@ -1,12 +1,12 @@
import * as plugins from './tstest.plugins'; import * as plugins from './tstest.plugins.js';
import * as paths from './tstest.paths'; import * as paths from './tstest.paths.js';
import * as logPrefixes from './tstest.logprefixes'; import * as logPrefixes from './tstest.logprefixes.js';
import { coloredString as cs } from '@pushrocks/consolecolor'; import { coloredString as cs } from '@push.rocks/consolecolor';
import { TestDirectory } from './tstest.classes.testdirectory'; import { TestDirectory } from './tstest.classes.testdirectory.js';
import { TapCombinator } from './tstest.classes.tap.combinator'; import { TapCombinator } from './tstest.classes.tap.combinator.js';
import { TapParser } from './tstest.classes.tap.parser'; import { TapParser } from './tstest.classes.tap.parser.js';
export class TsTest { export class TsTest {
public testDir: TestDirectory; public testDir: TestDirectory;
@ -40,29 +40,31 @@ export class TsTest {
switch (true) { switch (true) {
case process.env.CI && fileNameArg.includes('.nonci.'): case process.env.CI && fileNameArg.includes('.nonci.'):
console.log('!!!!!!!!!!!'); console.log('!!!!!!!!!!!');
console.log(`not running testfile ${fileNameArg}, sinc we are CI and file name includes '.nonci.' tag`); console.log(
`not running testfile ${fileNameArg}, since we are CI and file name includes '.nonci.' tag`
);
console.log('!!!!!!!!!!!'); console.log('!!!!!!!!!!!');
break; break;
case fileNameArg.endsWith('.browser.ts'): case fileNameArg.endsWith('.browser.ts') || fileNameArg.endsWith('.browser.nonci.ts'):
const tapParserBrowser = await this.runInChrome(fileNameArg); const tapParserBrowser = await this.runInChrome(fileNameArg);
tapCombinator.addTapParser(tapParserBrowser); tapCombinator.addTapParser(tapParserBrowser);
break; break;
case fileNameArg.endsWith('.both.ts'): case fileNameArg.endsWith('.both.ts') || fileNameArg.endsWith('.both.nonci.ts'):
console.log('>>>>>>> TEST PART 1: chrome'); console.log('>>>>>>> TEST PART 1: chrome');
const tapParserBothBrowser = await this.runInChrome(fileNameArg); const tapParserBothBrowser = await this.runInChrome(fileNameArg);
tapCombinator.addTapParser(tapParserBothBrowser); tapCombinator.addTapParser(tapParserBothBrowser);
console.log(cs(`|`.repeat(16), 'cyan')); console.log(cs(`|`.repeat(16), 'cyan'));
console.log(''); // force new line console.log(''); // force new line
console.log('>>>>>>> TEST PART 2: node'); console.log('>>>>>>> TEST PART 2: node');
const tapParserBothNode = await this.runInNode(fileNameArg); const tapParserBothNode = await this.runInNode(fileNameArg);
tapCombinator.addTapParser(tapParserBothNode); tapCombinator.addTapParser(tapParserBothNode);
break; break;
default: default:
const tapParserNode = await this.runInNode(fileNameArg); const tapParserNode = await this.runInNode(fileNameArg);
tapCombinator.addTapParser(tapParserNode); tapCombinator.addTapParser(tapParserNode);
break; break;
} }
console.log(cs(`^`.repeat(16), 'cyan')); console.log(cs(`^`.repeat(16), 'cyan'));
console.log(''); // force new line console.log(''); // force new line
} }
@ -97,17 +99,19 @@ export class TsTest {
const bundleFilePath = plugins.path.join(tsbundleCacheDirPath, bundleFileName); const bundleFilePath = plugins.path.join(tsbundleCacheDirPath, bundleFileName);
// lets bundle the test // lets bundle the test
await plugins.smartfile.fs.ensureDir(tsbundleCacheDirPath); await plugins.smartfile.fs.ensureEmptyDir(tsbundleCacheDirPath);
await this.tsbundleInstance.buildTest(fileNameArg, bundleFilePath, 'parcel'); await this.tsbundleInstance.build(process.cwd(), fileNameArg, bundleFilePath, {
bundler: 'esbuild',
});
// lets create a server // lets create a server
const server = new plugins.smartexpress.Server({ const server = new plugins.typedserver.servertools.Server({
cors: true, cors: true,
port: 3007, port: 3007,
}); });
server.addRoute( server.addRoute(
'/test', '/test',
new plugins.smartexpress.Handler('GET', async (req, res) => { new plugins.typedserver.servertools.Handler('GET', async (req, res) => {
res.type('.html'); res.type('.html');
res.write(` res.write(`
<html> <html>
@ -122,97 +126,71 @@ export class TsTest {
res.end(); res.end();
}) })
); );
server.addRoute('*', new plugins.smartexpress.HandlerStatic(tsbundleCacheDirPath)); server.addRoute('*', new plugins.typedserver.servertools.HandlerStatic(tsbundleCacheDirPath));
await server.start(); await server.start();
// lets handle realtime comms
const tapParser = new TapParser(fileNameArg + ':chrome');
const wss = new plugins.ws.WebSocketServer({ port: 8080 });
wss.on('connection', (ws) => {
ws.on('message', (message) => {
tapParser.handleTapLog(message.toString());
});
});
// lets do the browser bit // lets do the browser bit
await this.smartbrowserInstance.start(); await this.smartbrowserInstance.start();
const evaluation = await this.smartbrowserInstance.evaluateOnPage( const evaluation = await this.smartbrowserInstance.evaluateOnPage(
`http://localhost:3007/test?bundleName=${bundleFileName}`, `http://localhost:3007/test?bundleName=${bundleFileName}`,
async () => { async () => {
const convertToText = (obj) => { // lets enable real time comms
// create an array that will later be joined into a string. const ws = new WebSocket('ws://localhost:8080');
const stringArray = []; await new Promise((resolve) => (ws.onopen = resolve));
if (typeof obj === 'object' && typeof obj.toString === 'function') { // Ensure this function is declared with 'async'
stringArray.push(obj.toString()); const logStore = [];
} else if (typeof obj === 'object' && obj.join === undefined) { const originalLog = console.log;
stringArray.push('{'); const originalError = console.error;
for (const prop of Object.keys(obj)) {
stringArray.push(prop, ': ', convertToText(obj[prop]), ',');
}
stringArray.push('}');
// is array // Override console methods to capture the logs
} else if (typeof obj === 'object' && !(obj.join === undefined)) {
stringArray.push('[');
for (const prop of Object.keys(obj)) {
stringArray.push(convertToText(obj[prop]), ',');
}
stringArray.push(']');
// is function
} else if (typeof obj === 'function') {
stringArray.push(obj.toString());
// all other values can be done with JSON.stringify
} else {
stringArray.push(JSON.stringify(obj));
}
return stringArray.join('');
};
let logStore = '';
// tslint:disable-next-line: max-classes-per-file
const log = console.log.bind(console);
console.log = (...args) => { console.log = (...args) => {
args = args.map((argument) => { logStore.push(args.join(' '));
return typeof argument !== 'string' ? convertToText(argument) : argument; ws.send(args.join(' '));
}); originalLog(...args);
logStore += `${args}\n`;
log(...args);
}; };
const error = console.error;
console.error = (...args) => { console.error = (...args) => {
args = args.map((argument) => { logStore.push(args.join(' '));
return typeof argument !== 'string' ? convertToText(argument) : argument; ws.send(args.join(' '));
}); originalError(...args);
logStore += `${args}\n`;
error(...args);
}; };
const bundleName = new URLSearchParams(window.location.search).get('bundleName'); const bundleName = new URLSearchParams(window.location.search).get('bundleName');
console.log(`::TSTEST IN CHROMIUM:: Relevant Script name is: ${bundleName}`); originalLog(`::TSTEST IN CHROMIUM:: Relevant Script name is: ${bundleName}`);
const bundleResponse = await fetch(`/${bundleName}`);
console.log(
`::TSTEST IN CHROMIUM:: Got ${bundleName} with STATUS ${bundleResponse.status}`
);
const bundle = await bundleResponse.text();
console.log(`::TSTEST IN CHROMIUM:: Executing ${bundleName}`);
try { try {
// tslint:disable-next-line: no-eval // Dynamically import the test module
eval(bundle); const testModule = await import(`/${bundleName}`);
if (testModule && testModule.runTest) {
// Execute the exported test function
await testModule.runTest();
} else {
originalError('Test module does not export runTest function.');
}
} catch (err) { } catch (err) {
console.error(err); originalError(err);
} }
if (globalThis.tapbundleDeferred && globalThis.tapbundleDeferred.promise) { return logStore.join('\n');
await globalThis.tapbundleDeferred.promise;
} else {
console.log('Error: Could not find tapbundle Deferred');
}
return logStore;
} }
); );
await this.smartbrowserInstance.stop(); await this.smartbrowserInstance.stop();
await server.stop(); await server.stop();
wss.close();
console.log( console.log(
`${cs('=> ', 'blue')} Stopped ${cs(fileNameArg, 'orange')} chromium instance and server.` `${cs('=> ', 'blue')} Stopped ${cs(fileNameArg, 'orange')} chromium instance and server.`
); );
console.log(`${cs('=> ', 'blue')} See the result captured from the chromium execution:`);
// lets create the tap parser // lets create the tap parser
const tapParser = new TapParser(fileNameArg + ':chrome'); await tapParser.evaluateFinalResult();
tapParser.handleTapLog(evaluation);
return tapParser; return tapParser;
} }

View File

@ -1,7 +1,8 @@
import * as plugins from './tstest.plugins'; import * as plugins from './tstest.plugins.js';
import { coloredString as cs } from '@pushrocks/consolecolor'; import { coloredString as cs } from '@push.rocks/consolecolor';
export const TapPrefix = cs(`::TAP::`, 'pink', 'black'); export const TapPrefix = cs(`::TAP::`, 'pink', 'black');
export const TapPretaskPrefix = cs(`::PRETASK::`, 'cyan', 'black');
export const TapErrorPrefix = cs(` !!!TAP PROTOCOL ERROR!!! `, 'red', 'black'); export const TapErrorPrefix = cs(` !!!TAP PROTOCOL ERROR!!! `, 'red', 'black');
export const TsTestPrefix = cs(`**TSTEST**`, 'pink', 'black'); export const TsTestPrefix = cs(`**TSTEST**`, 'pink', 'black');

View File

@ -1,5 +1,5 @@
import * as plugins from './tstest.plugins'; import * as plugins from './tstest.plugins.js';
export const cwd = process.cwd(); export const cwd = process.cwd();
export const testDir = plugins.path.join(cwd, './test/'); export const testDir = plugins.path.join(cwd, './test/');
export const binDirectory = plugins.path.join(cwd, 'node_modules/.bin'); export const binDirectory = plugins.path.join(cwd, './node_modules/.bin');

View File

@ -3,21 +3,26 @@ import * as path from 'path';
export { path }; export { path };
// @pushrocks scope // @apiglobal scope
import * as consolecolor from '@pushrocks/consolecolor'; import * as typedserver from '@api.global/typedserver';
import * as smartbrowser from '@pushrocks/smartbrowser';
import * as smartexpress from '@pushrocks/smartexpress'; export {
import * as smartdelay from '@pushrocks/smartdelay'; typedserver
import * as smartfile from '@pushrocks/smartfile'; }
import * as smartlog from '@pushrocks/smartlog';
import * as smartpromise from '@pushrocks/smartpromise'; // @push.rocks scope
import * as smartshell from '@pushrocks/smartshell'; import * as consolecolor from '@push.rocks/consolecolor';
import * as tapbundle from '@pushrocks/tapbundle'; import * as smartbrowser from '@push.rocks/smartbrowser';
import * as smartdelay from '@push.rocks/smartdelay';
import * as smartfile from '@push.rocks/smartfile';
import * as smartlog from '@push.rocks/smartlog';
import * as smartpromise from '@push.rocks/smartpromise';
import * as smartshell from '@push.rocks/smartshell';
import * as tapbundle from '@push.rocks/tapbundle';
export { export {
consolecolor, consolecolor,
smartbrowser, smartbrowser,
smartexpress,
smartdelay, smartdelay,
smartfile, smartfile,
smartlog, smartlog,
@ -27,11 +32,18 @@ export {
}; };
// @gitzone scope // @gitzone scope
import * as tsbundle from '@gitzone/tsbundle'; import * as tsbundle from '@git.zone/tsbundle';
export { tsbundle }; export { tsbundle };
// sindresorhus // sindresorhus
import * as figures from 'figures'; import figures from 'figures';
export { figures }; export { figures };
// third party
import * as ws from 'ws';
export {
ws
}

14
tsconfig.json Normal file
View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"experimentalDecorators": true,
"useDefineForClassFields": false,
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"verbatimModuleSyntax": true
},
"exclude": [
"dist_*/**/*.d.ts"
]
}

View File

@ -1,17 +0,0 @@
{
"extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
}