core/analyzers/drift.analyzer.ts

core/analyzers/drift.analyzer.ts is a file in GovLab Docs. 38 lines of code and 10 definitions.

import type { PathRef, SymbolRef } from "#types/reference.types";
import { exportedNames } from "#core/parsers/export.parser";
import { isCodeFile } from "#core/predicates/source.predicate";
import { isExternalTarget } from "#core/predicates/reference.predicate";
import { pathReferences } from "#core/parsers/location.parser";
import { resolveTargetFile } from "#core/resolvers/source.resolver";
import { unquote } from "#core/normalizers/reference.normalizer";

const SYMBOL_SEPARATOR = "#";

const parseSymbolRef = function parseSymbolRef(raw: string): SymbolRef | null {
    const hash = raw.indexOf(SYMBOL_SEPARATOR);
    if (hash <= 0) {
        return null;
    }
    const file = raw.slice(0, hash);
    const symbol = raw.slice(hash + 1);
    return symbol.length === 0 || isExternalTarget(file) || !isCodeFile(file) ? null : { file, symbol };
};

const driftForRef = function driftForRef(ref: PathRef, moduleDir: string, consumerRoot: string): string | null {
    const parsed = parseSymbolRef(unquote(ref.path));
    if (parsed === null) {
        return null;
    }
    const resolved = resolveTargetFile(parsed.file, moduleDir, consumerRoot);
    if (resolved === null || exportedNames(resolved).has(parsed.symbol)) {
        return null;
    }
    return `${parsed.file}${SYMBOL_SEPARATOR}${parsed.symbol}`;
};

export const symbolDriftIn = function symbolDriftIn(
    fragment: string,
    moduleDir: string,
    consumerRoot: string,
): string[] {
    return pathReferences(fragment).flatMap((ref) => {
        const hit = driftForRef(ref, moduleDir, consumerRoot);
        return hit === null ? [] : [hit];
    });
};