@git.zone/tstest 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/tstest.plugins.d.ts +1 -1
  3. package/dist_ts/tstest.plugins.js +2 -2
  4. package/dist_ts_tapbundle/00_commitinfo_data.d.ts +8 -0
  5. package/dist_ts_tapbundle/00_commitinfo_data.js +9 -0
  6. package/dist_ts_tapbundle/index.d.ts +5 -0
  7. package/dist_ts_tapbundle/index.js +6 -0
  8. package/dist_ts_tapbundle/tapbundle.classes.pretask.d.ts +10 -0
  9. package/dist_ts_tapbundle/tapbundle.classes.pretask.js +13 -0
  10. package/dist_ts_tapbundle/tapbundle.classes.tap.d.ts +51 -0
  11. package/dist_ts_tapbundle/tapbundle.classes.tap.js +154 -0
  12. package/dist_ts_tapbundle/tapbundle.classes.taptest.d.ts +32 -0
  13. package/dist_ts_tapbundle/tapbundle.classes.taptest.js +62 -0
  14. package/dist_ts_tapbundle/tapbundle.classes.taptools.d.ts +27 -0
  15. package/dist_ts_tapbundle/tapbundle.classes.taptools.js +51 -0
  16. package/dist_ts_tapbundle/tapbundle.classes.tapwrap.d.ts +8 -0
  17. package/dist_ts_tapbundle/tapbundle.classes.tapwrap.js +7 -0
  18. package/dist_ts_tapbundle/tapbundle.plugins.d.ts +7 -0
  19. package/dist_ts_tapbundle/tapbundle.plugins.js +9 -0
  20. package/dist_ts_tapbundle/tapbundle.tapcreator.d.ts +3 -0
  21. package/dist_ts_tapbundle/tapbundle.tapcreator.js +5 -0
  22. package/dist_ts_tapbundle/webhelpers.d.ts +7 -0
  23. package/dist_ts_tapbundle/webhelpers.js +35 -0
  24. package/dist_ts_tapbundle_node/classes.tapnodetools.d.ts +25 -0
  25. package/dist_ts_tapbundle_node/classes.tapnodetools.js +81 -0
  26. package/dist_ts_tapbundle_node/classes.testfileprovider.d.ts +6 -0
  27. package/dist_ts_tapbundle_node/classes.testfileprovider.js +16 -0
  28. package/dist_ts_tapbundle_node/index.d.ts +1 -0
  29. package/dist_ts_tapbundle_node/index.js +2 -0
  30. package/dist_ts_tapbundle_node/paths.d.ts +2 -0
  31. package/dist_ts_tapbundle_node/paths.js +4 -0
  32. package/dist_ts_tapbundle_node/plugins.d.ts +11 -0
  33. package/dist_ts_tapbundle_node/plugins.js +14 -0
  34. package/package.json +18 -8
  35. package/readme.hints.md +62 -0
  36. package/ts/00_commitinfo_data.ts +1 -1
  37. package/ts/tspublish.json +3 -0
  38. package/ts/tstest.plugins.ts +1 -1
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tstest',
6
- version: '1.4.0',
6
+ version: '1.5.0',
7
7
  description: 'a test utility to run tests that match test/**/*.ts'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHFEQUFxRDtDQUNuRSxDQUFBIn0=
@@ -9,7 +9,7 @@ import * as smartfile from '@push.rocks/smartfile';
9
9
  import * as smartlog from '@push.rocks/smartlog';
10
10
  import * as smartpromise from '@push.rocks/smartpromise';
11
11
  import * as smartshell from '@push.rocks/smartshell';
12
- import * as tapbundle from '@push.rocks/tapbundle';
12
+ import * as tapbundle from '../dist_ts_tapbundle/index.js';
13
13
  export { consolecolor, smartbrowser, smartdelay, smartfile, smartlog, smartpromise, smartshell, tapbundle, };
14
14
  import * as tsbundle from '@git.zone/tsbundle';
15
15
  export { tsbundle };
@@ -12,7 +12,7 @@ import * as smartfile from '@push.rocks/smartfile';
12
12
  import * as smartlog from '@push.rocks/smartlog';
13
13
  import * as smartpromise from '@push.rocks/smartpromise';
14
14
  import * as smartshell from '@push.rocks/smartshell';
15
- import * as tapbundle from '@push.rocks/tapbundle';
15
+ import * as tapbundle from '../dist_ts_tapbundle/index.js';
16
16
  export { consolecolor, smartbrowser, smartdelay, smartfile, smartlog, smartpromise, smartshell, tapbundle, };
17
17
  // @gitzone scope
18
18
  import * as tsbundle from '@git.zone/tsbundle';
@@ -23,4 +23,4 @@ export { figures };
23
23
  // third party
24
24
  import * as ws from 'ws';
