openfeature-compliance-mining
Read-only mining for OpenFeature-compliant vs legacy feature-flag usages. Detects generated useFlag hooks, OpenFeature client/React SDK reads, legacy config.featureToggles accesses, and test helpers (setTestFlags vs testWithFeatureToggles). Emits openfeature_flag_usage metrics; leaves source unchanged.
# openfeature-compliance-mining
Read-only mining codemod that inventories **OpenFeature-compliant** vs **legacy**
feature-flag usages. No files are written to the target repo.
Useful for migration progress dashboards (e.g. Grafana’s move from
`config.featureToggles` to OpenFeature hooks/clients).
## Detected patterns
| `compliance` | `pattern` | Example |
| --------------- | --------------------------- | ------------------------------------------------------------------- |
| `compliant` | `use_flag_generated` | `useFlagPlaylistsRBAC()` |
| `compliant` | `get_boolean_value` | `getFeatureFlagClient().getBooleanValue(FlagKeys.X, false)` |
| `compliant` | `use_boolean_flag_value` | `useBooleanFlagValue('otelLogsFormatting', false)` |
| `compliant` | `use_flag` | `useFlag('key', false).value` |
| `compliant` | `set_test_flags` | `setTestFlags({ … })` |
| `non_compliant` | `config_feature_toggles` | `config.featureToggles.alertingNavigationV2` / `['key']` / bare map |
| `non_compliant` | `test_with_feature_toggles` | `testWithFeatureToggles({ … })` (legacy bootData-only test helper) |
## Metric: `openfeature_flag_usage`
Emitted once per detection site.
| field | description |
| ------------ | --------------------------------------------------------------------------------------- |
| `compliance` | `compliant` or `non_compliant` |
| `pattern` | One of the patterns in the table above |
| `flag_key` | Literal key, `FlagKeys.X`, generated hook name, `<expr:…>`, `<map>`, or `<test-helper>` |
| `detail` | Extra context (`member`, `subscript`, `value`, receiver text, …) |
| `scope` | `production` or `test` (from filename: `*.test.*`, `*.spec.*`, `__tests__`) |
| `file` | Relative path of the scanned file |
| `line` | 1-based line number |
| `symbol` | Enclosing function/class name, or `<file-scope>` |
## What this does **not** report
- Generated OpenFeature / feature-toggle sources (`*.gen.ts`, `openfeature.gen.ts`, …)
- Go / backend OpenFeature clients (this package scans TypeScript/TSX only)
- ESLint suppression inventory (`eslint-suppressions.json`) — mine call sites, not lint config
- Rewrites — use a separate cleanup/migration codemod to change source
## License
MIT