Path: blob/main/package/src/common/import-report/find-bad-imports.ts
6465 views
import { DenoInfoDependency, Edge, getDenoInfo } from "./deno-info.ts";1import { brightBlue } from "jsr:/@std/fmt@^0.224.0/colors";2import { longestCommonDirPrefix } from "./utils.ts";34const allowedTerminalFileSuffixes = [5"types.ts",6"constants.ts",7"schemas.ts",8".json",9];1011function isBadImport(source: string, dep: DenoInfoDependency) {12if (!(dep.code && dep.code.specifier)) {13if (14dep.type && dep.type.error &&15dep.type.error.startsWith("Relative import path") &&16source.indexOf("src/core/lib") !== -1 &&17!allowedTerminalFileSuffixes.some((allowedSuffix) =>18dep.type!.specifier!.endsWith(allowedSuffix)19)20) {21// report library imports from inside src/core/lib22return true;23} else {24return false;25}26}27const target = dep.code.specifier;28if (29allowedTerminalFileSuffixes.some((allowedSuffix) =>30target.endsWith(allowedSuffix)31)32) {33return false;34}35if (36source.indexOf("src/core/") !== -1 &&37target.indexOf("src/core/") === -138) {39// report src/core imports to outside src/core40return true;41}42if (43source.indexOf("src/core/lib") !== -1 &&44target.indexOf("src/core/lib") === -145) {46// report src/core/lib imports to outside src/core/lib47return true;48}49return false;50}5152if (import.meta.main) {53const json = await getDenoInfo(Deno.args[0]);54const result: Edge[] = [];55const strs: string[] = [];56for (const mod of json.modules) {57const source = mod.specifier;58for (const dep of mod.dependencies || []) {59if (isBadImport(source, dep)) {60if (dep.code) {61result.push({ "from": source, to: dep.code.specifier! });62strs.push(source, dep.code.specifier!);63} else if (dep.type) {64result.push({ "from": source, to: dep.type.specifier! });65strs.push(source, dep.type.specifier!);66} else {67throw new Error(68"don't know how to handle a dependency decl without code or type",69);70}71}72}73}74const p = longestCommonDirPrefix(strs).length;75for (const { "from": edgeFrom, to } of result) {76console.log(77`Bad import from ${brightBlue(edgeFrom.slice(p))} to ${78brightBlue(to.slice(p))79}`,80);81}82}838485