@featurevisor/core 0.50.0 → 0.51.1

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 (51) hide show
  1. package/.eslintcache +1 -1
  2. package/CHANGELOG.md +19 -0
  3. package/coverage/clover.xml +2 -2
  4. package/coverage/lcov-report/index.html +1 -1
  5. package/coverage/lcov-report/lib/allocator.js.html +1 -1
  6. package/coverage/lcov-report/lib/index.html +1 -1
  7. package/coverage/lcov-report/lib/traffic.js.html +1 -1
  8. package/coverage/lcov-report/src/allocator.ts.html +1 -1
  9. package/coverage/lcov-report/src/index.html +1 -1
  10. package/coverage/lcov-report/src/traffic.ts.html +1 -1
  11. package/lib/linter/attributeSchema.d.ts +2 -0
  12. package/lib/linter/attributeSchema.js +15 -0
  13. package/lib/linter/attributeSchema.js.map +1 -0
  14. package/lib/linter/checkCircularDependency.d.ts +3 -0
  15. package/lib/linter/checkCircularDependency.js +30 -0
  16. package/lib/linter/checkCircularDependency.js.map +1 -0
  17. package/lib/linter/conditionSchema.d.ts +3 -0
  18. package/lib/linter/conditionSchema.js +44 -0
  19. package/lib/linter/conditionSchema.js.map +1 -0
  20. package/lib/linter/featureSchema.d.ts +3 -0
  21. package/lib/linter/featureSchema.js +147 -0
  22. package/lib/linter/featureSchema.js.map +1 -0
  23. package/lib/linter/groupSchema.d.ts +4 -0
  24. package/lib/linter/groupSchema.js +51 -0
  25. package/lib/linter/groupSchema.js.map +1 -0
  26. package/lib/linter/index.d.ts +2 -0
  27. package/lib/linter/index.js +241 -0
  28. package/lib/linter/index.js.map +1 -0
  29. package/lib/linter/printJoiError.d.ts +2 -0
  30. package/lib/linter/printJoiError.js +14 -0
  31. package/lib/linter/printJoiError.js.map +1 -0
  32. package/lib/linter/segmentSchema.d.ts +3 -0
  33. package/lib/linter/segmentSchema.js +14 -0
  34. package/lib/linter/segmentSchema.js.map +1 -0
  35. package/lib/linter/testSchema.d.ts +3 -0
  36. package/lib/linter/testSchema.js +33 -0
  37. package/lib/linter/testSchema.js.map +1 -0
  38. package/package.json +5 -5
  39. package/src/linter/attributeSchema.ts +12 -0
  40. package/src/linter/checkCircularDependency.ts +45 -0
  41. package/src/linter/conditionSchema.ts +85 -0
  42. package/src/linter/featureSchema.ts +205 -0
  43. package/src/linter/groupSchema.ts +63 -0
  44. package/src/linter/index.ts +179 -0
  45. package/src/linter/printJoiError.ts +11 -0
  46. package/src/linter/segmentSchema.ts +13 -0
  47. package/src/linter/testSchema.ts +43 -0
  48. package/lib/linter.d.ts +0 -11
  49. package/lib/linter.js +0 -541
  50. package/lib/linter.js.map +0 -1
  51. package/src/linter.ts +0 -626
