refactor: migrate extra info feature to the new architecture

Bug: twpowertools:176
Change-Id: I379216066b973fe76f000ab9581053c1f0da569e
diff --git a/src/common/architecture/dependenciesProvider/DependenciesProvider.ts b/src/common/architecture/dependenciesProvider/DependenciesProvider.ts
index 132a67c..b6af2a1 100644
--- a/src/common/architecture/dependenciesProvider/DependenciesProvider.ts
+++ b/src/common/architecture/dependenciesProvider/DependenciesProvider.ts
@@ -1,16 +1,23 @@
+import ExtraInfo from '../../../features/extraInfo/core';
 import AutoRefresh from '../../../features/autoRefresh/core/autoRefresh';
 
 export const AutoRefreshDependency = 'autoRefresh';
+export const ExtraInfoDependency = 'extraInfo';
 export const DependenciesToClass = {
   [AutoRefreshDependency]: AutoRefresh,
+  [ExtraInfoDependency]: ExtraInfo,
 };
 
 interface OurWindow extends Window {
   TWPTDependencies?: Dependencies;
 }
 
+export type ClassFromDependency<T extends Dependency> = InstanceType<
+  (typeof DependenciesToClass)[T]
+>;
+
 type Dependencies = {
-  [K in Dependency]?: InstanceType<(typeof DependenciesToClass)[K]>;
+  [K in Dependency]?: ClassFromDependency<K>;
 };
 
 export type Dependency = keyof typeof DependenciesToClass;
@@ -26,14 +33,22 @@
     this.dependencies = ourWindow.TWPTDependencies;
   }
 
-  getDependency(dependency: Dependency) {
+  /**
+   * Gets an instance of a dependency, and creates it beforehand if it doesn't exist yet.
+   */
+  getDependency<T extends Dependency>(dependency: T): ClassFromDependency<T> {
     this.setUpDependency(dependency);
-    return this.dependencies[dependency];
+    const dep = this.dependencies[dependency];
+    if (!dep) {
+      throw new Error(`Dependency ${dependency} not found.`);
+    }
+    return dep;
   }
 
-  setUpDependency(dependency: Dependency): void {
+  setUpDependency<T extends Dependency>(dependency: T): void {
     if (!this.dependencies[dependency]) {
-      this.dependencies[dependency] = new DependenciesToClass[dependency]();
+      const dependencyClass = DependenciesToClass[dependency];
+      this.dependencies[dependency] = new dependencyClass() as Dependencies[T];
     }
   }
 }