@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.
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHN0ZXN0LnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90c3Rlc3QucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBQ2QsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFekIsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE1BQU0sZUFBZSxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7QUFDL0UsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssVUFBVSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxTQUFTLE1BQU0sK0JBQStCLENBQUM7QUFFM0QsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQ1osVUFBVSxFQUNWLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLGVBQWUsRUFDZixRQUFRLEVBQ1IsWUFBWSxFQUNaLFlBQVksRUFDWixVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsR0FDVixDQUFDO0FBRUYsa0JBQWtCO0FBQ2xCLE9BQU8sS0FBSyxRQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxLQUFLLEtBQUssTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBRTNCLGVBQWU7QUFDZixPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFFOUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBRW5CLGNBQWM7QUFDZCxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUV6QixPQUFPLEVBQ0wsRUFBRSxFQUNILENBQUEifQ==
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 SmartStorage 8 instance in a private temporary root.
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
- createSmartStorage(): Promise<import("@push.rocks/smartstorage").SmartStorage>;
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 SmartStorage 8 instance in a private temporary root.
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 createSmartStorage() {
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 smartstorageMod = await import('@push.rocks/smartstorage');
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-smartstorage-'));
82
- let smartstorageInstance;
81
+ const directory = await plugins.fs.promises.mkdtemp(plugins.path.join(plugins.os.tmpdir(), 'tstest-objectstorage-'));
82
+ let objectstorageInstance;
83
83
  try {
84
- smartstorageInstance = new smartstorageMod.SmartStorage({
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 smartstorageInstance.stop();
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 smartstorageInstance.start();
101
- return smartstorageInstance;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50YXBub2RldG9vbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190YXBidW5kbGVfc2VydmVyc2lkZS9jbGFzc2VzLnRhcG5vZGV0b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQU14QyxNQUFNLE9BQU8sWUFBWTtJQVF2QixZQUFZLE1BQXlCO1FBTDdCLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQy9DLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFFbEQscUJBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBRy9DLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUdNLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxhQUFxQjtRQUNsRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFrQjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUs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
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3RhcGJ1bmRsZV9zZXJ2ZXJzaWRlL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUVoQyxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLElBQUksTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0FBQy9FLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxHQUFHLENBQUMifQ==
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": "5.0.0",
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.2",
20
- "@types/node": "26.4.1",
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": "^8.0.0",
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 SmartDB server through `@push.rocks/smartmongo`. It downloads no MongoDB binary, implements only SmartDB's documented MongoDB wire-protocol surface, provides no replication, and currently requires Linux because SmartDB publishes Linux binaries.
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.createSmartStorage();
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 SmartStorage 8 in a separate private temporary
452
- directory for each instance. It honors
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
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tstest',
6
- version: '5.0.0',
6
+ version: '6.1.0',
7
7
  description: 'A powerful, modern test runner for TypeScript with multi-runtime support (Node.js, Deno, Bun, Chromium) and a batteries-included test framework.'
8
8
  }
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 from the project's package.json scripts section.
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 (scripts['test:before']) {
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 {