1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/packages/infrastructure/webpack/src/plugins/protect-from-importing-non-dependencies.ts
Iku-turso 9a4b02becb chore: Consolidate infrastructure of webpack to ts to make it scriptable
Co-authored-by: Janne Savolainen <janne.savolainen@live.fi>
Signed-off-by: Iku-turso <mikko.aspiala@gmail.com>
Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
2023-05-03 09:31:24 +03:00

64 lines
2.1 KiB
TypeScript

import path from "path";
import { getDependencyName } from "./get-dependency-name/get-dependency-name";
import { readJsonSync } from "fs-extra";
const pathToPackageJson = path.resolve(process.cwd(), "package.json");
export class ProtectFromImportingNonDependencies {
apply(compiler: any) {
const dependencies = getDependenciesAndPeerDependencies();
const nodeModulesToBeResolved = new Set();
compiler.hooks.normalModuleFactory.tap(
"irrelevant",
(normalModuleFactory: any) => {
normalModuleFactory.hooks.resolve.tap(
"irrelevant",
(toBeResolved: any) => {
const isSassDependency = toBeResolved.request.endsWith(".scss");
const isLocalDependency = toBeResolved.request.startsWith(".");
const isDependencyOfDependency =
toBeResolved.context.includes("node_modules");
const dependencyName = getDependencyName(toBeResolved.request);
const dependencyWeAreInterested =
!isSassDependency &&
!isLocalDependency &&
!isDependencyOfDependency &&
dependencyName;
if (dependencyWeAreInterested) {
nodeModulesToBeResolved.add(dependencyName);
}
}
);
}
);
compiler.hooks.afterCompile.tap("compile", () => {
const notSpecifiedDependencies = [...nodeModulesToBeResolved].filter(
(x: any) => !dependencies.includes(x)
);
if (notSpecifiedDependencies.length) {
throw new Error(
`Tried to import dependencies that are not specified in the package.json "${pathToPackageJson}". Add "${notSpecifiedDependencies.join(
'", "'
)}" to dependencies or peerDependencies.`
);
}
});
}
}
const getDependenciesAndPeerDependencies = () => {
const packageJson = readJsonSync(pathToPackageJson);
const dependencies = Object.keys(packageJson.dependencies || {});
const peerDependencies = Object.keys(packageJson.peerDependencies || {});
return [...dependencies, ...peerDependencies];
};