rules/eslint/closure-standalone-script-imported.eslint.rule.ts

rules/eslint/closure-standalone-script-imported.eslint.rule.ts is a file in GovLab Extension Host. 40 lines of code and 10 definitions.

import type { LocalRule, RuleContext, RuleListener } from "../../types/rule.types.ts";
import { absolutePath, relativePath } from "@ssot/paths";
import { applicationImporters } from "../../shared/analyzers/specifier.analyzer.ts";
import { defineCheck } from "@govlab/context/check";
import { listener } from "../../shared/factories/listener.factory.ts";
import { normalizePath } from "../../shared/resolvers/anchor.resolver.ts";

const LIST_JOINER = ", ";
const SHOWN_IMPORTERS = 3;

const STANDALONE_ROOT = `${normalizePath(absolutePath("project.scripts"))}/`;
const HOME = relativePath("app.build");
const IMPORTERS = applicationImporters();

export default {
    create(context: RuleContext): RuleListener {
        const filename = normalizePath(context.filename);
        const found = filename.startsWith(STANDALONE_ROOT) ? IMPORTERS.get(filename) : undefined;
        if (found === undefined) {
            return {};
        }
        return listener({
            program(_view, node) {
                const importers = [...new Set(found)].slice(0, SHOWN_IMPORTERS).join(LIST_JOINER);
                context.report({ data: { home: HOME, importers }, messageId: "importedScript", node });
            },
        });
    },
    meta: {
        docs: {
            checks: defineCheck({ detects: [], enforces: ["architecture:explicit-boundaries"] }),
            description:
                "A standalone script runs on its own and nothing imports it. Once a file under the application root imports one, the script has become a dependency of the application, and it belongs in the member that owns the application's build.",
            workspaceWide: true,
        },
        messages: {
            importedScript:
                "This script is imported by {{importers}}, so it is part of the application's build rather than a standalone script. Move it to {{home}}, the member that owns the scripts the application imports, and point its importers at that package.",
        },
        schema: [],
        type: "problem",
    },
} satisfies LocalRule;