@featurevisor/core 2.26.1 → 3.0.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.
- package/CHANGELOG.md +8 -0
- package/coverage/clover.xml +4991 -3130
- package/coverage/coverage-final.json +63 -39
- package/coverage/lcov-report/block-navigation.js +1 -1
- package/coverage/lcov-report/index.html +248 -98
- package/coverage/lcov-report/sorter.js +21 -7
- package/coverage/lcov-report/src/assess-distribution/index.html +116 -0
- package/coverage/lcov-report/src/assess-distribution/index.ts.html +754 -0
- package/coverage/lcov-report/{list → src/benchmark}/index.html +30 -30
- package/coverage/lcov-report/src/benchmark/index.ts.html +793 -0
- package/coverage/lcov-report/{builder → src/builder}/allocator.ts.html +38 -38
- package/coverage/lcov-report/{builder/buildScopedConditions.ts.html → src/builder/applyContextToConditions.ts.html} +80 -65
- package/coverage/lcov-report/{builder/buildScopedDatafile.ts.html → src/builder/applyContextToDatafile.ts.html} +92 -92
- package/coverage/lcov-report/{builder/buildScopedSegments.ts.html → src/builder/applyContextToSegments.ts.html} +103 -67
- package/coverage/lcov-report/{builder → src/builder}/buildDatafile.ts.html +336 -306
- package/coverage/lcov-report/src/builder/buildProject.ts.html +1117 -0
- package/coverage/lcov-report/src/builder/buildRuntimeDatafiles.ts.html +256 -0
- package/coverage/lcov-report/{builder → src/builder}/getFeatureRanges.ts.html +22 -22
- package/coverage/lcov-report/{builder → src/builder}/hashes.ts.html +50 -50
- package/coverage/lcov-report/{builder → src/builder}/index.html +114 -84
- package/coverage/lcov-report/{tester/cliFormat.ts.html → src/builder/index.ts.html} +17 -29
- package/coverage/lcov-report/{builder → src/builder}/mutateVariables.ts.html +55 -55
- package/coverage/lcov-report/{builder → src/builder}/mutator.ts.html +118 -118
- package/coverage/lcov-report/{builder → src/builder}/revision.ts.html +15 -15
- package/coverage/lcov-report/{builder → src/builder}/traffic.ts.html +86 -86
- package/coverage/lcov-report/src/cli/cli.ts.html +400 -0
- package/coverage/lcov-report/{tester → src/cli}/index.html +41 -41
- package/coverage/lcov-report/src/cli/plugins.ts.html +214 -0
- package/coverage/lcov-report/{config → src/config}/index.html +31 -31
- package/coverage/lcov-report/{config → src/config}/index.ts.html +12 -12
- package/coverage/lcov-report/{config → src/config}/projectConfig.ts.html +312 -96
- package/coverage/lcov-report/{datasource → src/datasource}/adapter.ts.html +28 -73
- package/coverage/lcov-report/{datasource → src/datasource}/datasource.ts.html +191 -104
- package/coverage/lcov-report/{datasource → src/datasource}/filesystemAdapter.ts.html +233 -635
- package/coverage/lcov-report/{datasource → src/datasource}/index.html +48 -48
- package/coverage/lcov-report/{datasource → src/datasource}/index.ts.html +14 -14
- package/coverage/lcov-report/src/evaluate/index.html +116 -0
- package/coverage/lcov-report/src/evaluate/index.ts.html +814 -0
- package/coverage/lcov-report/src/find-duplicate-segments/findDuplicateSegments.ts.html +313 -0
- package/coverage/lcov-report/src/find-duplicate-segments/index.html +131 -0
- package/coverage/lcov-report/src/find-duplicate-segments/index.ts.html +307 -0
- package/coverage/lcov-report/src/find-usage/index.html +116 -0
- package/coverage/lcov-report/src/find-usage/index.ts.html +1780 -0
- package/coverage/lcov-report/src/generate-code/index.html +131 -0
- package/coverage/lcov-report/src/generate-code/index.ts.html +403 -0
- package/coverage/lcov-report/{generate-code → src/generate-code}/typescript.ts.html +266 -1361
- package/coverage/lcov-report/{generate-code → src}/index.html +38 -23
- package/coverage/lcov-report/src/info/index.html +116 -0
- package/coverage/lcov-report/src/info/index.ts.html +472 -0
- package/coverage/lcov-report/src/init/index.html +116 -0
- package/coverage/lcov-report/src/init/index.ts.html +280 -0
- package/coverage/lcov-report/{linter → src/linter}/attributeSchema.ts.html +160 -157
- package/coverage/lcov-report/{linter → src/linter}/checkCircularDependency.ts.html +25 -25
- package/coverage/lcov-report/{linter → src/linter}/checkPercentageExceedingSlot.ts.html +42 -42
- package/coverage/lcov-report/{linter → src/linter}/conditionSchema.ts.html +207 -207
- package/coverage/lcov-report/{linter → src/linter}/featureSchema.ts.html +462 -471
- package/coverage/lcov-report/{linter → src/linter}/groupSchema.ts.html +25 -22
- package/coverage/lcov-report/{linter → src/linter}/index.html +129 -99
- package/coverage/lcov-report/src/linter/index.ts.html +88 -0
- package/coverage/lcov-report/{linter → src/linter}/lintProject.ts.html +740 -332
- package/coverage/lcov-report/{linter → src/linter}/mutationNotation.ts.html +130 -130
- package/coverage/lcov-report/{linter → src/linter}/printError.ts.html +27 -27
- package/coverage/lcov-report/{linter → src/linter}/schema.ts.html +153 -150
- package/coverage/lcov-report/{linter → src/linter}/segmentSchema.ts.html +18 -15
- package/coverage/lcov-report/src/linter/targetSchema.ts.html +223 -0
- package/coverage/lcov-report/{linter → src/linter}/testSchema.ts.html +54 -48
- package/coverage/lcov-report/{linter → src/linter}/zodHelpers.ts.html +17 -17
- package/coverage/lcov-report/src/list/index.html +131 -0
- package/coverage/lcov-report/src/list/index.ts.html +2065 -0
- package/coverage/lcov-report/{list → src/list}/matrix.ts.html +43 -58
- package/coverage/lcov-report/src/promoter/index.html +116 -0
- package/coverage/lcov-report/src/promoter/index.ts.html +3883 -0
- package/coverage/lcov-report/src/sets.ts.html +313 -0
- package/coverage/lcov-report/src/targeting.ts.html +403 -0
- package/coverage/lcov-report/src/tester/cliFormat.ts.html +133 -0
- package/coverage/lcov-report/{tester → src/tester}/helpers.ts.html +15 -15
- package/coverage/lcov-report/src/tester/index.html +206 -0
- package/coverage/lcov-report/src/tester/prettyDuration.ts.html +187 -0
- package/coverage/lcov-report/src/tester/printTestResult.ts.html +337 -0
- package/coverage/lcov-report/src/tester/testFeature.ts.html +1186 -0
- package/coverage/lcov-report/src/tester/testProject.ts.html +1018 -0
- package/coverage/lcov-report/src/tester/testSegment.ts.html +316 -0
- package/coverage/lcov-report/{utils → src/utils}/extractKeys.ts.html +68 -68
- package/coverage/lcov-report/{utils → src/utils}/git.ts.html +44 -68
- package/coverage/lcov-report/{utils → src/utils}/index.html +44 -44
- package/coverage/lcov-report/{utils → src/utils}/index.ts.html +14 -14
- package/coverage/lcov-report/{utils → src/utils}/pretty.ts.html +20 -20
- package/coverage/lcov.info +10121 -5723
- package/jest.config.js +13 -4
- package/lib/assess-distribution/index.d.ts +1 -1
- package/lib/assess-distribution/index.js +59 -40
- package/lib/assess-distribution/index.js.map +1 -1
- package/lib/benchmark/index.d.ts +8 -5
- package/lib/benchmark/index.js +82 -65
- package/lib/benchmark/index.js.map +1 -1
- package/lib/builder/applyContextToConditions.d.ts +5 -0
- package/lib/builder/{buildScopedConditions.js → applyContextToConditions.js} +19 -14
- package/lib/builder/applyContextToConditions.js.map +1 -0
- package/lib/builder/applyContextToDatafile.d.ts +2 -0
- package/lib/builder/{buildScopedDatafile.js → applyContextToDatafile.js} +26 -26
- package/lib/builder/applyContextToDatafile.js.map +1 -0
- package/lib/builder/applyContextToSegments.d.ts +5 -0
- package/lib/builder/{buildScopedSegments.js → applyContextToSegments.js} +19 -14
- package/lib/builder/applyContextToSegments.js.map +1 -0
- package/lib/builder/buildDatafile.d.ts +9 -6
- package/lib/builder/buildDatafile.js +86 -51
- package/lib/builder/buildDatafile.js.map +1 -1
- package/lib/builder/buildProject.d.ts +17 -3
- package/lib/builder/buildProject.js +151 -59
- package/lib/builder/buildProject.js.map +1 -1
- package/lib/builder/buildRuntimeDatafiles.d.ts +12 -0
- package/lib/builder/buildRuntimeDatafiles.js +35 -0
- package/lib/builder/buildRuntimeDatafiles.js.map +1 -0
- package/lib/builder/getFeatureRanges.js +34 -1
- package/lib/builder/getFeatureRanges.js.map +1 -1
- package/lib/builder/hashes.js +34 -1
- package/lib/builder/hashes.js.map +1 -1
- package/lib/builder/index.d.ts +0 -1
- package/lib/builder/index.js +0 -1
- package/lib/builder/index.js.map +1 -1
- package/lib/cli/cli.js +0 -4
- package/lib/cli/cli.js.map +1 -1
- package/lib/cli/plugins.js +7 -2
- package/lib/cli/plugins.js.map +1 -1
- package/lib/config/projectConfig.d.ts +17 -17
- package/lib/config/projectConfig.js +101 -15
- package/lib/config/projectConfig.js.map +1 -1
- package/lib/datasource/adapter.d.ts +7 -9
- package/lib/datasource/adapter.js +0 -7
- package/lib/datasource/adapter.js.map +1 -1
- package/lib/datasource/datasource.d.ts +15 -5
- package/lib/datasource/datasource.js +37 -9
- package/lib/datasource/datasource.js.map +1 -1
- package/lib/datasource/filesystemAdapter.d.ts +4 -10
- package/lib/datasource/filesystemAdapter.js +111 -149
- package/lib/datasource/filesystemAdapter.js.map +1 -1
- package/lib/evaluate/index.d.ts +1 -7
- package/lib/evaluate/index.js +81 -67
- package/lib/evaluate/index.js.map +1 -1
- package/lib/find-duplicate-segments/findDuplicateSegments.js +34 -1
- package/lib/find-duplicate-segments/findDuplicateSegments.js.map +1 -1
- package/lib/find-duplicate-segments/index.js +21 -13
- package/lib/find-duplicate-segments/index.js.map +1 -1
- package/lib/find-usage/index.js +57 -41
- package/lib/find-usage/index.js.map +1 -1
- package/lib/generate-code/index.d.ts +1 -1
- package/lib/generate-code/index.js +64 -21
- package/lib/generate-code/index.js.map +1 -1
- package/lib/generate-code/typescript.d.ts +1 -1
- package/lib/generate-code/typescript.js +59 -333
- package/lib/generate-code/typescript.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/info/index.js +57 -16
- package/lib/info/index.js.map +1 -1
- package/lib/init/index.d.ts +2 -2
- package/lib/init/index.js +39 -3
- package/lib/init/index.js.map +1 -1
- package/lib/linter/attributeSchema.d.ts +1 -0
- package/lib/linter/attributeSchema.js +1 -0
- package/lib/linter/attributeSchema.js.map +1 -1
- package/lib/linter/conditionSchema.js +5 -5
- package/lib/linter/conditionSchema.js.map +1 -1
- package/lib/linter/featureSchema.d.ts +4 -1
- package/lib/linter/featureSchema.js +15 -13
- package/lib/linter/featureSchema.js.map +1 -1
- package/lib/linter/groupSchema.d.ts +1 -0
- package/lib/linter/groupSchema.js +1 -0
- package/lib/linter/groupSchema.js.map +1 -1
- package/lib/linter/lintProject.d.ts +1 -3
- package/lib/linter/lintProject.js +198 -68
- package/lib/linter/lintProject.js.map +1 -1
- package/lib/linter/schema.js +1 -0
- package/lib/linter/schema.js.map +1 -1
- package/lib/linter/segmentSchema.d.ts +1 -0
- package/lib/linter/segmentSchema.js +1 -0
- package/lib/linter/segmentSchema.js.map +1 -1
- package/lib/linter/targetSchema.d.ts +16 -0
- package/lib/linter/targetSchema.js +40 -0
- package/lib/linter/targetSchema.js.map +1 -0
- package/lib/linter/testSchema.d.ts +4 -3
- package/lib/linter/testSchema.js +9 -4
- package/lib/linter/testSchema.js.map +1 -1
- package/lib/list/index.d.ts +1 -0
- package/lib/list/index.js +131 -12
- package/lib/list/index.js.map +1 -1
- package/lib/list/matrix.js +3 -7
- package/lib/list/matrix.js.map +1 -1
- package/lib/promoter/index.d.ts +50 -0
- package/lib/promoter/index.js +880 -0
- package/lib/promoter/index.js.map +1 -0
- package/lib/sets.d.ts +11 -0
- package/lib/sets.js +81 -0
- package/lib/sets.js.map +1 -0
- package/lib/targeting.d.ts +14 -0
- package/lib/targeting.js +82 -0
- package/lib/targeting.js.map +1 -0
- package/lib/tester/cliFormat.d.ts +7 -1
- package/lib/tester/cliFormat.js +11 -2
- package/lib/tester/cliFormat.js.map +1 -1
- package/lib/tester/printTestResult.js +2 -2
- package/lib/tester/printTestResult.js.map +1 -1
- package/lib/tester/testFeature.d.ts +0 -1
- package/lib/tester/testFeature.js +8 -25
- package/lib/tester/testFeature.js.map +1 -1
- package/lib/tester/testProject.d.ts +2 -3
- package/lib/tester/testProject.js +93 -86
- package/lib/tester/testProject.js.map +1 -1
- package/lib/tester/testSegment.d.ts +1 -1
- package/lib/tester/testSegment.js +3 -21
- package/lib/tester/testSegment.js.map +1 -1
- package/lib/utils/git.js +45 -19
- package/lib/utils/git.js.map +1 -1
- package/package.json +12 -12
- package/src/assess-distribution/index.ts +72 -52
- package/src/benchmark/index.ts +124 -91
- package/src/builder/{buildScopedConditions.spec.ts → applyContextToConditions.spec.ts} +160 -142
- package/src/builder/{buildScopedConditions.ts → applyContextToConditions.ts} +19 -14
- package/src/builder/{buildScopedDatafile.spec.ts → applyContextToDatafile.spec.ts} +141 -81
- package/src/builder/{buildScopedDatafile.ts → applyContextToDatafile.ts} +33 -33
- package/src/builder/{buildScopedSegments.spec.ts → applyContextToSegments.spec.ts} +171 -151
- package/src/builder/{buildScopedSegments.ts → applyContextToSegments.ts} +26 -14
- package/src/builder/buildDatafile.spec.ts +192 -14
- package/src/builder/buildDatafile.ts +74 -64
- package/src/builder/buildProject.ts +171 -86
- package/src/builder/buildRuntimeDatafiles.ts +57 -0
- package/src/builder/index.ts +0 -1
- package/src/cli/cli.ts +0 -5
- package/src/cli/plugins.ts +7 -2
- package/src/config/projectConfig.spec.ts +171 -8
- package/src/config/projectConfig.ts +100 -28
- package/src/datasource/adapter.ts +8 -23
- package/src/datasource/datasource.ts +50 -21
- package/src/datasource/filesystemAdapter.spec.ts +133 -74
- package/src/datasource/filesystemAdapter.ts +93 -227
- package/src/evaluate/index.ts +109 -97
- package/src/find-duplicate-segments/index.ts +34 -16
- package/src/find-usage/index.ts +89 -44
- package/src/generate-code/index.ts +36 -24
- package/src/generate-code/typescript.spec.ts +106 -0
- package/src/generate-code/typescript.ts +33 -398
- package/src/index.ts +2 -1
- package/src/info/index.ts +72 -16
- package/src/init/index.ts +1 -1
- package/src/linter/attributeSchema.ts +1 -0
- package/src/linter/conditionSchema.spec.ts +23 -3
- package/src/linter/conditionSchema.ts +5 -5
- package/src/linter/featureSchema.spec.ts +107 -18
- package/src/linter/featureSchema.ts +25 -28
- package/src/linter/groupSchema.ts +1 -0
- package/src/linter/lintProject.spec.ts +131 -92
- package/src/linter/lintProject.ts +233 -97
- package/src/linter/schema.ts +1 -0
- package/src/linter/segmentSchema.spec.ts +5 -3
- package/src/linter/segmentSchema.ts +1 -0
- package/src/linter/targetSchema.spec.ts +159 -0
- package/src/linter/targetSchema.ts +46 -0
- package/src/linter/testSchema.spec.ts +70 -5
- package/src/linter/testSchema.ts +12 -10
- package/src/list/index.spec.ts +135 -0
- package/src/list/index.ts +188 -12
- package/src/list/matrix.ts +3 -8
- package/src/promoter/index.spec.ts +617 -0
- package/src/promoter/index.ts +1266 -0
- package/src/sets.ts +76 -0
- package/src/targeting.spec.ts +74 -0
- package/src/targeting.ts +106 -0
- package/src/tester/cliFormat.ts +11 -1
- package/src/tester/printTestResult.ts +12 -3
- package/src/tester/testFeature.ts +10 -36
- package/src/tester/testProject.spec.ts +50 -0
- package/src/tester/testProject.ts +89 -140
- package/src/tester/testSegment.ts +5 -22
- package/src/utils/git.ts +13 -21
- package/tsconfig.cjs.json +5 -1
- package/tsconfig.typecheck.json +9 -0
- package/coverage/lcov-report/builder/convertToV1.ts.html +0 -583
- package/lib/builder/allocator.spec.d.ts +0 -1
- package/lib/builder/allocator.spec.js +0 -85
- package/lib/builder/allocator.spec.js.map +0 -1
- package/lib/builder/buildDatafile.spec.d.ts +0 -1
- package/lib/builder/buildDatafile.spec.js +0 -233
- package/lib/builder/buildDatafile.spec.js.map +0 -1
- package/lib/builder/buildScopedConditions.d.ts +0 -5
- package/lib/builder/buildScopedConditions.js.map +0 -1
- package/lib/builder/buildScopedConditions.spec.d.ts +0 -1
- package/lib/builder/buildScopedConditions.spec.js +0 -2167
- package/lib/builder/buildScopedConditions.spec.js.map +0 -1
- package/lib/builder/buildScopedDatafile.d.ts +0 -2
- package/lib/builder/buildScopedDatafile.js.map +0 -1
- package/lib/builder/buildScopedDatafile.spec.d.ts +0 -1
- package/lib/builder/buildScopedDatafile.spec.js +0 -2277
- package/lib/builder/buildScopedDatafile.spec.js.map +0 -1
- package/lib/builder/buildScopedSegments.d.ts +0 -5
- package/lib/builder/buildScopedSegments.js.map +0 -1
- package/lib/builder/buildScopedSegments.spec.d.ts +0 -1
- package/lib/builder/buildScopedSegments.spec.js +0 -1062
- package/lib/builder/buildScopedSegments.spec.js.map +0 -1
- package/lib/builder/convertToV1.d.ts +0 -10
- package/lib/builder/convertToV1.js +0 -119
- package/lib/builder/convertToV1.js.map +0 -1
- package/lib/builder/mutateVariables.spec.d.ts +0 -1
- package/lib/builder/mutateVariables.spec.js +0 -1074
- package/lib/builder/mutateVariables.spec.js.map +0 -1
- package/lib/builder/mutator.spec.d.ts +0 -1
- package/lib/builder/mutator.spec.js +0 -368
- package/lib/builder/mutator.spec.js.map +0 -1
- package/lib/builder/revision.spec.d.ts +0 -1
- package/lib/builder/revision.spec.js +0 -21
- package/lib/builder/revision.spec.js.map +0 -1
- package/lib/builder/traffic.spec.d.ts +0 -1
- package/lib/builder/traffic.spec.js +0 -872
- package/lib/builder/traffic.spec.js.map +0 -1
- package/lib/config/projectConfig.spec.d.ts +0 -1
- package/lib/config/projectConfig.spec.js +0 -24
- package/lib/config/projectConfig.spec.js.map +0 -1
- package/lib/datasource/filesystemAdapter.spec.d.ts +0 -1
- package/lib/datasource/filesystemAdapter.spec.js +0 -88
- package/lib/datasource/filesystemAdapter.spec.js.map +0 -1
- package/lib/generate-code/typescript.spec.d.ts +0 -1
- package/lib/generate-code/typescript.spec.js +0 -78
- package/lib/generate-code/typescript.spec.js.map +0 -1
- package/lib/linter/attributeSchema.spec.d.ts +0 -1
- package/lib/linter/attributeSchema.spec.js +0 -266
- package/lib/linter/attributeSchema.spec.js.map +0 -1
- package/lib/linter/conditionSchema.spec.d.ts +0 -1
- package/lib/linter/conditionSchema.spec.js +0 -380
- package/lib/linter/conditionSchema.spec.js.map +0 -1
- package/lib/linter/featureSchema.spec.d.ts +0 -1
- package/lib/linter/featureSchema.spec.js +0 -1552
- package/lib/linter/featureSchema.spec.js.map +0 -1
- package/lib/linter/lintProject.spec.d.ts +0 -1
- package/lib/linter/lintProject.spec.js +0 -211
- package/lib/linter/lintProject.spec.js.map +0 -1
- package/lib/linter/mutationNotation.spec.d.ts +0 -1
- package/lib/linter/mutationNotation.spec.js +0 -598
- package/lib/linter/mutationNotation.spec.js.map +0 -1
- package/lib/linter/schema.spec.d.ts +0 -1
- package/lib/linter/schema.spec.js +0 -535
- package/lib/linter/schema.spec.js.map +0 -1
- package/lib/linter/segmentSchema.spec.d.ts +0 -1
- package/lib/linter/segmentSchema.spec.js +0 -303
- package/lib/linter/segmentSchema.spec.js.map +0 -1
- package/lib/linter/testSchema.spec.d.ts +0 -1
- package/lib/linter/testSchema.spec.js +0 -162
- package/lib/linter/testSchema.spec.js.map +0 -1
- package/lib/list/matrix.spec.d.ts +0 -1
- package/lib/list/matrix.spec.js +0 -42
- package/lib/list/matrix.spec.js.map +0 -1
- package/lib/site/exportSite.d.ts +0 -2
- package/lib/site/exportSite.js +0 -30
- package/lib/site/exportSite.js.map +0 -1
- package/lib/site/generateHistory.d.ts +0 -3
- package/lib/site/generateHistory.js +0 -31
- package/lib/site/generateHistory.js.map +0 -1
- package/lib/site/generateSiteSearchIndex.d.ts +0 -4
- package/lib/site/generateSiteSearchIndex.js +0 -195
- package/lib/site/generateSiteSearchIndex.js.map +0 -1
- package/lib/site/getLastModifiedFromHistory.d.ts +0 -2
- package/lib/site/getLastModifiedFromHistory.js +0 -18
- package/lib/site/getLastModifiedFromHistory.js.map +0 -1
- package/lib/site/getOwnerAndRepoFromUrl.d.ts +0 -4
- package/lib/site/getOwnerAndRepoFromUrl.js +0 -20
- package/lib/site/getOwnerAndRepoFromUrl.js.map +0 -1
- package/lib/site/getRelativePaths.d.ts +0 -6
- package/lib/site/getRelativePaths.js +0 -15
- package/lib/site/getRelativePaths.js.map +0 -1
- package/lib/site/getRepoDetails.d.ts +0 -8
- package/lib/site/getRepoDetails.js +0 -48
- package/lib/site/getRepoDetails.js.map +0 -1
- package/lib/site/index.d.ts +0 -2
- package/lib/site/index.js +0 -43
- package/lib/site/index.js.map +0 -1
- package/lib/site/serveSite.d.ts +0 -2
- package/lib/site/serveSite.js +0 -54
- package/lib/site/serveSite.js.map +0 -1
- package/lib/tester/helpers.spec.d.ts +0 -1
- package/lib/tester/helpers.spec.js +0 -115
- package/lib/tester/helpers.spec.js.map +0 -1
- package/src/builder/convertToV1.ts +0 -166
- package/src/site/exportSite.ts +0 -42
- package/src/site/generateHistory.ts +0 -40
- package/src/site/generateSiteSearchIndex.ts +0 -258
- package/src/site/getLastModifiedFromHistory.ts +0 -21
- package/src/site/getOwnerAndRepoFromUrl.ts +0 -17
- package/src/site/getRelativePaths.ts +0 -24
- package/src/site/getRepoDetails.ts +0 -62
- package/src/site/index.ts +0 -46
- package/src/site/serveSite.ts +0 -58
package/jest.config.js
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
module.exports = {
|
|
2
|
-
preset: "ts-jest",
|
|
3
2
|
bail: true,
|
|
4
3
|
transform: {
|
|
5
|
-
"^.+\\.
|
|
6
|
-
"
|
|
4
|
+
"^.+\\.[tj]sx?$": [
|
|
5
|
+
"@swc/jest",
|
|
7
6
|
{
|
|
8
|
-
|
|
7
|
+
jsc: { parser: { syntax: "typescript", tsx: true } },
|
|
8
|
+
module: { type: "commonjs" },
|
|
9
9
|
},
|
|
10
10
|
],
|
|
11
11
|
},
|
|
12
12
|
testMatch: ["<rootDir>/src/**/*.spec.ts"],
|
|
13
|
+
collectCoverageFrom: ["src/**/*.ts", "!src/**/*.spec.ts"],
|
|
14
|
+
coverageThreshold: {
|
|
15
|
+
global: {
|
|
16
|
+
statements: 58,
|
|
17
|
+
branches: 59,
|
|
18
|
+
functions: 63,
|
|
19
|
+
lines: 59,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
13
22
|
};
|
|
@@ -6,10 +6,10 @@ export interface AssessDistributionOptions {
|
|
|
6
6
|
feature: FeatureKey;
|
|
7
7
|
context: Context;
|
|
8
8
|
n: number;
|
|
9
|
-
schemaVersion?: string;
|
|
10
9
|
inflate?: number;
|
|
11
10
|
populateUuid?: AttributeKey[];
|
|
12
11
|
verbose?: boolean;
|
|
12
|
+
target?: string | string[];
|
|
13
13
|
}
|
|
14
14
|
export declare function assessDistribution(deps: Dependencies, options: AssessDistributionOptions): Promise<void>;
|
|
15
15
|
export declare const assessDistributionPlugin: Plugin;
|
|
@@ -4,9 +4,10 @@ exports.assessDistributionPlugin = void 0;
|
|
|
4
4
|
exports.assessDistribution = assessDistribution;
|
|
5
5
|
const crypto_1 = require("crypto");
|
|
6
6
|
const sdk_1 = require("@featurevisor/sdk");
|
|
7
|
-
const
|
|
8
|
-
const config_1 = require("../config");
|
|
7
|
+
const buildRuntimeDatafiles_1 = require("../builder/buildRuntimeDatafiles");
|
|
9
8
|
const utils_1 = require("../utils");
|
|
9
|
+
const sets_1 = require("../sets");
|
|
10
|
+
const cliFormat_1 = require("../tester/cliFormat");
|
|
10
11
|
const UUID_LENGTHS = [4, 2, 2, 2, 6];
|
|
11
12
|
function generateUUID() {
|
|
12
13
|
return UUID_LENGTHS.map((len) => (0, crypto_1.randomBytes)(len).toString("hex")).join("-");
|
|
@@ -28,7 +29,7 @@ function printCounts(evaluations, n, sort = true) {
|
|
|
28
29
|
const highestCount = Object.values(evaluations).reduce((acc, curr) => (curr > acc ? curr : acc), 0);
|
|
29
30
|
const prettyHighestCountLength = (0, utils_1.prettyNumber)(highestCount).length;
|
|
30
31
|
for (const [value, count] of entries) {
|
|
31
|
-
console.log(`
|
|
32
|
+
console.log(` ${(0, cliFormat_1.colorize)("•", cliFormat_1.CLI_COLOR_CYAN)} ${value}:`.padEnd(longestValueLength + 14, " "), `\t${(0, utils_1.prettyNumber)(count).padStart(prettyHighestCountLength, " ")}`, `\t${(0, utils_1.prettyPercentage)(count, n).padStart(7, " ")}`);
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
35
|
function createContext(providedContext, populateUuid) {
|
|
@@ -40,31 +41,23 @@ function createContext(providedContext, populateUuid) {
|
|
|
40
41
|
}
|
|
41
42
|
return context;
|
|
42
43
|
}
|
|
43
|
-
async function
|
|
44
|
-
|
|
45
|
-
console.log(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
console.log(
|
|
51
|
-
const existingState = await datasource.readState(options.environment || false);
|
|
52
|
-
const datafileContent = await (0, builder_1.buildDatafile)(projectConfig, datasource, {
|
|
53
|
-
schemaVersion: options.schemaVersion || config_1.SCHEMA_VERSION,
|
|
54
|
-
revision: "include-all-features",
|
|
55
|
-
environment: options.environment || false,
|
|
56
|
-
inflate: options.inflate,
|
|
57
|
-
}, existingState);
|
|
58
|
-
const datafileBuildDuration = Date.now() - datafileBuildStart;
|
|
59
|
-
console.log(`Datafile build duration: ${datafileBuildDuration}ms`);
|
|
44
|
+
async function assessDistributionWithDatafile(datafileContent, options, target) {
|
|
45
|
+
console.log("");
|
|
46
|
+
console.log(cliFormat_1.CLI_FORMAT_BOLD, "Assess Featurevisor distribution");
|
|
47
|
+
console.log(` ${(0, cliFormat_1.colorize)("Feature", cliFormat_1.CLI_COLOR_CYAN)}: ${options.feature}`);
|
|
48
|
+
console.log(` ${(0, cliFormat_1.colorize)("Environment", cliFormat_1.CLI_COLOR_CYAN)}: ${options.environment || false}`);
|
|
49
|
+
if (target)
|
|
50
|
+
console.log(` ${(0, cliFormat_1.colorize)("Target", cliFormat_1.CLI_COLOR_CYAN)}: ${target}`);
|
|
51
|
+
console.log(` ${(0, cliFormat_1.colorize)("Iterations", cliFormat_1.CLI_COLOR_CYAN)}: ${(0, utils_1.prettyNumber)(options.n)}`);
|
|
60
52
|
/**
|
|
61
53
|
* Initialize SDK
|
|
62
54
|
*/
|
|
63
|
-
const f = (0, sdk_1.
|
|
55
|
+
const f = (0, sdk_1.createFeaturevisor)({
|
|
64
56
|
datafile: datafileContent,
|
|
65
57
|
logLevel: "warn",
|
|
66
58
|
});
|
|
67
|
-
console.log("
|
|
59
|
+
console.log("");
|
|
60
|
+
console.log(cliFormat_1.CLI_FORMAT_GREEN, "SDK initialized");
|
|
68
61
|
/**
|
|
69
62
|
* Evaluations
|
|
70
63
|
*/
|
|
@@ -78,7 +71,8 @@ async function assessDistribution(deps, options) {
|
|
|
78
71
|
disabled: 0,
|
|
79
72
|
};
|
|
80
73
|
const variationEvaluations = {};
|
|
81
|
-
console.log(
|
|
74
|
+
console.log("");
|
|
75
|
+
console.log(`Evaluating ${(0, utils_1.prettyNumber)(options.n)} times...`);
|
|
82
76
|
for (let i = 0; i < options.n; i++) {
|
|
83
77
|
const context = createContext(options.context, options.populateUuid);
|
|
84
78
|
if (options.verbose) {
|
|
@@ -104,31 +98,56 @@ async function assessDistribution(deps, options) {
|
|
|
104
98
|
/**
|
|
105
99
|
* Print results
|
|
106
100
|
*/
|
|
107
|
-
console.log("
|
|
101
|
+
console.log("");
|
|
102
|
+
console.log(cliFormat_1.CLI_FORMAT_BOLD, "Flag evaluations");
|
|
103
|
+
console.log("");
|
|
108
104
|
printCounts(flagEvaluations, options.n);
|
|
109
105
|
if (hasVariations) {
|
|
110
|
-
console.log("
|
|
106
|
+
console.log("");
|
|
107
|
+
console.log(cliFormat_1.CLI_FORMAT_BOLD, "Variation evaluations");
|
|
108
|
+
console.log("");
|
|
111
109
|
printCounts(variationEvaluations, options.n);
|
|
112
110
|
}
|
|
113
111
|
}
|
|
112
|
+
async function assessDistribution(deps, options) {
|
|
113
|
+
const datafileBuildStart = Date.now();
|
|
114
|
+
const datafiles = await (0, buildRuntimeDatafiles_1.buildRuntimeDatafiles)(deps, {
|
|
115
|
+
environment: options.environment || false,
|
|
116
|
+
target: options.target,
|
|
117
|
+
revision: "include-all-features",
|
|
118
|
+
inflate: options.inflate,
|
|
119
|
+
});
|
|
120
|
+
const datafileBuildDuration = Date.now() - datafileBuildStart;
|
|
121
|
+
console.log("");
|
|
122
|
+
console.log(`Building ${datafiles.length} datafile${datafiles.length === 1 ? "" : "s"}...`);
|
|
123
|
+
console.log(` ${(0, cliFormat_1.colorize)("Build duration", cliFormat_1.CLI_COLOR_CYAN)}: ${datafileBuildDuration}ms`);
|
|
124
|
+
for (const entry of datafiles) {
|
|
125
|
+
await assessDistributionWithDatafile(entry.datafile, options, entry.target);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
114
128
|
exports.assessDistributionPlugin = {
|
|
115
129
|
command: "assess-distribution",
|
|
116
130
|
handler: async ({ rootDirectoryPath, projectConfig, datasource, parsed }) => {
|
|
117
|
-
await
|
|
118
|
-
|
|
119
|
-
projectConfig,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
:
|
|
130
|
-
|
|
131
|
-
|
|
131
|
+
const executions = await (0, sets_1.getProjectSetExecutions)(projectConfig, datasource, parsed.set);
|
|
132
|
+
for (const execution of executions) {
|
|
133
|
+
(0, sets_1.printSetHeader)(projectConfig, execution.set);
|
|
134
|
+
await assessDistribution({
|
|
135
|
+
rootDirectoryPath,
|
|
136
|
+
projectConfig: execution.projectConfig,
|
|
137
|
+
datasource: execution.datasource,
|
|
138
|
+
options: parsed,
|
|
139
|
+
}, {
|
|
140
|
+
environment: parsed.environment,
|
|
141
|
+
feature: parsed.feature,
|
|
142
|
+
n: parseInt(parsed.n, 10) || 1,
|
|
143
|
+
context: parsed.context ? JSON.parse(parsed.context) : {},
|
|
144
|
+
populateUuid: Array.isArray(parsed.populateUuid)
|
|
145
|
+
? parsed.populateUuid
|
|
146
|
+
: [parsed.populateUuid].filter(Boolean),
|
|
147
|
+
verbose: parsed.verbose,
|
|
148
|
+
target: parsed.target,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
132
151
|
},
|
|
133
152
|
examples: [
|
|
134
153
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assess-distribution/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/assess-distribution/index.ts"],"names":[],"mappings":";;;AAuKA,gDAiBC;AAxLD,mCAAqC;AAGrC,2CAAuD;AAGvD,4EAAyE;AACzE,oCAA0D;AAE1D,kCAAkE;AAClE,mDAAkG;AAElG,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAErC,SAAS,YAAY;IACnB,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,oBAAW,EAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/E,CAAC;AAID,SAAS,WAAW,CAAC,WAA6B,EAAE,CAAS,EAAE,IAAI,GAAG,IAAI;IACxE,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC9B,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,OAAO,CAAC,CAAC,CAAC;YACZ,CAAC;YAED,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,OAAO,CAAC,CAAC;YACX,CAAC;YAED,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CACxD,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EACtD,CAAC,CACF,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CACpD,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EACxC,CAAC,CACF,CAAC;IACF,MAAM,wBAAwB,GAAG,IAAA,oBAAY,EAAC,YAAY,CAAC,CAAC,MAAM,CAAC;IAEnE,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CACT,KAAK,IAAA,oBAAQ,EAAC,GAAG,EAAE,0BAAc,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,kBAAkB,GAAG,EAAE,EAAE,GAAG,CAAC,EACnF,KAAK,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,CAAC,EAAE,EAClE,KAAK,IAAA,wBAAgB,EAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,eAAwB,EAAE,YAA6B;IAC5E,MAAM,OAAO,GAAG,EAAE,GAAG,eAAe,EAAE,CAAC;IAEvC,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAcD,KAAK,UAAU,8BAA8B,CAC3C,eAAgC,EAChC,OAAkC,EAClC,MAAe;IAEf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,2BAAe,EAAE,kCAAkC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,oBAAQ,EAAC,SAAS,EAAE,0BAAc,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,oBAAQ,EAAC,aAAa,EAAE,0BAAc,CAAC,KAAK,OAAO,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC,CAAC;IAC7F,IAAI,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,oBAAQ,EAAC,QAAQ,EAAE,0BAAc,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,oBAAQ,EAAC,YAAY,EAAE,0BAAc,CAAC,KAAK,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEvF;;OAEG;IACH,MAAM,CAAC,GAAG,IAAA,wBAAkB,EAAC;QAC3B,QAAQ,EAAE,eAAkC;QAC5C,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,4BAAgB,EAAE,iBAAiB,CAAC,CAAC;IAEjD;;OAEG;IACH,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAClC,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,eAAe,GAAqB;QACxC,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;KACZ,CAAC;IAEF,MAAM,oBAAoB,GAAqB,EAAE,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAE9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,iCAAiC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QAED,OAAO;QACP,MAAM,cAAc,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE7D,IAAI,cAAc,EAAE,CAAC;YACnB,eAAe,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC;QAED,YAAY;QACZ,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,mBAAmB,GAAG,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAW,CAAC;YAE/E,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC/C,oBAAoB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAChD,CAAC;YAED,oBAAoB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,2BAAe,EAAE,kBAAkB,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAExC,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,2BAAe,EAAE,uBAAuB,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,WAAW,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAAkB,EAAE,OAAkC;IAC7F,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,IAAA,6CAAqB,EAAC,IAAI,EAAE;QAClD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QACzC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,sBAAsB;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IACH,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,kBAAkB,CAAC;IAE9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,MAAM,YAAY,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,oBAAQ,EAAC,gBAAgB,EAAE,0BAAc,CAAC,KAAK,qBAAqB,IAAI,CAAC,CAAC;IAE3F,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,8BAA8B,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAEY,QAAA,wBAAwB,GAAW;IAC9C,OAAO,EAAE,qBAAqB;IAC9B,OAAO,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1E,MAAM,UAAU,GAAG,MAAM,IAAA,8BAAuB,EAAC,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAExF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAA,qBAAc,EAAC,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;YAE7C,MAAM,kBAAkB,CACtB;gBACE,iBAAiB;gBACjB,aAAa,EAAE,SAAS,CAAC,aAAa;gBACtC,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,OAAO,EAAE,MAAM;aAChB,EACD;gBACE,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;gBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;gBACzD,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC9C,CAAC,CAAC,MAAM,CAAC,YAAY;oBACrB,CAAC,CAAC,CAAC,MAAM,CAAC,YAAsB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBACnD,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,QAAQ,EAAE;QACR;YACE,OAAO,EACL,+GAA+G;YACjH,WAAW,EAAE,8DAA8D;SAC5E;KACF;CACF,CAAC"}
|
package/lib/benchmark/index.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Featurevisor } from "@featurevisor/sdk";
|
|
2
2
|
import { Dependencies } from "../dependencies";
|
|
3
3
|
import { Plugin } from "../cli";
|
|
4
4
|
export interface BenchmarkOutput {
|
|
5
5
|
value: any;
|
|
6
6
|
duration: number;
|
|
7
|
+
minDuration: number;
|
|
8
|
+
averageDuration: number;
|
|
9
|
+
maxDuration: number;
|
|
7
10
|
}
|
|
8
|
-
export declare function benchmarkFeatureFlag(f:
|
|
9
|
-
export declare function benchmarkFeatureVariation(f:
|
|
10
|
-
export declare function benchmarkFeatureVariable(f:
|
|
11
|
+
export declare function benchmarkFeatureFlag(f: Featurevisor, featureKey: string, context: Record<string, unknown>, n: number): BenchmarkOutput;
|
|
12
|
+
export declare function benchmarkFeatureVariation(f: Featurevisor, featureKey: string, context: Record<string, unknown>, n: number): BenchmarkOutput;
|
|
13
|
+
export declare function benchmarkFeatureVariable(f: Featurevisor, featureKey: string, variableKey: string, context: Record<string, unknown>, n: number): BenchmarkOutput;
|
|
11
14
|
export interface BenchmarkOptions {
|
|
12
15
|
environment?: string;
|
|
13
16
|
feature: string;
|
|
@@ -15,8 +18,8 @@ export interface BenchmarkOptions {
|
|
|
15
18
|
context: Record<string, unknown>;
|
|
16
19
|
variation?: boolean;
|
|
17
20
|
variable?: string;
|
|
18
|
-
schemaVersion?: string;
|
|
19
21
|
inflate?: number;
|
|
22
|
+
target?: string | string[];
|
|
20
23
|
}
|
|
21
24
|
export declare function benchmarkFeature(deps: Dependencies, options: BenchmarkOptions): Promise<void>;
|
|
22
25
|
export declare const benchmarkPlugin: Plugin;
|
package/lib/benchmark/index.js
CHANGED
|
@@ -6,75 +6,70 @@ exports.benchmarkFeatureVariation = benchmarkFeatureVariation;
|
|
|
6
6
|
exports.benchmarkFeatureVariable = benchmarkFeatureVariable;
|
|
7
7
|
exports.benchmarkFeature = benchmarkFeature;
|
|
8
8
|
const sdk_1 = require("@featurevisor/sdk");
|
|
9
|
-
const
|
|
10
|
-
const builder_1 = require("../builder");
|
|
9
|
+
const buildRuntimeDatafiles_1 = require("../builder/buildRuntimeDatafiles");
|
|
11
10
|
const prettyDuration_1 = require("../tester/prettyDuration");
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const sets_1 = require("../sets");
|
|
12
|
+
const cliFormat_1 = require("../tester/cliFormat");
|
|
13
|
+
function benchmarkEvaluation(n, evaluate) {
|
|
14
14
|
let value;
|
|
15
|
+
let totalDurationNs = 0n;
|
|
16
|
+
let minDurationNs;
|
|
17
|
+
let maxDurationNs = 0n;
|
|
15
18
|
for (let i = 0; i < n; i++) {
|
|
16
|
-
|
|
19
|
+
const start = process.hrtime.bigint();
|
|
20
|
+
value = evaluate();
|
|
21
|
+
const durationNs = process.hrtime.bigint() - start;
|
|
22
|
+
totalDurationNs += durationNs;
|
|
23
|
+
if (typeof minDurationNs === "undefined" || durationNs < minDurationNs) {
|
|
24
|
+
minDurationNs = durationNs;
|
|
25
|
+
}
|
|
26
|
+
if (durationNs > maxDurationNs) {
|
|
27
|
+
maxDurationNs = durationNs;
|
|
28
|
+
}
|
|
17
29
|
}
|
|
18
|
-
const duration =
|
|
30
|
+
const duration = Number(totalDurationNs) / 1000000;
|
|
19
31
|
return {
|
|
20
32
|
value,
|
|
21
33
|
duration,
|
|
34
|
+
minDuration: Number(minDurationNs || 0n) / 1000000,
|
|
35
|
+
averageDuration: duration / n,
|
|
36
|
+
maxDuration: Number(maxDurationNs) / 1000000,
|
|
22
37
|
};
|
|
23
38
|
}
|
|
39
|
+
function formatDurationMs(duration) {
|
|
40
|
+
return `${duration.toFixed(6)}ms`;
|
|
41
|
+
}
|
|
42
|
+
function benchmarkFeatureFlag(f, featureKey, context, n) {
|
|
43
|
+
return benchmarkEvaluation(n, () => f.isEnabled(featureKey, context));
|
|
44
|
+
}
|
|
24
45
|
function benchmarkFeatureVariation(f, featureKey, context, n) {
|
|
25
|
-
|
|
26
|
-
let value;
|
|
27
|
-
for (let i = 0; i < n; i++) {
|
|
28
|
-
value = f.getVariation(featureKey, context);
|
|
29
|
-
}
|
|
30
|
-
const duration = Date.now() - start;
|
|
31
|
-
return {
|
|
32
|
-
value,
|
|
33
|
-
duration,
|
|
34
|
-
};
|
|
46
|
+
return benchmarkEvaluation(n, () => f.getVariation(featureKey, context));
|
|
35
47
|
}
|
|
36
48
|
function benchmarkFeatureVariable(f, featureKey, variableKey, context, n) {
|
|
37
|
-
|
|
38
|
-
let value;
|
|
39
|
-
for (let i = 0; i < n; i++) {
|
|
40
|
-
value = f.getVariable(featureKey, variableKey, context);
|
|
41
|
-
}
|
|
42
|
-
const duration = Date.now() - start;
|
|
43
|
-
return {
|
|
44
|
-
value,
|
|
45
|
-
duration,
|
|
46
|
-
};
|
|
49
|
+
return benchmarkEvaluation(n, () => f.getVariable(featureKey, variableKey, context));
|
|
47
50
|
}
|
|
48
|
-
async function
|
|
49
|
-
const { datasource, projectConfig } = deps;
|
|
50
|
-
console.log("");
|
|
51
|
-
console.log(`Running benchmark for feature "${options.feature}"...`);
|
|
51
|
+
async function benchmarkFeatureWithDatafile(datafileContent, options, target) {
|
|
52
52
|
console.log("");
|
|
53
|
-
console.log(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
inflate: options.inflate,
|
|
61
|
-
}, existingState);
|
|
62
|
-
const datafileBuildDuration = Date.now() - datafileBuildStart;
|
|
63
|
-
console.log(`Datafile build duration: ${datafileBuildDuration}ms`);
|
|
64
|
-
console.log(`Datafile size: ${(JSON.stringify(datafileContent).length / 1024).toFixed(2)} kB`);
|
|
53
|
+
console.log(cliFormat_1.CLI_FORMAT_BOLD, "Benchmark Featurevisor feature");
|
|
54
|
+
console.log(` ${(0, cliFormat_1.colorize)("Feature", cliFormat_1.CLI_COLOR_CYAN)}: ${options.feature}`);
|
|
55
|
+
console.log(` ${(0, cliFormat_1.colorize)("Environment", cliFormat_1.CLI_COLOR_CYAN)}: ${options.environment || false}`);
|
|
56
|
+
if (target)
|
|
57
|
+
console.log(` ${(0, cliFormat_1.colorize)("Target", cliFormat_1.CLI_COLOR_CYAN)}: ${target}`);
|
|
58
|
+
console.log(` ${(0, cliFormat_1.colorize)("Iterations", cliFormat_1.CLI_COLOR_CYAN)}: ${options.n}`);
|
|
59
|
+
console.log(` ${(0, cliFormat_1.colorize)("Datafile size", cliFormat_1.CLI_COLOR_CYAN)}: ${(JSON.stringify(datafileContent).length / 1024).toFixed(2)} kB`);
|
|
65
60
|
if (options.inflate) {
|
|
66
61
|
console.log("");
|
|
67
|
-
console.log("Features count
|
|
68
|
-
console.log("Segments count
|
|
62
|
+
console.log(` ${(0, cliFormat_1.colorize)("Features count", cliFormat_1.CLI_COLOR_CYAN)}: ${Object.keys(datafileContent.features).length}`);
|
|
63
|
+
console.log(` ${(0, cliFormat_1.colorize)("Segments count", cliFormat_1.CLI_COLOR_CYAN)}: ${Object.keys(datafileContent.segments).length}`);
|
|
69
64
|
}
|
|
70
65
|
console.log("");
|
|
71
|
-
const f = (0, sdk_1.
|
|
66
|
+
const f = (0, sdk_1.createFeaturevisor)({
|
|
72
67
|
datafile: datafileContent,
|
|
73
68
|
logLevel: "warn",
|
|
74
69
|
});
|
|
75
|
-
console.log("
|
|
70
|
+
console.log(cliFormat_1.CLI_FORMAT_GREEN, "SDK initialized");
|
|
76
71
|
console.log("");
|
|
77
|
-
console.log(`
|
|
72
|
+
console.log(` ${(0, cliFormat_1.colorize)("Context", cliFormat_1.CLI_COLOR_CYAN)}: ${JSON.stringify(options.context)}`);
|
|
78
73
|
let output;
|
|
79
74
|
if (options.variable) {
|
|
80
75
|
// variable
|
|
@@ -92,28 +87,50 @@ async function benchmarkFeature(deps, options) {
|
|
|
92
87
|
output = benchmarkFeatureFlag(f, options.feature, options.context, options.n);
|
|
93
88
|
}
|
|
94
89
|
console.log("");
|
|
95
|
-
console.log(`Evaluated value : ${JSON.stringify(output.value)}`);
|
|
96
|
-
console.log(`Total duration
|
|
97
|
-
console.log(`
|
|
90
|
+
console.log(` ${(0, cliFormat_1.colorize)("Evaluated value", cliFormat_1.CLI_COLOR_CYAN)}: ${JSON.stringify(output.value)}`);
|
|
91
|
+
console.log(` ${(0, cliFormat_1.colorize)("Total duration", cliFormat_1.CLI_COLOR_CYAN)}: ${(0, prettyDuration_1.prettyDuration)(output.duration)}`);
|
|
92
|
+
console.log(` ${(0, cliFormat_1.colorize)("Minimum duration", cliFormat_1.CLI_COLOR_CYAN)}: ${formatDurationMs(output.minDuration)}`);
|
|
93
|
+
console.log(` ${(0, cliFormat_1.colorize)("Average duration", cliFormat_1.CLI_COLOR_CYAN)}: ${formatDurationMs(output.averageDuration)}`);
|
|
94
|
+
console.log(` ${(0, cliFormat_1.colorize)("Maximum duration", cliFormat_1.CLI_COLOR_CYAN)}: ${formatDurationMs(output.maxDuration)}`);
|
|
95
|
+
}
|
|
96
|
+
async function benchmarkFeature(deps, options) {
|
|
97
|
+
const datafileBuildStart = Date.now();
|
|
98
|
+
const datafiles = await (0, buildRuntimeDatafiles_1.buildRuntimeDatafiles)(deps, {
|
|
99
|
+
environment: options.environment || false,
|
|
100
|
+
target: options.target,
|
|
101
|
+
revision: "include-all-features",
|
|
102
|
+
inflate: options.inflate,
|
|
103
|
+
});
|
|
104
|
+
const datafileBuildDuration = Date.now() - datafileBuildStart;
|
|
105
|
+
console.log("");
|
|
106
|
+
console.log(`Building ${datafiles.length} datafile${datafiles.length === 1 ? "" : "s"}...`);
|
|
107
|
+
console.log(` ${(0, cliFormat_1.colorize)("Build duration", cliFormat_1.CLI_COLOR_CYAN)}: ${datafileBuildDuration}ms`);
|
|
108
|
+
for (const entry of datafiles) {
|
|
109
|
+
await benchmarkFeatureWithDatafile(entry.datafile, options, entry.target);
|
|
110
|
+
}
|
|
98
111
|
}
|
|
99
112
|
exports.benchmarkPlugin = {
|
|
100
113
|
command: "benchmark",
|
|
101
114
|
handler: async ({ rootDirectoryPath, projectConfig, datasource, parsed }) => {
|
|
102
|
-
await
|
|
103
|
-
|
|
104
|
-
projectConfig,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
const executions = await (0, sets_1.getProjectSetExecutions)(projectConfig, datasource, parsed.set);
|
|
116
|
+
for (const execution of executions) {
|
|
117
|
+
(0, sets_1.printSetHeader)(projectConfig, execution.set);
|
|
118
|
+
await benchmarkFeature({
|
|
119
|
+
rootDirectoryPath,
|
|
120
|
+
projectConfig: execution.projectConfig,
|
|
121
|
+
datasource: execution.datasource,
|
|
122
|
+
options: parsed,
|
|
123
|
+
}, {
|
|
124
|
+
environment: parsed.environment,
|
|
125
|
+
feature: parsed.feature,
|
|
126
|
+
n: parseInt(parsed.n, 10) || 1,
|
|
127
|
+
context: parsed.context ? JSON.parse(parsed.context) : {},
|
|
128
|
+
variation: parsed.variation || undefined,
|
|
129
|
+
variable: parsed.variable || undefined,
|
|
130
|
+
inflate: parseInt(parsed.inflate, 10) || undefined,
|
|
131
|
+
target: parsed.target,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
117
134
|
},
|
|
118
135
|
examples: [
|
|
119
136
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/benchmark/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/benchmark/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Condition, Context } from "@featurevisor/types";
|
|
2
|
+
import type { Featurevisor } from "@featurevisor/sdk";
|
|
3
|
+
export declare function applyContextToConditions(featurevisor: Featurevisor, conditions: Condition | Condition[], context: Context): Condition | Condition[];
|
|
4
|
+
export declare function removeRedundantConditions(conditions: Condition | Condition[]): Condition | Condition[];
|
|
5
|
+
export declare function applyContextToCondition(featurevisor: Featurevisor, condition: Condition | Condition[], context: Context): Condition | Condition[];
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.applyContextToConditions = applyContextToConditions;
|
|
4
4
|
exports.removeRedundantConditions = removeRedundantConditions;
|
|
5
|
-
exports.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
5
|
+
exports.applyContextToCondition = applyContextToCondition;
|
|
6
|
+
const sdk_1 = require("@featurevisor/sdk");
|
|
7
|
+
function applyContextToConditions(featurevisor, conditions, context) {
|
|
8
|
+
const withContextApplied = applyContextToCondition(featurevisor, conditions, context);
|
|
9
|
+
const removed = removeRedundantConditions(withContextApplied);
|
|
9
10
|
return removed;
|
|
10
11
|
}
|
|
11
12
|
function removeRedundantConditions(conditions) {
|
|
@@ -49,9 +50,13 @@ function removeRedundantConditions(conditions) {
|
|
|
49
50
|
if ("not" in conditions) {
|
|
50
51
|
const processed = conditions.not.map((c) => removeRedundantConditions(c));
|
|
51
52
|
const filtered = processed.filter((c) => c !== "*");
|
|
52
|
-
//
|
|
53
|
+
// `not` negates the implicit AND of its children. Matched children are true
|
|
54
|
+
// and can be removed: not(true && X) becomes not(X). If every child was
|
|
55
|
+
// true, keep not("*") so it remains an always-false expression.
|
|
53
56
|
if (filtered.length === 0) {
|
|
54
|
-
return
|
|
57
|
+
return {
|
|
58
|
+
not: ["*"],
|
|
59
|
+
};
|
|
55
60
|
}
|
|
56
61
|
return {
|
|
57
62
|
not: filtered,
|
|
@@ -60,17 +65,17 @@ function removeRedundantConditions(conditions) {
|
|
|
60
65
|
}
|
|
61
66
|
return conditions;
|
|
62
67
|
}
|
|
63
|
-
function
|
|
68
|
+
function applyContextToCondition(featurevisor, condition, context) {
|
|
64
69
|
if (condition === "*") {
|
|
65
70
|
return condition;
|
|
66
71
|
}
|
|
67
72
|
if (Array.isArray(condition)) {
|
|
68
|
-
return condition.map((c) =>
|
|
73
|
+
return condition.map((c) => applyContextToCondition(featurevisor, c, context));
|
|
69
74
|
}
|
|
70
75
|
if (typeof condition === "object") {
|
|
71
76
|
// plain condition
|
|
72
77
|
if ("attribute" in condition) {
|
|
73
|
-
const matched =
|
|
78
|
+
const matched = (0, sdk_1.allConditionsAreMatched)(condition, context);
|
|
74
79
|
if (matched) {
|
|
75
80
|
return "*";
|
|
76
81
|
}
|
|
@@ -78,20 +83,20 @@ function buildScopedCondition(datafileReader, condition, context) {
|
|
|
78
83
|
// AND, OR, NOT conditions
|
|
79
84
|
if ("and" in condition) {
|
|
80
85
|
return {
|
|
81
|
-
and: condition.and.map((c) =>
|
|
86
|
+
and: condition.and.map((c) => applyContextToCondition(featurevisor, c, context)),
|
|
82
87
|
};
|
|
83
88
|
}
|
|
84
89
|
if ("or" in condition) {
|
|
85
90
|
return {
|
|
86
|
-
or: condition.or.map((c) =>
|
|
91
|
+
or: condition.or.map((c) => applyContextToCondition(featurevisor, c, context)),
|
|
87
92
|
};
|
|
88
93
|
}
|
|
89
94
|
if ("not" in condition) {
|
|
90
95
|
return {
|
|
91
|
-
not: condition.not.map((c) =>
|
|
96
|
+
not: condition.not.map((c) => applyContextToCondition(featurevisor, c, context)),
|
|
92
97
|
};
|
|
93
98
|
}
|
|
94
99
|
}
|
|
95
100
|
return condition;
|
|
96
101
|
}
|
|
97
|
-
//# sourceMappingURL=
|
|
102
|
+
//# sourceMappingURL=applyContextToConditions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyContextToConditions.js","sourceRoot":"","sources":["../../src/builder/applyContextToConditions.ts"],"names":[],"mappings":"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"}
|