package/.eslintcache CHANGED
@@ -1 +1 @@
1
- [{"/home/runner/work/featurevisor/featurevisor/packages/core/src/allocator.spec.ts":"1","/home/runner/work/featurevisor/featurevisor/packages/core/src/allocator.ts":"2","/home/runner/work/featurevisor/featurevisor/packages/core/src/builder.ts":"3","/home/runner/work/featurevisor/featurevisor/packages/core/src/config.ts":"4","/home/runner/work/featurevisor/featurevisor/packages/core/src/datasource/datasource.ts":"5","/home/runner/work/featurevisor/featurevisor/packages/core/src/datasource/parsers.ts":"6","/home/runner/work/featurevisor/featurevisor/packages/core/src/generate-code/index.ts":"7","/home/runner/work/featurevisor/featurevisor/packages/core/src/generate-code/typescript.ts":"8","/home/runner/work/featurevisor/featurevisor/packages/core/src/index.ts":"9","/home/runner/work/featurevisor/featurevisor/packages/core/src/init.ts":"10","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter.ts":"11","/home/runner/work/featurevisor/featurevisor/packages/core/src/restore.ts":"12","/home/runner/work/featurevisor/featurevisor/packages/core/src/site.ts":"13","/home/runner/work/featurevisor/featurevisor/packages/core/src/tester.ts":"14","/home/runner/work/featurevisor/featurevisor/packages/core/src/traffic.spec.ts":"15","/home/runner/work/featurevisor/featurevisor/packages/core/src/traffic.ts":"16","/home/runner/work/featurevisor/featurevisor/packages/core/src/utils.ts":"17"},{"size":3214,"mtime":1696188445482,"results":"18","hashOfConfig":"19"},{"size":1014,"mtime":1696188445482,"results":"20","hashOfConfig":"19"},{"size":12373,"mtime":1696188445482,"results":"21","hashOfConfig":"19"},{"size":2966,"mtime":1696188445482,"results":"22","hashOfConfig":"19"},{"size":5523,"mtime":1696188445482,"results":"23","hashOfConfig":"19"},{"size":646,"mtime":1696188445482,"results":"24","hashOfConfig":"19"},{"size":1630,"mtime":1696188445482,"results":"25","hashOfConfig":"19"},{"size":5886,"mtime":1696188445482,"results":"26","hashOfConfig":"19"},{"size":213,"mtime":1696188445482,"results":"27","hashOfConfig":"19"},{"size":1308,"mtime":1696188445482,"results":"28","hashOfConfig":"19"},{"size":16860,"mtime":1696188445482,"results":"29","hashOfConfig":"19"},{"size":604,"mtime":1696188445482,"results":"30","hashOfConfig":"19"},{"size":14680,"mtime":1696188445482,"results":"31","hashOfConfig":"19"},{"size":6423,"mtime":1696188445482,"results":"32","hashOfConfig":"19"},{"size":12889,"mtime":1696188445486,"results":"33","hashOfConfig":"19"},{"size":4799,"mtime":1696188445486,"results":"34","hashOfConfig":"19"},{"size":2108,"mtime":1696188445486,"results":"35","hashOfConfig":"19"},{"filePath":"36","messages":"37","suppressedMessages":"38","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"u5hm5o",{"filePath":"39","messages":"40","suppressedMessages":"41","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"42","messages":"43","suppressedMessages":"44","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"45","messages":"46","suppressedMessages":"47","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"48","messages":"49","suppressedMessages":"50","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"51","messages":"52","suppressedMessages":"53","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"54","messages":"55","suppressedMessages":"56","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"57","messages":"58","suppressedMessages":"59","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"60","messages":"61","suppressedMessages":"62","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"63","messages":"64","suppressedMessages":"65","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"66","messages":"67","suppressedMessages":"68","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"69","messages":"70","suppressedMessages":"71","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"72","messages":"73","suppressedMessages":"74","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"75","messages":"76","suppressedMessages":"77","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"78","messages":"79","suppressedMessages":"80","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"81","messages":"82","suppressedMessages":"83","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"84","messages":"85","suppressedMessages":"86","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/home/runner/work/featurevisor/featurevisor/packages/core/src/allocator.spec.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/allocator.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/builder.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/config.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/datasource/datasource.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/datasource/parsers.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/generate-code/index.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/generate-code/typescript.ts",[],["87"],"/home/runner/work/featurevisor/featurevisor/packages/core/src/index.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/init.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/restore.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/site.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/tester.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/traffic.spec.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/traffic.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/utils.ts",[],[],{"ruleId":"88","severity":2,"message":"89","line":41,"column":10,"nodeType":"90","messageId":"91","endLine":41,"endColumn":38,"suppressions":"92"},"@typescript-eslint/no-unused-vars","'getFeaturevisorTypeFromValue' is defined but never used.","Identifier","unusedVar",["93"],{"kind":"94","justification":"95"},"directive",""]
1
+ [{"/home/runner/work/featurevisor/featurevisor/packages/core/src/allocator.spec.ts":"1","/home/runner/work/featurevisor/featurevisor/packages/core/src/allocator.ts":"2","/home/runner/work/featurevisor/featurevisor/packages/core/src/builder.ts":"3","/home/runner/work/featurevisor/featurevisor/packages/core/src/config.ts":"4","/home/runner/work/featurevisor/featurevisor/packages/core/src/datasource/datasource.ts":"5","/home/runner/work/featurevisor/featurevisor/packages/core/src/datasource/parsers.ts":"6","/home/runner/work/featurevisor/featurevisor/packages/core/src/generate-code/index.ts":"7","/home/runner/work/featurevisor/featurevisor/packages/core/src/generate-code/typescript.ts":"8","/home/runner/work/featurevisor/featurevisor/packages/core/src/index.ts":"9","/home/runner/work/featurevisor/featurevisor/packages/core/src/init.ts":"10","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/attributeSchema.ts":"11","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/checkCircularDependency.ts":"12","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/conditionSchema.ts":"13","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/featureSchema.ts":"14","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/groupSchema.ts":"15","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/index.ts":"16","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/printJoiError.ts":"17","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/segmentSchema.ts":"18","/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/testSchema.ts":"19","/home/runner/work/featurevisor/featurevisor/packages/core/src/restore.ts":"20","/home/runner/work/featurevisor/featurevisor/packages/core/src/site.ts":"21","/home/runner/work/featurevisor/featurevisor/packages/core/src/tester.ts":"22","/home/runner/work/featurevisor/featurevisor/packages/core/src/traffic.spec.ts":"23","/home/runner/work/featurevisor/featurevisor/packages/core/src/traffic.ts":"24","/home/runner/work/featurevisor/featurevisor/packages/core/src/utils.ts":"25"},{"size":3214,"mtime":1697044853599,"results":"26","hashOfConfig":"27"},{"size":1014,"mtime":1697044853599,"results":"28","hashOfConfig":"27"},{"size":12373,"mtime":1697044853599,"results":"29","hashOfConfig":"27"},{"size":2966,"mtime":1697044853599,"results":"30","hashOfConfig":"27"},{"size":5523,"mtime":1697044853599,"results":"31","hashOfConfig":"27"},{"size":646,"mtime":1697044853599,"results":"32","hashOfConfig":"27"},{"size":1630,"mtime":1697044853599,"results":"33","hashOfConfig":"27"},{"size":5886,"mtime":1697044853599,"results":"34","hashOfConfig":"27"},{"size":213,"mtime":1697044853599,"results":"35","hashOfConfig":"27"},{"size":1308,"mtime":1697044853599,"results":"36","hashOfConfig":"27"},{"size":341,"mtime":1697044853599,"results":"37","hashOfConfig":"27"},{"size":1117,"mtime":1697044853599,"results":"38","hashOfConfig":"27"},{"size":2019,"mtime":1697044853599,"results":"39","hashOfConfig":"27"},{"size":5782,"mtime":1697044853599,"results":"40","hashOfConfig":"27"},{"size":2103,"mtime":1697044853599,"results":"41","hashOfConfig":"27"},{"size":4605,"mtime":1697044853599,"results":"42","hashOfConfig":"27"},{"size":323,"mtime":1697044853599,"results":"43","hashOfConfig":"27"},{"size":368,"mtime":1697044853599,"results":"44","hashOfConfig":"27"},{"size":1248,"mtime":1697044853599,"results":"45","hashOfConfig":"27"},{"size":604,"mtime":1697044853599,"results":"46","hashOfConfig":"27"},{"size":14680,"mtime":1697044853599,"results":"47","hashOfConfig":"27"},{"size":6423,"mtime":1697044853599,"results":"48","hashOfConfig":"27"},{"size":12889,"mtime":1697044853599,"results":"49","hashOfConfig":"27"},{"size":4799,"mtime":1697044853599,"results":"50","hashOfConfig":"27"},{"size":2108,"mtime":1697044853599,"results":"51","hashOfConfig":"27"},{"filePath":"52","messages":"53","suppressedMessages":"54","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"u5hm5o",{"filePath":"55","messages":"56","suppressedMessages":"57","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"58","messages":"59","suppressedMessages":"60","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"61","messages":"62","suppressedMessages":"63","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"64","messages":"65","suppressedMessages":"66","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"67","messages":"68","suppressedMessages":"69","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"70","messages":"71","suppressedMessages":"72","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"73","messages":"74","suppressedMessages":"75","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"76","messages":"77","suppressedMessages":"78","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"79","messages":"80","suppressedMessages":"81","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"82","messages":"83","suppressedMessages":"84","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"85","messages":"86","suppressedMessages":"87","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"88","messages":"89","suppressedMessages":"90","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"91","messages":"92","suppressedMessages":"93","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"94","messages":"95","suppressedMessages":"96","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"97","messages":"98","suppressedMessages":"99","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"100","messages":"101","suppressedMessages":"102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"103","messages":"104","suppressedMessages":"105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"106","messages":"107","suppressedMessages":"108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"109","messages":"110","suppressedMessages":"111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"112","messages":"113","suppressedMessages":"114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"115","messages":"116","suppressedMessages":"117","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"118","messages":"119","suppressedMessages":"120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"121","messages":"122","suppressedMessages":"123","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"124","messages":"125","suppressedMessages":"126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/home/runner/work/featurevisor/featurevisor/packages/core/src/allocator.spec.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/allocator.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/builder.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/config.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/datasource/datasource.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/datasource/parsers.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/generate-code/index.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/generate-code/typescript.ts",[],["127"],"/home/runner/work/featurevisor/featurevisor/packages/core/src/index.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/init.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/attributeSchema.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/checkCircularDependency.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/conditionSchema.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/featureSchema.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/groupSchema.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/index.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/printJoiError.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/segmentSchema.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/linter/testSchema.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/restore.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/site.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/tester.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/traffic.spec.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/traffic.ts",[],[],"/home/runner/work/featurevisor/featurevisor/packages/core/src/utils.ts",[],[],{"ruleId":"128","severity":2,"message":"129","line":41,"column":10,"nodeType":"130","messageId":"131","endLine":41,"endColumn":38,"suppressions":"132"},"@typescript-eslint/no-unused-vars","'getFeaturevisorTypeFromValue' is defined but never used.","Identifier","unusedVar",["133"],{"kind":"134","justification":"135"},"directive",""]
package/CHANGELOG.md CHANGED
@@ -3,6 +3,25 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.51.1](https://github.com/featurevisor/featurevisor/compare/v0.51.0...v0.51.1) (2023-10-11)
7
+
8
+ **Note:** Version bump only for package @featurevisor/core
9
+
10
+
11
+
12
+
13
+
14
+ # [0.51.0](https://github.com/featurevisor/featurevisor/compare/v0.50.0...v0.51.0) (2023-10-05)
15
+
16
+
17
+ ### Features
18
+
19
+ * let variables have descriptions ([#165](https://github.com/featurevisor/featurevisor/issues/165)) ([2a1b73d](https://github.com/featurevisor/featurevisor/commit/2a1b73d274ae10184db024ca41aa73011b8e8532))
20
+
21
+
22
+
23
+
24
+
6
25
  # [0.50.0](https://github.com/featurevisor/featurevisor/compare/v0.49.0...v0.50.0) (2023-10-01)
7
26
 
8
27
 
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <coverage generated="1696188622507" clover="3.2.0">
3
- <project timestamp="1696188622507" name="All files">
2
+ <coverage generated="1697045031809" clover="3.2.0">
3
+ <project timestamp="1697045031809" name="All files">
4
4
  <metrics statements="173" coveredstatements="165" conditionals="86" coveredconditionals="70" methods="28" coveredmethods="28" elements="287" coveredelements="263" complexity="0" loc="173" ncloc="173" packages="2" files="4" classes="4"/>
5
5
  <package name="lib">
6
6
  <metrics statements="90" coveredstatements="86" conditionals="48" coveredconditionals="39" methods="14" coveredmethods="14"/>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2023-10-01T19:30:22.487Z
119
+ at 2023-10-11T17:23:51.798Z
120
120
  </div>
121
121
  <script src="prettify.js"></script>
122
122
  <script>
@@ -175,7 +175,7 @@ exports.getUpdatedAvailableRangesAfterFilling = getUpdatedAvailableRangesAfterFi
175
175
  <div class='footer quiet pad2 space-top1 center small'>
176
176
  Code coverage generated by
177
177
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
178
- at 2023-10-01T19:30:22.487Z
178
+ at 2023-10-11T17:23:51.798Z
179
179
  </div>
180
180
  <script src="../prettify.js"></script>
181
181
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2023-10-01T19:30:22.487Z
119
+ at 2023-10-11T17:23:51.798Z
120
120
  </div>
121
121
  <script src="../prettify.js"></script>
122
122
  <script>
@@ -442,7 +442,7 @@ exports.getTraffic = getTraffic;
442
442
  <div class='footer quiet pad2 space-top1 center small'>
443
443
  Code coverage generated by
444
444
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
445
- at 2023-10-01T19:30:22.487Z
445
+ at 2023-10-11T17:23:51.798Z
446
446
  </div>
447
447
  <script src="../prettify.js"></script>
448
448
  <script>
@@ -193,7 +193,7 @@ export function getUpdatedAvailableRangesAfterFilling(
193
193
  <div class='footer quiet pad2 space-top1 center small'>
194
194
  Code coverage generated by
195
195
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
196
- at 2023-10-01T19:30:22.487Z
196
+ at 2023-10-11T17:23:51.798Z
197
197
  </div>
198
198
  <script src="../prettify.js"></script>
199
199
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2023-10-01T19:30:22.487Z
119
+ at 2023-10-11T17:23:51.798Z
120
120
  </div>
121
121
  <script src="../prettify.js"></script>
122
122
  <script>
@@ -553,7 +553,7 @@ export function getTraffic(
553
553
  <div class='footer quiet pad2 space-top1 center small'>
554
554
  Code coverage generated by
555
555
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
556
- at 2023-10-01T19:30:22.487Z
556
+ at 2023-10-11T17:23:51.798Z
557
557
  </div>
558
558
  <script src="../prettify.js"></script>
559
559
  <script>
@@ -0,0 +1,2 @@
1
+ import * as Joi from "joi";
2
+ export declare function getAttributeJoiSchema(): Joi.ObjectSchema<any>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAttributeJoiSchema = void 0;
4
+ var Joi = require("joi");
5
+ function getAttributeJoiSchema() {
6
+ var attributeJoiSchema = Joi.object({
7
+ archived: Joi.boolean(),
8
+ type: Joi.string().allow("boolean", "string", "integer", "double", "date").required(),
9
+ description: Joi.string().required(),
10
+ capture: Joi.boolean(),
11
+ });
12
+ return attributeJoiSchema;
13
+ }
14
+ exports.getAttributeJoiSchema = getAttributeJoiSchema;
15
+ //# sourceMappingURL=attributeSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributeSchema.js","sourceRoot":"","sources":["../../src/linter/attributeSchema.ts"],"names":[],"mappings":";;;AAAA,yBAA2B;AAE3B,SAAgB,qBAAqB;IACnC,IAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC;QACpC,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE;QACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE;QACrF,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACpC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;KACvB,CAAC,CAAC;IAEH,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AATD,sDASC"}
@@ -0,0 +1,3 @@
1
+ import { FeatureKey, Required } from "@featurevisor/types";
2
+ import { Datasource } from "../datasource/datasource";
3
+ export declare function checkForCircularDependencyInRequired(datasource: Datasource, featureKey: FeatureKey, required?: Required[], chain?: FeatureKey[]): void;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkForCircularDependencyInRequired = void 0;
4
+ function checkForCircularDependencyInRequired(datasource, featureKey, required, chain) {
5
+ if (chain === void 0) { chain = []; }
6
+ if (!required) {
7
+ return;
8
+ }
9
+ var requiredKeys = required.map(function (r) { return (typeof r === "string" ? r : r.key); });
10
+ if (requiredKeys.length === 0) {
11
+ return;
12
+ }
13
+ for (var _i = 0, requiredKeys_1 = requiredKeys; _i < requiredKeys_1.length; _i++) {
14
+ var requiredKey = requiredKeys_1[_i];
15
+ chain.push(requiredKey);
16
+ if (chain.indexOf(featureKey) > -1) {
17
+ throw new Error("circular dependency found: ".concat(chain.join(" -> ")));
18
+ }
19
+ var requiredFeatureExists = datasource.entityExists("feature", requiredKey);
20
+ if (!requiredFeatureExists) {
21
+ throw new Error("required feature \"".concat(requiredKey, "\" not found"));
22
+ }
23
+ var requiredParsedFeature = datasource.readFeature(requiredKey);
24
+ if (requiredParsedFeature.required) {
25
+ checkForCircularDependencyInRequired(datasource, featureKey, requiredParsedFeature.required, chain);
26
+ }
27
+ }
28
+ }
29
+ exports.checkForCircularDependencyInRequired = checkForCircularDependencyInRequired;
30
+ //# sourceMappingURL=checkCircularDependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkCircularDependency.js","sourceRoot":"","sources":["../../src/linter/checkCircularDependency.ts"],"names":[],"mappings":";;;AAIA,SAAgB,oCAAoC,CAClD,UAAsB,EACtB,UAAsB,EACtB,QAAqB,EACrB,KAAwB;IAAxB,sBAAA,EAAA,UAAwB;IAExB,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO;KACR;IAED,IAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAnC,CAAmC,CAAC,CAAC;IAE9E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;QAC7B,OAAO;KACR;IAED,KAA0B,UAAY,EAAZ,6BAAY,EAAZ,0BAAY,EAAZ,IAAY,EAAE;QAAnC,IAAM,WAAW,qBAAA;QACpB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAExB,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,qCAA8B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAE,CAAC,CAAC;SACrE;QAED,IAAM,qBAAqB,GAAG,UAAU,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAE9E,IAAI,CAAC,qBAAqB,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,6BAAqB,WAAW,iBAAa,CAAC,CAAC;SAChE;QAED,IAAM,qBAAqB,GAAG,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAElE,IAAI,qBAAqB,CAAC,QAAQ,EAAE;YAClC,oCAAoC,CAClC,UAAU,EACV,UAAU,EACV,qBAAqB,CAAC,QAAQ,EAC9B,KAAK,CACN,CAAC;SACH;KACF;AACH,CAAC;AAxCD,oFAwCC"}
@@ -0,0 +1,3 @@
1
+ import * as Joi from "joi";
2
+ import { ProjectConfig } from "../config";
3
+ export declare function getConditionsJoiSchema(projectConfig: ProjectConfig, availableAttributeKeys: string[]): Joi.AlternativesSchema<any>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConditionsJoiSchema = void 0;
4
+ var Joi = require("joi");
5
+ function getConditionsJoiSchema(projectConfig, availableAttributeKeys) {
6
+ var _a;
7
+ var plainConditionJoiSchema = Joi.object({
8
+ attribute: (_a = Joi.string())
9
+ .valid.apply(_a, availableAttributeKeys).required(),
10
+ operator: Joi.string()
11
+ .valid("equals", "notEquals",
12
+ // numeric
13
+ "greaterThan", "greaterThanOrEquals", "lessThan", "lessThanOrEquals",
14
+ // string
15
+ "contains", "notContains", "startsWith", "endsWith",
16
+ // semver (string)
17
+ "semverEquals", "semverNotEquals", "semverGreaterThan", "semverGreaterThanOrEquals", "semverLessThan", "semverLessThanOrEquals",
18
+ // date comparisons
19
+ "before", "after",
20
+ // array of strings
21
+ "in", "notIn")
22
+ .required(),
23
+ value: Joi.alternatives()
24
+ .try(
25
+ // @TODO: make them more specific
26
+ Joi.string(), Joi.number(), Joi.boolean(), Joi.date(), Joi.array().items(Joi.string()))
27
+ .required(),
28
+ });
29
+ var andOrNotConditionJoiSchema = Joi.alternatives()
30
+ .try(Joi.object({
31
+ and: Joi.array().items(Joi.link("#andOrNotCondition"), plainConditionJoiSchema),
32
+ }), Joi.object({
33
+ or: Joi.array().items(Joi.link("#andOrNotCondition"), plainConditionJoiSchema),
34
+ }), Joi.object({
35
+ // @TODO: allow plainConditionJoiSchema as well?
36
+ not: Joi.array().items(Joi.link("#andOrNotCondition"), plainConditionJoiSchema),
37
+ }))
38
+ .id("andOrNotCondition");
39
+ var conditionJoiSchema = Joi.alternatives().try(andOrNotConditionJoiSchema, plainConditionJoiSchema);
40
+ var conditionsJoiSchema = Joi.alternatives().try(conditionJoiSchema, Joi.array().items(conditionJoiSchema));
41
+ return conditionsJoiSchema;
42
+ }
43
+ exports.getConditionsJoiSchema = getConditionsJoiSchema;
44
+ //# sourceMappingURL=conditionSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditionSchema.js","sourceRoot":"","sources":["../../src/linter/conditionSchema.ts"],"names":[],"mappings":";;;AAAA,yBAA2B;AAI3B,SAAgB,sBAAsB,CACpC,aAA4B,EAC5B,sBAAgC;;IAEhC,IAAM,uBAAuB,GAAG,GAAG,CAAC,MAAM,CAAC;QACzC,SAAS,EAAE,CAAA,KAAA,GAAG,CAAC,MAAM,EAAE,CAAA;aACpB,KAAK,WAAI,sBAAsB,EAC/B,QAAQ,EAAE;QACb,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;aACnB,KAAK,CACJ,QAAQ,EACR,WAAW;QAEX,UAAU;QACV,aAAa,EACb,qBAAqB,EACrB,UAAU,EACV,kBAAkB;QAElB,SAAS;QACT,UAAU,EACV,aAAa,EACb,YAAY,EACZ,UAAU;QAEV,kBAAkB;QAClB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,wBAAwB;QAExB,mBAAmB;QACnB,QAAQ,EACR,OAAO;QAEP,mBAAmB;QACnB,IAAI,EACJ,OAAO,CACR;aACA,QAAQ,EAAE;QACb,KAAK,EAAE,GAAG,CAAC,YAAY,EAAE;aACtB,GAAG;QACF,iCAAiC;QACjC,GAAG,CAAC,MAAM,EAAE,EACZ,GAAG,CAAC,MAAM,EAAE,EACZ,GAAG,CAAC,OAAO,EAAE,EACb,GAAG,CAAC,IAAI,EAAE,EACV,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAChC;aACA,QAAQ,EAAE;KACd,CAAC,CAAC;IAEH,IAAM,0BAA0B,GAAG,GAAG,CAAC,YAAY,EAAE;SAClD,GAAG,CACF,GAAG,CAAC,MAAM,CAAC;QACT,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,uBAAuB,CAAC;KAChF,CAAC,EACF,GAAG,CAAC,MAAM,CAAC;QACT,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,uBAAuB,CAAC;KAC/E,CAAC,EACF,GAAG,CAAC,MAAM,CAAC;QACT,gDAAgD;QAChD,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,uBAAuB,CAAC;KAChF,CAAC,CACH;SACA,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAE3B,IAAM,kBAAkB,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CAC/C,0BAA0B,EAC1B,uBAAuB,CACxB,CAAC;IAEF,IAAM,mBAAmB,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CAChD,kBAAkB,EAClB,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CACtC,CAAC;IAEF,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAhFD,wDAgFC"}
@@ -0,0 +1,3 @@
1
+ import * as Joi from "joi";
2
+ import { ProjectConfig } from "../config";
3
+ export declare function getFeatureJoiSchema(projectConfig: ProjectConfig, conditionsJoiSchema: any, availableSegmentKeys: string[], availableFeatureKeys: string[]): Joi.ObjectSchema<any>;
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
+ if (ar || !(i in from)) {
5
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
+ ar[i] = from[i];
7
+ }
8
+ }
9
+ return to.concat(ar || Array.prototype.slice.call(from));
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getFeatureJoiSchema = void 0;
13
+ var Joi = require("joi");
14
+ var tagRegex = /^[a-z0-9-]+$/;
15
+ function getFeatureJoiSchema(projectConfig, conditionsJoiSchema, availableSegmentKeys, availableFeatureKeys) {
16
+ var _a, _b, _c;
17
+ var variationValueJoiSchema = Joi.string().required();
18
+ var variableValueJoiSchema = Joi.alternatives()
19
+ .try(
20
+ // @TODO: make it stricter based on variableSchema.type
21
+ Joi.string(), Joi.number(), Joi.boolean(), Joi.array().items(Joi.string()), Joi.object().custom(function (value) {
22
+ var isFlat = true;
23
+ Object.keys(value).forEach(function (key) {
24
+ if (typeof value[key] === "object") {
25
+ isFlat = false;
26
+ }
27
+ });
28
+ if (!isFlat) {
29
+ throw new Error("object is not flat");
30
+ }
31
+ return value;
32
+ }))
33
+ .allow("");
34
+ var plainGroupSegment = (_a = Joi.string()).valid.apply(_a, __spreadArray(["*"], availableSegmentKeys, false));
35
+ var andOrNotGroupSegment = Joi.alternatives()
36
+ .try(Joi.object({
37
+ and: Joi.array().items(Joi.link("#andOrNotGroupSegment"), plainGroupSegment),
38
+ }), Joi.object({
39
+ or: Joi.array().items(Joi.link("#andOrNotGroupSegment"), plainGroupSegment),
40
+ }), Joi.object({
41
+ // @TODO: allow plainGroupSegment as well?
42
+ not: Joi.array().items(Joi.link("#andOrNotGroupSegment"), plainGroupSegment),
43
+ }))
44
+ .id("andOrNotGroupSegment");
45
+ var groupSegment = Joi.alternatives().try(andOrNotGroupSegment, plainGroupSegment);
46
+ var groupSegmentsJoiSchema = Joi.alternatives().try(Joi.array().items(groupSegment), groupSegment);
47
+ var environmentJoiSchema = Joi.object({
48
+ expose: Joi.boolean(),
49
+ rules: Joi.array()
50
+ .items(Joi.object({
51
+ key: Joi.string(),
52
+ segments: groupSegmentsJoiSchema,
53
+ percentage: Joi.number().precision(3).min(0).max(100),
54
+ enabled: Joi.boolean().optional(),
55
+ variation: variationValueJoiSchema.optional(),
56
+ variables: Joi.object().optional(), // @TODO: make it stricter
57
+ }))
58
+ .unique("key")
59
+ .required(),
60
+ force: Joi.array().items(Joi.object({
61
+ // @TODO: either of the two below
62
+ segments: groupSegmentsJoiSchema.optional(),
63
+ conditions: conditionsJoiSchema.optional(),
64
+ enabled: Joi.boolean().optional(),
65
+ variation: variationValueJoiSchema.optional(),
66
+ variables: Joi.object().optional(), // @TODO: make it stricter
67
+ })),
68
+ });
69
+ var allEnvironmentsSchema = {};
70
+ projectConfig.environments.forEach(function (environmentKey) {
71
+ allEnvironmentsSchema[environmentKey] = environmentJoiSchema.required();
72
+ });
73
+ var allEnvironmentsJoiSchema = Joi.object(allEnvironmentsSchema);
74
+ var featureJoiSchema = Joi.object({
75
+ archived: Joi.boolean().optional(),
76
+ deprecated: Joi.boolean().optional(),
77
+ description: Joi.string().required(),
78
+ tags: Joi.array()
79
+ .items(Joi.string().custom(function (value) {
80
+ if (!tagRegex.test(value)) {
81
+ throw new Error("tag must be lower cased and alphanumeric, and may contain hyphens.");
82
+ }
83
+ return value;
84
+ }))
85
+ .required(),
86
+ required: Joi.array()
87
+ .items(Joi.alternatives().try((_b = Joi.string()
88
+ .required())
89
+ .valid.apply(_b, availableFeatureKeys), Joi.object({
90
+ key: (_c = Joi.string()
91
+ .required())
92
+ .valid.apply(_c, availableFeatureKeys),
93
+ variation: Joi.string().optional(), // @TODO: can be made stricter
94
+ })))
95
+ .optional(),
96
+ bucketBy: Joi.alternatives()
97
+ .try(
98
+ // plain
99
+ Joi.string(),
100
+ // and
101
+ Joi.array().items(Joi.string()),
102
+ // or
103
+ Joi.object({
104
+ or: Joi.array().items(Joi.string()),
105
+ }))
106
+ .required(),
107
+ variablesSchema: Joi.array()
108
+ .items(Joi.object({
109
+ key: Joi.string().disallow("variation"),
110
+ type: Joi.string().valid("string", "integer", "boolean", "double", "array", "object", "json"),
111
+ description: Joi.string().optional(),
112
+ defaultValue: variableValueJoiSchema, // @TODO: make it stricter based on `type`
113
+ }))
114
+ .unique("key"),
115
+ variations: Joi.array()
116
+ .items(Joi.object({
117
+ description: Joi.string(),
118
+ value: variationValueJoiSchema.required(),
119
+ weight: Joi.number().precision(3).min(0).max(100).required(),
120
+ variables: Joi.array()
121
+ .items(Joi.object({
122
+ key: Joi.string(),
123
+ value: variableValueJoiSchema,
124
+ overrides: Joi.array().items(Joi.object({
125
+ // @TODO: either segments or conditions prsent at a time
126
+ segments: groupSegmentsJoiSchema,
127
+ conditions: conditionsJoiSchema,
128
+ // @TODO: make it stricter based on `type`
129
+ value: variableValueJoiSchema,
130
+ })),
131
+ }))
132
+ .unique("key"),
133
+ }))
134
+ .custom(function (value) {
135
+ var total = value.reduce(function (acc, v) { return acc + v.weight; }, 0);
136
+ if (total !== 100) {
137
+ throw new Error("Sum of all variation weights must be 100, got ".concat(total));
138
+ }
139
+ return value;
140
+ })
141
+ .optional(),
142
+ environments: allEnvironmentsJoiSchema.required(),
143
+ });
144
+ return featureJoiSchema;
145
+ }
146
+ exports.getFeatureJoiSchema = getFeatureJoiSchema;
147
+ //# sourceMappingURL=featureSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureSchema.js","sourceRoot":"","sources":["../../src/linter/featureSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import * as Joi from "joi";
2
+ import { ProjectConfig } from "../config";
3
+ import { Datasource } from "../datasource/datasource";
4
+ export declare function getGroupJoiSchema(projectConfig: ProjectConfig, datasource: Datasource, availableFeatureKeys: string[]): Joi.ObjectSchema<any>;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getGroupJoiSchema = void 0;
4
+ var Joi = require("joi");
5
+ function getGroupJoiSchema(projectConfig, datasource, availableFeatureKeys) {
6
+ var _a;
7
+ var groupJoiSchema = Joi.object({
8
+ description: Joi.string().required(),
9
+ slots: Joi.array()
10
+ .items(Joi.object({
11
+ feature: (_a = Joi.string()).valid.apply(_a, availableFeatureKeys),
12
+ percentage: Joi.number().precision(3).min(0).max(100),
13
+ }))
14
+ .custom(function (value) {
15
+ var totalPercentage = value.reduce(function (acc, slot) { return acc + slot.percentage; }, 0);
16
+ if (totalPercentage !== 100) {
17
+ throw new Error("total percentage is not 100");
18
+ }
19
+ for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {
20
+ var slot = value_1[_i];
21
+ var maxPercentageForRule = slot.percentage;
22
+ if (slot.feature) {
23
+ var featureKey = slot.feature;
24
+ var featureExists = datasource.entityExists("feature", featureKey);
25
+ if (!featureExists) {
26
+ throw new Error("feature ".concat(featureKey, " not found"));
27
+ }
28
+ var parsedFeature = datasource.readFeature(featureKey);
29
+ var environmentKeys = Object.keys(parsedFeature.environments);
30
+ for (var _a = 0, environmentKeys_1 = environmentKeys; _a < environmentKeys_1.length; _a++) {
31
+ var environmentKey = environmentKeys_1[_a];
32
+ var environment = parsedFeature.environments[environmentKey];
33
+ var rules = environment.rules;
34
+ for (var _b = 0, rules_1 = rules; _b < rules_1.length; _b++) {
35
+ var rule = rules_1[_b];
36
+ if (rule.percentage > maxPercentageForRule) {
37
+ // @TODO: this does not help with same feature belonging to multiple slots. fix that.
38
+ throw new Error("Feature ".concat(featureKey, "'s rule ").concat(rule.key, " in ").concat(environmentKey, " has a percentage of ").concat(rule.percentage, " which is greater than the maximum percentage of ").concat(maxPercentageForRule, " for the slot"));
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ return value;
45
+ })
46
+ .required(),
47
+ });
48
+ return groupJoiSchema;
49
+ }
50
+ exports.getGroupJoiSchema = getGroupJoiSchema;
51
+ //# sourceMappingURL=groupSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupSchema.js","sourceRoot":"","sources":["../../src/linter/groupSchema.ts"],"names":[],"mappings":";;;AAAA,yBAA2B;AAK3B,SAAgB,iBAAiB,CAC/B,aAA4B,EAC5B,UAAsB,EACtB,oBAA8B;;IAE9B,IAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC;QAChC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACpC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;aACf,KAAK,CACJ,GAAG,CAAC,MAAM,CAAC;YACT,OAAO,EAAE,CAAA,KAAA,GAAG,CAAC,MAAM,EAAE,CAAA,CAAC,KAAK,WAAI,oBAAoB,CAAC;YACpD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;SACtD,CAAC,CACH;aACA,MAAM,CAAC,UAAU,KAAK;YACrB,IAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,IAAI,IAAK,OAAA,GAAG,GAAG,IAAI,CAAC,UAAU,EAArB,CAAqB,EAAE,CAAC,CAAC,CAAC;YAE9E,IAAI,eAAe,KAAK,GAAG,EAAE;gBAC3B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;aAChD;YAED,KAAmB,UAAK,EAAL,eAAK,EAAL,mBAAK,EAAL,IAAK,EAAE;gBAArB,IAAM,IAAI,cAAA;gBACb,IAAM,oBAAoB,GAAG,IAAI,CAAC,UAAU,CAAC;gBAE7C,IAAI,IAAI,CAAC,OAAO,EAAE;oBAChB,IAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;oBAChC,IAAM,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;oBAErE,IAAI,CAAC,aAAa,EAAE;wBAClB,MAAM,IAAI,KAAK,CAAC,kBAAW,UAAU,eAAY,CAAC,CAAC;qBACpD;oBAED,IAAM,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;oBAEzD,IAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;oBAChE,KAA6B,UAAe,EAAf,mCAAe,EAAf,6BAAe,EAAf,IAAe,EAAE;wBAAzC,IAAM,cAAc,wBAAA;wBACvB,IAAM,WAAW,GAAG,aAAa,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;wBAC/D,IAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;wBAEhC,KAAmB,UAAK,EAAL,eAAK,EAAL,mBAAK,EAAL,IAAK,EAAE;4BAArB,IAAM,IAAI,cAAA;4BACb,IAAI,IAAI,CAAC,UAAU,GAAG,oBAAoB,EAAE;gCAC1C,qFAAqF;gCACrF,MAAM,IAAI,KAAK,CACb,kBAAW,UAAU,qBAAW,IAAI,CAAC,GAAG,iBAAO,cAAc,kCAAwB,IAAI,CAAC,UAAU,8DAAoD,oBAAoB,kBAAe,CAC5L,CAAC;6BACH;yBACF;qBACF;iBACF;aACF;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;aACD,QAAQ,EAAE;KACd,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAzDD,8CAyDC"}
@@ -0,0 +1,2 @@
1
+ import { ProjectConfig } from "../config";
2
+ export declare function lintProject(projectConfig: ProjectConfig): Promise<boolean>;