@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.
Files changed (81) hide show
  1. package/.eslintcache +1 -1
  2. package/CHANGELOG.md +16 -0
  3. package/coverage/clover.xml +2 -2
  4. package/coverage/lcov-report/index.html +1 -1
  5. package/coverage/lcov-report/lib/builder/allocator.js.html +1 -1
  6. package/coverage/lcov-report/lib/builder/index.html +1 -1
  7. package/coverage/lcov-report/lib/builder/traffic.js.html +1 -1
  8. package/coverage/lcov-report/src/builder/allocator.ts.html +1 -1
  9. package/coverage/lcov-report/src/builder/index.html +1 -1
  10. package/coverage/lcov-report/src/builder/traffic.ts.html +1 -1
  11. package/lib/builder/buildDatafile.d.ts +1 -1
  12. package/lib/builder/buildDatafile.js +241 -168
  13. package/lib/builder/buildDatafile.js.map +1 -1
  14. package/lib/builder/buildProject.d.ts +1 -1
  15. package/lib/builder/buildProject.js +99 -40
  16. package/lib/builder/buildProject.js.map +1 -1
  17. package/lib/builder/getFeatureRanges.d.ts +1 -1
  18. package/lib/builder/getFeatureRanges.js +92 -31
  19. package/lib/builder/getFeatureRanges.js.map +1 -1
  20. package/lib/datasource/datasource.d.ts +16 -16
  21. package/lib/datasource/datasource.js +123 -67
  22. package/lib/datasource/datasource.js.map +1 -1
  23. package/lib/find-duplicate-segments/findDuplicateSegments.d.ts +1 -1
  24. package/lib/find-duplicate-segments/findDuplicateSegments.js +75 -18
  25. package/lib/find-duplicate-segments/findDuplicateSegments.js.map +1 -1
  26. package/lib/find-duplicate-segments/index.d.ts +1 -1
  27. package/lib/find-duplicate-segments/index.js +56 -9
  28. package/lib/find-duplicate-segments/index.js.map +1 -1
  29. package/lib/generate-code/index.d.ts +1 -1
  30. package/lib/generate-code/index.js +67 -23
  31. package/lib/generate-code/index.js.map +1 -1
  32. package/lib/generate-code/typescript.d.ts +1 -1
  33. package/lib/generate-code/typescript.js +139 -72
  34. package/lib/generate-code/typescript.js.map +1 -1
  35. package/lib/linter/checkCircularDependency.d.ts +1 -1
  36. package/lib/linter/checkCircularDependency.js +78 -22
  37. package/lib/linter/checkCircularDependency.js.map +1 -1
  38. package/lib/linter/groupSchema.js +79 -28
  39. package/lib/linter/groupSchema.js.map +1 -1
  40. package/lib/linter/lintProject.js +122 -101
  41. package/lib/linter/lintProject.js.map +1 -1
  42. package/lib/restore.d.ts +1 -1
  43. package/lib/restore.js +53 -11
  44. package/lib/restore.js.map +1 -1
  45. package/lib/site/exportSite.d.ts +1 -1
  46. package/lib/site/exportSite.js +64 -21
  47. package/lib/site/exportSite.js.map +1 -1
  48. package/lib/site/generateSiteSearchIndex.d.ts +1 -1
  49. package/lib/site/generateSiteSearchIndex.js +203 -111
  50. package/lib/site/generateSiteSearchIndex.js.map +1 -1
  51. package/lib/tester/cliFormat.d.ts +3 -0
  52. package/lib/tester/cliFormat.js +7 -0
  53. package/lib/tester/cliFormat.js.map +1 -0
  54. package/lib/tester/testFeature.d.ts +1 -1
  55. package/lib/tester/testFeature.js +128 -59
  56. package/lib/tester/testFeature.js.map +1 -1
  57. package/lib/tester/testProject.d.ts +1 -1
  58. package/lib/tester/testProject.js +106 -39
  59. package/lib/tester/testProject.js.map +1 -1
  60. package/lib/tester/testSegment.d.ts +1 -1
  61. package/lib/tester/testSegment.js +70 -21
  62. package/lib/tester/testSegment.js.map +1 -1
  63. package/package.json +2 -2
  64. package/src/builder/buildDatafile.ts +9 -9
  65. package/src/builder/buildProject.ts +2 -2
  66. package/src/builder/getFeatureRanges.ts +4 -4
  67. package/src/datasource/datasource.ts +22 -69
  68. package/src/find-duplicate-segments/findDuplicateSegments.ts +9 -6
  69. package/src/find-duplicate-segments/index.ts +5 -2
  70. package/src/generate-code/index.ts +2 -2
  71. package/src/generate-code/typescript.ts +42 -25
  72. package/src/linter/checkCircularDependency.ts +4 -4
  73. package/src/linter/groupSchema.ts +3 -3
  74. package/src/linter/lintProject.ts +39 -39
  75. package/src/restore.ts +1 -1
  76. package/src/site/exportSite.ts +2 -2
  77. package/src/site/generateSiteSearchIndex.ts +14 -14
  78. package/src/tester/cliFormat.ts +4 -0
  79. package/src/tester/testFeature.ts +17 -11
  80. package/src/tester/testProject.ts +20 -7
  81. 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(` => Feature "${featureKey}":`);
23
+ console.log(CLI_FORMAT_BOLD, ` Feature "${featureKey}":`);
23
24
 
24
- test.assertions.forEach(function (assertion, aIndex) {
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(` => Assertion #${aIndex + 1}: (${assertion.environment}) ${description}`);
29
+ console.log(` Assertion #${aIndex + 1}: (${assertion.environment}) ${description}`);
28
30
 
29
- const featuresToInclude = Array.from(datasource.getRequiredFeaturesChain(test.feature));
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
- ` isEnabled failed: expected "${assertion.expectedToBeEnabled}", got "${isEnabled}"`,
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
- ` Variation failed: expected "${assertion.expectedVariation}", got "${variation}"`,
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
- ` Variable "${variableKey}" failed: expected ${JSON.stringify(
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(rootDirectoryPath: string, projectConfig: ProjectConfig): boolean {
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(` => Testing: ${testFilePath.replace(rootDirectoryPath, "")}`);
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(` => Invalid test: ${JSON.stringify(test)}`);
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
- export function testSegment(datasource: Datasource, test: TestSegment): boolean {
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(` => Segment "${segmentKey}":`);
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(` => Segment does not exist: ${segmentKey}`);
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(` => Assertion #${aIndex + 1}: ${description}`);
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(` Segment failed: expected "${expected}", got "${actual}"`);
38
+ console.error(CLI_FORMAT_RED, ` Segment failed: expected "${expected}", got "${actual}"`);
37
39
  }
38
40
  });
39
41