mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Introduce eslint and prettier for features and start using it (#7306)
* Introduce package for sharing eslint and prettier configurations Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com> Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> * Start using eslint and prettier in packages Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com> Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> --------- Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
1 parent
2789bcebcb
commit
699fc0309e
36 files changed
+2973
-610
No files matched your search
@@ -2,25 +2,31 @@ import type { DiContainer } from "@ogre-tools/injectable";
|
||||
import type { Feature } from "./feature";
|
||||
import { featureContextMapInjectable } from "./feature-context-map-injectable";
|
||||
|
||||
export const deregisterFeature = (di: DiContainer, ...features: Feature[]) => {
|
||||
features.forEach((feature) => {
|
||||
deregisterFeatureRecursed(di, feature);
|
||||
});
|
||||
const getDependingFeaturesFor = (
|
||||
featureContextMap: Map<Feature, { dependedBy: Map<Feature, number> }>,
|
||||
) => {
|
||||
const getDependingFeaturesForRecursion = (feature: Feature, atRoot = true): string[] => {
|
||||
const context = featureContextMap.get(feature);
|
||||
|
||||
if (context?.dependedBy.size) {
|
||||
return [...context?.dependedBy.entries()].flatMap(([dependant]) =>
|
||||
getDependingFeaturesForRecursion(dependant, false),
|
||||
);
|
||||
}
|
||||
|
||||
return atRoot ? [] : [feature.id];
|
||||
};
|
||||
|
||||
return getDependingFeaturesForRecursion;
|
||||
};
|
||||
|
||||
const deregisterFeatureRecursed = (
|
||||
di: DiContainer,
|
||||
feature: Feature,
|
||||
dependedBy?: Feature
|
||||
) => {
|
||||
const deregisterFeatureRecursed = (di: DiContainer, feature: Feature, dependedBy?: Feature) => {
|
||||
const featureContextMap = di.inject(featureContextMapInjectable);
|
||||
|
||||
const featureContext = featureContextMap.get(feature);
|
||||
|
||||
if (!featureContext) {
|
||||
throw new Error(
|
||||
`Tried to deregister feature "${feature.id}", but it was not registered.`
|
||||
);
|
||||
throw new Error(`Tried to deregister feature "${feature.id}", but it was not registered.`);
|
||||
}
|
||||
|
||||
featureContext.numberOfRegistrations--;
|
||||
@@ -33,15 +39,15 @@ const deregisterFeatureRecursed = (
|
||||
throw new Error(
|
||||
`Tried to deregister Feature "${
|
||||
feature.id
|
||||
}", but it is the dependency of Features "${dependingFeatures.join(
|
||||
", "
|
||||
)}"`
|
||||
}", but it is the dependency of Features "${dependingFeatures.join(", ")}"`,
|
||||
);
|
||||
}
|
||||
|
||||
if (dependedBy) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const oldNumberOfDependents = featureContext.dependedBy.get(dependedBy)!;
|
||||
const newNumberOfDependants = oldNumberOfDependents - 1;
|
||||
|
||||
featureContext.dependedBy.set(dependedBy, newNumberOfDependants);
|
||||
|
||||
if (newNumberOfDependants === 0) {
|
||||
@@ -60,23 +66,8 @@ const deregisterFeatureRecursed = (
|
||||
});
|
||||
};
|
||||
|
||||
const getDependingFeaturesFor = (
|
||||
featureContextMap: Map<Feature, { dependedBy: Map<Feature, number> }>
|
||||
) => {
|
||||
const getDependingFeaturesForRecursion = (
|
||||
feature: Feature,
|
||||
atRoot = true
|
||||
): string[] => {
|
||||
const context = featureContextMap.get(feature);
|
||||
|
||||
if (context?.dependedBy.size) {
|
||||
return [...context!.dependedBy.entries()].flatMap(([dependant]) =>
|
||||
getDependingFeaturesForRecursion(dependant, false)
|
||||
);
|
||||
}
|
||||
|
||||
return atRoot ? [] : [feature.id];
|
||||
};
|
||||
|
||||
return getDependingFeaturesForRecursion;
|
||||
export const deregisterFeature = (di: DiContainer, ...features: Feature[]) => {
|
||||
features.forEach((feature) => {
|
||||
deregisterFeatureRecursed(di, feature);
|
||||
});
|
||||
};
|
||||
@@ -11,10 +11,9 @@ export type FeatureContextMap = Map<
|
||||
}
|
||||
>;
|
||||
|
||||
export const featureContextMapInjectionToken =
|
||||
getInjectionToken<FeatureContextMap>({
|
||||
id: "feature-context-map-injection-token",
|
||||
});
|
||||
export const featureContextMapInjectionToken = getInjectionToken<FeatureContextMap>({
|
||||
id: "feature-context-map-injection-token",
|
||||
});
|
||||
|
||||
const featureContextMapInjectable = getInjectable({
|
||||
id: "feature-store",
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
import {
|
||||
createContainer,
|
||||
DiContainer,
|
||||
getInjectable,
|
||||
Injectable,
|
||||
} from "@ogre-tools/injectable";
|
||||
import { createContainer, DiContainer, getInjectable, Injectable } from "@ogre-tools/injectable";
|
||||
|
||||
import type { Feature } from "./feature";
|
||||
import { registerFeature } from "./register-feature";
|
||||
import { deregisterFeature } from "./deregister-feature";
|
||||
import { getFeature } from "./feature" ;
|
||||
import { getFeature } from "./feature";
|
||||
|
||||
describe("feature-dependencies", () => {
|
||||
describe("given a parent Feature with another Features as dependency", () => {
|
||||
@@ -55,7 +50,7 @@ describe("feature-dependencies", () => {
|
||||
expect(() => {
|
||||
deregisterFeature(di, someDependencyFeature);
|
||||
}).toThrow(
|
||||
'Tried to deregister Feature "some-dependency-feature", but it is the dependency of Features "some-feature"'
|
||||
'Tried to deregister Feature "some-dependency-feature", but it is the dependency of Features "some-feature"',
|
||||
);
|
||||
});
|
||||
|
||||
@@ -65,7 +60,7 @@ describe("feature-dependencies", () => {
|
||||
expect(() => {
|
||||
deregisterFeature(di, someDependencyFeature);
|
||||
}).toThrow(
|
||||
'Tried to deregister feature "some-dependency-feature", but it was not registered.'
|
||||
'Tried to deregister feature "some-dependency-feature", but it was not registered.',
|
||||
);
|
||||
});
|
||||
|
||||
@@ -74,9 +69,7 @@ describe("feature-dependencies", () => {
|
||||
|
||||
expect(() => {
|
||||
di.inject(someInjectableInDependencyFeature);
|
||||
}).toThrow(
|
||||
'Tried to inject non-registered injectable "irrelevant" -> "some-injectable".'
|
||||
);
|
||||
}).toThrow('Tried to inject non-registered injectable "irrelevant" -> "some-injectable".');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -112,7 +105,7 @@ describe("feature-dependencies", () => {
|
||||
expect(() => {
|
||||
deregisterFeature(di, someFeature1);
|
||||
}).toThrow(
|
||||
'Tried to deregister Feature "some-feature-1", but it is the dependency of Features "some-feature-2"'
|
||||
'Tried to deregister Feature "some-feature-1", but it is the dependency of Features "some-feature-2"',
|
||||
);
|
||||
});
|
||||
|
||||
@@ -170,7 +163,7 @@ describe("feature-dependencies", () => {
|
||||
expect(() => {
|
||||
deregisterFeature(di, someSharedDependencyFeature);
|
||||
}).toThrow(
|
||||
'Tried to deregister Feature "some-dependency-feature", but it is the dependency of Features "some-feature-1, some-feature-2"'
|
||||
'Tried to deregister Feature "some-dependency-feature", but it is the dependency of Features "some-feature-1, some-feature-2"',
|
||||
);
|
||||
});
|
||||
|
||||
@@ -188,7 +181,7 @@ describe("feature-dependencies", () => {
|
||||
expect(() => {
|
||||
di.inject(someInjectableInDependencyFeature);
|
||||
}).toThrow(
|
||||
'Tried to inject non-registered injectable "irrelevant" -> "some-injectable-in-dependency-feature".'
|
||||
'Tried to inject non-registered injectable "irrelevant" -> "some-injectable-in-dependency-feature".',
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -231,19 +224,14 @@ describe("feature-dependencies", () => {
|
||||
dependencies: [someFeatureForAdditionalHierarchy],
|
||||
});
|
||||
|
||||
registerFeature(
|
||||
di,
|
||||
someFeature1,
|
||||
someFeature2,
|
||||
someSharedDependencyFeature
|
||||
);
|
||||
registerFeature(di, someFeature1, someFeature2, someSharedDependencyFeature);
|
||||
});
|
||||
|
||||
it("when the shared Feature is deregistered, throws", () => {
|
||||
expect(() => {
|
||||
deregisterFeature(di, someSharedDependencyFeature);
|
||||
}).toThrow(
|
||||
'Tried to deregister Feature "some-dependency-feature", but it is the dependency of Features "some-feature-1, some-feature-2"'
|
||||
'Tried to deregister Feature "some-dependency-feature", but it is the dependency of Features "some-feature-1, some-feature-2"',
|
||||
);
|
||||
});
|
||||
|
||||
@@ -264,17 +252,12 @@ describe("feature-dependencies", () => {
|
||||
});
|
||||
|
||||
it("given all of the Features get deregistered, when injecting an injectable from the shared Feature, throws", () => {
|
||||
deregisterFeature(
|
||||
di,
|
||||
someFeature1,
|
||||
someFeature2,
|
||||
someSharedDependencyFeature
|
||||
);
|
||||
deregisterFeature(di, someFeature1, someFeature2, someSharedDependencyFeature);
|
||||
|
||||
expect(() => {
|
||||
di.inject(someInjectableInDependencyFeature);
|
||||
}).toThrow(
|
||||
'Tried to inject non-registered injectable "irrelevant" -> "some-injectable-in-dependency-feature".'
|
||||
'Tried to inject non-registered injectable "irrelevant" -> "some-injectable-in-dependency-feature".',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -8,5 +8,4 @@ export interface Feature {
|
||||
|
||||
export interface GetFeatureArgs extends Feature {}
|
||||
|
||||
export const getFeature = (getFeatureArgs: GetFeatureArgs): Feature =>
|
||||
getFeatureArgs;
|
||||
export const getFeature = (getFeatureArgs: GetFeatureArgs): Feature => getFeatureArgs;
|
||||
@@ -6,58 +6,6 @@ import {
|
||||
featureContextMapInjectionToken,
|
||||
} from "./feature-context-map-injectable";
|
||||
|
||||
export const registerFeature = (di: DiContainer, ...features: Feature[]) => {
|
||||
features.forEach((feature) => {
|
||||
registerFeatureRecursed(di, feature);
|
||||
});
|
||||
};
|
||||
|
||||
const registerFeatureRecursed = (
|
||||
di: DiContainer,
|
||||
feature: Feature,
|
||||
dependedBy?: Feature
|
||||
) => {
|
||||
const featureContextMaps = di.injectMany(featureContextMapInjectionToken);
|
||||
|
||||
if (featureContextMaps.length === 0) {
|
||||
di.register(featureContextMapInjectable);
|
||||
}
|
||||
|
||||
const featureContextMap = di.inject(featureContextMapInjectable);
|
||||
|
||||
const existingFeatureContext = featureContextMap.get(feature);
|
||||
if (
|
||||
!dependedBy &&
|
||||
existingFeatureContext &&
|
||||
existingFeatureContext.dependedBy.size === 0
|
||||
) {
|
||||
throw new Error(
|
||||
`Tried to register feature "${feature.id}", but it was already registered.`
|
||||
);
|
||||
}
|
||||
|
||||
const featureContext =
|
||||
existingFeatureContext || createFeatureContext(feature, di);
|
||||
|
||||
featureContext.numberOfRegistrations++;
|
||||
|
||||
if (dependedBy) {
|
||||
const oldNumberOfDependents =
|
||||
featureContext.dependedBy.get(dependedBy) || 0;
|
||||
|
||||
const newNumberOfDependants = oldNumberOfDependents + 1;
|
||||
featureContext.dependedBy.set(dependedBy, newNumberOfDependants);
|
||||
}
|
||||
|
||||
if (!existingFeatureContext) {
|
||||
featureContext.register();
|
||||
}
|
||||
|
||||
feature.dependencies?.forEach((dependency) => {
|
||||
registerFeatureRecursed(di, dependency, feature);
|
||||
});
|
||||
};
|
||||
|
||||
const createFeatureContext = (feature: Feature, di: DiContainer) => {
|
||||
const featureContextInjectable = getInjectable({
|
||||
id: feature.id,
|
||||
@@ -88,3 +36,45 @@ const createFeatureContext = (feature: Feature, di: DiContainer) => {
|
||||
|
||||
return featureContext;
|
||||
};
|
||||
|
||||
const registerFeatureRecursed = (di: DiContainer, feature: Feature, dependedBy?: Feature) => {
|
||||
const featureContextMaps = di.injectMany(featureContextMapInjectionToken);
|
||||
|
||||
if (featureContextMaps.length === 0) {
|
||||
di.register(featureContextMapInjectable);
|
||||
}
|
||||
|
||||
const featureContextMap = di.inject(featureContextMapInjectable);
|
||||
|
||||
const existingFeatureContext = featureContextMap.get(feature);
|
||||
|
||||
if (!dependedBy && existingFeatureContext && existingFeatureContext.dependedBy.size === 0) {
|
||||
throw new Error(`Tried to register feature "${feature.id}", but it was already registered.`);
|
||||
}
|
||||
|
||||
const featureContext = existingFeatureContext || createFeatureContext(feature, di);
|
||||
|
||||
featureContext.numberOfRegistrations++;
|
||||
|
||||
if (dependedBy) {
|
||||
const oldNumberOfDependents = featureContext.dependedBy.get(dependedBy) || 0;
|
||||
|
||||
const newNumberOfDependants = oldNumberOfDependents + 1;
|
||||
|
||||
featureContext.dependedBy.set(dependedBy, newNumberOfDependants);
|
||||
}
|
||||
|
||||
if (!existingFeatureContext) {
|
||||
featureContext.register();
|
||||
}
|
||||
|
||||
feature.dependencies?.forEach((dependency) => {
|
||||
registerFeatureRecursed(di, dependency, feature);
|
||||
});
|
||||
};
|
||||
|
||||
export const registerFeature = (di: DiContainer, ...features: Feature[]) => {
|
||||
features.forEach((feature) => {
|
||||
registerFeatureRecursed(di, feature);
|
||||
});
|
||||
};
|
||||
@@ -1,10 +1,5 @@
|
||||
import { registerFeature } from "./register-feature";
|
||||
import {
|
||||
createContainer,
|
||||
DiContainer,
|
||||
getInjectable,
|
||||
Injectable,
|
||||
} from "@ogre-tools/injectable";
|
||||
import { createContainer, DiContainer, getInjectable, Injectable } from "@ogre-tools/injectable";
|
||||
import type { Feature } from "./feature";
|
||||
import { getFeature } from "./feature";
|
||||
import { deregisterFeature } from "./deregister-feature";
|
||||
@@ -90,9 +85,7 @@ describe("register-feature", () => {
|
||||
it("when a Feature is registered again, throws", () => {
|
||||
expect(() => {
|
||||
registerFeature(di, someFeature);
|
||||
}).toThrow(
|
||||
'Tried to register feature "some-feature-1", but it was already registered.'
|
||||
);
|
||||
}).toThrow('Tried to register feature "some-feature-1", but it was already registered.');
|
||||
});
|
||||
|
||||
it("given a Feature deregistered, when deregistered again, throws", () => {
|
||||
@@ -100,15 +93,14 @@ describe("register-feature", () => {
|
||||
|
||||
expect(() => {
|
||||
deregisterFeature(di, someFeature);
|
||||
}).toThrow(
|
||||
'Tried to deregister feature "some-feature-1", but it was not registered.'
|
||||
);
|
||||
}).toThrow('Tried to deregister feature "some-feature-1", but it was not registered.');
|
||||
});
|
||||
});
|
||||
|
||||
it("given di-container and registered Features with injectables forming a cycle, when an injectable is injected, throws with namespaced error about cycle", () => {
|
||||
const someInjectable: Injectable<any> = getInjectable({
|
||||
id: "some-injectable-1",
|
||||
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
||||
instantiate: (di) => di.inject(someInjectable2),
|
||||
});
|
||||
|
||||
@@ -140,8 +132,9 @@ describe("register-feature", () => {
|
||||
expect(() => {
|
||||
di.inject(someInjectable);
|
||||
}).toThrow(
|
||||
// 'Cycle of injectables encountered: "some-container" -> "some-feature-1:some-injectable-1" -> "some-feature-2:some-injectable-2" -> "some-feature-1:some-injectable-1"'
|
||||
'Maximum call stack size exceeded'
|
||||
// 'Cycle of injectables encountered: "some-container" -> "some-feature-1:some-injectable-1"
|
||||
// -> "some-feature-2:some-injectable-2" -> "some-feature-1:some-injectable-1"'
|
||||
"Maximum call stack size exceeded",
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user