@git.zone/tstest 5.0.0 → 6.1.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.
- package/.smartconfig.json +5 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +3 -0
- package/dist_ts/index.js +34 -1
- package/dist_ts/tstest.classes.artifacts.d.ts +32 -0
- package/dist_ts/tstest.classes.artifacts.js +144 -0
- package/dist_ts/tstest.classes.beforescripts.d.ts +3 -1
- package/dist_ts/tstest.classes.beforescripts.js +18 -4
- package/dist_ts/tstest.classes.config.d.ts +11 -0
- package/dist_ts/tstest.classes.config.js +21 -0
- package/dist_ts/tstest.classes.tstest.js +12 -1
- package/dist_ts/tstest.interfaces.config.d.ts +51 -0
- package/dist_ts/tstest.interfaces.config.js +7 -0
- package/dist_ts/tstest.plugins.d.ts +2 -1
- package/dist_ts/tstest.plugins.js +3 -2
- package/dist_ts_tapbundle_serverside/classes.tapnodetools.d.ts +2 -2
- package/dist_ts_tapbundle_serverside/classes.tapnodetools.js +10 -10
- package/dist_ts_tapbundle_serverside/plugins.d.ts +1 -0
- package/dist_ts_tapbundle_serverside/plugins.js +3 -1
- package/package.json +9 -6
- package/readme.md +80 -4
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +51 -0
- package/ts/tstest.classes.artifacts.ts +173 -0
- package/ts/tstest.classes.beforescripts.ts +15 -3
- package/ts/tstest.classes.config.ts +25 -0
- package/ts/tstest.classes.tstest.ts +12 -0
- package/ts/tstest.interfaces.config.ts +55 -0
- package/ts/tstest.plugins.ts +2 -0
|
@@ -4,6 +4,7 @@ import * as url from 'node:url';
|
|
|
4
4
|
export { fs, path, url };
|
|
5
5
|
import * as consolecolor from '@push.rocks/consolecolor';
|
|
6
6
|
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
7
|
+
import * as smartconfig from '@push.rocks/smartconfig';
|
|
7
8
|
import * as smartserve from '@push.rocks/smartserve';
|
|
8
9
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
9
10
|
import * as smartfile from '@push.rocks/smartfile';
|
|
@@ -15,7 +16,7 @@ import * as smartpromise from '@push.rocks/smartpromise';
|
|
|
15
16
|
import * as smartshell from '@push.rocks/smartshell';
|
|
16
17
|
import * as smartwatch from '@push.rocks/smartwatch';
|
|
17
18
|
import * as tapbundle from '../dist_ts_tapbundle/index.js';
|
|
18
|
-
export { consolecolor, smartbrowser, smartserve, smartdelay, smartfile, smartfs, smartfsInstance, smartlog, smartnetwork, smartpromise, smartshell, smartwatch, tapbundle, };
|
|
19
|
+
export { consolecolor, smartbrowser, smartconfig, smartserve, smartdelay, smartfile, smartfs, smartfsInstance, smartlog, smartnetwork, smartpromise, smartshell, smartwatch, tapbundle, };
|
|
19
20
|
import * as tsbundle from '@git.zone/tsbundle';
|
|
20
21
|
import * as tsrun from '@git.zone/tsrun';
|
|
21
22
|
export { tsbundle, tsrun };
|
|
@@ -6,6 +6,7 @@ export { fs, path, url };
|
|
|
6
6
|
// @push.rocks scope
|
|
7
7
|
import * as consolecolor from '@push.rocks/consolecolor';
|
|
8
8
|
import * as smartbrowser from '@push.rocks/smartbrowser';
|
|
9
|
+
import * as smartconfig from '@push.rocks/smartconfig';
|
|
9
10
|
import * as smartserve from '@push.rocks/smartserve';
|
|
10
11
|
import * as smartdelay from '@push.rocks/smartdelay';
|
|
11
12
|
import * as smartfile from '@push.rocks/smartfile';
|
|
@@ -17,7 +18,7 @@ import * as smartpromise from '@push.rocks/smartpromise';
|
|
|
17
18
|
import * as smartshell from '@push.rocks/smartshell';
|
|
18
19
|
import * as smartwatch from '@push.rocks/smartwatch';
|
|
19
20
|
import * as tapbundle from '../dist_ts_tapbundle/index.js';
|
|
20
|
-
export { consolecolor, smartbrowser, smartserve, smartdelay, smartfile, smartfs, smartfsInstance, smartlog, smartnetwork, smartpromise, smartshell, smartwatch, tapbundle, };
|
|
21
|
+
export { consolecolor, smartbrowser, smartconfig, smartserve, smartdelay, smartfile, smartfs, smartfsInstance, smartlog, smartnetwork, smartpromise, smartshell, smartwatch, tapbundle, };
|
|
21
22
|
// @git.zone scope
|
|
22
23
|
import * as tsbundle from '@git.zone/tsbundle';
|
|
23
24
|
import * as tsrun from '@git.zone/tsrun';
|
|
@@ -28,4 +29,4 @@ export { figures };
|
|
|
28
29
|
// third party
|
|
29
30
|
import * as ws from 'ws';
|
|
30
31
|
export { ws };
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN0ZXN0LnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c3Rlc3QucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBQ2QsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFekIsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztBQUMvRSxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFNBQVMsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFlBQVksRUFDWixXQUFXLEVBQ1gsVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLGVBQWUsRUFDZixRQUFRLEVBQ1IsWUFBWSxFQUNaLFlBQVksRUFDWixVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsR0FDVixDQUFDO0FBRUYsa0JBQWtCO0FBQ2xCLE9BQU8sS0FBSyxRQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxLQUFLLEtBQUssTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBRTNCLGVBQWU7QUFDZixPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFFOUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBRW5CLGNBQWM7QUFDZCxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUV6QixPQUFPLEVBQ0wsRUFBRSxFQUNILENBQUEifQ==
|
|
@@ -24,10 +24,10 @@ export declare class TapNodeTools {
|
|
|
24
24
|
*/
|
|
25
25
|
createSmartmongo(): Promise<import("@push.rocks/smartmongo").SmartMongo>;
|
|
26
26
|
/**
|
|
27
|
-
* Create a standalone
|
|
27
|
+
* Create a standalone ObjectStorage 10 instance in a private temporary root.
|
|
28
28
|
* Callers may stop it early; helper cleanup joins shutdown and removes its root.
|
|
29
29
|
*/
|
|
30
|
-
|
|
30
|
+
createObjectStorage(): Promise<import("@lossless.org/objectstorage").ObjectStorage>;
|
|
31
31
|
private getSmartNetwork;
|
|
32
32
|
/**
|
|
33
33
|
* Find a single free port on the local machine.
|
|
@@ -68,20 +68,20 @@ export class TapNodeTools {
|
|
|
68
68
|
return smartmongoInstance;
|
|
69
69
|
}
|
|
70
70
|
/**
|
|
71
|
-
* Create a standalone
|
|
71
|
+
* Create a standalone ObjectStorage 10 instance in a private temporary root.
|
|
72
72
|
* Callers may stop it early; helper cleanup joins shutdown and removes its root.
|
|
73
73
|
*/
|
|
74
|
-
async
|
|
74
|
+
async createObjectStorage() {
|
|
75
75
|
if (this.cleanupPromise) {
|
|
76
76
|
throw new Error('Cannot create storage while helper cleanup is running.');
|
|
77
77
|
}
|
|
78
78
|
const creation = (async () => {
|
|
79
|
-
const
|
|
79
|
+
const objectstorageMod = await plugins.loadObjectStorage();
|
|
80
80
|
const port = await this.findFreePort({ startPort: 3003 });
|
|
81
|
-
const directory = await plugins.fs.promises.mkdtemp(plugins.path.join(plugins.os.tmpdir(), 'tstest-
|
|
82
|
-
let
|
|
81
|
+
const directory = await plugins.fs.promises.mkdtemp(plugins.path.join(plugins.os.tmpdir(), 'tstest-objectstorage-'));
|
|
82
|
+
let objectstorageInstance;
|
|
83
83
|
try {
|
|
84
|
-
|
|
84
|
+
objectstorageInstance = new objectstorageMod.ObjectStorage({
|
|
85
85
|
server: { port },
|
|
86
86
|
storage: { directory, cleanSlate: true },
|
|
87
87
|
});
|
|
@@ -91,14 +91,14 @@ export class TapNodeTools {
|
|
|
91
91
|
throw constructorError;
|
|
92
92
|
}
|
|
93
93
|
const cleanup = async () => {
|
|
94
|
-
await
|
|
94
|
+
await objectstorageInstance.stop();
|
|
95
95
|
await plugins.fs.promises.rm(directory, { recursive: true, force: true });
|
|
96
96
|
this.storageCleanups.delete(cleanup);
|
|
97
97
|
};
|
|
98
98
|
this.storageCleanups.add(cleanup);
|
|
99
99
|
try {
|
|
100
|
-
await
|
|
101
|
-
return
|
|
100
|
+
await objectstorageInstance.start();
|
|
101
|
+
return objectstorageInstance;
|
|
102
102
|
}
|
|
103
103
|
catch (startError) {
|
|
104
104
|
try {
|
|
@@ -238,4 +238,4 @@ export class TapNodeTools {
|
|
|
238
238
|
return this.cleanupPromise;
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXBub2RldG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGVfc2VydmVyc2lkZS9jbGFzc2VzLnRhcG5vZGV0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQU14QyxNQUFNLE9BQU8sWUFBWTtJQVF2QixZQUFZLE1BQXlCO1FBTDdCLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQy9DLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFFbEQscUJBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBRy9DLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUdNLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxhQUFxQjtRQUNsRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFrQjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFELFFBQVEsRUFBRSxNQUFNO2FBQ2pCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQzFCLGFBQXFCLFdBQVcsRUFDaEMsa0JBQTJCLElBQUk7UUFFL0IsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQiw2Q0FBNkM7WUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsR0FBRyxHQUFHLENBQUM7UUFDakQsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6RSxtQ0FBbUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFOUUsTUFBTSxLQUFLLEdBQUc7WUFDWixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUN6QyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUNwQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtZQUN4QyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtZQUNoRCxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO1lBQ2pELEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1NBQ2xDLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEIsOERBQThEO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFN0UsNkNBQTZDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6RSxPQUFPO1lBQ0wsR0FBRyxFQUFFLE1BQU07WUFDWCxJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsZ0JBQWdCO1FBQzNCLE1BQU0sYUFBYSxHQUFHLE1BQU0sTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMxRCxNQUFNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxrQkFBa0I7UUFDN0IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzNCLE1BQU0sZUFBZSxHQUFHLE1BQU0sTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDakUsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FDL0QsQ0FBQztZQUNGLElBQUksb0JBQXVFLENBQUM7WUFDNUUsSUFBSSxDQUFDO2dCQUNILG9CQUFvQixHQUFHLElBQUksZUFBZSxDQUFDLFlBQVksQ0FBQztvQkFDdEQsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFO29CQUNoQixPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtpQkFDekMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxnQkFBZ0IsQ0FBQztZQUN6QixDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLE1BQU0sb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQztnQkFDSCxNQUFNLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQyxPQUFPLG9CQUFvQixDQUFDO1lBQzlCLENBQUM7WUFBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUM7b0JBQ0gsTUFBTSxPQUFPLEVBQUUsQ0FBQztnQkFDbEIsQ0FBQztnQkFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO29CQUN0QixNQUFNLElBQUksY0FBYyxDQUN0QixDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsRUFDMUIsMkRBQTJELEVBQzNELEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUN0QixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsTUFBTSxVQUFVLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLFFBQVEsQ0FBQyxJQUFJLENBQ1gsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFDNUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FDN0MsQ0FBQztRQUNGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFFUCxlQUFlO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLFVBS3pCO1FBQ0MsTUFBTSxPQUFPLEdBQUc7WUFDZCxTQUFTLEVBQUUsSUFBSTtZQUNmLE9BQU8sRUFBRSxLQUFLO1lBQ2QsU0FBUyxFQUFFLElBQUk7WUFDZixPQUFPLEVBQUUsRUFBYztZQUN2QixHQUFHLFVBQVU7U0FDZCxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLE1BQU0sWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDL0UsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztTQUN6QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUNiLHVDQUF1QyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FDOUUsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQWdCLEVBQUUsVUFLNUM7UUFDQyxNQUFNLE9BQU8sR0FBRztZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsT0FBTyxFQUFFLEtBQUs7WUFDZCxTQUFTLEVBQUUsSUFBSTtZQUNmLE9BQU8sRUFBRSxFQUFjO1lBQ3ZCLEdBQUcsVUFBVTtTQUNkLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRTtnQkFDL0UsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2dCQUM1QixPQUFPLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQzthQUN2QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxJQUFJLEtBQUssQ0FDYixtQkFBbUIsS0FBSyxDQUFDLE1BQU0sT0FBTyxRQUFRLHdCQUF3QixPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FDN0csQ0FBQztZQUNKLENBQUM7WUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFnQixFQUFFLFVBSWhEO1FBQ0MsTUFBTSxPQUFPLEdBQUc7WUFDZCxTQUFTLEVBQUUsSUFBSTtZQUNmLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLEVBQWM7WUFDdkIsR0FBRyxVQUFVO1NBQ2QsQ0FBQztRQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFNUMsS0FBSyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxPQUFPLENBQUMsT0FBTyxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNyRixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbkIsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUNqRCxNQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUM1QixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDekIsT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDaEIsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLGdDQUFnQztvQkFDOUMsTUFBTTtnQkFDUixDQUFDO2dCQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ1osT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDaEIsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLGdDQUFnQztvQkFDOUMsTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO2dCQUMzQixLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7b0JBQ2pELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUNELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLGtCQUFrQixRQUFRLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FDckcsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxPQUFPO1FBQ1osSUFBSSxDQUFDLGNBQWMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2xDLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQ3RDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUN0RCxDQUFDO1lBQ0YsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUM7b0JBQ0gsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7Z0JBQ25DLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixNQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO1lBQzlFLENBQUM7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztDQUNGIn0=
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXBub2RldG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGVfc2VydmVyc2lkZS9jbGFzc2VzLnRhcG5vZGV0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQU14QyxNQUFNLE9BQU8sWUFBWTtJQVF2QixZQUFZLE1BQXlCO1FBTDdCLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQy9DLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFFbEQscUJBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBRy9DLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUdNLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxhQUFxQjtRQUNsRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFrQjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUs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
|
|
@@ -13,3 +13,4 @@ import * as smartpath from '@push.rocks/smartpath';
|
|
|
13
13
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
14
14
|
import * as smartshell from '@push.rocks/smartshell';
|
|
15
15
|
export { qenv, smartcrypto, smartfile, smartfs, smartfsInstance, smartnetwork, smartpath, smartrequest, smartshell, };
|
|
16
|
+
export declare const loadObjectStorage: () => Promise<typeof import("@lossless.org/objectstorage")>;
|
|
@@ -15,4 +15,6 @@ import * as smartpath from '@push.rocks/smartpath';
|
|
|
15
15
|
import * as smartrequest from '@push.rocks/smartrequest';
|
|
16
16
|
import * as smartshell from '@push.rocks/smartshell';
|
|
17
17
|
export { qenv, smartcrypto, smartfile, smartfs, smartfsInstance, smartnetwork, smartpath, smartrequest, smartshell, };
|
|
18
|
-
|
|
18
|
+
// @lossless.org scope: load the native storage owner only when requested.
|
|
19
|
+
export const loadObjectStorage = () => import('@lossless.org/objectstorage');
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZV9zZXJ2ZXJzaWRlL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUVoQyxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLElBQUksTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0FBQy9FLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxHQUFHLENBQUM7QUFFdEgsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tstest",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.1.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A powerful, modern test runner for TypeScript with multi-runtime support (Node.js, Deno, Bun, Chromium) and a batteries-included test framework.",
|
|
6
6
|
"exports": {
|
|
@@ -16,16 +16,18 @@
|
|
|
16
16
|
"tstest": "./cli.js"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@git.zone/tsbuild": "^4.4.
|
|
20
|
-
"@types/node": "26.
|
|
19
|
+
"@git.zone/tsbuild": "^4.4.3",
|
|
20
|
+
"@types/node": "26.5.0",
|
|
21
21
|
"tsx": "^4.23.13"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@git.zone/tsbundle": "^2.13.0",
|
|
25
25
|
"@git.zone/tsrun": "^2.0.6",
|
|
26
|
+
"@lossless.org/objectstorage": "10.0.1",
|
|
26
27
|
"@push.rocks/consolecolor": "^2.0.4",
|
|
27
28
|
"@push.rocks/qenv": "^6.1.4",
|
|
28
29
|
"@push.rocks/smartbrowser": "^2.0.11",
|
|
30
|
+
"@push.rocks/smartconfig": "^6.2.0",
|
|
29
31
|
"@push.rocks/smartcrypto": "^2.0.4",
|
|
30
32
|
"@push.rocks/smartdelay": "^3.1.0",
|
|
31
33
|
"@push.rocks/smartenv": "^6.1.0",
|
|
@@ -34,14 +36,13 @@
|
|
|
34
36
|
"@push.rocks/smartfs": "^1.5.1",
|
|
35
37
|
"@push.rocks/smartjson": "^6.0.1",
|
|
36
38
|
"@push.rocks/smartlog": "^3.2.2",
|
|
37
|
-
"@push.rocks/smartmongo": "
|
|
39
|
+
"@push.rocks/smartmongo": "9.0.0",
|
|
38
40
|
"@push.rocks/smartnetwork": "^4.7.1",
|
|
39
41
|
"@push.rocks/smartpath": "^6.0.0",
|
|
40
42
|
"@push.rocks/smartpromise": "^4.2.4",
|
|
41
43
|
"@push.rocks/smartrequest": "^5.0.3",
|
|
42
44
|
"@push.rocks/smartserve": "^2.0.4",
|
|
43
45
|
"@push.rocks/smartshell": "^3.3.8",
|
|
44
|
-
"@push.rocks/smartstorage": "^8.1.1",
|
|
45
46
|
"@push.rocks/smarttime": "^4.2.3",
|
|
46
47
|
"@push.rocks/smartwatch": "^6.4.0",
|
|
47
48
|
"@types/ws": "^8.18.1",
|
|
@@ -64,7 +65,9 @@
|
|
|
64
65
|
"last 1 chrome versions"
|
|
65
66
|
],
|
|
66
67
|
"scripts": {
|
|
67
|
-
"test": "pnpm run build && pnpm run test:tapbundle:verbose && pnpm run test:tstest:verbose",
|
|
68
|
+
"test": "pnpm run build && pnpm run test:root:verbose && pnpm run test:tapbundle:verbose && pnpm run test:tstest:verbose",
|
|
69
|
+
"test:root": "tsx ./cli.child.ts \"test/test.*.ts\"",
|
|
70
|
+
"test:root:verbose": "tsx ./cli.child.ts \"test/test.*.ts\" --verbose",
|
|
68
71
|
"test:tapbundle": "tsx ./cli.child.ts \"test/tapbundle/**/*.ts\"",
|
|
69
72
|
"test:tapbundle:verbose": "tsx ./cli.child.ts \"test/tapbundle/**/*.ts\" --verbose",
|
|
70
73
|
"test:tstest": "tsx ./cli.child.ts \"test/tstest/**/*.ts\"",
|
package/readme.md
CHANGED
|
@@ -160,6 +160,74 @@ tstest migrate --write
|
|
|
160
160
|
| `--watch`, `-w` | Re-run tests on file changes |
|
|
161
161
|
| `--watch-ignore <patterns>` | Ignore patterns in watch mode |
|
|
162
162
|
|
|
163
|
+
| Command | Description |
|
|
164
|
+
|---|---|
|
|
165
|
+
| `tstest clean` | Remove the artifacts tstest wrote |
|
|
166
|
+
| `tstest clean --dry-run` | List what would be removed, remove nothing |
|
|
167
|
+
|
|
168
|
+
## Project Configuration
|
|
169
|
+
|
|
170
|
+
tstest reads the `@git.zone/tstest` section of `.smartconfig.json`, the same
|
|
171
|
+
mechanism tsbundle, tswatch, tsrust and tsdocker use.
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"@git.zone/tstest": {
|
|
176
|
+
"prepare": {
|
|
177
|
+
"once": "docker compose up -d",
|
|
178
|
+
"perTestfile": "node scripts/reset-fixtures.mjs"
|
|
179
|
+
},
|
|
180
|
+
"cleanup": {
|
|
181
|
+
"onRelease": true,
|
|
182
|
+
"afterRun": false,
|
|
183
|
+
"artifacts": ["logs", "cache", "testfiles"],
|
|
184
|
+
"additionalPaths": [".nogit/my-project-fixtures"]
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### prepare
|
|
191
|
+
|
|
192
|
+
Replaces the `test:before`, `test:before:once` and `test:before:testfile`
|
|
193
|
+
package.json scripts, which remain supported for projects that already use
|
|
194
|
+
them. The config wins where both are present.
|
|
195
|
+
|
|
196
|
+
| Key | Description |
|
|
197
|
+
|---|---|
|
|
198
|
+
| `once` | Runs once before the whole test run |
|
|
199
|
+
| `perTestfile` | Runs before each individual test file |
|
|
200
|
+
|
|
201
|
+
### cleanup
|
|
202
|
+
|
|
203
|
+
Test runs leave data on disk, and on a long-lived machine it accumulates
|
|
204
|
+
indefinitely. Cleanup removes it.
|
|
205
|
+
|
|
206
|
+
| Key | Default | Description |
|
|
207
|
+
|---|---|---|
|
|
208
|
+
| `onRelease` | `true` | Clean as part of `gitzone release`. Set `false` to opt out. |
|
|
209
|
+
| `afterRun` | `false` | Also clean after every local test run |
|
|
210
|
+
| `artifacts` | `["logs", "cache", "testfiles"]` | Which artifact groups to remove |
|
|
211
|
+
| `additionalPaths` | `[]` | Extra project-relative paths to remove |
|
|
212
|
+
|
|
213
|
+
Artifact groups map to fixed locations:
|
|
214
|
+
|
|
215
|
+
| Group | Path | Notes |
|
|
216
|
+
|---|---|---|
|
|
217
|
+
| `logs` | `.nogit/testlogs/` | Written by `--logfile` |
|
|
218
|
+
| `cache` | `.nogit/tstest_cache/` | Browser bundle cache |
|
|
219
|
+
| `testfiles` | `.nogit/testfiles/` | Fixtures downloaded by tapnodetools |
|
|
220
|
+
| `snapshots` | `.nogit/test_snapshots/` | **Not cleaned by default** |
|
|
221
|
+
|
|
222
|
+
`snapshots` is excluded from the defaults deliberately. Snapshots are
|
|
223
|
+
assertion baselines, not output: deleting one makes the next `matchSnapshot`
|
|
224
|
+
re-record it instead of comparing, so the assertion silently passes. Only
|
|
225
|
+
list `snapshots` when you actually intend to discard those baselines.
|
|
226
|
+
|
|
227
|
+
`additionalPaths` entries must be relative and stay inside the project.
|
|
228
|
+
Absolute paths, and paths that escape the project root, are refused and
|
|
229
|
+
reported rather than followed.
|
|
230
|
+
|
|
163
231
|
## Writing Tests with tapbundle
|
|
164
232
|
|
|
165
233
|
### Basic Syntax
|
|
@@ -438,18 +506,26 @@ const mongo = await tapNodeTools.createSmartmongo();
|
|
|
438
506
|
await mongo.stop();
|
|
439
507
|
```
|
|
440
508
|
|
|
441
|
-
This starts a single-node, memory-backed
|
|
509
|
+
This starts a single-node, memory-backed NoSQLDB server through `@push.rocks/smartmongo`. It downloads no MongoDB binary, implements only NoSQLDB's documented MongoDB wire-protocol surface, provides no replication, and uses NoSQLDB binaries published for Linux and macOS on x64 and arm64.
|
|
510
|
+
|
|
511
|
+
### Migrating from v5
|
|
512
|
+
|
|
513
|
+
Version 6 renames `createSmartStorage()` to `createObjectStorage()` and returns the canonical `@lossless.org/objectstorage` 10 `ObjectStorage` class. The old helper is not retained. `createSmartmongo()` now uses SmartMongo 9 and exposes its underlying NoSQLDB server as `noSqlDbServer`. Both helpers create disposable test data; this migration changes no persisted database or object-storage format.
|
|
442
514
|
|
|
443
515
|
### 📦 Local S3 Storage
|
|
444
516
|
|
|
445
517
|
```typescript
|
|
446
|
-
const s3 = await tapNodeTools.
|
|
518
|
+
const s3 = await tapNodeTools.createObjectStorage();
|
|
447
519
|
// ... run object storage tests ...
|
|
448
520
|
await s3.stop();
|
|
449
521
|
```
|
|
450
522
|
|
|
451
|
-
The helper uses standalone
|
|
452
|
-
directory for each instance. It
|
|
523
|
+
The helper uses standalone ObjectStorage 10 in a separate private temporary
|
|
524
|
+
directory for each instance. It requires GNU/Linux amd64 or arm64 with glibc
|
|
525
|
+
2.34 or later, the matching dynamic loader, `libm.so.6` and `libgcc_s.so.1`.
|
|
526
|
+
Musl-only systems such as default Alpine are unsupported by this storage helper.
|
|
527
|
+
|
|
528
|
+
It honors
|
|
453
529
|
`If-None-Match: *` on `PutObject` and `CompleteMultipartUpload`: a conflicting
|
|
454
530
|
write returns `412 PreconditionFailed` and preserves the existing object. Callers
|
|
455
531
|
can await `stop()` to close a server early. Helper cleanup waits for admitted
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/index.ts
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
import { TsTest } from './tstest.classes.tstest.js';
|
|
2
2
|
import type { LogOptions } from './tstest.logging.js';
|
|
3
|
+
import { loadTstestConfig } from './tstest.classes.config.js';
|
|
4
|
+
import {
|
|
5
|
+
cleanArtifacts,
|
|
6
|
+
formatBytes,
|
|
7
|
+
resolveCleanupTargets,
|
|
8
|
+
} from './tstest.classes.artifacts.js';
|
|
9
|
+
|
|
10
|
+
export * from './tstest.interfaces.config.js';
|
|
11
|
+
export {
|
|
12
|
+
artifactPaths,
|
|
13
|
+
cleanArtifacts,
|
|
14
|
+
defaultCleanupArtifacts,
|
|
15
|
+
formatBytes,
|
|
16
|
+
resolveCleanupTargets,
|
|
17
|
+
} from './tstest.classes.artifacts.js';
|
|
18
|
+
export {
|
|
19
|
+
cleanupRunsAfterTests,
|
|
20
|
+
cleanupRunsOnRelease,
|
|
21
|
+
loadTstestConfig,
|
|
22
|
+
} from './tstest.classes.config.js';
|
|
3
23
|
|
|
4
24
|
export enum TestExecutionMode {
|
|
5
25
|
DIRECTORY = 'directory',
|
|
@@ -44,6 +64,33 @@ export const runCli = async () => {
|
|
|
44
64
|
|
|
45
65
|
// Parse command line arguments
|
|
46
66
|
const args = process.argv.slice(2);
|
|
67
|
+
|
|
68
|
+
// `tstest clean` removes the artifacts tstest wrote, per .smartconfig.json.
|
|
69
|
+
if (args[0] === 'clean') {
|
|
70
|
+
const dryRun = args.includes('--dry-run');
|
|
71
|
+
const cwd = process.cwd();
|
|
72
|
+
const config = loadTstestConfig(cwd);
|
|
73
|
+
|
|
74
|
+
if (dryRun) {
|
|
75
|
+
const { targets } = resolveCleanupTargets(cwd, config.cleanup);
|
|
76
|
+
console.log('tstest clean (dry run) would remove:');
|
|
77
|
+
for (const target of targets) {
|
|
78
|
+
console.log(` ${target}`);
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const result = cleanArtifacts(cwd, config);
|
|
84
|
+
if (result.removed.length === 0) {
|
|
85
|
+
console.log('tstest clean: nothing to remove');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
for (const entry of result.removed) {
|
|
89
|
+
console.log(` removed ${entry.path} (${formatBytes(entry.bytes)})`);
|
|
90
|
+
}
|
|
91
|
+
console.log(`tstest clean: reclaimed ${formatBytes(result.totalBytes)}`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
47
94
|
const logOptions: LogOptions = {};
|
|
48
95
|
let testPath: string | null = null;
|
|
49
96
|
let tags: string[] = [];
|
|
@@ -160,6 +207,7 @@ export const runCli = async () => {
|
|
|
160
207
|
if (!testPath) {
|
|
161
208
|
console.error('You must specify a test directory/file/pattern as argument. Please try again.');
|
|
162
209
|
console.error('\nUsage: tstest <path> [options]');
|
|
210
|
+
console.error(' tstest clean [--dry-run]');
|
|
163
211
|
console.error('\nOptions:');
|
|
164
212
|
console.error(' --version Show version information');
|
|
165
213
|
console.error(' --quiet, -q Minimal output');
|
|
@@ -173,6 +221,9 @@ export const runCli = async () => {
|
|
|
173
221
|
console.error(' --timeout <s> Timeout test files after s seconds');
|
|
174
222
|
console.error(' --watch, -w Watch for file changes and re-run tests');
|
|
175
223
|
console.error(' --watch-ignore Patterns to ignore in watch mode (comma-separated)');
|
|
224
|
+
console.error('\nCleanup:');
|
|
225
|
+
console.error(' clean Remove test artifacts (.nogit/testlogs, tstest_cache, testfiles)');
|
|
226
|
+
console.error(' clean --dry-run Show what would be removed without removing it');
|
|
176
227
|
process.exit(1);
|
|
177
228
|
}
|
|
178
229
|
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import * as plugins from './tstest.plugins.js';
|
|
2
|
+
import type {
|
|
3
|
+
ITstestCleanupConfig,
|
|
4
|
+
ITstestConfig,
|
|
5
|
+
TTstestArtifact,
|
|
6
|
+
} from './tstest.interfaces.config.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Every location tstest writes to, keyed by artifact group. Keeping this in
|
|
10
|
+
* one place is what makes cleanup complete: a new write location must be
|
|
11
|
+
* registered here, not scattered through the runtimes.
|
|
12
|
+
*/
|
|
13
|
+
export const artifactPaths: Record<TTstestArtifact, string> = {
|
|
14
|
+
logs: plugins.path.join('.nogit', 'testlogs'),
|
|
15
|
+
cache: plugins.path.join('.nogit', 'tstest_cache'),
|
|
16
|
+
testfiles: plugins.path.join('.nogit', 'testfiles'),
|
|
17
|
+
snapshots: plugins.path.join('.nogit', 'test_snapshots'),
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Removed unless a project opts in. Snapshots are excluded because they are
|
|
22
|
+
* assertion baselines rather than output - see ITstestCleanupConfig.artifacts.
|
|
23
|
+
*/
|
|
24
|
+
export const defaultCleanupArtifacts: TTstestArtifact[] = ['logs', 'cache', 'testfiles'];
|
|
25
|
+
|
|
26
|
+
export interface IRemovedArtifact {
|
|
27
|
+
path: string;
|
|
28
|
+
bytes: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ICleanupResult {
|
|
32
|
+
removed: IRemovedArtifact[];
|
|
33
|
+
totalBytes: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Human-readable byte size, so cleanup output states what it reclaimed. */
|
|
37
|
+
export const formatBytes = (bytes: number): string => {
|
|
38
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
39
|
+
const units = ['KB', 'MB', 'GB', 'TB'];
|
|
40
|
+
let value = bytes / 1024;
|
|
41
|
+
let unitIndex = 0;
|
|
42
|
+
while (value >= 1024 && unitIndex < units.length - 1) {
|
|
43
|
+
value /= 1024;
|
|
44
|
+
unitIndex++;
|
|
45
|
+
}
|
|
46
|
+
// One decimal below 10 keeps small differences visible; above that the
|
|
47
|
+
// fraction is noise.
|
|
48
|
+
return `${value.toFixed(value >= 10 ? 0 : 1)} ${units[unitIndex]}`;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const directorySize = (absolutePath: string): number => {
|
|
52
|
+
let total = 0;
|
|
53
|
+
const walk = (current: string) => {
|
|
54
|
+
let entries: string[];
|
|
55
|
+
try {
|
|
56
|
+
entries = plugins.fs.readdirSync(current);
|
|
57
|
+
} catch {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
const entryPath = plugins.path.join(current, entry);
|
|
62
|
+
let stat: import('fs').Stats;
|
|
63
|
+
try {
|
|
64
|
+
stat = plugins.fs.lstatSync(entryPath);
|
|
65
|
+
} catch {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (stat.isDirectory()) {
|
|
69
|
+
walk(entryPath);
|
|
70
|
+
} else {
|
|
71
|
+
total += stat.size;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
try {
|
|
76
|
+
const stat = plugins.fs.lstatSync(absolutePath);
|
|
77
|
+
if (stat.isDirectory()) {
|
|
78
|
+
walk(absolutePath);
|
|
79
|
+
} else {
|
|
80
|
+
total = stat.size;
|
|
81
|
+
}
|
|
82
|
+
} catch {
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
return total;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Resolve a configured relative path against the project root, refusing
|
|
90
|
+
* anything that escapes it. Cleanup deletes recursively, so an unchecked
|
|
91
|
+
* `../..` here would be destructive.
|
|
92
|
+
*/
|
|
93
|
+
const resolveInsideProject = (cwd: string, candidate: string): string | null => {
|
|
94
|
+
if (plugins.path.isAbsolute(candidate)) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const resolvedRoot = plugins.path.resolve(cwd);
|
|
98
|
+
const resolved = plugins.path.resolve(resolvedRoot, candidate);
|
|
99
|
+
if (resolved === resolvedRoot) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const withSeparator = resolvedRoot.endsWith(plugins.path.sep)
|
|
103
|
+
? resolvedRoot
|
|
104
|
+
: `${resolvedRoot}${plugins.path.sep}`;
|
|
105
|
+
return resolved.startsWith(withSeparator) ? resolved : null;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/** The concrete paths a cleanup would remove, after validation. */
|
|
109
|
+
export const resolveCleanupTargets = (
|
|
110
|
+
cwd: string,
|
|
111
|
+
cleanupConfig: ITstestCleanupConfig = {},
|
|
112
|
+
): { targets: string[]; rejected: string[] } => {
|
|
113
|
+
const artifacts = cleanupConfig.artifacts ?? defaultCleanupArtifacts;
|
|
114
|
+
const targets: string[] = [];
|
|
115
|
+
const rejected: string[] = [];
|
|
116
|
+
|
|
117
|
+
for (const artifact of artifacts) {
|
|
118
|
+
const relativePath = artifactPaths[artifact];
|
|
119
|
+
if (!relativePath) {
|
|
120
|
+
rejected.push(String(artifact));
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
targets.push(plugins.path.resolve(cwd, relativePath));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
for (const additional of cleanupConfig.additionalPaths ?? []) {
|
|
127
|
+
const resolved = resolveInsideProject(cwd, additional);
|
|
128
|
+
if (!resolved) {
|
|
129
|
+
rejected.push(additional);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
targets.push(resolved);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return { targets, rejected };
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Remove the configured artifacts. Missing paths are not an error - cleanup
|
|
140
|
+
* is expected to run on projects that never produced some of them.
|
|
141
|
+
*/
|
|
142
|
+
export const cleanArtifacts = (
|
|
143
|
+
cwd: string,
|
|
144
|
+
config: ITstestConfig = {},
|
|
145
|
+
): ICleanupResult => {
|
|
146
|
+
const { targets, rejected } = resolveCleanupTargets(cwd, config.cleanup);
|
|
147
|
+
|
|
148
|
+
for (const badPath of rejected) {
|
|
149
|
+
console.error(
|
|
150
|
+
`tstest cleanup: refusing "${badPath}" - additionalPaths must be relative and stay inside the project`,
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const removed: IRemovedArtifact[] = [];
|
|
155
|
+
let totalBytes = 0;
|
|
156
|
+
|
|
157
|
+
for (const target of targets) {
|
|
158
|
+
if (!plugins.fs.existsSync(target)) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const bytes = directorySize(target);
|
|
162
|
+
try {
|
|
163
|
+
plugins.fs.rmSync(target, { recursive: true, force: true });
|
|
164
|
+
} catch (error) {
|
|
165
|
+
console.error(`tstest cleanup: could not remove ${target}: ${error}`);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
removed.push({ path: plugins.path.relative(cwd, target) || target, bytes });
|
|
169
|
+
totalBytes += bytes;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return { removed, totalBytes };
|
|
173
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as plugins from './tstest.plugins.js';
|
|
2
2
|
import type { TsTestLogger } from './tstest.logging.js';
|
|
3
3
|
import type { Smartshell } from '@push.rocks/smartshell';
|
|
4
|
+
import { loadTstestConfig } from './tstest.classes.config.js';
|
|
4
5
|
|
|
5
6
|
export interface IBeforeScripts {
|
|
6
7
|
/** The "test:before" or "test:before:once" script command, or null if not defined */
|
|
@@ -10,11 +11,20 @@ export interface IBeforeScripts {
|
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
|
-
* Load before-script commands
|
|
14
|
+
* Load before-script commands. `.smartconfig.json`'s `@git.zone/tstest`
|
|
15
|
+
* prepare block wins; the package.json `test:before*` scripts remain
|
|
16
|
+
* supported so existing projects keep working.
|
|
14
17
|
*/
|
|
15
18
|
export function loadBeforeScripts(cwd: string): IBeforeScripts {
|
|
16
19
|
const result: IBeforeScripts = { beforeOnce: null, beforeTestfile: null };
|
|
17
20
|
|
|
21
|
+
const prepareConfig = loadTstestConfig(cwd).prepare;
|
|
22
|
+
if (prepareConfig?.once) result.beforeOnce = prepareConfig.once;
|
|
23
|
+
if (prepareConfig?.perTestfile) result.beforeTestfile = prepareConfig.perTestfile;
|
|
24
|
+
if (result.beforeOnce && result.beforeTestfile) {
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
|
|
18
28
|
try {
|
|
19
29
|
const packageJsonPath = plugins.path.join(cwd, 'package.json');
|
|
20
30
|
const packageJson = JSON.parse(plugins.fs.readFileSync(packageJsonPath, 'utf8'));
|
|
@@ -22,7 +32,9 @@ export function loadBeforeScripts(cwd: string): IBeforeScripts {
|
|
|
22
32
|
if (!scripts) return result;
|
|
23
33
|
|
|
24
34
|
// test:before takes precedence over test:before:once (they are aliases)
|
|
25
|
-
if (
|
|
35
|
+
if (result.beforeOnce) {
|
|
36
|
+
// already provided by .smartconfig.json
|
|
37
|
+
} else if (scripts['test:before']) {
|
|
26
38
|
result.beforeOnce = scripts['test:before'];
|
|
27
39
|
if (scripts['test:before:once']) {
|
|
28
40
|
console.warn('Warning: Both "test:before" and "test:before:once" are defined. Using "test:before".');
|
|
@@ -31,7 +43,7 @@ export function loadBeforeScripts(cwd: string): IBeforeScripts {
|
|
|
31
43
|
result.beforeOnce = scripts['test:before:once'];
|
|
32
44
|
}
|
|
33
45
|
|
|
34
|
-
if (scripts['test:before:testfile']) {
|
|
46
|
+
if (!result.beforeTestfile && scripts['test:before:testfile']) {
|
|
35
47
|
result.beforeTestfile = scripts['test:before:testfile'];
|
|
36
48
|
}
|
|
37
49
|
} catch {
|