mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
feat: Enforce dependencies for imports from node modules in package.json
Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com> Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
parent
adf67fb6a7
commit
f127a07916
@ -1,6 +1,5 @@
|
|||||||
const ForkTsCheckerPlugin = require("fork-ts-checker-webpack-plugin");
|
const ForkTsCheckerPlugin = require("fork-ts-checker-webpack-plugin");
|
||||||
const nodeExternals = require("webpack-node-externals");
|
const { ProtectFromImportingNonDependencies } = require("./plugins/protect-from-importing-non-dependencies");
|
||||||
const path = require("path");
|
|
||||||
|
|
||||||
module.exports = ({ entrypointFilePath, outputDirectory }) => ({
|
module.exports = ({ entrypointFilePath, outputDirectory }) => ({
|
||||||
name: entrypointFilePath,
|
name: entrypointFilePath,
|
||||||
@ -14,10 +13,12 @@ module.exports = ({ entrypointFilePath, outputDirectory }) => ({
|
|||||||
},
|
},
|
||||||
|
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: [".ts", ".tsx"],
|
extensions: [".ts", ".tsx", ".js"],
|
||||||
},
|
},
|
||||||
|
|
||||||
plugins: [
|
plugins: [
|
||||||
|
new ProtectFromImportingNonDependencies(),
|
||||||
|
|
||||||
new ForkTsCheckerPlugin({
|
new ForkTsCheckerPlugin({
|
||||||
typescript: {
|
typescript: {
|
||||||
mode: "write-dts",
|
mode: "write-dts",
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
const getDependencyName = (requireString) => {
|
||||||
|
const [a, b] = requireString.split("/");
|
||||||
|
|
||||||
|
const scoped = a.startsWith("@");
|
||||||
|
|
||||||
|
return scoped ? `${a}/${b}` : a;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = { getDependencyName };
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
import { getDependencyName } from "./get-dependency-name";
|
||||||
|
|
||||||
|
describe("get-dependency-name", () => {
|
||||||
|
it("given scoped dependency with entrypoint, returns dependency name", () => {
|
||||||
|
const actual = getDependencyName("@some-scope/some-package/entrypoint");
|
||||||
|
|
||||||
|
expect(actual).toBe("@some-scope/some-package");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("given scoped dependency but no entrypoint, returns dependency name", () => {
|
||||||
|
const actual = getDependencyName("@some-scope/some-package");
|
||||||
|
|
||||||
|
expect(actual).toBe("@some-scope/some-package");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("given non scoped dependency with entrypoint, returns dependency name", () => {
|
||||||
|
const actual = getDependencyName("some-package/some-entrypoint");
|
||||||
|
|
||||||
|
expect(actual).toBe("some-package");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("given non scoped dependency but no entrypoint, returns dependency name", () => {
|
||||||
|
const actual = getDependencyName("some-package");
|
||||||
|
|
||||||
|
expect(actual).toBe("some-package");
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
const path = require("path");
|
||||||
|
const { getDependencyName } = require("./get-dependency-name/get-dependency-name");
|
||||||
|
|
||||||
|
const pathToPackageJson = path.resolve(process.cwd(), "package.json");
|
||||||
|
|
||||||
|
class ProtectFromImportingNonDependencies {
|
||||||
|
apply(compiler) {
|
||||||
|
const dependencies = getDependenciesAndPeerDependencies();
|
||||||
|
|
||||||
|
const nodeModulesToBeResolved = new Set();
|
||||||
|
|
||||||
|
compiler.hooks.normalModuleFactory.tap("irrelevant", (normalModuleFactory) => {
|
||||||
|
normalModuleFactory.hooks.resolve.tap("irrelevant", (toBeResolved) => {
|
||||||
|
|
||||||
|
const isLocalDependency = toBeResolved.request.startsWith(".");
|
||||||
|
const isDependencyOfDependency =
|
||||||
|
toBeResolved.context.includes("node_modules");
|
||||||
|
|
||||||
|
if (!isLocalDependency && !isDependencyOfDependency) {
|
||||||
|
|
||||||
|
const dependencyName = getDependencyName(toBeResolved.request);
|
||||||
|
|
||||||
|
nodeModulesToBeResolved.add(dependencyName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
compiler.hooks.afterCompile.tap("compile", () => {
|
||||||
|
const notSpecifiedDependencies = [...nodeModulesToBeResolved].filter(
|
||||||
|
(x) => !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 = require(pathToPackageJson);
|
||||||
|
|
||||||
|
const dependencies = Object.keys(packageJson.dependencies || {});
|
||||||
|
const peerDependencies = Object.keys(packageJson.peerDependencies || {});
|
||||||
|
|
||||||
|
return [...dependencies, ...peerDependencies];
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
ProtectFromImportingNonDependencies,
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue
Block a user