@featurevisor/core 0.51.0 → 0.51.2

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 (110) hide show
  1. package/.eslintcache +1 -1
  2. package/CHANGELOG.md +16 -0
  3. package/coverage/clover.xml +8 -8
  4. package/coverage/coverage-final.json +4 -4
  5. package/coverage/lcov-report/index.html +3 -3
  6. package/coverage/lcov-report/lib/{allocator.js.html → builder/allocator.js.html} +10 -10
  7. package/coverage/lcov-report/lib/{index.html → builder/index.html} +10 -10
  8. package/coverage/lcov-report/lib/{traffic.js.html → builder/traffic.js.html} +10 -10
  9. package/coverage/lcov-report/src/{allocator.ts.html → builder/allocator.ts.html} +10 -10
  10. package/coverage/lcov-report/src/{index.html → builder/index.html} +10 -10
  11. package/coverage/lcov-report/src/{traffic.ts.html → builder/traffic.ts.html} +10 -10
  12. package/coverage/lcov.info +4 -4
  13. package/lib/builder/allocator.js.map +1 -0
  14. package/lib/builder/allocator.spec.js.map +1 -0
  15. package/lib/builder/buildDatafile.d.ts +11 -0
  16. package/lib/{builder.js → builder/buildDatafile.js} +5 -106
  17. package/lib/builder/buildDatafile.js.map +1 -0
  18. package/lib/builder/buildProject.d.ts +8 -0
  19. package/lib/builder/buildProject.js +63 -0
  20. package/lib/builder/buildProject.js.map +1 -0
  21. package/lib/builder/getFeatureRanges.d.ts +11 -0
  22. package/lib/builder/getFeatureRanges.js +50 -0
  23. package/lib/builder/getFeatureRanges.js.map +1 -0
  24. package/lib/builder/index.d.ts +2 -0
  25. package/lib/builder/index.js +19 -0
  26. package/lib/builder/index.js.map +1 -0
  27. package/lib/builder/traffic.js.map +1 -0
  28. package/lib/builder/traffic.spec.js.map +1 -0
  29. package/lib/datasource/index.d.ts +2 -0
  30. package/lib/datasource/index.js +19 -0
  31. package/lib/datasource/index.js.map +1 -0
  32. package/lib/generate-code/index.js +1 -1
  33. package/lib/generate-code/index.js.map +1 -1
  34. package/lib/generate-code/typescript.d.ts +1 -1
  35. package/lib/linter/attributeSchema.d.ts +2 -0
  36. package/lib/linter/attributeSchema.js +15 -0
  37. package/lib/linter/attributeSchema.js.map +1 -0
  38. package/lib/linter/checkCircularDependency.d.ts +3 -0
  39. package/lib/linter/checkCircularDependency.js +30 -0
  40. package/lib/linter/checkCircularDependency.js.map +1 -0
  41. package/lib/linter/conditionSchema.d.ts +3 -0
  42. package/lib/linter/conditionSchema.js +44 -0
  43. package/lib/linter/conditionSchema.js.map +1 -0
  44. package/lib/linter/featureSchema.d.ts +3 -0
  45. package/lib/linter/featureSchema.js +147 -0
  46. package/lib/linter/featureSchema.js.map +1 -0
  47. package/lib/linter/groupSchema.d.ts +4 -0
  48. package/lib/linter/groupSchema.js +51 -0
  49. package/lib/linter/groupSchema.js.map +1 -0
  50. package/lib/linter/index.d.ts +1 -0
  51. package/lib/linter/index.js +18 -0
  52. package/lib/linter/index.js.map +1 -0
  53. package/lib/linter/lintProject.d.ts +2 -0
  54. package/lib/linter/lintProject.js +241 -0
  55. package/lib/linter/lintProject.js.map +1 -0
  56. package/lib/linter/printJoiError.d.ts +2 -0
  57. package/lib/linter/printJoiError.js +14 -0
  58. package/lib/linter/printJoiError.js.map +1 -0
  59. package/lib/linter/segmentSchema.d.ts +3 -0
  60. package/lib/linter/segmentSchema.js +14 -0
  61. package/lib/linter/segmentSchema.js.map +1 -0
  62. package/lib/linter/testSchema.d.ts +3 -0
  63. package/lib/linter/testSchema.js +33 -0
  64. package/lib/linter/testSchema.js.map +1 -0
  65. package/lib/site.js +1 -1
  66. package/lib/site.js.map +1 -1
  67. package/lib/tester.js +1 -1
  68. package/lib/tester.js.map +1 -1
  69. package/package.json +2 -2
  70. package/src/{builder.ts → builder/buildDatafile.ts} +5 -148
  71. package/src/builder/buildProject.ts +95 -0
  72. package/src/builder/getFeatureRanges.ts +61 -0
  73. package/src/builder/index.ts +2 -0
  74. package/src/datasource/index.ts +2 -0
  75. package/src/generate-code/index.ts +1 -1
  76. package/src/generate-code/typescript.ts +1 -1
  77. package/src/linter/attributeSchema.ts +12 -0
  78. package/src/linter/checkCircularDependency.ts +45 -0
  79. package/src/linter/conditionSchema.ts +85 -0
  80. package/src/linter/featureSchema.ts +205 -0
  81. package/src/linter/groupSchema.ts +63 -0
  82. package/src/linter/index.ts +1 -0
  83. package/src/linter/lintProject.ts +179 -0
  84. package/src/linter/printJoiError.ts +11 -0
  85. package/src/linter/segmentSchema.ts +13 -0
  86. package/src/linter/testSchema.ts +43 -0
  87. package/src/site.ts +1 -1
  88. package/src/tester.ts +1 -1
  89. package/lib/allocator.js.map +0 -1
  90. package/lib/allocator.spec.js.map +0 -1
  91. package/lib/builder.d.ts +0 -26
  92. package/lib/builder.js.map +0 -1
  93. package/lib/linter.d.ts +0 -11
  94. package/lib/linter.js +0 -542
  95. package/lib/linter.js.map +0 -1
  96. package/lib/traffic.js.map +0 -1
  97. package/lib/traffic.spec.js.map +0 -1
  98. package/src/linter.ts +0 -627
  99. /package/lib/{allocator.d.ts → builder/allocator.d.ts} +0 -0
  100. /package/lib/{allocator.js → builder/allocator.js} +0 -0
  101. /package/lib/{allocator.spec.d.ts → builder/allocator.spec.d.ts} +0 -0
  102. /package/lib/{allocator.spec.js → builder/allocator.spec.js} +0 -0
  103. /package/lib/{traffic.d.ts → builder/traffic.d.ts} +0 -0
  104. /package/lib/{traffic.js → builder/traffic.js} +0 -0
  105. /package/lib/{traffic.spec.d.ts → builder/traffic.spec.d.ts} +0 -0
  106. /package/lib/{traffic.spec.js → builder/traffic.spec.js} +0 -0
  107. /package/src/{allocator.spec.ts → builder/allocator.spec.ts} +0 -0
  108. /package/src/{allocator.ts → builder/allocator.ts} +0 -0
  109. /package/src/{traffic.spec.ts → builder/traffic.spec.ts} +0 -0
  110. /package/src/{traffic.ts → builder/traffic.ts} +0 -0
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./datasource"), exports);
18
+ __exportStar(require("./parsers"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/datasource/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,4CAA0B"}
@@ -4,7 +4,7 @@ exports.generateCodeForProject = exports.ALLOWED_LANGUAGES_FOR_CODE_GENERATION =
4
4
  var fs = require("fs");
5
5
  var path = require("path");
6
6
  var mkdirp = require("mkdirp");
7
- var datasource_1 = require("../datasource/datasource");
7
+ var datasource_1 = require("../datasource");
8
8
  var typescript_1 = require("./typescript");
9
9
  exports.ALLOWED_LANGUAGES_FOR_CODE_GENERATION = ["typescript"];
10
10
  function generateCodeForProject(rootDirectoryPath, projectConfig, cliOptions) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generate-code/index.ts"],"names":[],"mappings":";;;AAAA,uBAAyB;AACzB,2BAA6B;AAE7B,+BAAiC;AAGjC,uDAAsD;AACtD,2CAAgE;AAEnD,QAAA,qCAAqC,GAAG,CAAC,YAAY,CAAC,CAAC;AAOpE,SAAgB,sBAAsB,CACpC,iBAAiB,EACjB,aAA4B,EAC5B,UAAkC;IAElC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;QACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;KACpD;IAED,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;KACnD;IAED,IAAM,UAAU,GAAG,IAAI,uBAAU,CAAC,aAAa,CAAC,CAAC;IAEjD,IAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAExE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,qCAA8B,YAAY,CAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KAC3B;SAAM;QACL,OAAO,CAAC,GAAG,CAAC,8CAAuC,YAAY,CAAE,CAAC,CAAC;KACpE;IAED,IAAI,CAAC,6CAAqC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QACxE,OAAO,CAAC,GAAG,CACT,8CAAuC,6CAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAE,CAC1F,CAAC;QAEF,MAAM,IAAI,KAAK,CAAC,mBAAY,UAAU,CAAC,QAAQ,0CAAuC,CAAC,CAAC;KACzF;IAED,IAAI,UAAU,CAAC,QAAQ,KAAK,YAAY,EAAE;QACxC,OAAO,IAAA,6CAAgC,EACrC,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,YAAY,CACb,CAAC;KACH;IAED,MAAM,IAAI,KAAK,CAAC,mBAAY,UAAU,CAAC,QAAQ,sBAAmB,CAAC,CAAC;AACtE,CAAC;AA1CD,wDA0CC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generate-code/index.ts"],"names":[],"mappings":";;;AAAA,uBAAyB;AACzB,2BAA6B;AAE7B,+BAAiC;AAGjC,4CAA2C;AAC3C,2CAAgE;AAEnD,QAAA,qCAAqC,GAAG,CAAC,YAAY,CAAC,CAAC;AAOpE,SAAgB,sBAAsB,CACpC,iBAAiB,EACjB,aAA4B,EAC5B,UAAkC;IAElC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;QACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;KACpD;IAED,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;KACnD;IAED,IAAM,UAAU,GAAG,IAAI,uBAAU,CAAC,aAAa,CAAC,CAAC;IAEjD,IAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAExE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,qCAA8B,YAAY,CAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KAC3B;SAAM;QACL,OAAO,CAAC,GAAG,CAAC,8CAAuC,YAAY,CAAE,CAAC,CAAC;KACpE;IAED,IAAI,CAAC,6CAAqC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QACxE,OAAO,CAAC,GAAG,CACT,8CAAuC,6CAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAE,CAC1F,CAAC;QAEF,MAAM,IAAI,KAAK,CAAC,mBAAY,UAAU,CAAC,QAAQ,0CAAuC,CAAC,CAAC;KACzF;IAED,IAAI,UAAU,CAAC,QAAQ,KAAK,YAAY,EAAE;QACxC,OAAO,IAAA,6CAAgC,EACrC,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,YAAY,CACb,CAAC;KACH;IAED,MAAM,IAAI,KAAK,CAAC,mBAAY,UAAU,CAAC,QAAQ,sBAAmB,CAAC,CAAC;AACtE,CAAC;AA1CD,wDA0CC"}
@@ -1,3 +1,3 @@
1
1
  import { ProjectConfig } from "../config";
2
- import { Datasource } from "../datasource/datasource";
2
+ import { Datasource } from "../datasource";
3
3
  export declare function generateTypeScriptCodeForProject(rootDirectoryPath: string, projectConfig: ProjectConfig, datasource: Datasource, outputPath: string): void;
@@ -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";
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";
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 @@
1
+ export * from "./lintProject";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./lintProject"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/linter/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B"}
@@ -0,0 +1,2 @@
1
+ import { ProjectConfig } from "../config";
2
+ export declare function lintProject(projectConfig: ProjectConfig): Promise<boolean>;