Compare commits
No commits in common. "master" and "v1.0.27" have entirely different histories.
4
.gitignore
vendored
4
.gitignore
vendored
@ -15,6 +15,8 @@ node_modules/
|
|||||||
|
|
||||||
# builds
|
# builds
|
||||||
dist/
|
dist/
|
||||||
dist_*/
|
dist_web/
|
||||||
|
dist_serve/
|
||||||
|
dist_ts_web/
|
||||||
|
|
||||||
# custom
|
# custom
|
120
.gitlab-ci.yml
Normal file
120
.gitlab-ci.yml
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
# gitzone ci_default
|
||||||
|
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||||
|
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- .npmci_cache/
|
||||||
|
key: "$CI_BUILD_STAGE"
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- security
|
||||||
|
- test
|
||||||
|
- release
|
||||||
|
- metadata
|
||||||
|
|
||||||
|
# ====================
|
||||||
|
# security stage
|
||||||
|
# ====================
|
||||||
|
mirror:
|
||||||
|
stage: security
|
||||||
|
script:
|
||||||
|
- npmci git mirror
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
|
snyk:
|
||||||
|
stage: security
|
||||||
|
script:
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci command npm install -g snyk
|
||||||
|
- npmci command npm install --ignore-scripts
|
||||||
|
- npmci command snyk test
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
|
# ====================
|
||||||
|
# test stage
|
||||||
|
# ====================
|
||||||
|
|
||||||
|
testStable:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci node install stable
|
||||||
|
- npmci npm install
|
||||||
|
- npmci npm test
|
||||||
|
coverage: /\d+.?\d+?\%\s*coverage/
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- priv
|
||||||
|
|
||||||
|
testBuild:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci node install stable
|
||||||
|
- npmci npm install
|
||||||
|
- npmci command npm run build
|
||||||
|
coverage: /\d+.?\d+?\%\s*coverage/
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
|
release:
|
||||||
|
stage: release
|
||||||
|
script:
|
||||||
|
- npmci node install stable
|
||||||
|
- npmci npm publish
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
|
# ====================
|
||||||
|
# metadata stage
|
||||||
|
# ====================
|
||||||
|
codequality:
|
||||||
|
stage: metadata
|
||||||
|
allow_failure: true
|
||||||
|
script:
|
||||||
|
- npmci command npm install -g tslint typescript
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci npm install
|
||||||
|
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- priv
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
stage: metadata
|
||||||
|
script:
|
||||||
|
- npmci trigger
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
|
pages:
|
||||||
|
image: hosttoday/ht-docker-dbase:npmci
|
||||||
|
services:
|
||||||
|
- docker:stable-dind
|
||||||
|
stage: metadata
|
||||||
|
script:
|
||||||
|
- npmci command npm install -g @gitzone/tsdoc
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci npm install
|
||||||
|
- npmci command tsdoc
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- notpriv
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
paths:
|
||||||
|
- public
|
||||||
|
allow_failure: true
|
11
.vscode/launch.json
vendored
11
.vscode/launch.json
vendored
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"command": "npm test",
|
|
||||||
"name": "Run npm test",
|
|
||||||
"request": "launch",
|
|
||||||
"type": "node-terminal"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
26
.vscode/settings.json
vendored
26
.vscode/settings.json
vendored
@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
"json.schemas": [
|
|
||||||
{
|
|
||||||
"fileMatch": ["/npmextra.json"],
|
|
||||||
"schema": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"npmci": {
|
|
||||||
"type": "object",
|
|
||||||
"description": "settings for npmci"
|
|
||||||
},
|
|
||||||
"gitzone": {
|
|
||||||
"type": "object",
|
|
||||||
"description": "settings for gitzone",
|
|
||||||
"properties": {
|
|
||||||
"projectType": {
|
|
||||||
"type": "string",
|
|
||||||
"enum": ["website", "element", "service", "npm", "wcc"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
153
changelog.md
153
changelog.md
@ -1,153 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
## 2025-01-23 - 1.0.96 - fix(TsTest)
|
|
||||||
Fixed improper type-check for promise-like testModule defaults
|
|
||||||
|
|
||||||
- Corrected the type-check for promise-like default exports in test modules
|
|
||||||
- Removed unnecessary setTimeout used for async execution
|
|
||||||
|
|
||||||
## 2025-01-23 - 1.0.95 - fix(core)
|
|
||||||
Fix delay handling in Chrome test execution
|
|
||||||
|
|
||||||
- Replaced smartdelay.delayFor with native Promise-based delay mechanism in runInChrome method.
|
|
||||||
|
|
||||||
## 2025-01-23 - 1.0.94 - fix(TsTest)
|
|
||||||
Fix test module execution by ensuring promise resolution delay
|
|
||||||
|
|
||||||
- Added a delay to ensure promise resolution when dynamically importing test modules in the runInChrome method.
|
|
||||||
|
|
||||||
## 2025-01-23 - 1.0.93 - fix(tstest)
|
|
||||||
Handle globalThis.tapPromise in browser runtime evaluation
|
|
||||||
|
|
||||||
- Added support for using globalThis.tapPromise in the browser evaluation logic.
|
|
||||||
- Added log messages to indicate the usage of globalThis.tapPromise.
|
|
||||||
|
|
||||||
## 2025-01-23 - 1.0.92 - fix(core)
|
|
||||||
Improve error logging for test modules without default promise
|
|
||||||
|
|
||||||
- Added logging to display the exported test module content when it does not export a default promise.
|
|
||||||
|
|
||||||
## 2025-01-23 - 1.0.91 - fix(core)
|
|
||||||
Refactored tstest class to enhance promise handling for test modules.
|
|
||||||
|
|
||||||
- Removed .gitlab-ci.yml configuration file.
|
|
||||||
- Updated package.json dependency versions.
|
|
||||||
- Added a condition to handle promiselike objects in tests.
|
|
||||||
|
|
||||||
## 2024-04-18 - 1.0.89 to 1.0.90 - Enhancements and Bug Fixes
|
|
||||||
Multiple updates and fixes have been made.
|
|
||||||
|
|
||||||
- Updated core components to enhance stability and performance.
|
|
||||||
|
|
||||||
## 2024-03-07 - 1.0.86 to 1.0.88 - Core Updates
|
|
||||||
Continued improvements and updates in the core module.
|
|
||||||
|
|
||||||
- Applied critical fixes to enhance core stability.
|
|
||||||
|
|
||||||
## 2024-01-19 - 1.0.85 to 1.0.89 - Bug Fixes
|
|
||||||
Series of core updates have been implemented.
|
|
||||||
|
|
||||||
- Addressed known bugs and improved overall system functionality.
|
|
||||||
|
|
||||||
## 2023-11-09 - 1.0.81 to 1.0.84 - Maintenance Updates
|
|
||||||
Maintenance updates focusing on core reliability.
|
|
||||||
|
|
||||||
- Improved core module through systematic updates.
|
|
||||||
- Strengthened system robustness.
|
|
||||||
|
|
||||||
## 2023-08-26 - 1.0.77 to 1.0.80 - Critical Fixes
|
|
||||||
Critical fixes implemented in core functionality.
|
|
||||||
|
|
||||||
- Enhanced core processing to fix existing issues.
|
|
||||||
|
|
||||||
## 2023-07-13 - 1.0.75 to 1.0.76 - Stability Improvements
|
|
||||||
Stability enhancements and minor improvements.
|
|
||||||
|
|
||||||
- Focused on ensuring a stable operational core.
|
|
||||||
|
|
||||||
## 2022-11-08 - 1.0.73 to 1.0.74 - Routine Fixes
|
|
||||||
Routine core fixes to address reported issues.
|
|
||||||
|
|
||||||
- Addressed minor issues in the core module.
|
|
||||||
|
|
||||||
## 2022-08-03 - 1.0.71 to 1.0.72 - Core Enhancements
|
|
||||||
Enhancements applied to core systems.
|
|
||||||
|
|
||||||
- Tweaked core components for enhanced reliability.
|
|
||||||
|
|
||||||
## 2022-05-04 - 1.0.69 to 1.0.70 - System Reliability Fixes
|
|
||||||
Fixes targeting the reliability of the core systems.
|
|
||||||
|
|
||||||
- Improved system reliability through targeted core updates.
|
|
||||||
|
|
||||||
## 2022-03-17 - 1.0.65 to 1.0.68 - Major Core Updates
|
|
||||||
Major updates and bug fixes delivered for core components.
|
|
||||||
|
|
||||||
- Enhanced central operations through key updates.
|
|
||||||
|
|
||||||
## 2022-02-15 - 1.0.60 to 1.0.64 - Core Stability Improvements
|
|
||||||
Focused updates on core stability and performance.
|
|
||||||
|
|
||||||
- Reinforced stability through systematic core changes.
|
|
||||||
|
|
||||||
## 2021-11-07 - 1.0.54 to 1.0.59 - Core Fixes and Improvements
|
|
||||||
Multiple core updates aimed at fixing and improving the system.
|
|
||||||
|
|
||||||
- Addressed outstanding bugs and improved performance in the core.
|
|
||||||
|
|
||||||
## 2021-08-20 - 1.0.50 to 1.0.53 - Core Functionality Updates
|
|
||||||
Continued updates to improve core functionality and user experience.
|
|
||||||
|
|
||||||
- Implemented essential core fixes to enhance user experience.
|
|
||||||
|
|
||||||
## 2020-10-01 - 1.0.44 to 1.0.49 - Core System Enhancements
|
|
||||||
Critical enhancements to core systems.
|
|
||||||
|
|
||||||
- Improved core operations and tackled existing issues.
|
|
||||||
|
|
||||||
## 2020-09-29 - 1.0.40 to 1.0.43 - Essential Fixes
|
|
||||||
Series of essential fixes for the core system.
|
|
||||||
|
|
||||||
- Rectified known issues and bolstered core functionalities.
|
|
||||||
|
|
||||||
## 2020-07-10 - 1.0.35 to 1.0.39 - Core Function Fixes
|
|
||||||
Focused improvements and fixes for critical components.
|
|
||||||
|
|
||||||
- Addressed critical core functions to boost system performance.
|
|
||||||
|
|
||||||
## 2020-06-01 - 1.0.31 to 1.0.34 - Core Updates
|
|
||||||
Updates to maintain core functionality efficacy.
|
|
||||||
|
|
||||||
- Fixed inefficiencies and updated essential components.
|
|
||||||
|
|
||||||
## 2019-10-02 - 1.0.26 to 1.0.29 - Core Maintenance
|
|
||||||
Regular maintenance and updates for core reliability.
|
|
||||||
|
|
||||||
- Addressed multiple core issues and enhanced system stability.
|
|
||||||
|
|
||||||
## 2019-05-28 - 1.0.20 to 1.0.25 - Core Improvements
|
|
||||||
General improvements targeting core functionalities.
|
|
||||||
|
|
||||||
- Made systematic improvements to core processes.
|
|
||||||
|
|
||||||
## 2019-04-08 - 1.0.16 to 1.0.19 - Bug Squashing
|
|
||||||
Resolved numerous issues within core operations.
|
|
||||||
|
|
||||||
- Fixed and optimized core functionalities for better performance.
|
|
||||||
|
|
||||||
## 2018-12-06 - 1.0.15 - Dependency Updates
|
|
||||||
Updates aimed at improving dependency management.
|
|
||||||
|
|
||||||
- Ensured dependencies are up-to-date for optimal performance.
|
|
||||||
|
|
||||||
## 2018-08-14 - 1.0.14 - Test Improvement
|
|
||||||
Major improvements in testing mechanisms and logging.
|
|
||||||
|
|
||||||
- Improved test results handling for accuracy and reliability.
|
|
||||||
- Enhanced logging features for increased clarity.
|
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|
||||||
- Implemented core components and established initial system structure.
|
|
||||||
- Addressed key bugs and enhanced initial functionality.
|
|
@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
process.env.CLI_CALL = 'true';
|
|
||||||
import * as cliTool from './ts/index.js';
|
|
||||||
cliTool.runCli();
|
|
3
cli.js
3
cli.js
@ -1,4 +1,3 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
process.env.CLI_CALL = 'true';
|
process.env.CLI_CALL = 'true';
|
||||||
const cliTool = await import('./dist_ts/index.js');
|
require('./dist/index');
|
||||||
cliTool.runCli();
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
process.env.CLI_CALL = 'true';
|
process.env.CLI_CALL = 'true';
|
||||||
|
require('@gitzone/tsrun');
|
||||||
import * as tsrun from '@git.zone/tsrun';
|
require('./ts/index');
|
||||||
tsrun.runPath('./cli.child.js', import.meta.url);
|
|
||||||
|
3
contribute.md
Normal file
3
contribute.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# How to contribute
|
||||||
|
|
||||||
|
Start with `tstest.classes.tstest.ts` to understand whats happening
|
@ -4,12 +4,11 @@
|
|||||||
"npmAccessLevel": "public"
|
"npmAccessLevel": "public"
|
||||||
},
|
},
|
||||||
"gitzone": {
|
"gitzone": {
|
||||||
"projectType": "npm",
|
|
||||||
"module": {
|
"module": {
|
||||||
"githost": "gitlab.com",
|
"githost": "gitlab.com",
|
||||||
"gitscope": "gitzone",
|
"gitscope": "gitzone",
|
||||||
"gitrepo": "tstest",
|
"gitrepo": "tstest",
|
||||||
"description": "a test utility to run tests that match test/**/*.ts",
|
"shortDescription": "a test utility to run tests that match test/**/*.ts",
|
||||||
"npmPackagename": "@gitzone/tstest",
|
"npmPackagename": "@gitzone/tstest",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
}
|
}
|
||||||
|
2787
package-lock.json
generated
Normal file
2787
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
60
package.json
60
package.json
@ -1,57 +1,47 @@
|
|||||||
{
|
{
|
||||||
"name": "@git.zone/tstest",
|
"name": "@gitzone/tstest",
|
||||||
"version": "1.0.96",
|
"version": "1.0.27",
|
||||||
"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/index.js",
|
||||||
"typings": "dist_ts/index.d.ts",
|
"typings": "dist/index.d.ts",
|
||||||
"type": "module",
|
|
||||||
"author": "Lossless GmbH",
|
"author": "Lossless GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"tstest": "./cli.js"
|
"tstest": "./cli.js"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(npm run cleanUp && npm run prepareTest && npm run tstest)",
|
"test": "(npm run prepareTest && npm run tstest && npm run cleanUp)",
|
||||||
"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/",
|
||||||
"cleanUp": "rm -rf .nogit/sandbox-npmts",
|
"cleanUp": "rm -rf .nogit/sandbox-npmts",
|
||||||
"build": "(tsbuild --web --allowimplicitany --skiplibcheck)",
|
"format": "(gitzone format)",
|
||||||
"buildDocs": "tsdoc"
|
"build": "(tsbuild)"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@git.zone/tsbuild": "^2.2.0",
|
"@gitzone/tsbuild": "^2.1.17",
|
||||||
"@types/node": "^22.10.9"
|
"@pushrocks/tapbundle": "^3.0.13"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@api.global/typedserver": "^3.0.53",
|
"@gitzone/tsbundle": "^1.0.40",
|
||||||
"@git.zone/tsbundle": "^2.1.0",
|
"@gitzone/tsrun": "^1.2.8",
|
||||||
"@git.zone/tsrun": "^1.3.3",
|
"@pushrocks/consolecolor": "^2.0.1",
|
||||||
"@push.rocks/consolecolor": "^2.0.2",
|
"@pushrocks/smartfile": "^7.0.6",
|
||||||
"@push.rocks/smartbrowser": "^2.0.8",
|
"@pushrocks/smartlog": "^2.0.19",
|
||||||
"@push.rocks/smartdelay": "^3.0.5",
|
"@pushrocks/smartpromise": "^3.0.6",
|
||||||
"@push.rocks/smartfile": "^11.1.5",
|
"@pushrocks/smartshell": "^2.0.25",
|
||||||
"@push.rocks/smartlog": "^3.0.7",
|
"@types/figures": "^3.0.1",
|
||||||
"@push.rocks/smartpromise": "^4.2.0",
|
"figures": "^3.0.0"
|
||||||
"@push.rocks/smartshell": "^3.2.2",
|
|
||||||
"@push.rocks/tapbundle": "^5.5.6",
|
|
||||||
"@types/ws": "^8.5.14",
|
|
||||||
"figures": "^6.1.0",
|
|
||||||
"ws": "^8.18.0"
|
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"ts/**/*",
|
"ts/*",
|
||||||
"ts_web/**/*",
|
"ts_web/*",
|
||||||
"dist/**/*",
|
"dist/*",
|
||||||
"dist_*/**/*",
|
"dist_web/*",
|
||||||
"dist_ts/**/*",
|
"dist_ts_web/*",
|
||||||
"dist_ts_web/**/*",
|
"assets/*",
|
||||||
"assets/**/*",
|
|
||||||
"cli.js",
|
"cli.js",
|
||||||
"npmextra.json",
|
"npmextra.json",
|
||||||
"readme.md"
|
"readme.md"
|
||||||
],
|
|
||||||
"browserslist": [
|
|
||||||
"last 1 chrome versions"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
9645
pnpm-lock.yaml
generated
9645
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
49
readme.md
49
readme.md
@ -8,51 +8,16 @@ a test utility to run tests that match test/**/*.ts
|
|||||||
* [docs (typedoc)](https://gitzone.gitlab.io/tstest/)
|
* [docs (typedoc)](https://gitzone.gitlab.io/tstest/)
|
||||||
|
|
||||||
## Status for master
|
## Status for master
|
||||||
|
[](https://gitlab.com/gitzone/tstest/commits/master)
|
||||||
Status Category | Status Badge
|
[](https://gitlab.com/gitzone/tstest/commits/master)
|
||||||
-- | --
|
[](https://www.npmjs.com/package/@gitzone/tstest)
|
||||||
GitLab Pipelines | [](https://lossless.cloud)
|
[](https://snyk.io/test/npm/@gitzone/tstest)
|
||||||
GitLab Pipline Test Coverage | [](https://lossless.cloud)
|
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||||
npm | [](https://lossless.cloud)
|
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||||
Snyk | [](https://lossless.cloud)
|
[](https://prettier.io/)
|
||||||
TypeScript Support | [](https://lossless.cloud)
|
|
||||||
node Support | [](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
|
||||||
Code Style | [](https://lossless.cloud)
|
|
||||||
PackagePhobia (total standalone install weight) | [](https://lossless.cloud)
|
|
||||||
PackagePhobia (package size on registry) | [](https://lossless.cloud)
|
|
||||||
BundlePhobia (total size when bundled) | [](https://lossless.cloud)
|
|
||||||
Platform support | [](https://lossless.cloud) [](https://lossless.cloud)
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
## cli usage
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
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). :)
|
|
||||||
|
|
||||||
For further information read the linked docs at the top of this readme.
|
For further information read the linked docs at the top of this readme.
|
||||||
|
|
||||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { expect, tap } from '@push.rocks/tapbundle';
|
import { expect, tap } from '@pushrocks/tapbundle';
|
||||||
import * as tstest from '../ts/index.js';
|
import * as tstest from '../ts/index';
|
||||||
|
|
||||||
tap.test('prepare test', async () => {});
|
tap.test('prepare test', async () => {});
|
||||||
|
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
/**
|
|
||||||
* autocreated commitinfo by @push.rocks/commitinfo
|
|
||||||
*/
|
|
||||||
export const commitinfo = {
|
|
||||||
name: '@git.zone/tstest',
|
|
||||||
version: '1.0.96',
|
|
||||||
description: 'a test utility to run tests that match test/**/*.ts'
|
|
||||||
}
|
|
13
ts/index.ts
13
ts/index.ts
@ -1,10 +1,9 @@
|
|||||||
import { TsTest } from './tstest.classes.tstest.js';
|
import { TsTest } from './tstest.classes.tstest';
|
||||||
|
|
||||||
export const runCli = async () => {
|
const cliRun = async () => {
|
||||||
if (!process.argv[2]) {
|
if (process.env.CLI_CALL) {
|
||||||
console.error('You must specify a test directory as argument. Please try again.');
|
const tsTestInstance = new TsTest(process.cwd(), process.argv[2]);
|
||||||
process.exit(1);
|
await tsTestInstance.run();
|
||||||
}
|
}
|
||||||
const tsTestInstance = new TsTest(process.cwd(), process.argv[2]);
|
|
||||||
await tsTestInstance.run();
|
|
||||||
};
|
};
|
||||||
|
cliRun();
|
||||||
|
@ -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.js';
|
import * as plugins from './tstest.plugins';
|
||||||
import { coloredString as cs } from '@push.rocks/consolecolor';
|
import { coloredString as cs } from '@pushrocks/consolecolor';
|
||||||
|
|
||||||
import { TapParser } from './tstest.classes.tap.parser.js';
|
import { TapParser } from './tstest.classes.tap.parser';
|
||||||
import * as logPrefixes from './tstest.logprefixes.js';
|
import * as logPrefixes from './tstest.logprefixes';
|
||||||
|
|
||||||
export class TapCombinator {
|
export class TapCombinator {
|
||||||
tapParserStore: TapParser[] = [];
|
tapParserStore: TapParser[] = [];
|
||||||
@ -20,24 +20,7 @@ export class TapCombinator {
|
|||||||
|
|
||||||
let failGlobal = false; // determine wether tstest should fail
|
let failGlobal = false; // determine wether tstest should fail
|
||||||
for (const tapParser of this.tapParserStore) {
|
for (const tapParser of this.tapParserStore) {
|
||||||
if (!tapParser.expectedTests) {
|
if (tapParser.getErrorTests().length === 0) {
|
||||||
failGlobal = true;
|
|
||||||
let overviewString =
|
|
||||||
logPrefixes.TsTestPrefix +
|
|
||||||
cs(` ${tapParser.fileName} ${plugins.figures.cross}`, 'red') +
|
|
||||||
` ${plugins.figures.pointer} ` +
|
|
||||||
`does not specify tests!`;
|
|
||||||
console.log(overviewString);
|
|
||||||
} else if (tapParser.expectedTests !== tapParser.receivedTests) {
|
|
||||||
failGlobal = true;
|
|
||||||
let overviewString =
|
|
||||||
logPrefixes.TsTestPrefix +
|
|
||||||
cs(` ${tapParser.fileName} ${plugins.figures.cross}`, 'red') +
|
|
||||||
` ${plugins.figures.pointer} ` +
|
|
||||||
tapParser.getTestOverviewAsString() +
|
|
||||||
`did not execute all specified tests!`;
|
|
||||||
console.log(overviewString);
|
|
||||||
} else if (tapParser.getErrorTests().length === 0) {
|
|
||||||
let overviewString =
|
let overviewString =
|
||||||
logPrefixes.TsTestPrefix +
|
logPrefixes.TsTestPrefix +
|
||||||
cs(` ${tapParser.fileName} ${plugins.figures.tick}`, 'green') +
|
cs(` ${tapParser.fileName} ${plugins.figures.tick}`, 'green') +
|
||||||
@ -45,13 +28,13 @@ export class TapCombinator {
|
|||||||
tapParser.getTestOverviewAsString();
|
tapParser.getTestOverviewAsString();
|
||||||
console.log(overviewString);
|
console.log(overviewString);
|
||||||
} else {
|
} else {
|
||||||
failGlobal = true;
|
|
||||||
let overviewString =
|
let overviewString =
|
||||||
logPrefixes.TsTestPrefix +
|
logPrefixes.TsTestPrefix +
|
||||||
cs(` ${tapParser.fileName} ${plugins.figures.cross}`, 'red') +
|
cs(` ${tapParser.fileName} ${plugins.figures.cross}`, 'red') +
|
||||||
` ${plugins.figures.pointer} ` +
|
` ${plugins.figures.pointer} ` +
|
||||||
tapParser.getTestOverviewAsString();
|
tapParser.getTestOverviewAsString();
|
||||||
console.log(overviewString);
|
console.log(overviewString);
|
||||||
|
failGlobal = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log(cs(plugins.figures.hamburger.repeat(48), 'cyan'));
|
console.log(cs(plugins.figures.hamburger.repeat(48), 'cyan'));
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import { ChildProcess } from 'child_process';
|
import { ChildProcess } from 'child_process';
|
||||||
import { coloredString as cs } from '@push.rocks/consolecolor';
|
import { coloredString as cs } from '@pushrocks/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.js';
|
import * as plugins from './tstest.plugins';
|
||||||
import { TapTestResult } from './tstest.classes.tap.testresult.js';
|
import { TapTestResult } from './tstest.classes.tap.testresult';
|
||||||
import * as logPrefixes from './tstest.logprefixes.js';
|
import * as logPrefixes from './tstest.logprefixes';
|
||||||
|
|
||||||
export class TapParser {
|
export class TapParser {
|
||||||
testStore: TapTestResult[] = [];
|
testStore: TapTestResult[] = [];
|
||||||
@ -18,8 +18,6 @@ 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
|
||||||
*/
|
*/
|
||||||
@ -51,12 +49,6 @@ 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);
|
||||||
@ -113,15 +105,15 @@ export class TapParser {
|
|||||||
/**
|
/**
|
||||||
* returns all tests that are not completed
|
* returns all tests that are not completed
|
||||||
*/
|
*/
|
||||||
public getUncompletedTests() {
|
getUncompletedTests() {
|
||||||
// TODO:
|
// TODO:
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns all tests that threw an error
|
* returns all tests that threw an error
|
||||||
*/
|
*/
|
||||||
public getErrorTests() {
|
getErrorTests() {
|
||||||
return this.testStore.filter((tapTestArg) => {
|
return this.testStore.filter(tapTestArg => {
|
||||||
return !tapTestArg.testOk;
|
return !tapTestArg.testOk;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -131,7 +123,7 @@ export class TapParser {
|
|||||||
*/
|
*/
|
||||||
getTestOverviewAsString() {
|
getTestOverviewAsString() {
|
||||||
let overviewString = '';
|
let overviewString = '';
|
||||||
for (const test of this.testStore) {
|
for (let test of this.testStore) {
|
||||||
if (overviewString !== '') {
|
if (overviewString !== '') {
|
||||||
overviewString += ' | ';
|
overviewString += ' | ';
|
||||||
}
|
}
|
||||||
@ -148,62 +140,45 @@ export class TapParser {
|
|||||||
* handles a tap process
|
* handles a tap process
|
||||||
* @param childProcessArg
|
* @param childProcessArg
|
||||||
*/
|
*/
|
||||||
public async handleTapProcess(childProcessArg: ChildProcess) {
|
async handleTapProcess(childProcessArg: ChildProcess) {
|
||||||
const done = plugins.smartpromise.defer();
|
const done = plugins.smartpromise.defer();
|
||||||
childProcessArg.stdout.on('data', (data) => {
|
childProcessArg.stdout.on('data', data => {
|
||||||
this._processLog(data);
|
this._processLog(data);
|
||||||
});
|
});
|
||||||
childProcessArg.stderr.on('data', (data) => {
|
childProcessArg.stderr.on('data', data => {
|
||||||
this._processLog(data);
|
this._processLog(data);
|
||||||
});
|
});
|
||||||
childProcessArg.on('exit', async () => {
|
childProcessArg.on('exit', () => {
|
||||||
await this.evaluateFinalResult();
|
this.receivedTests = this.testStore.length;
|
||||||
|
|
||||||
|
// check wether all tests ran
|
||||||
|
if (this.expectedTests === this.receivedTests) {
|
||||||
|
console.log(
|
||||||
|
`${logPrefixes.TapPrefix} ${cs(
|
||||||
|
`${this.receivedTests} out of ${this.expectedTests} Tests completed!`,
|
||||||
|
'green'
|
||||||
|
)}`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
`${logPrefixes.TapErrorPrefix} ${cs(
|
||||||
|
`Only ${this.receivedTests} out of ${this.expectedTests} completed!`,
|
||||||
|
'red'
|
||||||
|
)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (this.getErrorTests().length === 0) {
|
||||||
|
console.log(`${logPrefixes.TapPrefix} ${cs(`All tests are successfull!!!`, 'green')}`);
|
||||||
|
} else {
|
||||||
|
console.log(
|
||||||
|
`${logPrefixes.TapPrefix} ${cs(
|
||||||
|
`${this.getErrorTests().length} tests threw an error!!!`,
|
||||||
|
'red'
|
||||||
|
)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
done.resolve();
|
done.resolve();
|
||||||
});
|
});
|
||||||
await done.promise;
|
await done.promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async handleTapLog(tapLog: string) {
|
|
||||||
this._processLog(tapLog);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async evaluateFinalResult() {
|
|
||||||
this.receivedTests = this.testStore.length;
|
|
||||||
|
|
||||||
// check wether all tests ran
|
|
||||||
if (this.expectedTests === this.receivedTests) {
|
|
||||||
console.log(
|
|
||||||
`${logPrefixes.TapPrefix} ${cs(
|
|
||||||
`${this.receivedTests} out of ${this.expectedTests} Tests completed!`,
|
|
||||||
'green'
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
console.log(
|
|
||||||
`${logPrefixes.TapErrorPrefix} ${cs(
|
|
||||||
`Only ${this.receivedTests} out of ${this.expectedTests} completed!`,
|
|
||||||
'red'
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (!this.expectedTests) {
|
|
||||||
console.log(cs('Error: No tests were defined. Therefore the testfile failed!', 'red'));
|
|
||||||
} else if (this.expectedTests !== this.receivedTests) {
|
|
||||||
console.log(
|
|
||||||
cs(
|
|
||||||
'Error: The amount of received tests and expectedTests is unequal! Therefore the testfile failed',
|
|
||||||
'red'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else if (this.getErrorTests().length === 0) {
|
|
||||||
console.log(`${logPrefixes.TapPrefix} ${cs(`All tests are successfull!!!`, 'green')}`);
|
|
||||||
} else {
|
|
||||||
console.log(
|
|
||||||
`${logPrefixes.TapPrefix} ${cs(
|
|
||||||
`${this.getErrorTests().length} tests threw an error!!!`,
|
|
||||||
'red'
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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.js';
|
import * as plugins from './tstest.plugins';
|
||||||
|
|
||||||
export class TapTestResult {
|
export class TapTestResult {
|
||||||
testLogBuffer = Buffer.from('');
|
testLogBuffer = Buffer.from('');
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import * as plugins from './tstest.plugins.js';
|
import * as plugins from './tstest.plugins';
|
||||||
import * as paths from './tstest.paths.js';
|
import * as paths from './tstest.paths';
|
||||||
import { SmartFile } from '@push.rocks/smartfile';
|
import { Smartfile } from '@pushrocks/smartfile';
|
||||||
|
|
||||||
// tap related stuff
|
// tap related stuff
|
||||||
import { TapCombinator } from './tstest.classes.tap.combinator.js';
|
import { TapCombinator } from './tstest.classes.tap.combinator';
|
||||||
import { TapParser } from './tstest.classes.tap.parser.js';
|
import { TapParser } from './tstest.classes.tap.parser';
|
||||||
import { TapTestResult } from './tstest.classes.tap.testresult.js';
|
import { TapTestResult } from './tstest.classes.tap.testresult';
|
||||||
|
|
||||||
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
|
||||||
|
@ -1,24 +1,15 @@
|
|||||||
import * as plugins from './tstest.plugins.js';
|
import * as plugins from './tstest.plugins';
|
||||||
import * as paths from './tstest.paths.js';
|
import * as paths from './tstest.paths';
|
||||||
import * as logPrefixes from './tstest.logprefixes.js';
|
import * as logPrefixes from './tstest.logprefixes';
|
||||||
|
|
||||||
import { coloredString as cs } from '@push.rocks/consolecolor';
|
import { coloredString as cs } from '@pushrocks/consolecolor';
|
||||||
|
|
||||||
import { TestDirectory } from './tstest.classes.testdirectory.js';
|
import { TestDirectory } from './tstest.classes.testdirectory';
|
||||||
import { TapCombinator } from './tstest.classes.tap.combinator.js';
|
import { TapCombinator } from './tstest.classes.tap.combinator';
|
||||||
import { TapParser } from './tstest.classes.tap.parser.js';
|
import { TapParser } from './tstest.classes.tap.parser';
|
||||||
|
|
||||||
export class TsTest {
|
export class TsTest {
|
||||||
public testDir: TestDirectory;
|
testDir: TestDirectory;
|
||||||
|
|
||||||
public smartshellInstance = new plugins.smartshell.Smartshell({
|
|
||||||
executor: 'bash',
|
|
||||||
pathDirectories: [paths.binDirectory],
|
|
||||||
sourceFilePaths: [],
|
|
||||||
});
|
|
||||||
public smartbrowserInstance = new plugins.smartbrowser.SmartBrowser();
|
|
||||||
|
|
||||||
public tsbundleInstance = new plugins.tsbundle.TsBundle();
|
|
||||||
|
|
||||||
constructor(cwdArg: string, relativePathToTestDirectory: string) {
|
constructor(cwdArg: string, relativePathToTestDirectory: string) {
|
||||||
this.testDir = new TestDirectory(cwdArg, relativePathToTestDirectory);
|
this.testDir = new TestDirectory(cwdArg, relativePathToTestDirectory);
|
||||||
@ -34,179 +25,31 @@ export class TsTest {
|
|||||||
}
|
}
|
||||||
console.log('-'.repeat(48));
|
console.log('-'.repeat(48));
|
||||||
console.log(''); // force new line
|
console.log(''); // force new line
|
||||||
|
const smartshellInstance = new plugins.smartshell.Smartshell({
|
||||||
|
executor: 'bash',
|
||||||
|
pathDirectories: [paths.binDirectory],
|
||||||
|
sourceFilePaths: []
|
||||||
|
});
|
||||||
const tapCombinator = new TapCombinator(); // lets create the TapCombinator
|
const tapCombinator = new TapCombinator(); // lets create the TapCombinator
|
||||||
for (const fileNameArg of fileNamesToRun) {
|
for (const fileName of fileNamesToRun) {
|
||||||
switch (true) {
|
console.log(`${cs('=> ', 'blue')} Running ${cs(fileName, 'orange')}`);
|
||||||
case process.env.CI && fileNameArg.includes('.nonci.'):
|
console.log(cs(`=`.repeat(16), 'cyan'));
|
||||||
console.log('!!!!!!!!!!!');
|
const tapParser = new TapParser(fileName);
|
||||||
console.log(
|
|
||||||
`not running testfile ${fileNameArg}, since we are CI and file name includes '.nonci.' tag`
|
// tsrun options
|
||||||
);
|
let tsrunOptions = '';
|
||||||
console.log('!!!!!!!!!!!');
|
if (process.argv.includes('--web')) {
|
||||||
break;
|
tsrunOptions += ' --web';
|
||||||
case fileNameArg.endsWith('.browser.ts') || fileNameArg.endsWith('.browser.nonci.ts'):
|
|
||||||
const tapParserBrowser = await this.runInChrome(fileNameArg);
|
|
||||||
tapCombinator.addTapParser(tapParserBrowser);
|
|
||||||
break;
|
|
||||||
case fileNameArg.endsWith('.both.ts') || fileNameArg.endsWith('.both.nonci.ts'):
|
|
||||||
console.log('>>>>>>> TEST PART 1: chrome');
|
|
||||||
const tapParserBothBrowser = await this.runInChrome(fileNameArg);
|
|
||||||
tapCombinator.addTapParser(tapParserBothBrowser);
|
|
||||||
console.log(cs(`|`.repeat(16), 'cyan'));
|
|
||||||
console.log(''); // force new line
|
|
||||||
console.log('>>>>>>> TEST PART 2: node');
|
|
||||||
const tapParserBothNode = await this.runInNode(fileNameArg);
|
|
||||||
tapCombinator.addTapParser(tapParserBothNode);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
const tapParserNode = await this.runInNode(fileNameArg);
|
|
||||||
tapCombinator.addTapParser(tapParserNode);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const execResultStreaming = await smartshellInstance.execStreamingSilent(
|
||||||
|
`tsrun ${fileName}${tsrunOptions}`
|
||||||
|
);
|
||||||
|
await tapParser.handleTapProcess(execResultStreaming.childProcess);
|
||||||
console.log(cs(`^`.repeat(16), 'cyan'));
|
console.log(cs(`^`.repeat(16), 'cyan'));
|
||||||
console.log(''); // force new line
|
console.log(''); // force new line
|
||||||
|
tapCombinator.addTapParser(tapParser);
|
||||||
}
|
}
|
||||||
tapCombinator.evaluate();
|
tapCombinator.evaluate();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async runInNode(fileNameArg: string): Promise<TapParser> {
|
|
||||||
console.log(`${cs('=> ', 'blue')} Running ${cs(fileNameArg, 'orange')} in node.js runtime.`);
|
|
||||||
console.log(`${cs(`= `.repeat(32), 'cyan')}`);
|
|
||||||
const tapParser = new TapParser(fileNameArg + ':node');
|
|
||||||
|
|
||||||
// tsrun options
|
|
||||||
let tsrunOptions = '';
|
|
||||||
if (process.argv.includes('--web')) {
|
|
||||||
tsrunOptions += ' --web';
|
|
||||||
}
|
|
||||||
|
|
||||||
const execResultStreaming = await this.smartshellInstance.execStreamingSilent(
|
|
||||||
`tsrun ${fileNameArg}${tsrunOptions}`
|
|
||||||
);
|
|
||||||
await tapParser.handleTapProcess(execResultStreaming.childProcess);
|
|
||||||
return tapParser;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async runInChrome(fileNameArg: string): Promise<TapParser> {
|
|
||||||
console.log(`${cs('=> ', 'blue')} Running ${cs(fileNameArg, 'orange')} in chromium runtime.`);
|
|
||||||
console.log(`${cs(`= `.repeat(32), 'cyan')}`);
|
|
||||||
|
|
||||||
// lets get all our paths sorted
|
|
||||||
const tsbundleCacheDirPath = plugins.path.join(paths.cwd, './.nogit/tstest_cache');
|
|
||||||
const bundleFileName = fileNameArg.replace('/', '__') + '.js';
|
|
||||||
const bundleFilePath = plugins.path.join(tsbundleCacheDirPath, bundleFileName);
|
|
||||||
|
|
||||||
// lets bundle the test
|
|
||||||
await plugins.smartfile.fs.ensureEmptyDir(tsbundleCacheDirPath);
|
|
||||||
await this.tsbundleInstance.build(process.cwd(), fileNameArg, bundleFilePath, {
|
|
||||||
bundler: 'esbuild',
|
|
||||||
});
|
|
||||||
|
|
||||||
// lets create a server
|
|
||||||
const server = new plugins.typedserver.servertools.Server({
|
|
||||||
cors: true,
|
|
||||||
port: 3007,
|
|
||||||
});
|
|
||||||
server.addRoute(
|
|
||||||
'/test',
|
|
||||||
new plugins.typedserver.servertools.Handler('GET', async (req, res) => {
|
|
||||||
res.type('.html');
|
|
||||||
res.write(`
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<script>
|
|
||||||
globalThis.testdom = true;
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body></body>
|
|
||||||
</html>
|
|
||||||
`);
|
|
||||||
res.end();
|
|
||||||
})
|
|
||||||
);
|
|
||||||
server.addRoute('*', new plugins.typedserver.servertools.HandlerStatic(tsbundleCacheDirPath));
|
|
||||||
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
|
|
||||||
await this.smartbrowserInstance.start();
|
|
||||||
const evaluation = await this.smartbrowserInstance.evaluateOnPage(
|
|
||||||
`http://localhost:3007/test?bundleName=${bundleFileName}`,
|
|
||||||
async () => {
|
|
||||||
// lets enable real time comms
|
|
||||||
const ws = new WebSocket('ws://localhost:8080');
|
|
||||||
await new Promise((resolve) => (ws.onopen = resolve));
|
|
||||||
|
|
||||||
// Ensure this function is declared with 'async'
|
|
||||||
const logStore = [];
|
|
||||||
const originalLog = console.log;
|
|
||||||
const originalError = console.error;
|
|
||||||
|
|
||||||
// Override console methods to capture the logs
|
|
||||||
console.log = (...args) => {
|
|
||||||
logStore.push(args.join(' '));
|
|
||||||
ws.send(args.join(' '));
|
|
||||||
originalLog(...args);
|
|
||||||
};
|
|
||||||
console.error = (...args) => {
|
|
||||||
logStore.push(args.join(' '));
|
|
||||||
ws.send(args.join(' '));
|
|
||||||
originalError(...args);
|
|
||||||
};
|
|
||||||
|
|
||||||
const bundleName = new URLSearchParams(window.location.search).get('bundleName');
|
|
||||||
originalLog(`::TSTEST IN CHROMIUM:: Relevant Script name is: ${bundleName}`);
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Dynamically import the test module
|
|
||||||
const testModule = await import(`/${bundleName}`);
|
|
||||||
if (testModule && testModule.default && testModule.default instanceof Promise) {
|
|
||||||
// Execute the exported test function
|
|
||||||
await testModule.default;
|
|
||||||
} else if (testModule && testModule.default && typeof testModule.default.then === 'function') {
|
|
||||||
console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
|
|
||||||
console.log('Test module default export is just promiselike: Something might be messing with your Promise implementation.');
|
|
||||||
console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
|
|
||||||
await testModule.default;
|
|
||||||
} else if (globalThis.tapPromise && typeof globalThis.tapPromise.then === 'function') {
|
|
||||||
console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
|
|
||||||
console.log('Using globalThis.tapPromise');
|
|
||||||
console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
|
|
||||||
await testModule.default;
|
|
||||||
} else {
|
|
||||||
console.error('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
|
|
||||||
console.error('Test module does not export a default promise.');
|
|
||||||
console.error('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
|
|
||||||
console.log(`We got: ${JSON.stringify(testModule)}`);
|
|
||||||
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
return logStore.join('\n');
|
|
||||||
}
|
|
||||||
);
|
|
||||||
await this.smartbrowserInstance.stop();
|
|
||||||
await server.stop();
|
|
||||||
wss.close();
|
|
||||||
console.log(
|
|
||||||
`${cs('=> ', 'blue')} Stopped ${cs(fileNameArg, 'orange')} chromium instance and server.`
|
|
||||||
);
|
|
||||||
// lets create the tap parser
|
|
||||||
await tapParser.evaluateFinalResult();
|
|
||||||
return tapParser;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async runInDeno() {}
|
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
import * as plugins from './tstest.plugins.js';
|
import * as plugins from './tstest.plugins';
|
||||||
import { coloredString as cs } from '@push.rocks/consolecolor';
|
import { coloredString as cs } from '@pushrocks/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');
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import * as plugins from './tstest.plugins.js';
|
import * as plugins from './tstest.plugins';
|
||||||
|
|
||||||
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');
|
||||||
|
@ -1,49 +1,14 @@
|
|||||||
// node native
|
// node native
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
|
||||||
export { path };
|
// @pushrocks scope
|
||||||
|
import * as consolecolor from '@pushrocks/consolecolor';
|
||||||
// @apiglobal scope
|
import * as smartfile from '@pushrocks/smartfile';
|
||||||
import * as typedserver from '@api.global/typedserver';
|
import * as smartlog from '@pushrocks/smartlog';
|
||||||
|
import * as smartpromise from '@pushrocks/smartpromise';
|
||||||
export {
|
import * as smartshell from '@pushrocks/smartshell';
|
||||||
typedserver
|
|
||||||
}
|
|
||||||
|
|
||||||
// @push.rocks scope
|
|
||||||
import * as consolecolor from '@push.rocks/consolecolor';
|
|
||||||
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 {
|
|
||||||
consolecolor,
|
|
||||||
smartbrowser,
|
|
||||||
smartdelay,
|
|
||||||
smartfile,
|
|
||||||
smartlog,
|
|
||||||
smartpromise,
|
|
||||||
smartshell,
|
|
||||||
tapbundle,
|
|
||||||
};
|
|
||||||
|
|
||||||
// @gitzone scope
|
|
||||||
import * as tsbundle from '@git.zone/tsbundle';
|
|
||||||
|
|
||||||
export { tsbundle };
|
|
||||||
|
|
||||||
// sindresorhus
|
// sindresorhus
|
||||||
import figures from 'figures';
|
import * as figures from 'figures';
|
||||||
|
|
||||||
export { figures };
|
export { consolecolor, figures, path, smartfile, smartlog, smartpromise, smartshell };
|
||||||
|
|
||||||
// third party
|
|
||||||
import * as ws from 'ws';
|
|
||||||
|
|
||||||
export {
|
|
||||||
ws
|
|
||||||
}
|
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"experimentalDecorators": true,
|
|
||||||
"useDefineForClassFields": false,
|
|
||||||
"target": "ES2022",
|
|
||||||
"module": "NodeNext",
|
|
||||||
"moduleResolution": "NodeNext",
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"verbatimModuleSyntax": true
|
|
||||||
},
|
|
||||||
"exclude": [
|
|
||||||
"dist_*/**/*.d.ts"
|
|
||||||
]
|
|
||||||
}
|
|
17
tslint.json
Normal file
17
tslint.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user