@featurevisor/core 0.53.1 → 0.53.3
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/.eslintcache +1 -1
- package/CHANGELOG.md +16 -0
- package/coverage/clover.xml +2 -2
- package/coverage/lcov-report/index.html +1 -1
- package/coverage/lcov-report/lib/builder/allocator.js.html +1 -1
- package/coverage/lcov-report/lib/builder/index.html +1 -1
- package/coverage/lcov-report/lib/builder/traffic.js.html +1 -1
- package/coverage/lcov-report/src/builder/allocator.ts.html +1 -1
- package/coverage/lcov-report/src/builder/index.html +1 -1
- package/coverage/lcov-report/src/builder/traffic.ts.html +1 -1
- package/lib/builder/buildDatafile.d.ts +1 -1
- package/lib/builder/buildDatafile.js +241 -168
- package/lib/builder/buildDatafile.js.map +1 -1
- package/lib/builder/buildProject.d.ts +1 -1
- package/lib/builder/buildProject.js +99 -40
- package/lib/builder/buildProject.js.map +1 -1
- package/lib/builder/getFeatureRanges.d.ts +1 -1
- package/lib/builder/getFeatureRanges.js +92 -31
- package/lib/builder/getFeatureRanges.js.map +1 -1
- package/lib/datasource/datasource.d.ts +16 -16
- package/lib/datasource/datasource.js +123 -67
- package/lib/datasource/datasource.js.map +1 -1
- package/lib/find-duplicate-segments/findDuplicateSegments.d.ts +1 -1
- package/lib/find-duplicate-segments/findDuplicateSegments.js +75 -18
- package/lib/find-duplicate-segments/findDuplicateSegments.js.map +1 -1
- package/lib/find-duplicate-segments/index.d.ts +1 -1
- package/lib/find-duplicate-segments/index.js +56 -9
- package/lib/find-duplicate-segments/index.js.map +1 -1
- package/lib/generate-code/index.d.ts +1 -1
- package/lib/generate-code/index.js +67 -23
- package/lib/generate-code/index.js.map +1 -1
- package/lib/generate-code/typescript.d.ts +1 -1
- package/lib/generate-code/typescript.js +139 -72
- package/lib/generate-code/typescript.js.map +1 -1
- package/lib/linter/checkCircularDependency.d.ts +1 -1
- package/lib/linter/checkCircularDependency.js +78 -22
- package/lib/linter/checkCircularDependency.js.map +1 -1
- package/lib/linter/groupSchema.js +79 -28
- package/lib/linter/groupSchema.js.map +1 -1
- package/lib/linter/lintProject.js +122 -101
- package/lib/linter/lintProject.js.map +1 -1
- package/lib/restore.d.ts +1 -1
- package/lib/restore.js +53 -11
- package/lib/restore.js.map +1 -1
- package/lib/site/exportSite.d.ts +1 -1
- package/lib/site/exportSite.js +64 -21
- package/lib/site/exportSite.js.map +1 -1
- package/lib/site/generateSiteSearchIndex.d.ts +1 -1
- package/lib/site/generateSiteSearchIndex.js +203 -111
- package/lib/site/generateSiteSearchIndex.js.map +1 -1
- package/lib/tester/cliFormat.d.ts +3 -0
- package/lib/tester/cliFormat.js +7 -0
- package/lib/tester/cliFormat.js.map +1 -0
- package/lib/tester/testFeature.d.ts +1 -1
- package/lib/tester/testFeature.js +128 -59
- package/lib/tester/testFeature.js.map +1 -1
- package/lib/tester/testProject.d.ts +1 -1
- package/lib/tester/testProject.js +106 -39
- package/lib/tester/testProject.js.map +1 -1
- package/lib/tester/testSegment.d.ts +1 -1
- package/lib/tester/testSegment.js +70 -21
- package/lib/tester/testSegment.js.map +1 -1
- package/package.json +2 -2
- package/src/builder/buildDatafile.ts +9 -9
- package/src/builder/buildProject.ts +2 -2
- package/src/builder/getFeatureRanges.ts +4 -4
- package/src/datasource/datasource.ts +22 -69
- package/src/find-duplicate-segments/findDuplicateSegments.ts +9 -6
- package/src/find-duplicate-segments/index.ts +5 -2
- package/src/generate-code/index.ts +2 -2
- package/src/generate-code/typescript.ts +42 -25
- package/src/linter/checkCircularDependency.ts +4 -4
- package/src/linter/groupSchema.ts +3 -3
- package/src/linter/lintProject.ts +39 -39
- package/src/restore.ts +1 -1
- package/src/site/exportSite.ts +2 -2
- package/src/site/generateSiteSearchIndex.ts +14 -14
- package/src/tester/cliFormat.ts +4 -0
- package/src/tester/testFeature.ts +17 -11
- package/src/tester/testProject.ts +20 -7
- package/src/tester/testSegment.ts +9 -7
|
@@ -10,25 +10,28 @@ import { SCHEMA_VERSION } from "../config";
|
|
|
10
10
|
|
|
11
11
|
import { checkIfArraysAreEqual } from "./checkIfArraysAreEqual";
|
|
12
12
|
import { checkIfObjectsAreEqual } from "./checkIfObjectsAreEqual";
|
|
13
|
+
import { CLI_FORMAT_BOLD, CLI_FORMAT_RED } from "./cliFormat";
|
|
13
14
|
|
|
14
|
-
export function testFeature(
|
|
15
|
+
export async function testFeature(
|
|
15
16
|
datasource: Datasource,
|
|
16
17
|
projectConfig: ProjectConfig,
|
|
17
18
|
test: TestFeature,
|
|
18
|
-
): boolean {
|
|
19
|
+
): Promise<boolean> {
|
|
19
20
|
let hasError = false;
|
|
20
21
|
const featureKey = test.feature;
|
|
21
22
|
|
|
22
|
-
console.log(`
|
|
23
|
+
console.log(CLI_FORMAT_BOLD, ` Feature "${featureKey}":`);
|
|
23
24
|
|
|
24
|
-
test.assertions.
|
|
25
|
+
for (let aIndex = 0; aIndex < test.assertions.length; aIndex++) {
|
|
26
|
+
const assertion = test.assertions[aIndex];
|
|
25
27
|
const description = assertion.description || `at ${assertion.at}%`;
|
|
26
28
|
|
|
27
|
-
console.log(`
|
|
29
|
+
console.log(` Assertion #${aIndex + 1}: (${assertion.environment}) ${description}`);
|
|
28
30
|
|
|
29
|
-
const
|
|
31
|
+
const requiredChain = await datasource.getRequiredFeaturesChain(test.feature);
|
|
32
|
+
const featuresToInclude = Array.from(requiredChain);
|
|
30
33
|
|
|
31
|
-
const datafileContent = buildDatafile(
|
|
34
|
+
const datafileContent = await buildDatafile(
|
|
32
35
|
projectConfig,
|
|
33
36
|
datasource,
|
|
34
37
|
{
|
|
@@ -60,7 +63,8 @@ export function testFeature(
|
|
|
60
63
|
hasError = true;
|
|
61
64
|
|
|
62
65
|
console.error(
|
|
63
|
-
|
|
66
|
+
CLI_FORMAT_RED,
|
|
67
|
+
` isEnabled failed: expected "${assertion.expectedToBeEnabled}", got "${isEnabled}"`,
|
|
64
68
|
);
|
|
65
69
|
}
|
|
66
70
|
}
|
|
@@ -73,7 +77,8 @@ export function testFeature(
|
|
|
73
77
|
hasError = true;
|
|
74
78
|
|
|
75
79
|
console.error(
|
|
76
|
-
|
|
80
|
+
CLI_FORMAT_RED,
|
|
81
|
+
` Variation failed: expected "${assertion.expectedVariation}", got "${variation}"`,
|
|
77
82
|
);
|
|
78
83
|
}
|
|
79
84
|
}
|
|
@@ -99,14 +104,15 @@ export function testFeature(
|
|
|
99
104
|
hasError = true;
|
|
100
105
|
|
|
101
106
|
console.error(
|
|
102
|
-
|
|
107
|
+
CLI_FORMAT_RED,
|
|
108
|
+
` Variable "${variableKey}" failed: expected ${JSON.stringify(
|
|
103
109
|
expectedValue,
|
|
104
110
|
)}, got "${JSON.stringify(actualValue)}"`,
|
|
105
111
|
);
|
|
106
112
|
}
|
|
107
113
|
});
|
|
108
114
|
}
|
|
109
|
-
}
|
|
115
|
+
}
|
|
110
116
|
|
|
111
117
|
return hasError;
|
|
112
118
|
}
|
|
@@ -7,8 +7,12 @@ import { Datasource } from "../datasource";
|
|
|
7
7
|
|
|
8
8
|
import { testSegment } from "./testSegment";
|
|
9
9
|
import { testFeature } from "./testFeature";
|
|
10
|
+
import { CLI_FORMAT_BOLD, CLI_FORMAT_GREEN, CLI_FORMAT_RED } from "./cliFormat";
|
|
10
11
|
|
|
11
|
-
export function testProject(
|
|
12
|
+
export async function testProject(
|
|
13
|
+
rootDirectoryPath: string,
|
|
14
|
+
projectConfig: ProjectConfig,
|
|
15
|
+
): Promise<boolean> {
|
|
12
16
|
let hasError = false;
|
|
13
17
|
const datasource = new Datasource(projectConfig);
|
|
14
18
|
|
|
@@ -19,7 +23,7 @@ export function testProject(rootDirectoryPath: string, projectConfig: ProjectCon
|
|
|
19
23
|
return hasError;
|
|
20
24
|
}
|
|
21
25
|
|
|
22
|
-
const testFiles = datasource.listTests();
|
|
26
|
+
const testFiles = await datasource.listTests();
|
|
23
27
|
|
|
24
28
|
if (testFiles.length === 0) {
|
|
25
29
|
console.error(`No tests found in: ${projectConfig.testsDirectoryPath}`);
|
|
@@ -31,15 +35,16 @@ export function testProject(rootDirectoryPath: string, projectConfig: ProjectCon
|
|
|
31
35
|
for (const testFile of testFiles) {
|
|
32
36
|
const testFilePath = datasource.getEntityPath("test", testFile);
|
|
33
37
|
|
|
34
|
-
console.log(
|
|
38
|
+
console.log("");
|
|
39
|
+
console.log(CLI_FORMAT_BOLD, `Testing: ${testFilePath.replace(rootDirectoryPath, "")}`);
|
|
35
40
|
|
|
36
|
-
const t = datasource.readTest(testFile);
|
|
41
|
+
const t = await datasource.readTest(testFile);
|
|
37
42
|
|
|
38
43
|
if ((t as TestSegment).segment) {
|
|
39
44
|
// segment testing
|
|
40
45
|
const test = t as TestSegment;
|
|
41
46
|
|
|
42
|
-
const segmentHasError = testSegment(datasource, test);
|
|
47
|
+
const segmentHasError = await testSegment(datasource, test);
|
|
43
48
|
|
|
44
49
|
if (segmentHasError) {
|
|
45
50
|
hasError = true;
|
|
@@ -48,16 +53,24 @@ export function testProject(rootDirectoryPath: string, projectConfig: ProjectCon
|
|
|
48
53
|
// feature testing
|
|
49
54
|
const test = t as TestFeature;
|
|
50
55
|
|
|
51
|
-
const featureHasError = testFeature(datasource, projectConfig, test);
|
|
56
|
+
const featureHasError = await testFeature(datasource, projectConfig, test);
|
|
52
57
|
|
|
53
58
|
if (featureHasError) {
|
|
54
59
|
hasError = true;
|
|
55
60
|
}
|
|
56
61
|
} else {
|
|
57
|
-
console.error(`
|
|
62
|
+
console.error(` => Invalid test: ${JSON.stringify(test)}`);
|
|
58
63
|
hasError = true;
|
|
59
64
|
}
|
|
60
65
|
}
|
|
61
66
|
|
|
67
|
+
console.log("");
|
|
68
|
+
if (hasError) {
|
|
69
|
+
console.log(CLI_FORMAT_RED, `Some tests failed`);
|
|
70
|
+
} else {
|
|
71
|
+
console.log(CLI_FORMAT_GREEN, `All tests passed`);
|
|
72
|
+
}
|
|
73
|
+
console.log("");
|
|
74
|
+
|
|
62
75
|
return hasError;
|
|
63
76
|
}
|
|
@@ -3,29 +3,31 @@ import { allConditionsAreMatched } from "@featurevisor/sdk";
|
|
|
3
3
|
|
|
4
4
|
import { Datasource } from "../datasource";
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
import { CLI_FORMAT_BOLD, CLI_FORMAT_RED } from "./cliFormat";
|
|
7
|
+
|
|
8
|
+
export async function testSegment(datasource: Datasource, test: TestSegment): Promise<boolean> {
|
|
7
9
|
let hasError = false;
|
|
8
10
|
|
|
9
11
|
const segmentKey = test.segment;
|
|
10
12
|
|
|
11
|
-
console.log(`
|
|
13
|
+
console.log(CLI_FORMAT_BOLD, ` Segment "${segmentKey}":`);
|
|
12
14
|
|
|
13
|
-
const segmentExists = datasource.entityExists("segment", segmentKey);
|
|
15
|
+
const segmentExists = await datasource.entityExists("segment", segmentKey);
|
|
14
16
|
|
|
15
17
|
if (!segmentExists) {
|
|
16
|
-
console.error(`
|
|
18
|
+
console.error(CLI_FORMAT_RED, ` Segment does not exist: ${segmentKey}`);
|
|
17
19
|
hasError = true;
|
|
18
20
|
|
|
19
21
|
return hasError;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
|
-
const parsedSegment = datasource.readSegment(segmentKey);
|
|
24
|
+
const parsedSegment = await datasource.readSegment(segmentKey);
|
|
23
25
|
const conditions = parsedSegment.conditions as Condition | Condition[];
|
|
24
26
|
|
|
25
27
|
test.assertions.forEach(function (assertion, aIndex) {
|
|
26
28
|
const description = assertion.description || `#${aIndex + 1}`;
|
|
27
29
|
|
|
28
|
-
console.log(`
|
|
30
|
+
console.log(` Assertion #${aIndex + 1}: ${description}`);
|
|
29
31
|
|
|
30
32
|
const expected = assertion.expectedToMatch;
|
|
31
33
|
const actual = allConditionsAreMatched(conditions, assertion.context);
|
|
@@ -33,7 +35,7 @@ export function testSegment(datasource: Datasource, test: TestSegment): boolean
|
|
|
33
35
|
if (actual !== expected) {
|
|
34
36
|
hasError = true;
|
|
35
37
|
|
|
36
|
-
console.error(`
|
|
38
|
+
console.error(CLI_FORMAT_RED, ` Segment failed: expected "${expected}", got "${actual}"`);
|
|
37
39
|
}
|
|
38
40
|
});
|
|
39
41
|
|