# core/coordinators/concern.coordinator.ts

> 40 lines of code and 9 definitions.

Tree: GovLab Quality
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-coordinators-concern-coordinator-ts
Source text: https://banes-lab.com/source/quality/core/coordinators/concern.coordinator.ts.txt

Listed in [core/coordinators](https://banes-lab.com/api/source/quality/core/coordinators.md), after [core/coordinators/comment.coordinator.ts](https://banes-lab.com/source/quality/core/coordinators/comment.coordinator.ts.md) and before [core/coordinators/emitter.coordinator.ts](https://banes-lab.com/source/quality/core/coordinators/emitter.coordinator.ts.md).

## Definitions

- `runLint` (lexical_declaration, line 20, exported)
- `activeEcosystems` (lexical_declaration, line 8)
- `wanted` (lexical_declaration, line 12)
- `allow` (lexical_declaration, line 16)
- `{ env, root }` (lexical_declaration, line 21, exported)
- `spec` (lexical_declaration, line 22, exported)
- `declared` (lexical_declaration, line 23, exported)
- `ecosystems` (lexical_declaration, line 24, exported)
- `outcome` (lexical_declaration, line 28, exported)

## Contained in

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

## Used by

- [runtime/entrypoints/invocation.entrypoint.ts](https://banes-lab.com/source/quality/runtime/entrypoints/invocation.entrypoint.ts.md)

## Linked from

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

## Source

```typescript
import { AGGREGATE_CONCERN, CONCERNS } from "#configuration/constants/concern.constants";
import { resolveActiveEcosystems, resolveActiveSelectable } from "#core/resolvers/tool.resolver";
import type { CliArgs } from "#types/quality.types";
import type { ProcessEnv } from "#types/tool.types";
import process from "node:process";
import { runQuality } from "#core/coordinators/quality.coordinator";

const activeEcosystems = function activeEcosystems(
    declared: readonly string[] | null,
    requested: readonly string[] | undefined,
): string[] {
    const wanted = [...(requested ?? [])];
    if (declared === null) {
        return wanted;
    }
    const allow = new Set(declared);
    return wanted.filter((ecosystem) => allow.has(ecosystem));
};

export const runLint = async function runLint(args: CliArgs, host: { env: ProcessEnv; root: string }): Promise<number> {
    const { env, root } = host;
    const spec = CONCERNS[args.concern];
    const declared = args.concern === AGGREGATE_CONCERN ? await resolveActiveEcosystems(root) : null;
    const ecosystems = activeEcosystems(declared, spec.ecosystems);
    if (declared !== null && ecosystems.length === 0) {
        return 0;
    }
    const outcome = await runQuality({
        backup: args.backup,
        dryRun: args.dryRun,
        ecosystems,
        env,
        fix: args.fix,
        only: spec.only,
        paths: args.paths.length > 0 ? args.paths : undefined,
        reporter: args.reporter,
        root,
        selectableActive: await resolveActiveSelectable(root),
    });
    process.stdout.write(outcome.report);
    return outcome.exitCode;
};
```
