# core/resolvers/rule.resolver.ts

> 28 lines of code and 8 definitions.

Tree: GovLab Quality
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-resolvers-rule-resolver-ts
Source text: https://banes-lab.com/source/quality/core/resolvers/rule.resolver.ts.txt

Listed in [core/resolvers](https://banes-lab.com/api/source/quality/core/resolvers.md), after [core/resolvers/plan.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/plan.resolver.ts.md) and before [core/resolvers/scope.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/scope.resolver.ts.md).

## Definitions

- `enabledRuleIds` (lexical_declaration, line 16, exported)
- `activeConcerns` (lexical_declaration, line 9)
- `disabled` (lexical_declaration, line 10)
- `data` (lexical_declaration, line 21, exported)
- `plan` (lexical_declaration, line 22, exported)
- `resolution` (lexical_declaration, line 23, exported)
- `toolTokens` (lexical_declaration, line 27, exported)
- `ruleIds` (lexical_declaration, line 28, exported)

## Contained in

- [core/resolvers](https://banes-lab.com/anatomy/quality/folder-quality-core-resolvers.md)

## Used by

- [core/resolvers/tool.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/tool.resolver.ts.md)

## Linked from

- [core/resolvers](https://banes-lab.com/anatomy/quality/folder-quality-core-resolvers.md)

## Source

```typescript
import { ruleIdsFor, toolTokensOf } from "#core/selectors/emitter.selector";
import type { ConcernConfig } from "#types/concern.types";
import type { ToolResolution } from "#types/plan.types";
import { concernsToCanonicalConfig } from "#core/converters/concern.converter";
import { loadCanonicalData } from "#core/loaders/canon.loader";
import { loadEmitTokens } from "#core/loaders/emitter.loader";
import { resolveConfig } from "#core/resolvers/plan.resolver";

const activeConcerns = function activeConcerns(resolution: ToolResolution): Set<string> {
    const disabled = new Set(resolution.disabledSurfaces);
    return new Set(
        [...Object.keys(resolution.knobs), ...resolution.enabledIntents].filter((concern) => !disabled.has(concern)),
    );
};

export const enabledRuleIds = function enabledRuleIds(
    concerns: ConcernConfig,
    language: string,
    tool: string,
): string[] {
    const data = loadCanonicalData();
    const plan = resolveConfig({ ...concernsToCanonicalConfig(concerns, data), languages: [language] }, data);
    const resolution = "conflicts" in plan ? undefined : plan.perToolConfig[tool];
    if (!resolution) {
        return [];
    }
    const toolTokens = toolTokensOf(loadEmitTokens(), tool);
    const ruleIds = [...activeConcerns(resolution)].flatMap((concern) => ruleIdsFor(toolTokens, concern));
    return [...new Set(ruleIds)].sort((a, b) => a.localeCompare(b));
};
```
