@flemist/test-variants 0.0.1 → 0.0.4
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/README.md +7 -5
- package/dist/bundle/browser.js +24 -0
- package/dist/lib/createTestVariants.cjs +91 -0
- package/dist/lib/createTestVariants.mjs +89 -0
- package/dist/lib/delay.cjs +19 -0
- package/dist/lib/delay.mjs +17 -0
- package/dist/lib/index.cjs +9 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.mjs +1 -0
- package/dist/lib/test-variants/createTestVariants.cjs +9 -0
- package/dist/lib/test-variants/createTestVariants.d.ts +13 -0
- package/dist/lib/test-variants/createTestVariants.mjs +1 -0
- package/dist/{node → lib}/test-variants/createTestVariants.perf.cjs +8 -9
- package/dist/{node → lib}/test-variants/createTestVariants.perf.d.ts +0 -0
- package/dist/lib/test-variants/createTestVariants.perf.mjs +25 -0
- package/package.json +55 -53
- package/dist/browser/browser.js +0 -24
- package/dist/node/index.cjs +0 -10
- package/dist/node/index.d.ts +0 -1
- package/dist/node/test-variants/createTestVariants.cjs +0 -94
- package/dist/node/test-variants/createTestVariants.d.ts +0 -11
package/README.md
CHANGED
|
@@ -10,13 +10,15 @@ Runs a test function with all possible combinations of its parameters.
|
|
|
10
10
|
## Sync only
|
|
11
11
|
```ts
|
|
12
12
|
const result = []
|
|
13
|
-
const testVariants =
|
|
13
|
+
const testVariants = createTestVariants(({a, b, c}: { a: number, b: string, c: boolean }) => {
|
|
14
14
|
result.push([a, b, c])
|
|
15
15
|
})
|
|
16
|
-
const count = testVariants({
|
|
16
|
+
const count = await testVariants({
|
|
17
17
|
a: [1, 2],
|
|
18
18
|
b: ['3', '4'],
|
|
19
19
|
c: [true, false],
|
|
20
|
+
})({
|
|
21
|
+
forceAwaitInterval: 10000, // await after each 10 seconds, needed for karma tests
|
|
20
22
|
})
|
|
21
23
|
|
|
22
24
|
// result == [
|
|
@@ -32,7 +34,7 @@ const count = testVariants({
|
|
|
32
34
|
// count == 8
|
|
33
35
|
```
|
|
34
36
|
|
|
35
|
-
##
|
|
37
|
+
## Async
|
|
36
38
|
```ts
|
|
37
39
|
const result = []
|
|
38
40
|
const testVariants = createTestVariants(async ({a, b, c}: { a: number, b: string, c: boolean }) => {
|
|
@@ -43,7 +45,7 @@ const count = await testVariants({
|
|
|
43
45
|
a: [1, 2],
|
|
44
46
|
b: ['3', '4'],
|
|
45
47
|
c: [true, false],
|
|
46
|
-
})
|
|
48
|
+
})() // no extra parameters
|
|
47
49
|
```
|
|
48
50
|
|
|
49
51
|
## Calculable variants
|
|
@@ -57,7 +59,7 @@ const count = await testVariants({
|
|
|
57
59
|
a: [1, 2],
|
|
58
60
|
b: ({a}) => [ a + 1, a + 2 ], // you can use 'a', but you can't use 'c' because it will initialize after 'b'
|
|
59
61
|
c: ({a, b}) => [ a, b, a + b ],
|
|
60
|
-
})
|
|
62
|
+
})()
|
|
61
63
|
```
|
|
62
64
|
|
|
63
65
|
# License
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
!function(r){"use strict"
|
|
2
|
+
;r.createTestVariants=function(r){
|
|
3
|
+
return function(e){return function(t){
|
|
4
|
+
var n=(void 0===t?{}:t).forceAwaitInterval,o=Object.keys(e),f=Object.values(e),u=o.length,a={}
|
|
5
|
+
;function c(r){var e=f[r]
|
|
6
|
+
;return"function"==typeof e&&(e=e(a)),e}
|
|
7
|
+
for(var i=[],v=[],l=0;l<u;l++)i[l]=-1,v[l]=[]
|
|
8
|
+
;function s(){for(var r=u-1;r>=0;r--){var e=i[r]+1
|
|
9
|
+
;if(e<v[r].length){
|
|
10
|
+
for(i[r]=e,a[o[r]]=v[r][e],r++;r<u;r++){var t=c(r)
|
|
11
|
+
;if(0===t.length)break;i[r]=0,v[r]=t,a[o[r]]=t[0]}
|
|
12
|
+
if(r>=u)return!0}}return!1}v[0]=c(0)
|
|
13
|
+
;var h=0,y=!1,b=0;function p(r){
|
|
14
|
+
console.error(JSON.stringify(a,null,2)),console.error(r)
|
|
15
|
+
;var e=Date.now()
|
|
16
|
+
;throw Date.now()-e>50&&b<5&&(y=!0,w(0),b++),r}
|
|
17
|
+
function w(e){h+="number"==typeof e?e:1
|
|
18
|
+
;for(var t=n&&Date.now();y||s();)try{var o=r(a)
|
|
19
|
+
;if("object"==typeof o&&o&&"function"==typeof o.then)return o.then(w).catch(p)
|
|
20
|
+
;if(n&&Date.now()-t>=n)return Promise.resolve(o).then(w)
|
|
21
|
+
;h+="number"==typeof o?o:1}catch(r){p(r)}return h}
|
|
22
|
+
return w(0)}}
|
|
23
|
+
},Object.defineProperty(r,"__esModule",{value:!0})
|
|
24
|
+
}({});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-shadow */
|
|
4
|
+
function createTestVariants(test) {
|
|
5
|
+
return function testVariantsArgs(args) {
|
|
6
|
+
return function testVariantsCall({ forceAwaitInterval, } = {}) {
|
|
7
|
+
const argsKeys = Object.keys(args);
|
|
8
|
+
const argsValues = Object.values(args);
|
|
9
|
+
const argsLength = argsKeys.length;
|
|
10
|
+
const variantArgs = {};
|
|
11
|
+
function getArgValues(nArg) {
|
|
12
|
+
let argValues = argsValues[nArg];
|
|
13
|
+
if (typeof argValues === 'function') {
|
|
14
|
+
argValues = argValues(variantArgs);
|
|
15
|
+
}
|
|
16
|
+
return argValues;
|
|
17
|
+
}
|
|
18
|
+
const indexes = [];
|
|
19
|
+
const values = [];
|
|
20
|
+
for (let nArg = 0; nArg < argsLength; nArg++) {
|
|
21
|
+
indexes[nArg] = -1;
|
|
22
|
+
values[nArg] = [];
|
|
23
|
+
}
|
|
24
|
+
values[0] = getArgValues(0);
|
|
25
|
+
function nextVariant() {
|
|
26
|
+
for (let nArg = argsLength - 1; nArg >= 0; nArg--) {
|
|
27
|
+
const index = indexes[nArg] + 1;
|
|
28
|
+
if (index < values[nArg].length) {
|
|
29
|
+
indexes[nArg] = index;
|
|
30
|
+
variantArgs[argsKeys[nArg]] = values[nArg][index];
|
|
31
|
+
for (nArg++; nArg < argsLength; nArg++) {
|
|
32
|
+
const argValues = getArgValues(nArg);
|
|
33
|
+
if (argValues.length === 0) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
indexes[nArg] = 0;
|
|
37
|
+
values[nArg] = argValues;
|
|
38
|
+
variantArgs[argsKeys[nArg]] = argValues[0];
|
|
39
|
+
}
|
|
40
|
+
if (nArg >= argsLength) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
let iterations = 0;
|
|
48
|
+
let debug = false;
|
|
49
|
+
let debugIteration = 0;
|
|
50
|
+
function onError(err) {
|
|
51
|
+
console.error(JSON.stringify(variantArgs, null, 2));
|
|
52
|
+
console.error(err);
|
|
53
|
+
// rerun failed variant 5 times for debug
|
|
54
|
+
const time0 = Date.now();
|
|
55
|
+
// eslint-disable-next-line no-debugger
|
|
56
|
+
debugger;
|
|
57
|
+
if (Date.now() - time0 > 50 && debugIteration < 5) {
|
|
58
|
+
debug = true;
|
|
59
|
+
next(0);
|
|
60
|
+
debugIteration++;
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
function next(value) {
|
|
65
|
+
iterations += typeof value === 'number' ? value : 1;
|
|
66
|
+
const time0 = forceAwaitInterval && Date.now();
|
|
67
|
+
while (debug || nextVariant()) {
|
|
68
|
+
try {
|
|
69
|
+
const promiseOrIterations = test(variantArgs);
|
|
70
|
+
if (typeof promiseOrIterations === 'object'
|
|
71
|
+
&& promiseOrIterations
|
|
72
|
+
&& typeof promiseOrIterations.then === 'function') {
|
|
73
|
+
return promiseOrIterations.then(next).catch(onError);
|
|
74
|
+
}
|
|
75
|
+
if (forceAwaitInterval && Date.now() - time0 >= forceAwaitInterval) {
|
|
76
|
+
return Promise.resolve(promiseOrIterations).then(next);
|
|
77
|
+
}
|
|
78
|
+
iterations += typeof promiseOrIterations === 'number' ? promiseOrIterations : 1;
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
onError(err);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return iterations;
|
|
85
|
+
}
|
|
86
|
+
return next(0);
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
exports.createTestVariants = createTestVariants;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-shadow */
|
|
2
|
+
function createTestVariants(test) {
|
|
3
|
+
return function testVariantsArgs(args) {
|
|
4
|
+
return function testVariantsCall({ forceAwaitInterval, } = {}) {
|
|
5
|
+
const argsKeys = Object.keys(args);
|
|
6
|
+
const argsValues = Object.values(args);
|
|
7
|
+
const argsLength = argsKeys.length;
|
|
8
|
+
const variantArgs = {};
|
|
9
|
+
function getArgValues(nArg) {
|
|
10
|
+
let argValues = argsValues[nArg];
|
|
11
|
+
if (typeof argValues === 'function') {
|
|
12
|
+
argValues = argValues(variantArgs);
|
|
13
|
+
}
|
|
14
|
+
return argValues;
|
|
15
|
+
}
|
|
16
|
+
const indexes = [];
|
|
17
|
+
const values = [];
|
|
18
|
+
for (let nArg = 0; nArg < argsLength; nArg++) {
|
|
19
|
+
indexes[nArg] = -1;
|
|
20
|
+
values[nArg] = [];
|
|
21
|
+
}
|
|
22
|
+
values[0] = getArgValues(0);
|
|
23
|
+
function nextVariant() {
|
|
24
|
+
for (let nArg = argsLength - 1; nArg >= 0; nArg--) {
|
|
25
|
+
const index = indexes[nArg] + 1;
|
|
26
|
+
if (index < values[nArg].length) {
|
|
27
|
+
indexes[nArg] = index;
|
|
28
|
+
variantArgs[argsKeys[nArg]] = values[nArg][index];
|
|
29
|
+
for (nArg++; nArg < argsLength; nArg++) {
|
|
30
|
+
const argValues = getArgValues(nArg);
|
|
31
|
+
if (argValues.length === 0) {
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
indexes[nArg] = 0;
|
|
35
|
+
values[nArg] = argValues;
|
|
36
|
+
variantArgs[argsKeys[nArg]] = argValues[0];
|
|
37
|
+
}
|
|
38
|
+
if (nArg >= argsLength) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
let iterations = 0;
|
|
46
|
+
let debug = false;
|
|
47
|
+
let debugIteration = 0;
|
|
48
|
+
function onError(err) {
|
|
49
|
+
console.error(JSON.stringify(variantArgs, null, 2));
|
|
50
|
+
console.error(err);
|
|
51
|
+
// rerun failed variant 5 times for debug
|
|
52
|
+
const time0 = Date.now();
|
|
53
|
+
// eslint-disable-next-line no-debugger
|
|
54
|
+
debugger;
|
|
55
|
+
if (Date.now() - time0 > 50 && debugIteration < 5) {
|
|
56
|
+
debug = true;
|
|
57
|
+
next(0);
|
|
58
|
+
debugIteration++;
|
|
59
|
+
}
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
function next(value) {
|
|
63
|
+
iterations += typeof value === 'number' ? value : 1;
|
|
64
|
+
const time0 = forceAwaitInterval && Date.now();
|
|
65
|
+
while (debug || nextVariant()) {
|
|
66
|
+
try {
|
|
67
|
+
const promiseOrIterations = test(variantArgs);
|
|
68
|
+
if (typeof promiseOrIterations === 'object'
|
|
69
|
+
&& promiseOrIterations
|
|
70
|
+
&& typeof promiseOrIterations.then === 'function') {
|
|
71
|
+
return promiseOrIterations.then(next).catch(onError);
|
|
72
|
+
}
|
|
73
|
+
if (forceAwaitInterval && Date.now() - time0 >= forceAwaitInterval) {
|
|
74
|
+
return Promise.resolve(promiseOrIterations).then(next);
|
|
75
|
+
}
|
|
76
|
+
iterations += typeof promiseOrIterations === 'number' ? promiseOrIterations : 1;
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
onError(err);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return iterations;
|
|
83
|
+
}
|
|
84
|
+
return next(0);
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { createTestVariants as c };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function delay(milliseconds, abortSignal) {
|
|
4
|
+
return new Promise(resolve => {
|
|
5
|
+
if (abortSignal && abortSignal.aborted) {
|
|
6
|
+
resolve();
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const timer = setTimeout(resolve, milliseconds);
|
|
10
|
+
if (abortSignal) {
|
|
11
|
+
abortSignal.addEventListener('abort', () => {
|
|
12
|
+
clearTimeout(timer);
|
|
13
|
+
resolve();
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
exports.delay = delay;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function delay(milliseconds, abortSignal) {
|
|
2
|
+
return new Promise(resolve => {
|
|
3
|
+
if (abortSignal && abortSignal.aborted) {
|
|
4
|
+
resolve();
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
const timer = setTimeout(resolve, milliseconds);
|
|
8
|
+
if (abortSignal) {
|
|
9
|
+
abortSignal.addEventListener('abort', () => {
|
|
10
|
+
clearTimeout(timer);
|
|
11
|
+
resolve();
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { delay as d };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createTestVariants, } from './test-variants/createTestVariants';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { c as createTestVariants } from './createTestVariants.mjs';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare type VariantsArgs<TArgs> = {
|
|
2
|
+
[key in keyof TArgs]: TArgs[key][] | ((args: TArgs) => TArgs[key][]);
|
|
3
|
+
};
|
|
4
|
+
declare type PromiseOrValue<T> = Promise<T> | T;
|
|
5
|
+
declare type TestVariantsCall = (callParams?: TestVariantsCallParams) => PromiseOrValue<number>;
|
|
6
|
+
declare type TestVariantsSetArgs<TArgs> = <TAdditionalArgs>(args: VariantsArgs<{
|
|
7
|
+
[key in (keyof TAdditionalArgs | keyof TArgs)]: key extends keyof TArgs ? TArgs[key] : key extends keyof TAdditionalArgs ? TAdditionalArgs[key] : never;
|
|
8
|
+
}>) => TestVariantsCall;
|
|
9
|
+
export declare type TestVariantsCallParams = {
|
|
10
|
+
forceAwaitInterval?: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function createTestVariants<TArgs extends object>(test: (args: TArgs) => Promise<number | void> | number | void): TestVariantsSetArgs<TArgs>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { c as createTestVariants } from '../createTestVariants.mjs';
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var rdtsc = require('rdtsc');
|
|
4
|
-
var
|
|
4
|
+
var createTestVariants = require('../createTestVariants.cjs');
|
|
5
5
|
|
|
6
6
|
describe('test > testVariants perf', function () {
|
|
7
7
|
this.timeout(300000);
|
|
8
|
-
it('sync
|
|
9
|
-
|
|
10
|
-
})
|
|
11
|
-
|
|
8
|
+
it('sync', function () {
|
|
9
|
+
let value = 0;
|
|
10
|
+
const testVariantsSync = createTestVariants.createTestVariants(({ a, b, c }) => {
|
|
11
|
+
if (a === 1 && b === '4' && c === false) {
|
|
12
|
+
value++;
|
|
13
|
+
}
|
|
12
14
|
});
|
|
13
15
|
const args = {
|
|
14
16
|
a: [1, 2],
|
|
@@ -17,11 +19,8 @@ describe('test > testVariants perf', function () {
|
|
|
17
19
|
};
|
|
18
20
|
const result = rdtsc.calcPerformance(10000, () => {
|
|
19
21
|
}, () => {
|
|
20
|
-
testVariantsSync(args);
|
|
21
|
-
}, () => {
|
|
22
|
-
testVariantsAsync(args);
|
|
23
22
|
});
|
|
24
|
-
const count = testVariantsSync(args);
|
|
23
|
+
const count = testVariantsSync(args)();
|
|
25
24
|
result.absoluteDiff = result.absoluteDiff.map(o => o / count);
|
|
26
25
|
console.log('testVariants perf:', result);
|
|
27
26
|
});
|
|
File without changes
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { calcPerformance } from 'rdtsc';
|
|
2
|
+
import { c as createTestVariants } from '../createTestVariants.mjs';
|
|
3
|
+
|
|
4
|
+
describe('test > testVariants perf', function () {
|
|
5
|
+
this.timeout(300000);
|
|
6
|
+
it('sync', function () {
|
|
7
|
+
let value = 0;
|
|
8
|
+
const testVariantsSync = createTestVariants(({ a, b, c }) => {
|
|
9
|
+
if (a === 1 && b === '4' && c === false) {
|
|
10
|
+
value++;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
const args = {
|
|
14
|
+
a: [1, 2],
|
|
15
|
+
b: ['3', '4'],
|
|
16
|
+
c: [true, false],
|
|
17
|
+
};
|
|
18
|
+
const result = calcPerformance(10000, () => {
|
|
19
|
+
}, () => {
|
|
20
|
+
});
|
|
21
|
+
const count = testVariantsSync(args)();
|
|
22
|
+
result.absoluteDiff = result.absoluteDiff.map(o => o / count);
|
|
23
|
+
console.log('testVariants perf:', result);
|
|
24
|
+
});
|
|
25
|
+
});
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flemist/test-variants",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "Runs a test function with all possible combinations of its parameters.",
|
|
5
|
-
"main": "dist/
|
|
6
|
-
"
|
|
5
|
+
"main": "dist/lib/index.cjs",
|
|
6
|
+
"module": "dist/lib/index.mjs",
|
|
7
|
+
"types": "dist/lib/index.d.ts",
|
|
7
8
|
"engines": {
|
|
8
|
-
"node": ">=
|
|
9
|
+
"node": ">=10.4.0",
|
|
9
10
|
"pnpm": "^7.1.6"
|
|
10
11
|
},
|
|
11
12
|
"repository": {
|
|
@@ -32,52 +33,53 @@
|
|
|
32
33
|
"access": "public"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
|
-
"@babel/core": "
|
|
36
|
-
"@babel/plugin-syntax-dynamic-import": "
|
|
37
|
-
"@babel/plugin-transform-classes": "
|
|
38
|
-
"@babel/plugin-transform-runtime": "
|
|
39
|
-
"@babel/preset-env": "
|
|
40
|
-
"@babel/runtime-corejs3": "
|
|
41
|
-
"@flemist/copy-glob-flat": "
|
|
42
|
-
"@flemist/karma-custom-launcher": "
|
|
43
|
-
"@
|
|
44
|
-
"@rollup/plugin-
|
|
45
|
-
"@rollup/plugin-
|
|
46
|
-
"@rollup/plugin-
|
|
47
|
-
"@rollup/plugin-
|
|
48
|
-
"@rollup/plugin-
|
|
49
|
-
"@rollup/plugin-
|
|
50
|
-
"@rollup/plugin-
|
|
51
|
-
"@rollup/plugin-
|
|
52
|
-
"@
|
|
53
|
-
"@types/
|
|
54
|
-
"@types/
|
|
55
|
-
"@types/
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"eslint
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"karma
|
|
63
|
-
"karma-
|
|
64
|
-
"karma-
|
|
65
|
-
"karma-
|
|
66
|
-
"karma-
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"rollup
|
|
74
|
-
"rollup-plugin-
|
|
75
|
-
"rollup-plugin-
|
|
76
|
-
"rollup-plugin-
|
|
77
|
-
"rollup-plugin-
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
36
|
+
"@babel/core": "7.18.5",
|
|
37
|
+
"@babel/plugin-syntax-dynamic-import": "7.8.3",
|
|
38
|
+
"@babel/plugin-transform-classes": "7.18.4",
|
|
39
|
+
"@babel/plugin-transform-runtime": "7.18.5",
|
|
40
|
+
"@babel/preset-env": "7.18.2",
|
|
41
|
+
"@babel/runtime-corejs3": "7.18.3",
|
|
42
|
+
"@flemist/copy-glob-flat": "0.0.5",
|
|
43
|
+
"@flemist/karma-custom-launcher": "0.0.0",
|
|
44
|
+
"@flemist/test-utils": "^0.0.5",
|
|
45
|
+
"@rollup/plugin-alias": "3.1.9",
|
|
46
|
+
"@rollup/plugin-babel": "5.3.1",
|
|
47
|
+
"@rollup/plugin-commonjs": "22.0.0",
|
|
48
|
+
"@rollup/plugin-inject": "4.0.4",
|
|
49
|
+
"@rollup/plugin-json": "4.1.0",
|
|
50
|
+
"@rollup/plugin-multi-entry": "4.1.0",
|
|
51
|
+
"@rollup/plugin-node-resolve": "13.3.0",
|
|
52
|
+
"@rollup/plugin-replace": "4.0.0",
|
|
53
|
+
"@rollup/plugin-typescript": "8.3.3",
|
|
54
|
+
"@types/assert": "1.5.6",
|
|
55
|
+
"@types/fs-extra": "9.0.13",
|
|
56
|
+
"@types/mocha": "9.1.1",
|
|
57
|
+
"@types/node": "18.0.0",
|
|
58
|
+
"cpy-cli": "3.1.1",
|
|
59
|
+
"eslint": "8.18.0",
|
|
60
|
+
"eslint-config-pro": "3.0.13",
|
|
61
|
+
"fs-extra": "10.1.0",
|
|
62
|
+
"globby": "=11.1.0",
|
|
63
|
+
"karma": "6.4.0",
|
|
64
|
+
"karma-chrome-launcher": "3.1.1",
|
|
65
|
+
"karma-coverage": "2.2.0",
|
|
66
|
+
"karma-firefox-launcher": "2.1.2",
|
|
67
|
+
"karma-mocha": "2.0.1",
|
|
68
|
+
"karma-safari-launcher": "1.0.0",
|
|
69
|
+
"mocha": "9.2.2",
|
|
70
|
+
"nodemon": "2.0.16",
|
|
71
|
+
"nyc": "15.1.0",
|
|
72
|
+
"rdtsc": "2.0.0",
|
|
73
|
+
"rimraf": "3.0.2",
|
|
74
|
+
"rollup": "2.75.6",
|
|
75
|
+
"rollup-plugin-delete": "2.0.0",
|
|
76
|
+
"rollup-plugin-istanbul": "3.0.0",
|
|
77
|
+
"rollup-plugin-multi-input": "1.3.1",
|
|
78
|
+
"rollup-plugin-node-polyfills": "0.2.1",
|
|
79
|
+
"rollup-plugin-terser": "7.0.2",
|
|
80
|
+
"ts-node": "=10.8.0",
|
|
81
|
+
"tsconfig-paths": "4.0.0",
|
|
82
|
+
"typescript": "^4.7.4"
|
|
81
83
|
},
|
|
82
84
|
"dependencies": {
|
|
83
85
|
"tslib": "^2.4.0"
|
|
@@ -87,8 +89,8 @@
|
|
|
87
89
|
"lint": "eslint ./**/*.{js,cjs,mjs,ts,tsx}",
|
|
88
90
|
"lint:fix": "eslint --fix ./**/*.{js,cjs,mjs,ts,tsx}",
|
|
89
91
|
"lint:wizard": "eslint-nibble --cache --multi ./**/*.{js,cjs,mjs,ts,tsx}",
|
|
90
|
-
"build:js": "
|
|
91
|
-
"build:types": "tsc --outDir dist/
|
|
92
|
+
"build:js": "rimraf dist/lib && cpy \"**/assets/**\" \"../dist/lib/\" --parents --cwd=src && rollup -c",
|
|
93
|
+
"build:types": "tsc --outDir dist/lib --declaration",
|
|
92
94
|
"build": "rimraf dist && pnpm run build:js && pnpm run build:types",
|
|
93
95
|
"coverage:merge": "rimraf tmp/coverage/{all,merge} && cp-flat \"tmp/coverage/*/json/**/*.json\" \"tmp/coverage/merge\" && nyc report -r lcov --report-dir tmp/coverage/all/lcov --temp-dir \"tmp/coverage/merge/\"",
|
|
94
96
|
"coverage:check": "pnpm run coverage:merge && nyc check-coverage --report-dir tmp/coverage/all/lcov --lines 50 --functions 50 --branches 50 --statements 50",
|
|
@@ -96,7 +98,7 @@
|
|
|
96
98
|
"test:mocha:coverage": "rimraf tmp/coverage/mocha && nyc --all mocha ./src/**/*.test.*",
|
|
97
99
|
"test:mocha:watch": "mocha --watch ./src/**/*.test.*",
|
|
98
100
|
"test:karma": "rimraf tmp/coverage/karma && karma start --single-run --log-level debug",
|
|
99
|
-
"test:mocha:ci": "rimraf tmp/coverage/mocha && nyc --all mocha ./{src,dist/
|
|
101
|
+
"test:mocha:ci": "rimraf tmp/coverage/mocha && nyc --all mocha ./{src,dist/lib}/**/*.test.*",
|
|
100
102
|
"coveralls": "pnpm run coverage:check && nyc report --reporter=text-lcov --temp-dir \"tmp/coverage/merge/\" | coveralls"
|
|
101
103
|
}
|
|
102
104
|
}
|
package/dist/browser/browser.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
!function(r){"use strict";function n(r,n){
|
|
2
|
-
return function(t){
|
|
3
|
-
var e=Object.keys(t),o=Object.values(t),c=e.length,u={}
|
|
4
|
-
;function f(r){var n=o[r]
|
|
5
|
-
;return"function"==typeof n&&(n=n(u)),n}
|
|
6
|
-
for(var i=[],a=[],s=0;s<c;s++)i[s]=-1,a[s]=[]
|
|
7
|
-
;function l(){for(var r=c-1;r>=0;r--){var n=i[r]+1
|
|
8
|
-
;if(n<a[r].length){
|
|
9
|
-
for(i[r]=n,u[e[r]]=a[r][n],r++;r<c;r++){var t=f(r)
|
|
10
|
-
;if(0===t.length)break;i[r]=0,a[r]=t,u[e[r]]=t[0]}
|
|
11
|
-
if(r>=c)return!0}}return!1}a[0]=f(0)
|
|
12
|
-
;var v=0,h=!1,y=0;function b(r){
|
|
13
|
-
console.error(JSON.stringify(u,null,2)),console.error(r)
|
|
14
|
-
;var n=Date.now()
|
|
15
|
-
;throw Date.now()-n>5&&y<5&&(h=!0,g(),y++),r}
|
|
16
|
-
function g(){for(;h||l();)try{v++;var t=r(u)
|
|
17
|
-
;if(t&&"function"==typeof t.then)return n&&b(new Error("Unexpected Promise result for sync test function")),
|
|
18
|
-
t.then(g).catch(b)}catch(r){b(r)}return v}
|
|
19
|
-
return g()}}r.createTestVariants=function(r){
|
|
20
|
-
return n(r,!1)
|
|
21
|
-
},r.createTestVariantsSync=function(r){
|
|
22
|
-
return n(r,!0)
|
|
23
|
-
},Object.defineProperty(r,"__esModule",{value:!0})
|
|
24
|
-
}({});
|
package/dist/node/index.cjs
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var testVariants_createTestVariants = require('./test-variants/createTestVariants.cjs');
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
exports.createTestVariants = testVariants_createTestVariants.createTestVariants;
|
|
10
|
-
exports.createTestVariantsSync = testVariants_createTestVariants.createTestVariantsSync;
|
package/dist/node/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { createTestVariantsSync, createTestVariants, } from './test-variants/createTestVariants';
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
/* eslint-disable @typescript-eslint/no-shadow */
|
|
6
|
-
function _createTestVariants(test, sync) {
|
|
7
|
-
return function _testVariants(args) {
|
|
8
|
-
const argsKeys = Object.keys(args);
|
|
9
|
-
const argsValues = Object.values(args);
|
|
10
|
-
const argsLength = argsKeys.length;
|
|
11
|
-
const variantArgs = {};
|
|
12
|
-
function getArgValues(nArg) {
|
|
13
|
-
let argValues = argsValues[nArg];
|
|
14
|
-
if (typeof argValues === 'function') {
|
|
15
|
-
argValues = argValues(variantArgs);
|
|
16
|
-
}
|
|
17
|
-
return argValues;
|
|
18
|
-
}
|
|
19
|
-
const indexes = [];
|
|
20
|
-
const values = [];
|
|
21
|
-
for (let nArg = 0; nArg < argsLength; nArg++) {
|
|
22
|
-
indexes[nArg] = -1;
|
|
23
|
-
values[nArg] = [];
|
|
24
|
-
}
|
|
25
|
-
values[0] = getArgValues(0);
|
|
26
|
-
function nextVariant() {
|
|
27
|
-
for (let nArg = argsLength - 1; nArg >= 0; nArg--) {
|
|
28
|
-
const index = indexes[nArg] + 1;
|
|
29
|
-
if (index < values[nArg].length) {
|
|
30
|
-
indexes[nArg] = index;
|
|
31
|
-
variantArgs[argsKeys[nArg]] = values[nArg][index];
|
|
32
|
-
for (nArg++; nArg < argsLength; nArg++) {
|
|
33
|
-
const argValues = getArgValues(nArg);
|
|
34
|
-
if (argValues.length === 0) {
|
|
35
|
-
break;
|
|
36
|
-
}
|
|
37
|
-
indexes[nArg] = 0;
|
|
38
|
-
values[nArg] = argValues;
|
|
39
|
-
variantArgs[argsKeys[nArg]] = argValues[0];
|
|
40
|
-
}
|
|
41
|
-
if (nArg >= argsLength) {
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
let iteration = 0;
|
|
49
|
-
let debug = false;
|
|
50
|
-
let debugIteration = 0;
|
|
51
|
-
function onError(err) {
|
|
52
|
-
console.error(JSON.stringify(variantArgs, null, 2));
|
|
53
|
-
console.error(err);
|
|
54
|
-
// rerun failed variant 5 times for debug
|
|
55
|
-
const time0 = Date.now();
|
|
56
|
-
// eslint-disable-next-line no-debugger
|
|
57
|
-
debugger;
|
|
58
|
-
if (Date.now() - time0 > 5 && debugIteration < 5) {
|
|
59
|
-
debug = true;
|
|
60
|
-
next();
|
|
61
|
-
debugIteration++;
|
|
62
|
-
}
|
|
63
|
-
throw err;
|
|
64
|
-
}
|
|
65
|
-
function next() {
|
|
66
|
-
while (debug || nextVariant()) {
|
|
67
|
-
try {
|
|
68
|
-
iteration++;
|
|
69
|
-
const promise = test(variantArgs);
|
|
70
|
-
if (promise && typeof promise.then === 'function') {
|
|
71
|
-
if (sync) {
|
|
72
|
-
onError(new Error('Unexpected Promise result for sync test function'));
|
|
73
|
-
}
|
|
74
|
-
return promise.then(next).catch(onError);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
onError(err);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return iteration;
|
|
82
|
-
}
|
|
83
|
-
return next();
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
function createTestVariantsSync(test) {
|
|
87
|
-
return _createTestVariants(test, true);
|
|
88
|
-
}
|
|
89
|
-
function createTestVariants(test) {
|
|
90
|
-
return _createTestVariants(test, false);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
exports.createTestVariants = createTestVariants;
|
|
94
|
-
exports.createTestVariantsSync = createTestVariantsSync;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
declare type VariantsArgs<TArgs> = {
|
|
2
|
-
[key in keyof TArgs]: TArgs[key][] | ((args: TArgs) => TArgs[key][]);
|
|
3
|
-
};
|
|
4
|
-
declare type TestVariantsFunc<TArgs, TResult> = <TAdditionalArgs>(args: VariantsArgs<{
|
|
5
|
-
[key in (keyof TAdditionalArgs | keyof TArgs)]: key extends keyof TArgs ? TArgs[key] : key extends keyof TAdditionalArgs ? TAdditionalArgs[key] : never;
|
|
6
|
-
}>) => TResult;
|
|
7
|
-
export declare type TestVariantsFuncSync<TArgs> = TestVariantsFunc<TArgs, number>;
|
|
8
|
-
export declare type TestVariantsFuncAsync<TArgs> = TestVariantsFunc<TArgs, Promise<number> | number>;
|
|
9
|
-
export declare function createTestVariantsSync<TArgs extends object>(test: (args: TArgs) => void): TestVariantsFuncSync<TArgs>;
|
|
10
|
-
export declare function createTestVariants<TArgs extends object>(test: (args: TArgs) => Promise<void> | void): TestVariantsFuncAsync<TArgs>;
|
|
11
|
-
export {};
|