25
25
  export { ws };
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN0ZXN0LnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c3Rlc3QucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBQ2QsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0FBRWhCLG1CQUFtQjtBQUNuQixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFDTCxXQUFXLEVBQ1osQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQ1osVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsWUFBWSxFQUNaLFVBQVUsRUFDVixTQUFTLEdBQ1YsQ0FBQztBQUVGLGlCQUFpQjtBQUNqQixPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUVwQixlQUFlO0FBQ2YsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUVuQixjQUFjO0FBQ2QsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxFQUNMLEVBQUUsRUFDSCxDQUFBIn0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN0ZXN0LnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c3Rlc3QucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBQ2QsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0FBRWhCLG1CQUFtQjtBQUNuQixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFDTCxXQUFXLEVBQ1osQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sK0JBQStCLENBQUM7QUFFM0QsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQ1osVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsWUFBWSxFQUNaLFVBQVUsRUFDVixTQUFTLEdBQ1YsQ0FBQztBQUVGLGlCQUFpQjtBQUNqQixPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUVwQixlQUFlO0FBQ2YsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUVuQixjQUFjO0FBQ2QsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxFQUNMLEVBQUUsRUFDSCxDQUFBIn0=
@@ -0,0 +1,8 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export declare const commitinfo: {
5
+ name: string;
6
+ version: string;
7
+ description: string;
8
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export const commitinfo = {
5
+ name: '@push.rocks/tapbundle',
6
+ version: '6.0.3',
7
+ description: 'A comprehensive testing automation library that provides a wide range of utilities and tools for TAP (Test Anything Protocol) based testing, especially suitable for projects using tapbuffer.'
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdGFwYnVuZGxlLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsdUJBQXVCO0lBQzdCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxnTUFBZ007Q0FDOU0sQ0FBQSJ9
@@ -0,0 +1,5 @@
1
+ export { tap } from './tapbundle.classes.tap.js';
2
+ export { TapWrap } from './tapbundle.classes.tapwrap.js';
3
+ export { webhelpers } from './webhelpers.js';
4
+ import { expect } from '@push.rocks/smartexpect';
5
+ export { expect };
@@ -0,0 +1,6 @@
1
+ export { tap } from './tapbundle.classes.tap.js';
2
+ export { TapWrap } from './tapbundle.classes.tapwrap.js';
3
+ export { webhelpers } from './webhelpers.js';
4
+ import { expect } from '@push.rocks/smartexpect';
5
+ export { expect };
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWpELE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyJ9
@@ -0,0 +1,10 @@
1
+ import { TapTools } from './tapbundle.classes.taptools.js';
2
+ export interface IPreTaskFunction {
3
+ (tapTools?: TapTools): Promise<any>;
4
+ }
5
+ export declare class PreTask {
6
+ description: string;
7
+ preTaskFunction: IPreTaskFunction;
8
+ constructor(descriptionArg: string, preTaskFunctionArg: IPreTaskFunction);
9
+ run(): Promise<void>;
10
+ }
@@ -0,0 +1,13 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ import { TapTools } from './tapbundle.classes.taptools.js';
3
+ export class PreTask {
4
+ constructor(descriptionArg, preTaskFunctionArg) {
5
+ this.description = descriptionArg;
6
+ this.preTaskFunction = preTaskFunctionArg;
7
+ }
8
+ async run() {
9
+ console.log(`::__PRETASK: ${this.description}`);
10
+ await this.preTaskFunction(new TapTools(null));
11
+ }
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMucHJldGFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUuY2xhc3Nlcy5wcmV0YXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTTNELE1BQU0sT0FBTyxPQUFPO0lBSWxCLFlBQVksY0FBc0IsRUFBRSxrQkFBb0M7UUFDdEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7UUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUc7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,51 @@
1
+ import { type IPreTaskFunction } from './tapbundle.classes.pretask.js';
2
+ import { TapTest, type ITestFunction } from './tapbundle.classes.taptest.js';
3
+ export declare class Tap<T> {
4
+ /**
5
+ * skips a test
6
+ * tests marked with tap.skip.test() are never executed
7
+ */
8
+ skip: {
9
+ test: (descriptionArg: string, functionArg: ITestFunction<T>) => void;
10
+ testParallel: (descriptionArg: string, functionArg: ITestFunction<T>) => void;
11
+ };
12
+ /**
13
+ * only executes tests marked as ONLY
14
+ */
15
+ only: {
16
+ test: (descriptionArg: string, testFunctionArg: ITestFunction<T>) => void;
17
+ };
18
+ private _tapPreTasks;
19
+ private _tapTests;
20
+ private _tapTestsOnly;
21
+ /**
22
+ * Normal test function, will run one by one
23
+ * @param testDescription - A description of what the test does
24
+ * @param testFunction - A Function that returns a Promise and resolves or rejects
25
+ */
26
+ test(testDescription: string, testFunction: ITestFunction<T>, modeArg?: 'normal' | 'only' | 'skip'): TapTest<T>;
27
+ preTask(descriptionArg: string, functionArg: IPreTaskFunction): void;
28
+ /**
29
+ * A parallel test that will not be waited for before the next starts.
30
+ * @param testDescription - A description of what the test does
31
+ * @param testFunction - A Function that returns a Promise and resolves or rejects
32
+ */
33
+ testParallel(testDescription: string, testFunction: ITestFunction<T>): void;
34
+ /**
35
+ * starts the test evaluation
36
+ */
37
+ start(optionsArg?: {
38
+ throwOnError: boolean;
39
+ }): Promise<void>;
40
+ stopForcefully(codeArg?: number, directArg?: boolean): Promise<void>;
41
+ /**
42
+ * handle errors
43
+ */
44
+ threw(err: Error): void;
45
+ /**
46
+ * Explicitly fail the current test with a custom message
47
+ * @param message - The failure message to display
48
+ */
49
+ fail(message?: string): never;
50
+ }
51
+ export declare let tap: Tap<unknown>;
@@ -0,0 +1,154 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ import { PreTask } from './tapbundle.classes.pretask.js';
3
+ import { TapTest } from './tapbundle.classes.taptest.js';
4
+ export class Tap {
5
+ constructor() {
6
+ /**
7
+ * skips a test
8
+ * tests marked with tap.skip.test() are never executed
9
+ */
10
+ this.skip = {
11
+ test: (descriptionArg, functionArg) => {
12
+ console.log(`skipped test: ${descriptionArg}`);
13
+ },
14
+ testParallel: (descriptionArg, functionArg) => {
15
+ console.log(`skipped test: ${descriptionArg}`);
16
+ },
17
+ };
18
+ /**
19
+ * only executes tests marked as ONLY
20
+ */
21
+ this.only = {
22
+ test: (descriptionArg, testFunctionArg) => {
23
+ this.test(descriptionArg, testFunctionArg, 'only');
24
+ },
25
+ };
26
+ this._tapPreTasks = [];
27
+ this._tapTests = [];
28
+ this._tapTestsOnly = [];
29
+ }
30
+ /**
31
+ * Normal test function, will run one by one
32
+ * @param testDescription - A description of what the test does
33
+ * @param testFunction - A Function that returns a Promise and resolves or rejects
34
+ */
35
+ test(testDescription, testFunction, modeArg = 'normal') {
36
+ const localTest = new TapTest({
37
+ description: testDescription,
38
+ testFunction,
39
+ parallel: false,
40
+ });
41
+ if (modeArg === 'normal') {
42
+ this._tapTests.push(localTest);
43
+ }
44
+ else if (modeArg === 'only') {
45
+ this._tapTestsOnly.push(localTest);
46
+ }
47
+ return localTest;
48
+ }
49
+ preTask(descriptionArg, functionArg) {
50
+ this._tapPreTasks.push(new PreTask(descriptionArg, functionArg));
51
+ }
52
+ /**
53
+ * A parallel test that will not be waited for before the next starts.
54
+ * @param testDescription - A description of what the test does
55
+ * @param testFunction - A Function that returns a Promise and resolves or rejects
56
+ */
57
+ testParallel(testDescription, testFunction) {
58
+ this._tapTests.push(new TapTest({
59
+ description: testDescription,
60
+ testFunction,
61
+ parallel: true,
62
+ }));
63
+ }
64
+ /**
65
+ * starts the test evaluation
66
+ */
67
+ async start(optionsArg) {
68
+ // lets set the tapbundle promise
69
+ const smartenvInstance = new plugins.smartenv.Smartenv();
70
+ smartenvInstance.isBrowser
71
+ ? (globalThis.tapbundleDeferred = plugins.smartpromise.defer())
72
+ : null;
73
+ // lets continue with running the tests
74
+ const promiseArray = [];
75
+ // safeguard against empty test array
76
+ if (this._tapTests.length === 0) {
77
+ console.log('no tests specified. Ending here!');
78
+ // TODO: throw proper error
79
+ return;
80
+ }
81
+ // determine which tests to run
82
+ let concerningTests;
83
+ if (this._tapTestsOnly.length > 0) {
84
+ concerningTests = this._tapTestsOnly;
85
+ }
86
+ else {
87
+ concerningTests = this._tapTests;
88
+ }
89
+ // lets run the pretasks
90
+ for (const preTask of this._tapPreTasks) {
91
+ await preTask.run();
92
+ }
93
+ console.log(`1..${concerningTests.length}`);
94
+ for (let testKey = 0; testKey < concerningTests.length; testKey++) {
95
+ const currentTest = concerningTests[testKey];
96
+ const testPromise = currentTest.run(testKey);
97
+ if (currentTest.parallel) {
98
+ promiseArray.push(testPromise);
99
+ }
100
+ else {
101
+ await testPromise;
102
+ }
103
+ }
104
+ await Promise.all(promiseArray);
105
+ // when tests have been run and all promises are fullfilled
106
+ const failReasons = [];
107
+ const executionNotes = [];
108
+ // collect failed tests
109
+ for (const tapTest of concerningTests) {
110
+ if (tapTest.status !== 'success') {
111
+ failReasons.push(`Test ${tapTest.testKey + 1} failed with status ${tapTest.status}:\n` +
112
+ `|| ${tapTest.description}\n` +
113
+ `|| for more information please take a look the logs above`);
114
+ }
115
+ }
116
+ // render fail Reasons
117
+ for (const failReason of failReasons) {
118
+ console.log(failReason);
119
+ }
120
+ if (optionsArg && optionsArg.throwOnError && failReasons.length > 0) {
121
+ if (!smartenvInstance.isBrowser)
122
+ process.exit(1);
123
+ }
124
+ if (smartenvInstance.isBrowser) {
125
+ globalThis.tapbundleDeferred.resolve();
126
+ }
127
+ }
128
+ async stopForcefully(codeArg = 0, directArg = false) {
129
+ console.log(`tap stopping forcefully! Code: ${codeArg} / Direct: ${directArg}`);
130
+ if (directArg) {
131
+ process.exit(codeArg);
132
+ }
133
+ else {
134
+ setTimeout(() => {
135
+ process.exit(codeArg);
136
+ }, 10);
137
+ }
138
+ }
139
+ /**
140
+ * handle errors
141
+ */
142
+ threw(err) {
143
+ console.log(err);
144
+ }
145
+ /**
146
+ * Explicitly fail the current test with a custom message
147
+ * @param message - The failure message to display
148
+ */
149
+ fail(message = 'Test failed') {
150
+ throw new Error(message);
151
+ }
152
+ }
153
+ export let tap = new Tap();
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdGFwYnVuZGxlL3RhcGJ1bmRsZS5jbGFzc2VzLnRhcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHdCQUF3QixDQUFDO0FBRWxELE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBc0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RSxNQUFNLE9BQU8sR0FBRztJQUFoQjtRQUNFOzs7V0FHRztRQUNJLFNBQUksR0FBRztZQUNaLElBQUksRUFBRSxDQUFDLGNBQXNCLEVBQUUsV0FBNkIsRUFBRSxFQUFFO2dCQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFDRCxZQUFZLEVBQUUsQ0FBQyxjQUFzQixFQUFFLFdBQTZCLEVBQUUsRUFBRTtnQkFDdEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUNqRCxDQUFDO1NBQ0YsQ0FBQztRQUVGOztXQUVHO1FBQ0ksU0FBSSxHQUFHO1lBQ1osSUFBSSxFQUFFLENBQUMsY0FBc0IsRUFBRSxlQUFpQyxFQUFFLEVBQUU7Z0JBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNyRCxDQUFDO1NBQ0YsQ0FBQztRQUVNLGlCQUFZLEdBQWMsRUFBRSxDQUFDO1FBQzdCLGNBQVMsR0FBbUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztJQTZJN0MsQ0FBQztJQTNJQzs7OztPQUlHO0lBQ0ksSUFBSSxDQUNULGVBQXVCLEVBQ3ZCLFlBQThCLEVBQzlCLFVBQXNDLFFBQVE7UUFFOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxPQUFPLENB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
@@ -0,0 +1,32 @@
1
+ import { TapTools } from './tapbundle.classes.taptools.js';
2
+ import { HrtMeasurement } from '@push.rocks/smarttime';
3
+ export type TTestStatus = 'success' | 'error' | 'pending' | 'errorAfterSuccess' | 'timeout';
4
+ export interface ITestFunction<T> {
5
+ (tapTools?: TapTools): Promise<T>;
6
+ }
7
+ export declare class TapTest<T = unknown> {
8
+ description: string;
9
+ failureAllowed: boolean;
10
+ hrtMeasurement: HrtMeasurement;
11
+ parallel: boolean;
12
+ status: TTestStatus;
13
+ tapTools: TapTools;
14
+ testFunction: ITestFunction<T>;
15
+ testKey: number;
16
+ private testDeferred;
17
+ testPromise: Promise<TapTest<T>>;
18
+ private testResultDeferred;
19
+ testResultPromise: Promise<T>;
20
+ /**
21
+ * constructor
22
+ */
23
+ constructor(optionsArg: {
24
+ description: string;
25
+ testFunction: ITestFunction<T>;
26
+ parallel: boolean;
27
+ });
28
+ /**
29
+ * run the test
30
+ */
31
+ run(testKeyArg: number): Promise<void>;
32
+ }
@@ -0,0 +1,62 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ import { tapCreator } from './tapbundle.tapcreator.js';
3
+ import { TapTools } from './tapbundle.classes.taptools.js';
4
+ // imported interfaces
5
+ import { Deferred } from '@push.rocks/smartpromise';
6
+ import { HrtMeasurement } from '@push.rocks/smarttime';
7
+ export class TapTest {
8
+ /**
9
+ * constructor
10
+ */
11
+ constructor(optionsArg) {
12
+ this.testDeferred = plugins.smartpromise.defer();
13
+ this.testPromise = this.testDeferred.promise;
14
+ this.testResultDeferred = plugins.smartpromise.defer();
15
+ this.testResultPromise = this.testResultDeferred.promise;
16
+ this.description = optionsArg.description;
17
+ this.hrtMeasurement = new HrtMeasurement();
18
+ this.parallel = optionsArg.parallel;
19
+ this.status = 'pending';
20
+ this.tapTools = new TapTools(this);
21
+ this.testFunction = optionsArg.testFunction;
22
+ }
23
+ /**
24
+ * run the test
25
+ */
26
+ async run(testKeyArg) {
27
+ this.hrtMeasurement.start();
28
+ this.testKey = testKeyArg;
29
+ const testNumber = testKeyArg + 1;
30
+ try {
31
+ const testReturnValue = await this.testFunction(this.tapTools);
32
+ if (this.status === 'timeout') {
33
+ throw new Error('Test succeeded, but timed out...');
34
+ }
35
+ this.hrtMeasurement.stop();
36
+ console.log(`ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`);
37
+ this.status = 'success';
38
+ this.testDeferred.resolve(this);
39
+ this.testResultDeferred.resolve(testReturnValue);
40
+ }
41
+ catch (err) {
42
+ this.hrtMeasurement.stop();
43
+ console.log(`not ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`);
44
+ this.testDeferred.resolve(this);
45
+ this.testResultDeferred.resolve(err);
46
+ // if the test has already succeeded before
47
+ if (this.status === 'success') {
48
+ this.status = 'errorAfterSuccess';
49
+ console.log('!!! ALERT !!!: weird behaviour, since test has been already successfull');
50
+ }
51
+ else {
52
+ this.status = 'error';
53
+ }
54
+ // if the test is allowed to fail
55
+ if (this.failureAllowed) {
56
+ console.log(`please note: failure allowed!`);
57
+ }
58
+ console.log(err);
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUuY2xhc3Nlcy50YXB0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUUzRCxzQkFBc0I7QUFDdEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVN2RCxNQUFNLE9BQU8sT0FBTztJQWFsQjs7T0FFRztJQUNILFlBQVksVUFJWDtRQVhPLGlCQUFZLEdBQXlCLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkUsZ0JBQVcsR0FBd0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDNUQsdUJBQWtCLEdBQWdCLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEUsc0JBQWlCLEdBQWUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztRQVNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQWtCO1FBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUM7WUFDSCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9ELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxVQUFVLE1BQU0sSUFBSSxDQUFDLFdBQVcsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksSUFBSSxDQUN0RixDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsVUFBVSxVQUFVLE1BQU0sSUFBSSxDQUFDLFdBQVcsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksSUFBSSxDQUMxRixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVyQywyQ0FBMkM7WUFDM0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDO2dCQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7WUFDekYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLENBQUM7WUFFRCxpQ0FBaUM7WUFDakMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
@@ -0,0 +1,27 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ import { TapTest } from './tapbundle.classes.taptest.js';
3
+ export interface IPromiseFunc {
4
+ (): Promise<any>;
5
+ }
6
+ export declare class TapTools {
7
+ /**
8
+ * the referenced TapTest
9
+ */
10
+ private _tapTest;
11
+ constructor(TapTestArg: TapTest<any>);
12
+ /**
13
+ * allow failure
14
+ */
15
+ allowFailure(): void;
16
+ /**
17
+ * async/await delay method
18
+ */
19
+ delayFor(timeMilliArg: number): Promise<void>;
20
+ delayForRandom(timeMilliMinArg: number, timeMilliMaxArg: number): Promise<void>;
21
+ coloredString(...args: Parameters<typeof plugins.consolecolor.coloredString>): Promise<string>;
22
+ timeout(timeMilliArg: number): Promise<void>;
23
+ returnError(throwingFuncArg: IPromiseFunc): Promise<Error>;
24
+ defer(): plugins.smartpromise.Deferred<unknown>;
25
+ cumulativeDefer(): plugins.smartpromise.CumulativeDeferred;
26
+ smartjson: typeof plugins.smartjson;
27
+ }
@@ -0,0 +1,51 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ import { TapTest } from './tapbundle.classes.taptest.js';
3
+ export class TapTools {
4
+ constructor(TapTestArg) {
5
+ this.smartjson = plugins.smartjson;
6
+ this._tapTest = TapTestArg;
7
+ }
8
+ /**
9
+ * allow failure
10
+ */
11
+ allowFailure() {
12
+ this._tapTest.failureAllowed = true;
13
+ }
14
+ /**
15
+ * async/await delay method
16
+ */
17
+ async delayFor(timeMilliArg) {
18
+ await plugins.smartdelay.delayFor(timeMilliArg);
19
+ }
20
+ async delayForRandom(timeMilliMinArg, timeMilliMaxArg) {
21
+ await plugins.smartdelay.delayForRandom(timeMilliMinArg, timeMilliMaxArg);
22
+ }
23
+ async coloredString(...args) {
24
+ return plugins.consolecolor.coloredString(...args);
25
+ }
26
+ async timeout(timeMilliArg) {
27
+ const timeout = new plugins.smartdelay.Timeout(timeMilliArg);
28
+ timeout.makeUnrefed();
29
+ await timeout.promise;
30
+ if (this._tapTest.status === 'pending') {
31
+ this._tapTest.status = 'timeout';
32
+ }
33
+ }
34
+ async returnError(throwingFuncArg) {
35
+ let funcErr;
36
+ try {
37
+ await throwingFuncArg();
38
+ }
39
+ catch (err) {
40
+ funcErr = err;
41
+ }
42
+ return funcErr;
43
+ }
44
+ defer() {
45
+ return plugins.smartpromise.defer();
46
+ }
47
+ cumulativeDefer() {
48
+ return plugins.smartpromise.cumulativeDefer();
49
+ }
50
+ }
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGUvdGFwYnVuZGxlLmNsYXNzZXMudGFwdG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFNekQsTUFBTSxPQUFPLFFBQVE7SUFNbkIsWUFBWSxVQUF3QjtRQXFEN0IsY0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFwRG5DLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVk7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBb0I7UUFDeEMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxlQUF1QixFQUFFLGVBQXVCO1FBQzFFLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBMkQ7UUFDdkYsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQW9CO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsZUFBNkI7UUFDcEQsSUFBSSxPQUFjLENBQUM7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxlQUFlLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sS0FBSztRQUNWLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDaEQsQ0FBQztDQUdGIn0=
@@ -0,0 +1,8 @@
1
+ export interface ITapWrapOptions {
2
+ before: () => Promise<any>;
3
+ after: () => {};
4
+ }
5
+ export declare class TapWrap {
6
+ options: ITapWrapOptions;
7
+ constructor(optionsArg: ITapWrapOptions);
8
+ }
@@ -0,0 +1,7 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ export class TapWrap {
3
+ constructor(optionsArg) {
4
+ this.options = optionsArg;
5
+ }
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwd3JhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS90YXBidW5kbGUuY2xhc3Nlcy50YXB3cmFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFPbEQsTUFBTSxPQUFPLE9BQU87SUFFbEIsWUFBWSxVQUEyQjtRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM1QixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,7 @@
1
+ import * as consolecolor from '@push.rocks/consolecolor';
2
+ import * as smartdelay from '@push.rocks/smartdelay';
3
+ import * as smartenv from '@push.rocks/smartenv';
4
+ import * as smartexpect from '@push.rocks/smartexpect';
5
+ import * as smartjson from '@push.rocks/smartjson';
6
+ import * as smartpromise from '@push.rocks/smartpromise';
7
+ export { consolecolor, smartdelay, smartenv, smartexpect, smartjson, smartpromise };
@@ -0,0 +1,9 @@
1
+ // pushrocks
2
+ import * as consolecolor from '@push.rocks/consolecolor';
3
+ import * as smartdelay from '@push.rocks/smartdelay';
4
+ import * as smartenv from '@push.rocks/smartenv';
5
+ import * as smartexpect from '@push.rocks/smartexpect';
6
+ import * as smartjson from '@push.rocks/smartjson';
7
+ import * as smartpromise from '@push.rocks/smartpromise';
8
+ export { consolecolor, smartdelay, smartenv, smartexpect, smartjson, smartpromise };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGUvdGFwYnVuZGxlLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDIn0=
@@ -0,0 +1,3 @@
1
+ export declare class TapCreator {
2
+ }
3
+ export declare let tapCreator: TapCreator;
@@ -0,0 +1,5 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ export class TapCreator {
3
+ }
4
+ export let tapCreator = new TapCreator();
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLnRhcGNyZWF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGUvdGFwYnVuZGxlLnRhcGNyZWF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUVsRCxNQUFNLE9BQU8sVUFBVTtDQUV0QjtBQUVELE1BQU0sQ0FBQyxJQUFJLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDIn0=
@@ -0,0 +1,7 @@
1
+ declare class WebHelpers {
2
+ html: any;
3
+ fixture: any;
4
+ constructor();
5
+ }
6
+ export declare const webhelpers: WebHelpers;
7
+ export {};
@@ -0,0 +1,35 @@
1
+ import * as plugins from './tapbundle.plugins.js';
2
+ import { tap } from './tapbundle.classes.tap.js';
3
+ class WebHelpers {
4
+ constructor() {
5
+ const smartenv = new plugins.smartenv.Smartenv();
6
+ // Initialize HTML template tag function
7
+ this.html = (strings, ...values) => {
8
+ let result = '';
9
+ for (let i = 0; i < strings.length; i++) {
10
+ result += strings[i];
11
+ if (i < values.length) {
12
+ result += values[i];
13
+ }
14
+ }
15
+ return result;
16
+ };
17
+ // Initialize fixture function based on environment
18
+ if (smartenv.isBrowser) {
19
+ this.fixture = async (htmlString) => {
20
+ const container = document.createElement('div');
21
+ container.innerHTML = htmlString.trim();
22
+ const element = container.firstChild;
23
+ return element;
24
+ };
25
+ }
26
+ else {
27
+ // Node.js environment - provide a stub or alternative implementation
28
+ this.fixture = async (htmlString) => {
29
+ throw new Error('WebHelpers.fixture is only available in browser environment');
30
+ };
31
+ }
32
+ }
33
+ }
34
+ export const webhelpers = new WebHelpers();
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZS93ZWJoZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWpELE1BQU0sVUFBVTtJQUlkO1FBQ0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpELHdDQUF3QztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBNkIsRUFBRSxHQUFHLE1BQWEsRUFBRSxFQUFFO1lBQzlELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDO1FBRUYsbURBQW1EO1FBQ25ELElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxFQUFFLFVBQWtCLEVBQXdCLEVBQUU7Z0JBQ2hFLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hELFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBeUIsQ0FBQztnQkFDcEQsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQyxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixxRUFBcUU7WUFDckUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsVUFBa0IsRUFBZ0IsRUFBRTtnQkFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1lBQ2pGLENBQUMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQyJ9
@@ -0,0 +1,25 @@
1
+ import { TestFileProvider } from './classes.testfileprovider.js';
2
+ import * as plugins from './plugins.js';
3
+ declare class TapNodeTools {
4
+ private smartshellInstance;
5
+ testFileProvider: TestFileProvider;
6
+ constructor();
7
+ private qenv;
8
+ getQenv(): Promise<plugins.qenv.Qenv>;
9
+ getEnvVarOnDemand(envVarNameArg: string): Promise<string>;
10
+ runCommand(commandArg: string): Promise<any>;
11
+ createHttpsCert(commonName?: string, allowSelfSigned?: boolean): Promise<{
12
+ key: string;
13
+ cert: string;
14
+ }>;
15
+ /**
16
+ * create and return a smartmongo instance
17
+ */
18
+ createSmartmongo(): Promise<import("@push.rocks/smartmongo").SmartMongo>;
19
+ /**
20
+ * create and return a smarts3 instance
21
+ */
22
+ createSmarts3(): Promise<import("@push.rocks/smarts3").Smarts3>;
23
+ }
24
+ export declare const tapNodeTools: TapNodeTools;
25
+ export {};
@@ -0,0 +1,81 @@
1
+ import { TestFileProvider } from './classes.testfileprovider.js';
2
+ import * as plugins from './plugins.js';
3
+ class TapNodeTools {
4
+ constructor() {
5
+ this.testFileProvider = new TestFileProvider();
6
+ }
7
+ async getQenv() {
8
+ this.qenv = this.qenv || new plugins.qenv.Qenv('./', '.nogit/');
9
+ return this.qenv;
10
+ }
11
+ async getEnvVarOnDemand(envVarNameArg) {
12
+ const qenv = await this.getQenv();
13
+ return qenv.getEnvVarOnDemand(envVarNameArg);
14
+ }
15
+ async runCommand(commandArg) {
16
+ if (!this.smartshellInstance) {
17
+ this.smartshellInstance = new plugins.smartshell.Smartshell({
18
+ executor: 'bash',
19
+ });
20
+ }
21
+ const result = await this.smartshellInstance.exec(commandArg);
22
+ return result;
23
+ }
24
+ async createHttpsCert(commonName = 'localhost', allowSelfSigned = true) {
25
+ if (allowSelfSigned) {
26
+ // set node to allow self-signed certificates
27
+ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
28
+ }
29
+ // Generate a key pair
30
+ const keys = plugins.smartcrypto.nodeForge.pki.rsa.generateKeyPair(2048);
31
+ // Create a self-signed certificate
32
+ const cert = plugins.smartcrypto.nodeForge.pki.createCertificate();
33
+ cert.publicKey = keys.publicKey;
34
+ cert.serialNumber = '01';
35
+ cert.validity.notBefore = new Date();
36
+ cert.validity.notAfter = new Date();
37
+ cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);
38
+ const attrs = [
39
+ { name: 'commonName', value: commonName },
40
+ { name: 'countryName', value: 'US' },
41
+ { shortName: 'ST', value: 'California' },
42
+ { name: 'localityName', value: 'San Francisco' },
43
+ { name: 'organizationName', value: 'My Company' },
44
+ { shortName: 'OU', value: 'Dev' },
45
+ ];
46
+ cert.setSubject(attrs);
47
+ cert.setIssuer(attrs);
48
+ // Sign the certificate with its own private key (self-signed)
49
+ cert.sign(keys.privateKey, plugins.smartcrypto.nodeForge.md.sha256.create());
50
+ // PEM encode the private key and certificate
51
+ const pemKey = plugins.smartcrypto.nodeForge.pki.privateKeyToPem(keys.privateKey);
52
+ const pemCert = plugins.smartcrypto.nodeForge.pki.certificateToPem(cert);
53
+ return {
54
+ key: pemKey,
55
+ cert: pemCert,
56
+ };
57
+ }
58
+ /**
59
+ * create and return a smartmongo instance
60
+ */
61
+ async createSmartmongo() {
62
+ const smartmongoMod = await import('@push.rocks/smartmongo');
63
+ const smartmongoInstance = new smartmongoMod.SmartMongo();
64
+ await smartmongoInstance.start();
65
+ return smartmongoInstance;
66
+ }
67
+ /**
68
+ * create and return a smarts3 instance
69
+ */
70
+ async createSmarts3() {
71
+ const smarts3Mod = await import('@push.rocks/smarts3');
72
+ const smarts3Instance = new smarts3Mod.Smarts3({
73
+ port: 3003,
74
+ cleanSlate: true,
75
+ });
76
+ await smarts3Instance.start();
77
+ return smarts3Instance;
78
+ }
79
+ }
80
+ export const tapNodeTools = new TapNodeTools();
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXBub2RldG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGVfbm9kZS9jbGFzc2VzLnRhcG5vZGV0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLFlBQVk7SUFJaEI7UUFGTyxxQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7SUFFbEMsQ0FBQztJQUdULEtBQUssQ0FBQyxPQUFPO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxhQUFxQjtRQUNsRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFrQjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFELFFBQVEsRUFBRSxNQUFNO2FBQ2pCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVN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
@@ -0,0 +1,6 @@
1
+ export declare const fileUrls: {
2
+ dockerAlpineImage: string;
3
+ };
4
+ export declare class TestFileProvider {
5
+ getDockerAlpineImageAsLocalTarball(): Promise<string>;
6
+ }
@@ -0,0 +1,16 @@
1
+ import * as plugins from './plugins.js';
2
+ import * as paths from './paths.js';
3
+ export const fileUrls = {
4
+ dockerAlpineImage: 'https://code.foss.global/testassets/docker/raw/branch/main/alpine.tar',
5
+ };
6
+ export class TestFileProvider {
7
+ async getDockerAlpineImageAsLocalTarball() {
8
+ const filePath = plugins.path.join(paths.testFilesDir, 'alpine.tar');
9
+ // fetch the docker alpine image
10
+ const response = await plugins.smartrequest.getBinary(fileUrls.dockerAlpineImage);
11
+ await plugins.smartfile.fs.ensureDir(paths.testFilesDir);
12
+ await plugins.smartfile.memory.toFs(response.body, filePath);
13
+ return filePath;
14
+ }
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50ZXN0ZmlsZXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdGFwYnVuZGxlX25vZGUvY2xhc3Nlcy50ZXN0ZmlsZXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRztJQUN0QixpQkFBaUIsRUFBRSx1RUFBdUU7Q0FDM0YsQ0FBQTtBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFDcEIsS0FBSyxDQUFDLGtDQUFrQztRQUM3QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQ3BFLGdDQUFnQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ export * from './classes.tapnodetools.js';
@@ -0,0 +1,2 @@
1
+ export * from './classes.tapnodetools.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGVfbm9kZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDJCQUEyQixDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ export declare const cwd: string;
2
+ export declare const testFilesDir: string;
@@ -0,0 +1,4 @@
1
+ import * as plugins from './plugins.js';
2
+ export const cwd = process.cwd();
3
+ export const testFilesDir = plugins.path.join(cwd, './.nogit/testfiles/');
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGVfbm9kZS9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUMsQ0FBQyJ9
@@ -0,0 +1,11 @@
1
+ import * as crypto from 'crypto';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ export { crypto, fs, path, };
5
+ import * as qenv from '@push.rocks/qenv';
6
+ import * as smartcrypto from '@push.rocks/smartcrypto';
7
+ import * as smartfile from '@push.rocks/smartfile';
8
+ import * as smartpath from '@push.rocks/smartpath';
9
+ import * as smartrequest from '@push.rocks/smartrequest';
10
+ import * as smartshell from '@push.rocks/smartshell';
11
+ export { qenv, smartcrypto, smartfile, smartpath, smartrequest, smartshell, };
@@ -0,0 +1,14 @@
1
+ // node native
2
+ import * as crypto from 'crypto';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ export { crypto, fs, path, };
6
+ // @push.rocks scope
7
+ import * as qenv from '@push.rocks/qenv';
8
+ import * as smartcrypto from '@push.rocks/smartcrypto';
9
+ import * as smartfile from '@push.rocks/smartfile';
10
+ import * as smartpath from '@push.rocks/smartpath';
11
+ import * as smartrequest from '@push.rocks/smartrequest';
12
+ import * as smartshell from '@push.rocks/smartshell';
13
+ export { qenv, smartcrypto, smartfile, smartpath, smartrequest, smartshell, };
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZV9ub2RlL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxNQUFNLEVBQUMsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDO0FBRTVCLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssSUFBSSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEdBQUcsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@git.zone/tstest",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "private": false,
5
5
  "description": "a test utility to run tests that match test/**/*.ts",
6
6
  "main": "dist_ts/index.js",
@@ -20,13 +20,22 @@
20
20
  "@git.zone/tsbundle": "^2.2.5",
21
21
  "@git.zone/tsrun": "^1.3.3",
22
22
  "@push.rocks/consolecolor": "^2.0.2",
23
+ "@push.rocks/qenv": "^6.1.0",
23
24
  "@push.rocks/smartbrowser": "^2.0.8",
25
+ "@push.rocks/smartcrypto": "^2.0.4",
24
26
  "@push.rocks/smartdelay": "^3.0.5",
27
+ "@push.rocks/smartenv": "^5.0.12",
28
+ "@push.rocks/smartexpect": "^2.4.2",
25
29
  "@push.rocks/smartfile": "^11.2.0",
26
- "@push.rocks/smartlog": "^3.0.9",
30
+ "@push.rocks/smartjson": "^5.0.20",
31
+ "@push.rocks/smartlog": "^3.1.1",
32
+ "@push.rocks/smartmongo": "^2.0.12",
33
+ "@push.rocks/smartpath": "^5.0.18",
27
34
  "@push.rocks/smartpromise": "^4.2.3",
35
+ "@push.rocks/smartrequest": "^2.1.0",
36
+ "@push.rocks/smarts3": "^2.2.5",
28
37
  "@push.rocks/smartshell": "^3.2.3",
29
- "@push.rocks/tapbundle": "^6.0.3",
38
+ "@push.rocks/smarttime": "^4.1.1",
30
39
  "@types/ws": "^8.18.1",
31
40
  "figures": "^6.1.0",
32
41
  "ws": "^8.18.2"
@@ -47,11 +56,12 @@
47
56
  "last 1 chrome versions"
48
57
  ],
49
58
  "scripts": {
50
- "test": "(npm run cleanUp && npm run prepareTest && npm run tstest)",
51
- "prepareTest": "git clone https://gitlab.com/sandboxzone/sandbox-npmts.git .nogit/sandbox-npmts && cd .nogit/sandbox-npmts && npm install",
52
- "tstest": "cd .nogit/sandbox-npmts && node ../../cli.ts.js test/ --web",
53
- "cleanUp": "rm -rf .nogit/sandbox-npmts",
54
- "build": "(tsbuild --web --allowimplicitany --skiplibcheck)",
59
+ "test": "pnpm run build && pnpm run test:tapbundle && pnpm run test:tstest",
60
+ "test:tapbundle": "tsx ./cli.child.ts test/tapbundle/**/*.ts",
61
+ "test:tapbundle:verbose": "tsx ./cli.child.ts test/tapbundle/**/*.ts --verbose",
62
+ "test:tstest": "tsx ./cli.child.ts test/tstest/**/*.ts",
63
+ "test:tstest:verbose": "tsx ./cli.child.ts test/tstest/**/*.ts --verbose",
64
+ "build": "(tsbuild tsfolders)",
55
65
  "buildDocs": "tsdoc"
56
66
  }
57
67
  }
package/readme.hints.md CHANGED
@@ -0,0 +1,62 @@
1
+ # Architecture Overview
2
+
3
+ ## Project Structure
4
+
5
+ This project integrates tstest with tapbundle through a modular architecture:
6
+
7
+ 1. **tstest** (`/ts/`) - The test runner that discovers and executes test files
8
+ 2. **tapbundle** (`/ts_tapbundle/`) - The TAP testing framework for writing tests
9
+ 3. **tapbundle_node** (`/ts_tapbundle_node/`) - Node.js-specific testing utilities
10
+
11
+ ## How Components Work Together
12
+
13
+ ### Test Execution Flow
14
+
15
+ 1. **CLI Entry Point** (`cli.js` � `cli.ts.js` � `cli.child.ts`)
16
+ - The CLI uses tsx to run TypeScript files directly
17
+ - Accepts glob patterns to find test files
18
+ - Supports options like `--verbose`, `--quiet`, `--web`
19
+
20
+ 2. **Test Discovery**
21
+ - tstest scans for test files matching the provided pattern
22
+ - Defaults to `test/**/*.ts` when no pattern is specified
23
+ - Supports both file and directory modes
24
+
25
+ 3. **Test Runner**
26
+ - Each test file imports `tap` and `expect` from tapbundle
27
+ - Tests are written using `tap.test()` with async functions
28
+ - Browser tests are compiled with esbuild and run in Chromium via Puppeteer
29
+
30
+ ### Key Integration Points
31
+
32
+ 1. **Import Structure**
33
+ - Test files import from local tapbundle: `import { tap, expect } from '../../ts_tapbundle/index.js'`
34
+ - Node-specific tests also import from tapbundle_node: `import { tapNodeTools } from '../../ts_tapbundle_node/index.js'`
35
+
36
+ 2. **WebHelpers**
37
+ - Browser tests can use webhelpers for DOM manipulation
38
+ - `webhelpers.html` - Template literal for creating HTML strings
39
+ - `webhelpers.fixture` - Creates DOM elements from HTML strings
40
+ - Automatically detects browser environment and only enables in browser context
41
+
42
+ 3. **Build System**
43
+ - Uses `tsbuild tsfolders` to compile TypeScript
44
+ - Maintains separate output directories: `/dist_ts/`, `/dist_ts_tapbundle/`, `/dist_ts_tapbundle_node/`
45
+ - Compilation order is resolved automatically based on dependencies
46
+
47
+ ### Test Scripts
48
+
49
+ The package.json defines several test scripts:
50
+ - `test` - Builds and runs all tests (tapbundle and tstest)
51
+ - `test:tapbundle` - Runs tapbundle framework tests
52
+ - `test:tstest` - Runs tstest's own tests
53
+ - Both support `:verbose` variants for detailed output
54
+
55
+ ### Environment Detection
56
+
57
+ The framework automatically detects the runtime environment:
58
+ - Node.js tests run directly via tsx
59
+ - Browser tests are compiled and served via a local server
60
+ - WebHelpers are only enabled in browser environment
61
+
62
+ This architecture allows for seamless testing across both Node.js and browser environments while maintaining a clean separation of concerns.
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tstest',
6
- version: '1.4.0',
6
+ version: '1.5.0',
7
7
  description: 'a test utility to run tests that match test/**/*.ts'
8
8
  }
@@ -0,0 +1,3 @@
1
+ {
2
+ "order": 2
3
+ }
@@ -18,7 +18,7 @@ import * as smartfile from '@push.rocks/smartfile';
18
18
  import * as smartlog from '@push.rocks/smartlog';
19
19
  import * as smartpromise from '@push.rocks/smartpromise';
20
20
  import * as smartshell from '@push.rocks/smartshell';
21
- import * as tapbundle from '@push.rocks/tapbundle';
21
+ import * as tapbundle from '../dist_ts_tapbundle/index.js';
22
22
 
23
23
  export {
24
24
  consolecolor,